@babylonjs/core 6.22.1 → 6.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/Animations/animationGroup.d.ts +2 -1
  2. package/Animations/animationGroup.js +5 -1
  3. package/Animations/animationGroup.js.map +1 -1
  4. package/Behaviors/Cameras/framingBehavior.d.ts +0 -5
  5. package/Behaviors/Cameras/framingBehavior.js +2 -34
  6. package/Behaviors/Cameras/framingBehavior.js.map +1 -1
  7. package/Buffers/buffer.d.ts +64 -1
  8. package/Buffers/buffer.js +30 -23
  9. package/Buffers/buffer.js.map +1 -1
  10. package/Buffers/storageBuffer.d.ts +3 -1
  11. package/Buffers/storageBuffer.js +4 -2
  12. package/Buffers/storageBuffer.js.map +1 -1
  13. package/Cameras/Inputs/BaseCameraPointersInput.js +1 -1
  14. package/Cameras/Inputs/BaseCameraPointersInput.js.map +1 -1
  15. package/Cameras/Inputs/arcRotateCameraVRDeviceOrientationInput.js +1 -1
  16. package/Cameras/Inputs/arcRotateCameraVRDeviceOrientationInput.js.map +1 -1
  17. package/Cameras/Inputs/freeCameraMouseInput.js +1 -1
  18. package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
  19. package/Cameras/Stereoscopic/anaglyphArcRotateCamera.d.ts +1 -1
  20. package/Cameras/Stereoscopic/anaglyphArcRotateCamera.js +1 -1
  21. package/Cameras/Stereoscopic/anaglyphArcRotateCamera.js.map +1 -1
  22. package/Cameras/Stereoscopic/anaglyphFreeCamera.d.ts +1 -1
  23. package/Cameras/Stereoscopic/anaglyphFreeCamera.js +1 -1
  24. package/Cameras/Stereoscopic/anaglyphFreeCamera.js.map +1 -1
  25. package/Cameras/Stereoscopic/anaglyphGamepadCamera.d.ts +1 -1
  26. package/Cameras/Stereoscopic/anaglyphGamepadCamera.js +1 -1
  27. package/Cameras/Stereoscopic/anaglyphGamepadCamera.js.map +1 -1
  28. package/Cameras/Stereoscopic/anaglyphUniversalCamera.d.ts +1 -1
  29. package/Cameras/Stereoscopic/anaglyphUniversalCamera.js +1 -1
  30. package/Cameras/Stereoscopic/anaglyphUniversalCamera.js.map +1 -1
  31. package/Cameras/Stereoscopic/stereoscopicArcRotateCamera.d.ts +1 -1
  32. package/Cameras/Stereoscopic/stereoscopicArcRotateCamera.js +1 -1
  33. package/Cameras/Stereoscopic/stereoscopicArcRotateCamera.js.map +1 -1
  34. package/Cameras/Stereoscopic/stereoscopicFreeCamera.d.ts +1 -1
  35. package/Cameras/Stereoscopic/stereoscopicFreeCamera.js +1 -1
  36. package/Cameras/Stereoscopic/stereoscopicFreeCamera.js.map +1 -1
  37. package/Cameras/Stereoscopic/stereoscopicGamepadCamera.d.ts +1 -1
  38. package/Cameras/Stereoscopic/stereoscopicGamepadCamera.js +1 -1
  39. package/Cameras/Stereoscopic/stereoscopicGamepadCamera.js.map +1 -1
  40. package/Cameras/Stereoscopic/stereoscopicUniversalCamera.d.ts +1 -1
  41. package/Cameras/Stereoscopic/stereoscopicUniversalCamera.js +1 -1
  42. package/Cameras/Stereoscopic/stereoscopicUniversalCamera.js.map +1 -1
  43. package/Cameras/VR/vrDeviceOrientationArcRotateCamera.d.ts +1 -1
  44. package/Cameras/VR/vrDeviceOrientationArcRotateCamera.js +1 -1
  45. package/Cameras/VR/vrDeviceOrientationArcRotateCamera.js.map +1 -1
  46. package/Cameras/VR/vrDeviceOrientationFreeCamera.d.ts +1 -1
  47. package/Cameras/VR/vrDeviceOrientationFreeCamera.js +1 -1
  48. package/Cameras/VR/vrDeviceOrientationFreeCamera.js.map +1 -1
  49. package/Cameras/VR/vrDeviceOrientationGamepadCamera.d.ts +1 -1
  50. package/Cameras/VR/vrDeviceOrientationGamepadCamera.js +1 -1
  51. package/Cameras/VR/vrDeviceOrientationGamepadCamera.js.map +1 -1
  52. package/Cameras/arcRotateCamera.d.ts +4 -0
  53. package/Cameras/arcRotateCamera.js +30 -3
  54. package/Cameras/arcRotateCamera.js.map +1 -1
  55. package/Culling/Octrees/octreeSceneComponent.js +4 -4
  56. package/Culling/Octrees/octreeSceneComponent.js.map +1 -1
  57. package/Debug/physicsViewer.js +4 -4
  58. package/Debug/physicsViewer.js.map +1 -1
  59. package/Debug/rayHelper.js +1 -1
  60. package/Debug/rayHelper.js.map +1 -1
  61. package/Engines/Extensions/engine.storageBuffer.d.ts +2 -1
  62. package/Engines/Extensions/engine.storageBuffer.js.map +1 -1
  63. package/Engines/Extensions/engine.uniformBuffer.d.ts +4 -2
  64. package/Engines/Extensions/engine.uniformBuffer.js +2 -2
  65. package/Engines/Extensions/engine.uniformBuffer.js.map +1 -1
  66. package/Engines/WebGPU/Extensions/engine.storageBuffer.d.ts +2 -1
  67. package/Engines/WebGPU/Extensions/engine.storageBuffer.js +3 -3
  68. package/Engines/WebGPU/Extensions/engine.storageBuffer.js.map +1 -1
  69. package/Engines/WebGPU/Extensions/engine.uniformBuffer.js +5 -5
  70. package/Engines/WebGPU/Extensions/engine.uniformBuffer.js.map +1 -1
  71. package/Engines/WebGPU/webgpuBufferManager.d.ts +3 -2
  72. package/Engines/WebGPU/webgpuBufferManager.js +16 -3
  73. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  74. package/Engines/WebGPU/webgpuCacheRenderPipeline.d.ts +2 -0
  75. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +63 -2
  76. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  77. package/Engines/WebGPU/webgpuConstants.d.ts +5 -4
  78. package/Engines/WebGPU/webgpuConstants.js +15 -15
  79. package/Engines/WebGPU/webgpuConstants.js.map +1 -1
  80. package/Engines/WebGPU/webgpuDrawContext.js +1 -1
  81. package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
  82. package/Engines/WebGPU/webgpuPipelineContext.d.ts +3 -0
  83. package/Engines/WebGPU/webgpuPipelineContext.js +1 -0
  84. package/Engines/WebGPU/webgpuPipelineContext.js.map +1 -1
  85. package/Engines/WebGPU/webgpuQuerySet.js +3 -3
  86. package/Engines/WebGPU/webgpuQuerySet.js.map +1 -1
  87. package/Engines/WebGPU/webgpuShaderProcessingContext.js.map +1 -1
  88. package/Engines/WebGPU/webgpuShaderProcessor.d.ts +3 -0
  89. package/Engines/WebGPU/webgpuShaderProcessor.js +5 -0
  90. package/Engines/WebGPU/webgpuShaderProcessor.js.map +1 -1
  91. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js +11 -1
  92. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js.map +1 -1
  93. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.d.ts +3 -0
  94. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +32 -4
  95. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  96. package/Engines/WebGPU/webgpuTextureHelper.d.ts +1 -0
  97. package/Engines/WebGPU/webgpuTextureHelper.js +32 -34
  98. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  99. package/Engines/WebGPU/webgpuTintWASM.js +1 -1
  100. package/Engines/WebGPU/webgpuTintWASM.js.map +1 -1
  101. package/Engines/engine.d.ts +32 -32
  102. package/Engines/nativeEngine.d.ts +2 -2
  103. package/Engines/nativeEngine.js +5 -2
  104. package/Engines/nativeEngine.js.map +1 -1
  105. package/Engines/thinEngine.d.ts +7 -3
  106. package/Engines/thinEngine.js +11 -7
  107. package/Engines/thinEngine.js.map +1 -1
  108. package/Engines/webgpuEngine.d.ts +9 -4
  109. package/Engines/webgpuEngine.js +16 -11
  110. package/Engines/webgpuEngine.js.map +1 -1
  111. package/FlowGraph/flowGraph.js +1 -1
  112. package/FlowGraph/flowGraph.js.map +1 -1
  113. package/Lights/Shadows/cascadedShadowGenerator.js +1 -1
  114. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  115. package/Lights/Shadows/shadowGenerator.js +1 -1
  116. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  117. package/Materials/Node/Blocks/Fragment/prePassOutputBlock.d.ts +4 -0
  118. package/Materials/Node/Blocks/Fragment/prePassOutputBlock.js +21 -0
  119. package/Materials/Node/Blocks/Fragment/prePassOutputBlock.js.map +1 -1
  120. package/Materials/Textures/Procedurals/proceduralTexture.d.ts +4 -1
  121. package/Materials/Textures/Procedurals/proceduralTexture.js +10 -8
  122. package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
  123. package/Materials/Textures/equiRectangularCubeTexture.js +1 -1
  124. package/Materials/Textures/equiRectangularCubeTexture.js.map +1 -1
  125. package/Materials/Textures/texture.d.ts +2 -0
  126. package/Materials/Textures/texture.js +8 -0
  127. package/Materials/Textures/texture.js.map +1 -1
  128. package/Materials/Textures/videoTexture.d.ts +4 -0
  129. package/Materials/Textures/videoTexture.js +21 -0
  130. package/Materials/Textures/videoTexture.js.map +1 -1
  131. package/Materials/effect.d.ts +8 -3
  132. package/Materials/effect.js +25 -19
  133. package/Materials/effect.js.map +1 -1
  134. package/Materials/material.js +8 -6
  135. package/Materials/material.js.map +1 -1
  136. package/Materials/meshDebugPluginMaterial.js +1 -1
  137. package/Materials/meshDebugPluginMaterial.js.map +1 -1
  138. package/Materials/uniformBuffer.d.ts +1 -0
  139. package/Materials/uniformBuffer.js +10 -3
  140. package/Materials/uniformBuffer.js.map +1 -1
  141. package/Meshes/Node/Blocks/Instances/instantiateBaseBlock.d.ts +66 -0
  142. package/Meshes/Node/Blocks/Instances/instantiateBaseBlock.js +100 -0
  143. package/Meshes/Node/Blocks/Instances/instantiateBaseBlock.js.map +1 -0
  144. package/Meshes/Node/Blocks/Instances/instantiateBlock.d.ts +5 -30
  145. package/Meshes/Node/Blocks/Instances/instantiateBlock.js +2 -52
  146. package/Meshes/Node/Blocks/Instances/instantiateBlock.js.map +1 -1
  147. package/Meshes/Node/Blocks/Instances/instantiateLinearBlock.d.ts +31 -0
  148. package/Meshes/Node/Blocks/Instances/instantiateLinearBlock.js +101 -0
  149. package/Meshes/Node/Blocks/Instances/instantiateLinearBlock.js.map +1 -0
  150. package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.d.ts +4 -4
  151. package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.js +4 -4
  152. package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.js.map +1 -1
  153. package/Meshes/Node/Blocks/Instances/instantiateRadialBlock.d.ts +43 -0
  154. package/Meshes/Node/Blocks/Instances/instantiateRadialBlock.js +139 -0
  155. package/Meshes/Node/Blocks/Instances/instantiateRadialBlock.js.map +1 -0
  156. package/Meshes/Node/Blocks/Sources/meshBlock.d.ts +4 -0
  157. package/Meshes/Node/Blocks/Sources/meshBlock.js +18 -0
  158. package/Meshes/Node/Blocks/Sources/meshBlock.js.map +1 -1
  159. package/Meshes/Node/Blocks/booleanGeometryBlock.js +20 -0
  160. package/Meshes/Node/Blocks/booleanGeometryBlock.js.map +1 -1
  161. package/Meshes/Node/index.d.ts +2 -0
  162. package/Meshes/Node/index.js +2 -0
  163. package/Meshes/Node/index.js.map +1 -1
  164. package/Meshes/geometry.js +8 -2
  165. package/Meshes/geometry.js.map +1 -1
  166. package/Meshes/mesh.d.ts +10 -0
  167. package/Meshes/mesh.js +33 -0
  168. package/Meshes/mesh.js.map +1 -1
  169. package/Misc/tools.d.ts +0 -1
  170. package/Misc/tools.js +1 -5
  171. package/Misc/tools.js.map +1 -1
  172. package/Misc/videoRecorder.js +3 -3
  173. package/Misc/videoRecorder.js.map +1 -1
  174. package/Physics/physicsHelper.js +3 -3
  175. package/Physics/physicsHelper.js.map +1 -1
  176. package/Physics/v2/Plugins/havokPlugin.js +64 -56
  177. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  178. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js +7 -0
  179. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
  180. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js +6 -0
  181. package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js.map +1 -1
  182. package/PostProcesses/screenSpaceCurvaturePostProcess.js +3 -0
  183. package/PostProcesses/screenSpaceCurvaturePostProcess.js.map +1 -1
  184. package/PostProcesses/screenSpaceReflectionPostProcess.js +6 -0
  185. package/PostProcesses/screenSpaceReflectionPostProcess.js.map +1 -1
  186. package/Rendering/fluidRenderer/fluidRenderer.js +4 -4
  187. package/Rendering/fluidRenderer/fluidRenderer.js.map +1 -1
  188. package/Rendering/geometryBufferRenderer.d.ts +4 -0
  189. package/Rendering/geometryBufferRenderer.js +7 -0
  190. package/Rendering/geometryBufferRenderer.js.map +1 -1
  191. package/Shaders/ShadersInclude/lightFragment.js +4 -4
  192. package/Shaders/ShadersInclude/lightFragment.js.map +1 -1
  193. package/Shaders/ShadersInclude/shadowsFragmentFunctions.js +42 -42
  194. package/Shaders/ShadersInclude/shadowsFragmentFunctions.js.map +1 -1
  195. package/Shaders/geometry.fragment.js +4 -0
  196. package/Shaders/geometry.fragment.js.map +1 -1
  197. package/Shaders/geometry.vertex.js +4 -0
  198. package/Shaders/geometry.vertex.js.map +1 -1
  199. package/XR/features/WebXRSpaceWarp.d.ts +2 -0
  200. package/XR/features/WebXRSpaceWarp.js +6 -1
  201. package/XR/features/WebXRSpaceWarp.js.map +1 -1
  202. package/XR/webXRSessionManager.js +1 -1
  203. package/XR/webXRSessionManager.js.map +1 -1
  204. package/package.json +1 -1
  205. package/scene.js +4 -4
  206. package/scene.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"engine.storageBuffer.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Engines/WebGPU/Extensions/engine.storageBuffer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,eAAe,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAenD,MAAM,CAAC,SAAS,CAAC,gBAAgB,GAAG,UAAU,IAAY,EAAE,MAA+B;IACvF,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAChD,CAAC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,mBAAmB,GAAG,UAAU,IAAwB,EAAE,aAAqB;IAClG,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,CAAC,2BAA2B,CAAC,CAAC;AAC3F,CAAC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,mBAAmB,GAAG,UAAU,MAAkB,EAAE,IAAe,EAAE,UAAmB,EAAE,UAAmB;IAChI,MAAM,UAAU,GAAG,MAA0B,CAAC;IAC9C,IAAI,UAAU,KAAK,SAAS,EAAE;QAC1B,UAAU,GAAG,CAAC,CAAC;KAClB;IAED,IAAI,IAAqB,CAAC;IAC1B,IAAI,UAAU,KAAK,SAAS,EAAE;QAC1B,IAAI,IAAI,YAAY,KAAK,EAAE;YACvB,IAAI,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;SACjC;aAAM,IAAI,IAAI,YAAY,WAAW,EAAE;YACpC,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;SAC/B;aAAM;YACH,IAAI,GAAG,IAAI,CAAC;SACf;QACD,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;KAChC;SAAM;QACH,IAAI,IAAI,YAAY,KAAK,EAAE;YACvB,IAAI,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;SACjC;aAAM,IAAI,IAAI,YAAY,WAAW,EAAE;YACpC,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;SAC/B;aAAM;YACH,IAAI,GAAG,IAAI,CAAC;SACf;KACJ;IAED,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;AAChF,CAAC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,qBAAqB,GAAG,UAAU,aAAyB,EAAE,MAAe,EAAE,IAAa,EAAE,MAAwB;IACxI,IAAI,GAAG,IAAI,IAAI,aAAa,CAAC,QAAQ,CAAC;IAEtC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,WAAW,CAAC,OAAO,GAAG,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAEvI,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,aAAa,CAAC,kBAAkB,EAAE,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAEhH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,mGAAmG;QACnG,qFAAqF;QACrF,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE;YACnC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAC1D,GAAG,EAAE;gBACD,MAAM,eAAe,GAAG,SAAS,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC1D,IAAI,IAAI,GAAgC,MAAM,CAAC;gBAC/C,IAAI,IAAI,KAAK,SAAS,EAAE;oBACpB,IAAI,GAAG,IAAI,UAAU,CAAC,IAAK,CAAC,CAAC;oBAC5B,IAAmB,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC;iBAC7D;qBAAM;oBACH,MAAM,IAAI,GAAG,IAAI,CAAC,WAAkB,CAAC,CAAC,6FAA6F;oBACnI,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC5B,IAAY,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;iBAChD;gBACD,SAAS,CAAC,KAAK,EAAE,CAAC;gBAClB,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;gBAC7C,OAAO,CAAC,IAAK,CAAC,CAAC;YACnB,CAAC,EACD,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAC7B,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,gBAAgB,GAAG,UAAU,IAAY,EAAE,MAA+B;;IAC7F,MAAA,IAAI,CAAC,mBAAmB,0CAAE,SAAS,CAAC,IAAI,EAAE,MAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,SAAS,EAAuB,mCAAI,IAAI,CAAC,CAAC;AACjG,CAAC,CAAC","sourcesContent":["import type { DataBuffer } from \"../../../Buffers/dataBuffer\";\r\nimport type { WebGPUDataBuffer } from \"../../../Meshes/WebGPU/webgpuDataBuffer\";\r\nimport type { DataArray, Nullable } from \"../../../types\";\r\nimport { Constants } from \"../../constants\";\r\nimport { WebGPUEngine } from \"../../webgpuEngine\";\r\nimport * as WebGPUConstants from \"../webgpuConstants\";\r\nimport { Effect } from \"../../../Materials/effect\";\r\n\r\nimport type { StorageBuffer } from \"../../../Buffers/storageBuffer\";\r\n\r\ndeclare module \"../../../Materials/effect\" {\r\n export interface Effect {\r\n /**\r\n * Sets a storage buffer on the engine to be used in the shader.\r\n * @param name Name of the storage buffer variable.\r\n * @param buffer Storage buffer to set.\r\n */\r\n setStorageBuffer(name: string, buffer: Nullable<StorageBuffer>): void;\r\n }\r\n}\r\n\r\nEffect.prototype.setStorageBuffer = function (name: string, buffer: Nullable<StorageBuffer>): void {\r\n this._engine.setStorageBuffer(name, buffer);\r\n};\r\n\r\nWebGPUEngine.prototype.createStorageBuffer = function (data: DataArray | number, creationFlags: number): DataBuffer {\r\n return this._createBuffer(data, creationFlags | Constants.BUFFER_CREATIONFLAG_STORAGE);\r\n};\r\n\r\nWebGPUEngine.prototype.updateStorageBuffer = function (buffer: DataBuffer, data: DataArray, byteOffset?: number, byteLength?: number): void {\r\n const dataBuffer = buffer as WebGPUDataBuffer;\r\n if (byteOffset === undefined) {\r\n byteOffset = 0;\r\n }\r\n\r\n let view: ArrayBufferView;\r\n if (byteLength === undefined) {\r\n if (data instanceof Array) {\r\n view = new Float32Array(data);\r\n } else if (data instanceof ArrayBuffer) {\r\n view = new Uint8Array(data);\r\n } else {\r\n view = data;\r\n }\r\n byteLength = view.byteLength;\r\n } else {\r\n if (data instanceof Array) {\r\n view = new Float32Array(data);\r\n } else if (data instanceof ArrayBuffer) {\r\n view = new Uint8Array(data);\r\n } else {\r\n view = data;\r\n }\r\n }\r\n\r\n this._bufferManager.setSubData(dataBuffer, byteOffset, view, 0, byteLength);\r\n};\r\n\r\nWebGPUEngine.prototype.readFromStorageBuffer = function (storageBuffer: DataBuffer, offset?: number, size?: number, buffer?: ArrayBufferView): Promise<ArrayBufferView> {\r\n size = size || storageBuffer.capacity;\r\n\r\n const gpuBuffer = this._bufferManager.createRawBuffer(size, WebGPUConstants.BufferUsage.MapRead | WebGPUConstants.BufferUsage.CopyDst);\r\n\r\n this._renderTargetEncoder.copyBufferToBuffer(storageBuffer.underlyingResource, offset ?? 0, gpuBuffer, 0, size);\r\n\r\n return new Promise((resolve, reject) => {\r\n // we are using onEndFrameObservable because we need to map the gpuBuffer AFTER the command buffers\r\n // have been submitted, else we get the error: \"Buffer used in a submit while mapped\"\r\n this.onEndFrameObservable.addOnce(() => {\r\n gpuBuffer.mapAsync(WebGPUConstants.MapMode.Read, 0, size).then(\r\n () => {\r\n const copyArrayBuffer = gpuBuffer.getMappedRange(0, size);\r\n let data: ArrayBufferView | undefined = buffer;\r\n if (data === undefined) {\r\n data = new Uint8Array(size!);\r\n (data as Uint8Array).set(new Uint8Array(copyArrayBuffer));\r\n } else {\r\n const ctor = data.constructor as any; // we want to create result data with the same type as buffer (Uint8Array, Float32Array, ...)\r\n data = new ctor(data.buffer);\r\n (data as any).set(new ctor(copyArrayBuffer));\r\n }\r\n gpuBuffer.unmap();\r\n this._bufferManager.releaseBuffer(gpuBuffer);\r\n resolve(data!);\r\n },\r\n (reason) => reject(reason)\r\n );\r\n });\r\n });\r\n};\r\n\r\nWebGPUEngine.prototype.setStorageBuffer = function (name: string, buffer: Nullable<StorageBuffer>): void {\r\n this._currentDrawContext?.setBuffer(name, (buffer?.getBuffer() as WebGPUDataBuffer) ?? null);\r\n};\r\n"]}
1
+ {"version":3,"file":"engine.storageBuffer.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Engines/WebGPU/Extensions/engine.storageBuffer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DataBuffer } from \"../../../Buffers/dataBuffer\";\r\nimport type { WebGPUDataBuffer } from \"../../../Meshes/WebGPU/webgpuDataBuffer\";\r\nimport type { DataArray, Nullable } from \"../../../types\";\r\nimport { Constants } from \"../../constants\";\r\nimport { WebGPUEngine } from \"../../webgpuEngine\";\r\nimport * as WebGPUConstants from \"../webgpuConstants\";\r\nimport { Effect } from \"../../../Materials/effect\";\r\n\r\nimport type { StorageBuffer } from \"../../../Buffers/storageBuffer\";\r\n\r\ndeclare module \"../../../Materials/effect\" {\r\n export interface Effect {\r\n /**\r\n * Sets a storage buffer on the engine to be used in the shader.\r\n * @param name Name of the storage buffer variable.\r\n * @param buffer Storage buffer to set.\r\n * @param label defines the label of the buffer (for debug purpose)\r\n */\r\n setStorageBuffer(name: string, buffer: Nullable<StorageBuffer>, label?: string): void;\r\n }\r\n}\r\n\r\nEffect.prototype.setStorageBuffer = function (name: string, buffer: Nullable<StorageBuffer>): void {\r\n this._engine.setStorageBuffer(name, buffer);\r\n};\r\n\r\nWebGPUEngine.prototype.createStorageBuffer = function (data: DataArray | number, creationFlags: number, label?: string): DataBuffer {\r\n return this._createBuffer(data, creationFlags | Constants.BUFFER_CREATIONFLAG_STORAGE, label);\r\n};\r\n\r\nWebGPUEngine.prototype.updateStorageBuffer = function (buffer: DataBuffer, data: DataArray, byteOffset?: number, byteLength?: number): void {\r\n const dataBuffer = buffer as WebGPUDataBuffer;\r\n if (byteOffset === undefined) {\r\n byteOffset = 0;\r\n }\r\n\r\n let view: ArrayBufferView;\r\n if (byteLength === undefined) {\r\n if (data instanceof Array) {\r\n view = new Float32Array(data);\r\n } else if (data instanceof ArrayBuffer) {\r\n view = new Uint8Array(data);\r\n } else {\r\n view = data;\r\n }\r\n byteLength = view.byteLength;\r\n } else {\r\n if (data instanceof Array) {\r\n view = new Float32Array(data);\r\n } else if (data instanceof ArrayBuffer) {\r\n view = new Uint8Array(data);\r\n } else {\r\n view = data;\r\n }\r\n }\r\n\r\n this._bufferManager.setSubData(dataBuffer, byteOffset, view, 0, byteLength);\r\n};\r\n\r\nWebGPUEngine.prototype.readFromStorageBuffer = function (storageBuffer: DataBuffer, offset?: number, size?: number, buffer?: ArrayBufferView): Promise<ArrayBufferView> {\r\n size = size || storageBuffer.capacity;\r\n\r\n const gpuBuffer = this._bufferManager.createRawBuffer(size, WebGPUConstants.BufferUsage.MapRead | WebGPUConstants.BufferUsage.CopyDst, undefined, \"TempReadFromStorageBuffer\");\r\n\r\n this._renderTargetEncoder.copyBufferToBuffer(storageBuffer.underlyingResource, offset ?? 0, gpuBuffer, 0, size);\r\n\r\n return new Promise((resolve, reject) => {\r\n // we are using onEndFrameObservable because we need to map the gpuBuffer AFTER the command buffers\r\n // have been submitted, else we get the error: \"Buffer used in a submit while mapped\"\r\n this.onEndFrameObservable.addOnce(() => {\r\n gpuBuffer.mapAsync(WebGPUConstants.MapMode.Read, 0, size).then(\r\n () => {\r\n const copyArrayBuffer = gpuBuffer.getMappedRange(0, size);\r\n let data: ArrayBufferView | undefined = buffer;\r\n if (data === undefined) {\r\n data = new Uint8Array(size!);\r\n (data as Uint8Array).set(new Uint8Array(copyArrayBuffer));\r\n } else {\r\n const ctor = data.constructor as any; // we want to create result data with the same type as buffer (Uint8Array, Float32Array, ...)\r\n data = new ctor(data.buffer);\r\n (data as any).set(new ctor(copyArrayBuffer));\r\n }\r\n gpuBuffer.unmap();\r\n this._bufferManager.releaseBuffer(gpuBuffer);\r\n resolve(data!);\r\n },\r\n (reason) => reject(reason)\r\n );\r\n });\r\n });\r\n};\r\n\r\nWebGPUEngine.prototype.setStorageBuffer = function (name: string, buffer: Nullable<StorageBuffer>): void {\r\n this._currentDrawContext?.setBuffer(name, (buffer?.getBuffer() as WebGPUDataBuffer) ?? null);\r\n};\r\n"]}
@@ -1,6 +1,6 @@
1
1
  import { WebGPUEngine } from "../../webgpuEngine.js";
2
2
  import * as WebGPUConstants from "../webgpuConstants.js";
3
- WebGPUEngine.prototype.createUniformBuffer = function (elements) {
3
+ WebGPUEngine.prototype.createUniformBuffer = function (elements, label) {
4
4
  let view;
5
5
  if (elements instanceof Array) {
6
6
  view = new Float32Array(elements);
@@ -8,11 +8,11 @@ WebGPUEngine.prototype.createUniformBuffer = function (elements) {
8
8
  else {
9
9
  view = elements;
10
10
  }
11
- const dataBuffer = this._bufferManager.createBuffer(view, WebGPUConstants.BufferUsage.Uniform | WebGPUConstants.BufferUsage.CopyDst);
11
+ const dataBuffer = this._bufferManager.createBuffer(view, WebGPUConstants.BufferUsage.Uniform | WebGPUConstants.BufferUsage.CopyDst, label);
12
12
  return dataBuffer;
13
13
  };
14
- WebGPUEngine.prototype.createDynamicUniformBuffer = function (elements) {
15
- return this.createUniformBuffer(elements);
14
+ WebGPUEngine.prototype.createDynamicUniformBuffer = function (elements, label) {
15
+ return this.createUniformBuffer(elements, label);
16
16
  };
17
17
  WebGPUEngine.prototype.updateUniformBuffer = function (uniformBuffer, elements, offset, count) {
18
18
  if (offset === undefined) {
@@ -39,7 +39,7 @@ WebGPUEngine.prototype.updateUniformBuffer = function (uniformBuffer, elements,
39
39
  }
40
40
  this._bufferManager.setSubData(dataBuffer, offset, view, 0, count);
41
41
  };
42
- WebGPUEngine.prototype.bindUniformBufferBase = function (buffer, location, name) {
42
+ WebGPUEngine.prototype.bindUniformBufferBase = function (buffer, _location, name) {
43
43
  this._currentDrawContext.setBuffer(name, buffer);
44
44
  };
45
45
  WebGPUEngine.prototype.bindUniformBlock = function () { };
@@ -1 +1 @@
1
- {"version":3,"file":"engine.uniformBuffer.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Engines/WebGPU/Extensions/engine.uniformBuffer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,eAAe,MAAM,oBAAoB,CAAC;AAEtD,YAAY,CAAC,SAAS,CAAC,mBAAmB,GAAG,UAAU,QAAoB;IACvE,IAAI,IAAkB,CAAC;IACvB,IAAI,QAAQ,YAAY,KAAK,EAAE;QAC3B,IAAI,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;KACrC;SAAM;QACH,IAAI,GAAG,QAAQ,CAAC;KACnB;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,EAAE,eAAe,CAAC,WAAW,CAAC,OAAO,GAAG,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACrI,OAAO,UAAU,CAAC;AACtB,CAAC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,0BAA0B,GAAG,UAAU,QAAoB;IAC9E,OAAO,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,mBAAmB,GAAG,UAAU,aAAyB,EAAE,QAAoB,EAAE,MAAe,EAAE,KAAc;IACnI,IAAI,MAAM,KAAK,SAAS,EAAE;QACtB,MAAM,GAAG,CAAC,CAAC;KACd;IAED,MAAM,UAAU,GAAG,aAAiC,CAAC;IACrD,IAAI,IAAkB,CAAC;IACvB,IAAI,KAAK,KAAK,SAAS,EAAE;QACrB,IAAI,QAAQ,YAAY,YAAY,EAAE;YAClC,IAAI,GAAG,QAAQ,CAAC;SACnB;aAAM;YACH,IAAI,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;SACrC;QACD,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;KAC3B;SAAM;QACH,IAAI,QAAQ,YAAY,YAAY,EAAE;YAClC,IAAI,GAAG,QAAQ,CAAC;SACnB;aAAM;YACH,IAAI,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;SACrC;KACJ;IAED,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AACvE,CAAC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,qBAAqB,GAAG,UAAU,MAAkB,EAAE,QAAgB,EAAE,IAAY;IACvG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,EAAE,MAA0B,CAAC,CAAC;AACzE,CAAC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,gBAAgB,GAAG,cAAmB,CAAC,CAAC","sourcesContent":["import type { DataBuffer } from \"../../../Buffers/dataBuffer\";\r\nimport type { WebGPUDataBuffer } from \"../../../Meshes/WebGPU/webgpuDataBuffer\";\r\nimport type { FloatArray } from \"../../../types\";\r\nimport { WebGPUEngine } from \"../../webgpuEngine\";\r\nimport * as WebGPUConstants from \"../webgpuConstants\";\r\n\r\nWebGPUEngine.prototype.createUniformBuffer = function (elements: FloatArray): DataBuffer {\r\n let view: Float32Array;\r\n if (elements instanceof Array) {\r\n view = new Float32Array(elements);\r\n } else {\r\n view = elements;\r\n }\r\n\r\n const dataBuffer = this._bufferManager.createBuffer(view, WebGPUConstants.BufferUsage.Uniform | WebGPUConstants.BufferUsage.CopyDst);\r\n return dataBuffer;\r\n};\r\n\r\nWebGPUEngine.prototype.createDynamicUniformBuffer = function (elements: FloatArray): DataBuffer {\r\n return this.createUniformBuffer(elements);\r\n};\r\n\r\nWebGPUEngine.prototype.updateUniformBuffer = function (uniformBuffer: DataBuffer, elements: FloatArray, offset?: number, count?: number): void {\r\n if (offset === undefined) {\r\n offset = 0;\r\n }\r\n\r\n const dataBuffer = uniformBuffer as WebGPUDataBuffer;\r\n let view: Float32Array;\r\n if (count === undefined) {\r\n if (elements instanceof Float32Array) {\r\n view = elements;\r\n } else {\r\n view = new Float32Array(elements);\r\n }\r\n count = view.byteLength;\r\n } else {\r\n if (elements instanceof Float32Array) {\r\n view = elements;\r\n } else {\r\n view = new Float32Array(elements);\r\n }\r\n }\r\n\r\n this._bufferManager.setSubData(dataBuffer, offset, view, 0, count);\r\n};\r\n\r\nWebGPUEngine.prototype.bindUniformBufferBase = function (buffer: DataBuffer, location: number, name: string): void {\r\n this._currentDrawContext.setBuffer(name, buffer as WebGPUDataBuffer);\r\n};\r\n\r\nWebGPUEngine.prototype.bindUniformBlock = function (): void {};\r\n"]}
1
+ {"version":3,"file":"engine.uniformBuffer.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Engines/WebGPU/Extensions/engine.uniformBuffer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,eAAe,MAAM,oBAAoB,CAAC;AAEtD,YAAY,CAAC,SAAS,CAAC,mBAAmB,GAAG,UAAU,QAAoB,EAAE,KAAc;IACvF,IAAI,IAAkB,CAAC;IACvB,IAAI,QAAQ,YAAY,KAAK,EAAE;QAC3B,IAAI,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;KACrC;SAAM;QACH,IAAI,GAAG,QAAQ,CAAC;KACnB;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,IAAI,EAAE,eAAe,CAAC,WAAW,CAAC,OAAO,GAAG,eAAe,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC5I,OAAO,UAAU,CAAC;AACtB,CAAC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,0BAA0B,GAAG,UAAU,QAAoB,EAAE,KAAc;IAC9F,OAAO,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACrD,CAAC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,mBAAmB,GAAG,UAAU,aAAyB,EAAE,QAAoB,EAAE,MAAe,EAAE,KAAc;IACnI,IAAI,MAAM,KAAK,SAAS,EAAE;QACtB,MAAM,GAAG,CAAC,CAAC;KACd;IAED,MAAM,UAAU,GAAG,aAAiC,CAAC;IACrD,IAAI,IAAkB,CAAC;IACvB,IAAI,KAAK,KAAK,SAAS,EAAE;QACrB,IAAI,QAAQ,YAAY,YAAY,EAAE;YAClC,IAAI,GAAG,QAAQ,CAAC;SACnB;aAAM;YACH,IAAI,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;SACrC;QACD,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;KAC3B;SAAM;QACH,IAAI,QAAQ,YAAY,YAAY,EAAE;YAClC,IAAI,GAAG,QAAQ,CAAC;SACnB;aAAM;YACH,IAAI,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;SACrC;KACJ;IAED,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AACvE,CAAC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,qBAAqB,GAAG,UAAU,MAAkB,EAAE,SAAiB,EAAE,IAAY;IACxG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,EAAE,MAA0B,CAAC,CAAC;AACzE,CAAC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,gBAAgB,GAAG,cAAmB,CAAC,CAAC","sourcesContent":["import type { DataBuffer } from \"../../../Buffers/dataBuffer\";\r\nimport type { WebGPUDataBuffer } from \"../../../Meshes/WebGPU/webgpuDataBuffer\";\r\nimport type { FloatArray } from \"../../../types\";\r\nimport { WebGPUEngine } from \"../../webgpuEngine\";\r\nimport * as WebGPUConstants from \"../webgpuConstants\";\r\n\r\nWebGPUEngine.prototype.createUniformBuffer = function (elements: FloatArray, label?: string): DataBuffer {\r\n let view: Float32Array;\r\n if (elements instanceof Array) {\r\n view = new Float32Array(elements);\r\n } else {\r\n view = elements;\r\n }\r\n\r\n const dataBuffer = this._bufferManager.createBuffer(view, WebGPUConstants.BufferUsage.Uniform | WebGPUConstants.BufferUsage.CopyDst, label);\r\n return dataBuffer;\r\n};\r\n\r\nWebGPUEngine.prototype.createDynamicUniformBuffer = function (elements: FloatArray, label?: string): DataBuffer {\r\n return this.createUniformBuffer(elements, label);\r\n};\r\n\r\nWebGPUEngine.prototype.updateUniformBuffer = function (uniformBuffer: DataBuffer, elements: FloatArray, offset?: number, count?: number): void {\r\n if (offset === undefined) {\r\n offset = 0;\r\n }\r\n\r\n const dataBuffer = uniformBuffer as WebGPUDataBuffer;\r\n let view: Float32Array;\r\n if (count === undefined) {\r\n if (elements instanceof Float32Array) {\r\n view = elements;\r\n } else {\r\n view = new Float32Array(elements);\r\n }\r\n count = view.byteLength;\r\n } else {\r\n if (elements instanceof Float32Array) {\r\n view = elements;\r\n } else {\r\n view = new Float32Array(elements);\r\n }\r\n }\r\n\r\n this._bufferManager.setSubData(dataBuffer, offset, view, 0, count);\r\n};\r\n\r\nWebGPUEngine.prototype.bindUniformBufferBase = function (buffer: DataBuffer, _location: number, name: string): void {\r\n this._currentDrawContext.setBuffer(name, buffer as WebGPUDataBuffer);\r\n};\r\n\r\nWebGPUEngine.prototype.bindUniformBlock = function (): void {};\r\n"]}
@@ -6,9 +6,10 @@ export declare class WebGPUBufferManager {
6
6
  private _device;
7
7
  private _deferredReleaseBuffers;
8
8
  private static _IsGPUBuffer;
9
+ private static _FlagsToString;
9
10
  constructor(device: GPUDevice);
10
- createRawBuffer(viewOrSize: ArrayBufferView | number, flags: GPUBufferUsageFlags, mappedAtCreation?: boolean): GPUBuffer;
11
- createBuffer(viewOrSize: ArrayBufferView | number, flags: GPUBufferUsageFlags): WebGPUDataBuffer;
11
+ createRawBuffer(viewOrSize: ArrayBufferView | number, flags: GPUBufferUsageFlags, mappedAtCreation?: boolean, label?: string): GPUBuffer;
12
+ createBuffer(viewOrSize: ArrayBufferView | number, flags: GPUBufferUsageFlags, label?: string): WebGPUDataBuffer;
12
13
  setRawData(buffer: GPUBuffer, dstByteOffset: number, src: ArrayBufferView, srcByteOffset: number, byteLength: number): void;
13
14
  setSubData(dataBuffer: WebGPUDataBuffer, dstByteOffset: number, src: ArrayBufferView, srcByteOffset?: number, byteLength?: number): void;
14
15
  private _getHalfFloatAsFloatRGBAArrayBuffer;
@@ -8,22 +8,35 @@ export class WebGPUBufferManager {
8
8
  static _IsGPUBuffer(buffer) {
9
9
  return buffer.underlyingResource === undefined;
10
10
  }
11
+ static _FlagsToString(flags, suffix = "") {
12
+ let result = suffix;
13
+ for (let i = 0; i <= 9; ++i) {
14
+ if (flags & (1 << i)) {
15
+ if (result) {
16
+ result += "_";
17
+ }
18
+ result += WebGPUConstants.BufferUsage[1 << i];
19
+ }
20
+ }
21
+ return result;
22
+ }
11
23
  constructor(device) {
12
24
  this._deferredReleaseBuffers = [];
13
25
  this._device = device;
14
26
  }
15
- createRawBuffer(viewOrSize, flags, mappedAtCreation = false) {
27
+ createRawBuffer(viewOrSize, flags, mappedAtCreation = false, label) {
16
28
  const alignedLength = viewOrSize.byteLength !== undefined ? (viewOrSize.byteLength + 3) & ~3 : (viewOrSize + 3) & ~3; // 4 bytes alignments (because of the upload which requires this)
17
29
  const verticesBufferDescriptor = {
30
+ label: WebGPUBufferManager._FlagsToString(flags, label !== null && label !== void 0 ? label : "Buffer") + "_size" + alignedLength,
18
31
  mappedAtCreation,
19
32
  size: alignedLength,
20
33
  usage: flags,
21
34
  };
22
35
  return this._device.createBuffer(verticesBufferDescriptor);
23
36
  }
24
- createBuffer(viewOrSize, flags) {
37
+ createBuffer(viewOrSize, flags, label) {
25
38
  const isView = viewOrSize.byteLength !== undefined;
26
- const buffer = this.createRawBuffer(viewOrSize, flags);
39
+ const buffer = this.createRawBuffer(viewOrSize, flags, undefined, label);
27
40
  const dataBuffer = new WebGPUDataBuffer(buffer);
28
41
  dataBuffer.references = 1;
29
42
  dataBuffer.capacity = isView ? viewOrSize.byteLength : viewOrSize;
@@ -1 +1 @@
1
- {"version":3,"file":"webgpuBufferManager.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuBufferManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DataBuffer } from \"../../Buffers/dataBuffer\";\r\nimport { WebGPUDataBuffer } from \"../../Meshes/WebGPU/webgpuDataBuffer\";\r\nimport { FromHalfFloat } from \"../../Misc/textureTools\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Constants } from \"../constants\";\r\nimport { allocateAndCopyTypedBuffer } from \"../Extensions/engine.readTexture\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\n\r\n/** @internal */\r\nexport class WebGPUBufferManager {\r\n private _device: GPUDevice;\r\n private _deferredReleaseBuffers: Array<GPUBuffer> = [];\r\n\r\n private static _IsGPUBuffer(buffer: DataBuffer | GPUBuffer): buffer is GPUBuffer {\r\n return (buffer as DataBuffer).underlyingResource === undefined;\r\n }\r\n\r\n constructor(device: GPUDevice) {\r\n this._device = device;\r\n }\r\n\r\n public createRawBuffer(viewOrSize: ArrayBufferView | number, flags: GPUBufferUsageFlags, mappedAtCreation = false): GPUBuffer {\r\n const alignedLength = (viewOrSize as ArrayBufferView).byteLength !== undefined ? ((viewOrSize as ArrayBufferView).byteLength + 3) & ~3 : ((viewOrSize as number) + 3) & ~3; // 4 bytes alignments (because of the upload which requires this)\r\n const verticesBufferDescriptor = {\r\n mappedAtCreation,\r\n size: alignedLength,\r\n usage: flags,\r\n };\r\n\r\n return this._device.createBuffer(verticesBufferDescriptor);\r\n }\r\n\r\n public createBuffer(viewOrSize: ArrayBufferView | number, flags: GPUBufferUsageFlags): WebGPUDataBuffer {\r\n const isView = (viewOrSize as ArrayBufferView).byteLength !== undefined;\r\n const buffer = this.createRawBuffer(viewOrSize, flags);\r\n const dataBuffer = new WebGPUDataBuffer(buffer);\r\n dataBuffer.references = 1;\r\n dataBuffer.capacity = isView ? (viewOrSize as ArrayBufferView).byteLength : (viewOrSize as number);\r\n\r\n if (isView) {\r\n this.setSubData(dataBuffer, 0, viewOrSize as ArrayBufferView);\r\n }\r\n\r\n return dataBuffer;\r\n }\r\n\r\n public setRawData(buffer: GPUBuffer, dstByteOffset: number, src: ArrayBufferView, srcByteOffset: number, byteLength: number): void {\r\n this._device.queue.writeBuffer(buffer, dstByteOffset, src.buffer, srcByteOffset, byteLength);\r\n }\r\n\r\n public setSubData(dataBuffer: WebGPUDataBuffer, dstByteOffset: number, src: ArrayBufferView, srcByteOffset = 0, byteLength = 0): void {\r\n const buffer = dataBuffer.underlyingResource as GPUBuffer;\r\n\r\n byteLength = byteLength || src.byteLength;\r\n byteLength = Math.min(byteLength, dataBuffer.capacity - dstByteOffset);\r\n\r\n // After Migration to Canary\r\n let chunkStart = src.byteOffset + srcByteOffset;\r\n let chunkEnd = chunkStart + byteLength;\r\n\r\n // 4 bytes alignments for upload\r\n const alignedLength = (byteLength + 3) & ~3;\r\n if (alignedLength !== byteLength) {\r\n const tempView = new Uint8Array(src.buffer.slice(chunkStart, chunkEnd));\r\n src = new Uint8Array(alignedLength);\r\n (src as Uint8Array).set(tempView);\r\n srcByteOffset = 0;\r\n chunkStart = 0;\r\n chunkEnd = alignedLength;\r\n byteLength = alignedLength;\r\n }\r\n\r\n // Chunk\r\n const maxChunk = 1024 * 1024 * 15;\r\n let offset = 0;\r\n while (chunkEnd - (chunkStart + offset) > maxChunk) {\r\n this._device.queue.writeBuffer(buffer, dstByteOffset + offset, src.buffer, chunkStart + offset, maxChunk);\r\n offset += maxChunk;\r\n }\r\n\r\n this._device.queue.writeBuffer(buffer, dstByteOffset + offset, src.buffer, chunkStart + offset, byteLength - offset);\r\n }\r\n\r\n private _getHalfFloatAsFloatRGBAArrayBuffer(dataLength: number, arrayBuffer: ArrayBuffer, destArray?: Float32Array): Float32Array {\r\n if (!destArray) {\r\n destArray = new Float32Array(dataLength);\r\n }\r\n const srcData = new Uint16Array(arrayBuffer);\r\n while (dataLength--) {\r\n destArray[dataLength] = FromHalfFloat(srcData[dataLength]);\r\n }\r\n\r\n return destArray;\r\n }\r\n\r\n public readDataFromBuffer(\r\n gpuBuffer: GPUBuffer,\r\n size: number,\r\n width: number,\r\n height: number,\r\n bytesPerRow: number,\r\n bytesPerRowAligned: number,\r\n type = Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n offset = 0,\r\n buffer: Nullable<ArrayBufferView> = null,\r\n destroyBuffer = true,\r\n noDataConversion = false\r\n ): Promise<ArrayBufferView> {\r\n const floatFormat = type === Constants.TEXTURETYPE_FLOAT ? 2 : type === Constants.TEXTURETYPE_HALF_FLOAT ? 1 : 0;\r\n return new Promise((resolve, reject) => {\r\n gpuBuffer.mapAsync(WebGPUConstants.MapMode.Read, offset, size).then(\r\n () => {\r\n const copyArrayBuffer = gpuBuffer.getMappedRange(offset, size);\r\n let data: Nullable<ArrayBufferView> | Uint8Array | Float32Array = buffer;\r\n if (noDataConversion) {\r\n if (data === null) {\r\n data = allocateAndCopyTypedBuffer(type, size, true, copyArrayBuffer);\r\n } else {\r\n data = allocateAndCopyTypedBuffer(type, data.buffer, undefined, copyArrayBuffer);\r\n }\r\n } else {\r\n if (data === null) {\r\n switch (floatFormat) {\r\n case 0: // byte format\r\n data = new Uint8Array(size);\r\n (data as Uint8Array).set(new Uint8Array(copyArrayBuffer));\r\n break;\r\n case 1: // half float\r\n // TODO WEBGPU use computer shaders (or render pass) to make the conversion?\r\n data = this._getHalfFloatAsFloatRGBAArrayBuffer(size / 2, copyArrayBuffer);\r\n break;\r\n case 2: // float\r\n data = new Float32Array(size / 4);\r\n (data as Float32Array).set(new Float32Array(copyArrayBuffer));\r\n break;\r\n }\r\n } else {\r\n switch (floatFormat) {\r\n case 0: // byte format\r\n data = new Uint8Array(data.buffer);\r\n (data as Uint8Array).set(new Uint8Array(copyArrayBuffer));\r\n break;\r\n case 1: // half float\r\n // TODO WEBGPU use computer shaders (or render pass) to make the conversion?\r\n data = this._getHalfFloatAsFloatRGBAArrayBuffer(size / 2, copyArrayBuffer, buffer as Float32Array);\r\n break;\r\n case 2: // float\r\n data = new Float32Array(data.buffer);\r\n (data as Float32Array).set(new Float32Array(copyArrayBuffer));\r\n break;\r\n }\r\n }\r\n }\r\n if (bytesPerRow !== bytesPerRowAligned) {\r\n // TODO WEBGPU use computer shaders (or render pass) to build the final buffer data?\r\n if (floatFormat === 1 && !noDataConversion) {\r\n // half float have been converted to float above\r\n bytesPerRow *= 2;\r\n bytesPerRowAligned *= 2;\r\n }\r\n const data2 = new Uint8Array(data!.buffer);\r\n let offset = bytesPerRow,\r\n offset2 = 0;\r\n for (let y = 1; y < height; ++y) {\r\n offset2 = y * bytesPerRowAligned;\r\n for (let x = 0; x < bytesPerRow; ++x) {\r\n data2[offset++] = data2[offset2++];\r\n }\r\n }\r\n if (floatFormat !== 0 && !noDataConversion) {\r\n data = new Float32Array(data2.buffer, 0, offset / 4);\r\n } else {\r\n data = new Uint8Array(data2.buffer, 0, offset);\r\n }\r\n }\r\n gpuBuffer.unmap();\r\n if (destroyBuffer) {\r\n this.releaseBuffer(gpuBuffer);\r\n }\r\n resolve(data!);\r\n },\r\n (reason) => reject(reason)\r\n );\r\n });\r\n }\r\n\r\n public releaseBuffer(buffer: DataBuffer | GPUBuffer): boolean {\r\n if (WebGPUBufferManager._IsGPUBuffer(buffer)) {\r\n this._deferredReleaseBuffers.push(buffer);\r\n return true;\r\n }\r\n\r\n buffer.references--;\r\n\r\n if (buffer.references === 0) {\r\n this._deferredReleaseBuffers.push(buffer.underlyingResource as GPUBuffer);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public destroyDeferredBuffers(): void {\r\n for (let i = 0; i < this._deferredReleaseBuffers.length; ++i) {\r\n this._deferredReleaseBuffers[i].destroy();\r\n }\r\n\r\n this._deferredReleaseBuffers.length = 0;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"webgpuBufferManager.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuBufferManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DataBuffer } from \"../../Buffers/dataBuffer\";\r\nimport { WebGPUDataBuffer } from \"../../Meshes/WebGPU/webgpuDataBuffer\";\r\nimport { FromHalfFloat } from \"../../Misc/textureTools\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Constants } from \"../constants\";\r\nimport { allocateAndCopyTypedBuffer } from \"../Extensions/engine.readTexture\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\n\r\n/** @internal */\r\nexport class WebGPUBufferManager {\r\n private _device: GPUDevice;\r\n private _deferredReleaseBuffers: Array<GPUBuffer> = [];\r\n\r\n private static _IsGPUBuffer(buffer: DataBuffer | GPUBuffer): buffer is GPUBuffer {\r\n return (buffer as DataBuffer).underlyingResource === undefined;\r\n }\r\n\r\n private static _FlagsToString(flags: GPUBufferUsageFlags, suffix = \"\") {\r\n let result = suffix;\r\n\r\n for (let i = 0; i <= 9; ++i) {\r\n if (flags & (1 << i)) {\r\n if (result) {\r\n result += \"_\";\r\n }\r\n result += WebGPUConstants.BufferUsage[1 << i];\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n constructor(device: GPUDevice) {\r\n this._device = device;\r\n }\r\n\r\n public createRawBuffer(viewOrSize: ArrayBufferView | number, flags: GPUBufferUsageFlags, mappedAtCreation = false, label?: string): GPUBuffer {\r\n const alignedLength = (viewOrSize as ArrayBufferView).byteLength !== undefined ? ((viewOrSize as ArrayBufferView).byteLength + 3) & ~3 : ((viewOrSize as number) + 3) & ~3; // 4 bytes alignments (because of the upload which requires this)\r\n const verticesBufferDescriptor = {\r\n label: WebGPUBufferManager._FlagsToString(flags, label ?? \"Buffer\") + \"_size\" + alignedLength,\r\n mappedAtCreation,\r\n size: alignedLength,\r\n usage: flags,\r\n };\r\n\r\n return this._device.createBuffer(verticesBufferDescriptor);\r\n }\r\n\r\n public createBuffer(viewOrSize: ArrayBufferView | number, flags: GPUBufferUsageFlags, label?: string): WebGPUDataBuffer {\r\n const isView = (viewOrSize as ArrayBufferView).byteLength !== undefined;\r\n const buffer = this.createRawBuffer(viewOrSize, flags, undefined, label);\r\n const dataBuffer = new WebGPUDataBuffer(buffer);\r\n dataBuffer.references = 1;\r\n dataBuffer.capacity = isView ? (viewOrSize as ArrayBufferView).byteLength : (viewOrSize as number);\r\n\r\n if (isView) {\r\n this.setSubData(dataBuffer, 0, viewOrSize as ArrayBufferView);\r\n }\r\n\r\n return dataBuffer;\r\n }\r\n\r\n public setRawData(buffer: GPUBuffer, dstByteOffset: number, src: ArrayBufferView, srcByteOffset: number, byteLength: number): void {\r\n this._device.queue.writeBuffer(buffer, dstByteOffset, src.buffer, srcByteOffset, byteLength);\r\n }\r\n\r\n public setSubData(dataBuffer: WebGPUDataBuffer, dstByteOffset: number, src: ArrayBufferView, srcByteOffset = 0, byteLength = 0): void {\r\n const buffer = dataBuffer.underlyingResource as GPUBuffer;\r\n\r\n byteLength = byteLength || src.byteLength;\r\n byteLength = Math.min(byteLength, dataBuffer.capacity - dstByteOffset);\r\n\r\n // After Migration to Canary\r\n let chunkStart = src.byteOffset + srcByteOffset;\r\n let chunkEnd = chunkStart + byteLength;\r\n\r\n // 4 bytes alignments for upload\r\n const alignedLength = (byteLength + 3) & ~3;\r\n if (alignedLength !== byteLength) {\r\n const tempView = new Uint8Array(src.buffer.slice(chunkStart, chunkEnd));\r\n src = new Uint8Array(alignedLength);\r\n (src as Uint8Array).set(tempView);\r\n srcByteOffset = 0;\r\n chunkStart = 0;\r\n chunkEnd = alignedLength;\r\n byteLength = alignedLength;\r\n }\r\n\r\n // Chunk\r\n const maxChunk = 1024 * 1024 * 15;\r\n let offset = 0;\r\n while (chunkEnd - (chunkStart + offset) > maxChunk) {\r\n this._device.queue.writeBuffer(buffer, dstByteOffset + offset, src.buffer, chunkStart + offset, maxChunk);\r\n offset += maxChunk;\r\n }\r\n\r\n this._device.queue.writeBuffer(buffer, dstByteOffset + offset, src.buffer, chunkStart + offset, byteLength - offset);\r\n }\r\n\r\n private _getHalfFloatAsFloatRGBAArrayBuffer(dataLength: number, arrayBuffer: ArrayBuffer, destArray?: Float32Array): Float32Array {\r\n if (!destArray) {\r\n destArray = new Float32Array(dataLength);\r\n }\r\n const srcData = new Uint16Array(arrayBuffer);\r\n while (dataLength--) {\r\n destArray[dataLength] = FromHalfFloat(srcData[dataLength]);\r\n }\r\n\r\n return destArray;\r\n }\r\n\r\n public readDataFromBuffer(\r\n gpuBuffer: GPUBuffer,\r\n size: number,\r\n width: number,\r\n height: number,\r\n bytesPerRow: number,\r\n bytesPerRowAligned: number,\r\n type = Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n offset = 0,\r\n buffer: Nullable<ArrayBufferView> = null,\r\n destroyBuffer = true,\r\n noDataConversion = false\r\n ): Promise<ArrayBufferView> {\r\n const floatFormat = type === Constants.TEXTURETYPE_FLOAT ? 2 : type === Constants.TEXTURETYPE_HALF_FLOAT ? 1 : 0;\r\n return new Promise((resolve, reject) => {\r\n gpuBuffer.mapAsync(WebGPUConstants.MapMode.Read, offset, size).then(\r\n () => {\r\n const copyArrayBuffer = gpuBuffer.getMappedRange(offset, size);\r\n let data: Nullable<ArrayBufferView> | Uint8Array | Float32Array = buffer;\r\n if (noDataConversion) {\r\n if (data === null) {\r\n data = allocateAndCopyTypedBuffer(type, size, true, copyArrayBuffer);\r\n } else {\r\n data = allocateAndCopyTypedBuffer(type, data.buffer, undefined, copyArrayBuffer);\r\n }\r\n } else {\r\n if (data === null) {\r\n switch (floatFormat) {\r\n case 0: // byte format\r\n data = new Uint8Array(size);\r\n (data as Uint8Array).set(new Uint8Array(copyArrayBuffer));\r\n break;\r\n case 1: // half float\r\n // TODO WEBGPU use computer shaders (or render pass) to make the conversion?\r\n data = this._getHalfFloatAsFloatRGBAArrayBuffer(size / 2, copyArrayBuffer);\r\n break;\r\n case 2: // float\r\n data = new Float32Array(size / 4);\r\n (data as Float32Array).set(new Float32Array(copyArrayBuffer));\r\n break;\r\n }\r\n } else {\r\n switch (floatFormat) {\r\n case 0: // byte format\r\n data = new Uint8Array(data.buffer);\r\n (data as Uint8Array).set(new Uint8Array(copyArrayBuffer));\r\n break;\r\n case 1: // half float\r\n // TODO WEBGPU use computer shaders (or render pass) to make the conversion?\r\n data = this._getHalfFloatAsFloatRGBAArrayBuffer(size / 2, copyArrayBuffer, buffer as Float32Array);\r\n break;\r\n case 2: // float\r\n data = new Float32Array(data.buffer);\r\n (data as Float32Array).set(new Float32Array(copyArrayBuffer));\r\n break;\r\n }\r\n }\r\n }\r\n if (bytesPerRow !== bytesPerRowAligned) {\r\n // TODO WEBGPU use computer shaders (or render pass) to build the final buffer data?\r\n if (floatFormat === 1 && !noDataConversion) {\r\n // half float have been converted to float above\r\n bytesPerRow *= 2;\r\n bytesPerRowAligned *= 2;\r\n }\r\n const data2 = new Uint8Array(data!.buffer);\r\n let offset = bytesPerRow,\r\n offset2 = 0;\r\n for (let y = 1; y < height; ++y) {\r\n offset2 = y * bytesPerRowAligned;\r\n for (let x = 0; x < bytesPerRow; ++x) {\r\n data2[offset++] = data2[offset2++];\r\n }\r\n }\r\n if (floatFormat !== 0 && !noDataConversion) {\r\n data = new Float32Array(data2.buffer, 0, offset / 4);\r\n } else {\r\n data = new Uint8Array(data2.buffer, 0, offset);\r\n }\r\n }\r\n gpuBuffer.unmap();\r\n if (destroyBuffer) {\r\n this.releaseBuffer(gpuBuffer);\r\n }\r\n resolve(data!);\r\n },\r\n (reason) => reject(reason)\r\n );\r\n });\r\n }\r\n\r\n public releaseBuffer(buffer: DataBuffer | GPUBuffer): boolean {\r\n if (WebGPUBufferManager._IsGPUBuffer(buffer)) {\r\n this._deferredReleaseBuffers.push(buffer);\r\n return true;\r\n }\r\n\r\n buffer.references--;\r\n\r\n if (buffer.references === 0) {\r\n this._deferredReleaseBuffers.push(buffer.underlyingResource as GPUBuffer);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public destroyDeferredBuffers(): void {\r\n for (let i = 0; i < this._deferredReleaseBuffers.length; ++i) {\r\n this._deferredReleaseBuffers[i].destroy();\r\n }\r\n\r\n this._deferredReleaseBuffers.length = 0;\r\n }\r\n}\r\n"]}
@@ -59,6 +59,7 @@ export declare abstract class WebGPUCacheRenderPipeline {
59
59
  private _indexBuffer;
60
60
  private _textureState;
61
61
  private _useTextureStage;
62
+ private static _IsSignedType;
62
63
  constructor(device: GPUDevice, emptyVertexBuffer: VertexBuffer, useTextureStage: boolean);
63
64
  reset(): void;
64
65
  protected abstract _getRenderPipeline(param: {
@@ -126,5 +127,6 @@ export declare abstract class WebGPUCacheRenderPipeline {
126
127
  private _createPipelineLayout;
127
128
  private _createPipelineLayoutWithTextureStage;
128
129
  private _getVertexInputDescriptor;
130
+ private _processNonFloatVertexBuffers;
129
131
  private _createRenderPipeline;
130
132
  }
@@ -1,4 +1,6 @@
1
1
  /* eslint-disable @typescript-eslint/naming-convention */
2
+ /* eslint-disable babylonjs/available */
3
+ /* eslint-disable jsdoc/require-jsdoc */
2
4
 
3
5
  import * as WebGPUConstants from "./webgpuConstants.js";
4
6
  import { VertexBuffer } from "../../Buffers/buffer.js";
@@ -48,8 +50,40 @@ const stencilOpToIndex = {
48
50
  0x8507: 6,
49
51
  0x8508: 7, // DECR_WRAP
50
52
  };
53
+ const vertexBufferKindForNonFloatProcessing = {
54
+ [VertexBuffer.PositionKind]: true,
55
+ [VertexBuffer.NormalKind]: true,
56
+ [VertexBuffer.TangentKind]: true,
57
+ [VertexBuffer.UVKind]: true,
58
+ [VertexBuffer.UV2Kind]: true,
59
+ [VertexBuffer.UV3Kind]: true,
60
+ [VertexBuffer.UV4Kind]: true,
61
+ [VertexBuffer.UV5Kind]: true,
62
+ [VertexBuffer.UV6Kind]: true,
63
+ [VertexBuffer.ColorKind]: true,
64
+ [VertexBuffer.ColorInstanceKind]: true,
65
+ [VertexBuffer.MatricesIndicesKind]: true,
66
+ [VertexBuffer.MatricesWeightsKind]: true,
67
+ [VertexBuffer.MatricesIndicesExtraKind]: true,
68
+ [VertexBuffer.MatricesWeightsExtraKind]: true,
69
+ };
51
70
  /** @internal */
52
71
  export class WebGPUCacheRenderPipeline {
72
+ static _IsSignedType(type) {
73
+ switch (type) {
74
+ case VertexBuffer.BYTE:
75
+ case VertexBuffer.SHORT:
76
+ case VertexBuffer.INT:
77
+ case VertexBuffer.FLOAT:
78
+ return true;
79
+ case VertexBuffer.UNSIGNED_BYTE:
80
+ case VertexBuffer.UNSIGNED_SHORT:
81
+ case VertexBuffer.UNSIGNED_INT:
82
+ return false;
83
+ default:
84
+ throw new Error(`Invalid type '${type}'`);
85
+ }
86
+ }
53
87
  constructor(device, emptyVertexBuffer, useTextureStage) {
54
88
  this.mrtTextureCount = 0;
55
89
  this._device = device;
@@ -206,7 +240,7 @@ export class WebGPUCacheRenderPipeline {
206
240
  textureCount = textureCount !== null && textureCount !== void 0 ? textureCount : textureArray.length;
207
241
  if (textureCount > 10) {
208
242
  // If we want more than 10 attachments we need to change this method (and the StatePosition enum) but 10 seems plenty: note that WebGPU only supports 8 at the time (2021/12/13)!
209
- // As we need 39 different values we are using 6 bits to encode a texture format, meaning we can encode 5 texture formats in 32 bits
243
+ // As we need ~39 different values we are using 6 bits to encode a texture format, meaning we can encode 5 texture formats in 32 bits
210
244
  // We are using 2x32 bit values to handle 10 textures
211
245
  throw "Can't handle more than 10 attachments for a MRT in cache render pipeline!";
212
246
  }
@@ -717,7 +751,7 @@ export class WebGPUCacheRenderPipeline {
717
751
  if (!(currentGPUBuffer && currentGPUAttributes && currentGPUBuffer === buffer) || invalidOffsetRange) {
718
752
  const vertexBufferDescriptor = {
719
753
  arrayStride: vertexBuffer.byteStride,
720
- stepMode: vertexBuffer.getIsInstanced() ? WebGPUConstants.InputStepMode.Instance : WebGPUConstants.InputStepMode.Vertex,
754
+ stepMode: vertexBuffer.getIsInstanced() ? WebGPUConstants.VertexStepMode.Instance : WebGPUConstants.VertexStepMode.Vertex,
721
755
  attributes: [],
722
756
  };
723
757
  descriptors.push(vertexBufferDescriptor);
@@ -736,6 +770,32 @@ export class WebGPUCacheRenderPipeline {
736
770
  }
737
771
  return descriptors;
738
772
  }
773
+ _processNonFloatVertexBuffers(webgpuPipelineContext, effect) {
774
+ const webgpuShaderProcessor = webgpuPipelineContext.engine._getShaderProcessor(webgpuPipelineContext.shaderProcessingContext.shaderLanguage);
775
+ let reprocessShaders = false;
776
+ for (const kind in this._vertexBuffers) {
777
+ const currentVertexBuffer = this._vertexBuffers[kind];
778
+ if (!currentVertexBuffer || !vertexBufferKindForNonFloatProcessing[kind]) {
779
+ continue;
780
+ }
781
+ const currentVertexBufferType = currentVertexBuffer.normalized ? VertexBuffer.FLOAT : currentVertexBuffer.type;
782
+ const vertexBufferType = webgpuPipelineContext.vertexBufferKindToType[kind];
783
+ if ((currentVertexBufferType !== VertexBuffer.FLOAT && vertexBufferType === undefined) ||
784
+ (vertexBufferType !== undefined && vertexBufferType !== currentVertexBufferType)) {
785
+ reprocessShaders = true;
786
+ webgpuPipelineContext.vertexBufferKindToType[kind] = currentVertexBufferType;
787
+ if (currentVertexBufferType !== VertexBuffer.FLOAT) {
788
+ webgpuShaderProcessor.vertexBufferKindToNumberOfComponents[kind] = VertexBuffer.DeduceStride(kind);
789
+ if (WebGPUCacheRenderPipeline._IsSignedType(currentVertexBufferType)) {
790
+ webgpuShaderProcessor.vertexBufferKindToNumberOfComponents[kind] *= -1;
791
+ }
792
+ }
793
+ }
794
+ }
795
+ if (reprocessShaders) {
796
+ effect._processShaderCode(webgpuShaderProcessor, true);
797
+ }
798
+ }
739
799
  _createRenderPipeline(effect, topology, sampleCount) {
740
800
  var _a, _b, _c;
741
801
  const webgpuPipelineContext = effect._pipelineContext;
@@ -744,6 +804,7 @@ export class WebGPUCacheRenderPipeline {
744
804
  const colorStates = [];
745
805
  const alphaBlend = this._getAphaBlendState();
746
806
  const colorBlend = this._getColorBlendState();
807
+ this._processNonFloatVertexBuffers(webgpuPipelineContext, effect);
747
808
  if (this._mrtAttachments1 > 0) {
748
809
  for (let i = 0; i < this._mrtFormats.length; ++i) {
749
810
  const format = this._mrtFormats[i];