@babylonjs/core 5.0.0-alpha.57 → 5.0.0-alpha.58

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 (237) hide show
  1. package/Cameras/Inputs/BaseCameraPointersInput.d.ts +0 -1
  2. package/Cameras/Inputs/BaseCameraPointersInput.js +5 -5
  3. package/Cameras/Inputs/BaseCameraPointersInput.js.map +1 -1
  4. package/Cameras/Inputs/freeCameraMouseInput.d.ts +0 -1
  5. package/Cameras/Inputs/freeCameraMouseInput.js +27 -28
  6. package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
  7. package/Cameras/camera.d.ts +4 -0
  8. package/Cameras/camera.js +2 -0
  9. package/Cameras/camera.js.map +1 -1
  10. package/Culling/boundingBox.d.ts +7 -1
  11. package/Culling/boundingBox.js +4 -0
  12. package/Culling/boundingBox.js.map +1 -1
  13. package/DeviceInput/Helpers/eventFactory.js +1 -2
  14. package/DeviceInput/Helpers/eventFactory.js.map +1 -1
  15. package/DeviceInput/Implementations/webDeviceInputSystem.d.ts +1 -0
  16. package/DeviceInput/Implementations/webDeviceInputSystem.js +5 -12
  17. package/DeviceInput/Implementations/webDeviceInputSystem.js.map +1 -1
  18. package/DeviceInput/InputDevices/deviceEnums.d.ts +1 -3
  19. package/DeviceInput/InputDevices/deviceEnums.js +0 -2
  20. package/DeviceInput/InputDevices/deviceEnums.js.map +1 -1
  21. package/Engines/IDrawContext.d.ts +3 -0
  22. package/Engines/IDrawContext.js.map +1 -1
  23. package/Engines/WebGPU/Extensions/engine.alpha.js +1 -1
  24. package/Engines/WebGPU/Extensions/engine.alpha.js.map +1 -1
  25. package/Engines/WebGPU/Extensions/engine.storageBuffer.js +1 -1
  26. package/Engines/WebGPU/Extensions/engine.storageBuffer.js.map +1 -1
  27. package/Engines/WebGPU/Extensions/engine.uniformBuffer.js +1 -1
  28. package/Engines/WebGPU/Extensions/engine.uniformBuffer.js.map +1 -1
  29. package/Engines/WebGPU/webgpuBufferManager.d.ts +1 -0
  30. package/Engines/WebGPU/webgpuBufferManager.js +3 -0
  31. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  32. package/Engines/WebGPU/webgpuCacheBindGroups.d.ts +3 -2
  33. package/Engines/WebGPU/webgpuCacheBindGroups.js +15 -14
  34. package/Engines/WebGPU/webgpuCacheBindGroups.js.map +1 -1
  35. package/Engines/WebGPU/webgpuCacheRenderPipelineTree.d.ts +2 -0
  36. package/Engines/WebGPU/webgpuCacheRenderPipelineTree.js +17 -0
  37. package/Engines/WebGPU/webgpuCacheRenderPipelineTree.js.map +1 -1
  38. package/Engines/WebGPU/webgpuDrawContext.d.ts +21 -2
  39. package/Engines/WebGPU/webgpuDrawContext.js +67 -1
  40. package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
  41. package/Engines/WebGPU/webgpuMaterialContext.d.ts +0 -6
  42. package/Engines/WebGPU/webgpuMaterialContext.js +0 -6
  43. package/Engines/WebGPU/webgpuMaterialContext.js.map +1 -1
  44. package/Engines/WebGPU/webgpuShaderProcessor.d.ts +1 -0
  45. package/Engines/WebGPU/webgpuShaderProcessor.js +2 -1
  46. package/Engines/WebGPU/webgpuShaderProcessor.js.map +1 -1
  47. package/Engines/WebGPU/webgpuTextureHelper.js +1 -1
  48. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  49. package/Engines/constants.d.ts +1 -7
  50. package/Engines/constants.js +1 -7
  51. package/Engines/constants.js.map +1 -1
  52. package/Engines/engine.d.ts +37 -2
  53. package/Engines/engine.js +68 -0
  54. package/Engines/engine.js.map +1 -1
  55. package/Engines/engineFeatures.d.ts +2 -0
  56. package/Engines/engineFeatures.js.map +1 -1
  57. package/Engines/nativeEngine.js +1 -0
  58. package/Engines/nativeEngine.js.map +1 -1
  59. package/Engines/nullEngine.js +1 -0
  60. package/Engines/nullEngine.js.map +1 -1
  61. package/Engines/thinEngine.d.ts +4 -0
  62. package/Engines/thinEngine.js +3 -2
  63. package/Engines/thinEngine.js.map +1 -1
  64. package/Engines/webgpuEngine.d.ts +14 -6
  65. package/Engines/webgpuEngine.js +107 -57
  66. package/Engines/webgpuEngine.js.map +1 -1
  67. package/Inputs/scene.inputManager.js +2 -3
  68. package/Inputs/scene.inputManager.js.map +1 -1
  69. package/Layers/effectLayer.d.ts +0 -2
  70. package/Layers/effectLayer.js +12 -11
  71. package/Layers/effectLayer.js.map +1 -1
  72. package/Layers/effectLayerSceneComponent.js +5 -0
  73. package/Layers/effectLayerSceneComponent.js.map +1 -1
  74. package/Layers/glowLayer.js +2 -0
  75. package/Layers/glowLayer.js.map +1 -1
  76. package/Layers/highlightLayer.js +2 -0
  77. package/Layers/highlightLayer.js.map +1 -1
  78. package/LensFlares/lensFlare.d.ts +3 -0
  79. package/LensFlares/lensFlare.js +5 -0
  80. package/LensFlares/lensFlare.js.map +1 -1
  81. package/LensFlares/lensFlareSystem.d.ts +2 -1
  82. package/LensFlares/lensFlareSystem.js +15 -12
  83. package/LensFlares/lensFlareSystem.js.map +1 -1
  84. package/Lights/Shadows/cascadedShadowGenerator.d.ts +0 -2
  85. package/Lights/Shadows/cascadedShadowGenerator.js +3 -12
  86. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  87. package/Lights/Shadows/shadowGenerator.d.ts +0 -3
  88. package/Lights/Shadows/shadowGenerator.js +8 -14
  89. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  90. package/Lights/light.js +3 -0
  91. package/Lights/light.js.map +1 -1
  92. package/Loading/Plugins/babylonFileLoader.js +3 -0
  93. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  94. package/Materials/Background/backgroundMaterial.js +8 -11
  95. package/Materials/Background/backgroundMaterial.js.map +1 -1
  96. package/Materials/Node/Blocks/PBR/reflectionBlock.js +1 -1
  97. package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
  98. package/Materials/Node/Blocks/cloudBlock.d.ts +4 -0
  99. package/Materials/Node/Blocks/cloudBlock.js +27 -8
  100. package/Materials/Node/Blocks/cloudBlock.js.map +1 -1
  101. package/Materials/Node/Blocks/colorMergerBlock.d.ts +21 -0
  102. package/Materials/Node/Blocks/colorMergerBlock.js +48 -4
  103. package/Materials/Node/Blocks/colorMergerBlock.js.map +1 -1
  104. package/Materials/Node/Blocks/vectorMergerBlock.d.ts +25 -0
  105. package/Materials/Node/Blocks/vectorMergerBlock.js +93 -23
  106. package/Materials/Node/Blocks/vectorMergerBlock.js.map +1 -1
  107. package/Materials/Node/nodeMaterial.js +4 -4
  108. package/Materials/Node/nodeMaterial.js.map +1 -1
  109. package/Materials/PBR/pbrBaseMaterial.js +8 -4
  110. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  111. package/Materials/PBR/pbrClearCoatConfiguration.js +1 -1
  112. package/Materials/PBR/pbrClearCoatConfiguration.js.map +1 -1
  113. package/Materials/PBR/pbrSheenConfiguration.js +1 -1
  114. package/Materials/PBR/pbrSheenConfiguration.js.map +1 -1
  115. package/Materials/PBR/pbrSubSurfaceConfiguration.js +1 -1
  116. package/Materials/PBR/pbrSubSurfaceConfiguration.js.map +1 -1
  117. package/Materials/Textures/baseTexture.d.ts +2 -0
  118. package/Materials/Textures/baseTexture.js +2 -0
  119. package/Materials/Textures/baseTexture.js.map +1 -1
  120. package/Materials/Textures/renderTargetTexture.d.ts +27 -0
  121. package/Materials/Textures/renderTargetTexture.js +127 -14
  122. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  123. package/Materials/Textures/texture.js +11 -4
  124. package/Materials/Textures/texture.js.map +1 -1
  125. package/Materials/drawWrapper.d.ts +2 -1
  126. package/Materials/drawWrapper.js +10 -1
  127. package/Materials/drawWrapper.js.map +1 -1
  128. package/Materials/material.d.ts +3 -1
  129. package/Materials/material.detailMapConfiguration.d.ts +1 -1
  130. package/Materials/material.detailMapConfiguration.js +2 -2
  131. package/Materials/material.detailMapConfiguration.js.map +1 -1
  132. package/Materials/material.js +18 -9
  133. package/Materials/material.js.map +1 -1
  134. package/Materials/pushMaterial.js +1 -1
  135. package/Materials/pushMaterial.js.map +1 -1
  136. package/Materials/shaderMaterial.d.ts +0 -1
  137. package/Materials/shaderMaterial.js +3 -4
  138. package/Materials/shaderMaterial.js.map +1 -1
  139. package/Materials/shadowDepthWrapper.d.ts +4 -4
  140. package/Materials/shadowDepthWrapper.js +16 -15
  141. package/Materials/shadowDepthWrapper.js.map +1 -1
  142. package/Materials/standardMaterial.js +8 -4
  143. package/Materials/standardMaterial.js.map +1 -1
  144. package/Materials/uniformBuffer.d.ts +10 -2
  145. package/Materials/uniformBuffer.js +17 -11
  146. package/Materials/uniformBuffer.js.map +1 -1
  147. package/Meshes/abstractMesh.d.ts +13 -0
  148. package/Meshes/abstractMesh.js +22 -2
  149. package/Meshes/abstractMesh.js.map +1 -1
  150. package/Meshes/linesMesh.js +1 -1
  151. package/Meshes/linesMesh.js.map +1 -1
  152. package/Meshes/mesh.js +15 -0
  153. package/Meshes/mesh.js.map +1 -1
  154. package/Meshes/subMesh.d.ts +10 -9
  155. package/Meshes/subMesh.js +44 -43
  156. package/Meshes/subMesh.js.map +1 -1
  157. package/Misc/environmentTextureTools.js +1 -0
  158. package/Misc/environmentTextureTools.js.map +1 -1
  159. package/Misc/rgbdTextureTools.js +1 -0
  160. package/Misc/rgbdTextureTools.js.map +1 -1
  161. package/Misc/sceneSerializer.js +17 -17
  162. package/Misc/sceneSerializer.js.map +1 -1
  163. package/Misc/textureTools.js +2 -0
  164. package/Misc/textureTools.js.map +1 -1
  165. package/Particles/gpuParticleSystem.d.ts +5 -1
  166. package/Particles/gpuParticleSystem.js +31 -5
  167. package/Particles/gpuParticleSystem.js.map +1 -1
  168. package/Particles/particleSystem.d.ts +5 -1
  169. package/Particles/particleSystem.js +35 -5
  170. package/Particles/particleSystem.js.map +1 -1
  171. package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.js +2 -0
  172. package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.js.map +1 -1
  173. package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js +1 -0
  174. package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js.map +1 -1
  175. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +1 -0
  176. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
  177. package/PostProcesses/bloomMergePostProcess.js +1 -0
  178. package/PostProcesses/bloomMergePostProcess.js.map +1 -1
  179. package/PostProcesses/depthOfFieldBlurPostProcess.js +1 -0
  180. package/PostProcesses/depthOfFieldBlurPostProcess.js.map +1 -1
  181. package/PostProcesses/depthOfFieldMergePostProcess.js +1 -0
  182. package/PostProcesses/depthOfFieldMergePostProcess.js.map +1 -1
  183. package/PostProcesses/extractHighlightsPostProcess.js +1 -0
  184. package/PostProcesses/extractHighlightsPostProcess.js.map +1 -1
  185. package/PostProcesses/postProcess.d.ts +6 -0
  186. package/PostProcesses/postProcess.js +9 -1
  187. package/PostProcesses/postProcess.js.map +1 -1
  188. package/PostProcesses/screenSpaceReflectionPostProcess.js +1 -1
  189. package/PostProcesses/screenSpaceReflectionPostProcess.js.map +1 -1
  190. package/PostProcesses/tonemapPostProcess.d.ts +2 -1
  191. package/PostProcesses/tonemapPostProcess.js +3 -2
  192. package/PostProcesses/tonemapPostProcess.js.map +1 -1
  193. package/Rendering/boundingBoxRenderer.d.ts +5 -3
  194. package/Rendering/boundingBoxRenderer.js +46 -14
  195. package/Rendering/boundingBoxRenderer.js.map +1 -1
  196. package/Rendering/depthRenderer.d.ts +9 -2
  197. package/Rendering/depthRenderer.js +77 -43
  198. package/Rendering/depthRenderer.js.map +1 -1
  199. package/Rendering/depthRendererSceneComponent.js +0 -1
  200. package/Rendering/depthRendererSceneComponent.js.map +1 -1
  201. package/Rendering/edgesRenderer.d.ts +2 -0
  202. package/Rendering/edgesRenderer.js +11 -0
  203. package/Rendering/edgesRenderer.js.map +1 -1
  204. package/Rendering/geometryBufferRenderer.js +1 -1
  205. package/Rendering/geometryBufferRenderer.js.map +1 -1
  206. package/Rendering/outlineRenderer.d.ts +5 -4
  207. package/Rendering/outlineRenderer.js +24 -19
  208. package/Rendering/outlineRenderer.js.map +1 -1
  209. package/Rendering/prePassRenderer.js +2 -1
  210. package/Rendering/prePassRenderer.js.map +1 -1
  211. package/Shaders/ShadersInclude/boundingBoxRendererFragmentDeclaration.d.ts +5 -0
  212. package/Shaders/ShadersInclude/boundingBoxRendererFragmentDeclaration.js +7 -0
  213. package/Shaders/ShadersInclude/boundingBoxRendererFragmentDeclaration.js.map +1 -0
  214. package/Shaders/ShadersInclude/boundingBoxRendererUboDeclaration.d.ts +5 -0
  215. package/Shaders/ShadersInclude/boundingBoxRendererUboDeclaration.js +7 -0
  216. package/Shaders/ShadersInclude/boundingBoxRendererUboDeclaration.js.map +1 -0
  217. package/Shaders/ShadersInclude/boundingBoxRendererVertexDeclaration.d.ts +5 -0
  218. package/Shaders/ShadersInclude/boundingBoxRendererVertexDeclaration.js +7 -0
  219. package/Shaders/ShadersInclude/boundingBoxRendererVertexDeclaration.js.map +1 -0
  220. package/Shaders/boundingBoxRenderer.fragment.d.ts +7 -0
  221. package/Shaders/boundingBoxRenderer.fragment.js +9 -0
  222. package/Shaders/boundingBoxRenderer.fragment.js.map +1 -0
  223. package/Shaders/boundingBoxRenderer.vertex.d.ts +7 -0
  224. package/Shaders/boundingBoxRenderer.vertex.js +9 -0
  225. package/Shaders/boundingBoxRenderer.vertex.js.map +1 -0
  226. package/Sprites/spriteManager.d.ts +3 -1
  227. package/Sprites/spriteManager.js +16 -5
  228. package/Sprites/spriteManager.js.map +1 -1
  229. package/Sprites/spriteRenderer.d.ts +1 -0
  230. package/Sprites/spriteRenderer.js +14 -0
  231. package/Sprites/spriteRenderer.js.map +1 -1
  232. package/XR/features/WebXRWalkingLocomotion.js +28 -13
  233. package/XR/features/WebXRWalkingLocomotion.js.map +1 -1
  234. package/package.json +16 -1
  235. package/scene.d.ts +18 -4
  236. package/scene.js +99 -34
  237. package/scene.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"engine.storageBuffer.js","sourceRoot":"","sources":["../../../../../sourceES6/core/Engines/WebGPU/Extensions/engine.storageBuffer.ts"],"names":[],"mappings":"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","sourcesContent":["import { DataBuffer } from \"../../../Buffers/dataBuffer\";\r\nimport { WebGPUDataBuffer } from \"../../../Meshes/WebGPU/webgpuDataBuffer\";\r\nimport { DataArray, Nullable } from \"../../../types\";\r\n\r\nimport { WebGPUEngine } from \"../../webgpuEngine\";\r\nimport * as WebGPUConstants from '../webgpuConstants';\r\nimport { Effect } from \"../../../Materials/effect\";\r\n\r\ndeclare type StorageBuffer = import(\"../../../Buffers/storageBuffer\").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 | 32);\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 }\r\n else if (data instanceof ArrayBuffer) {\r\n view = new Uint8Array(data);\r\n }\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 }\r\n else if (data instanceof ArrayBuffer) {\r\n view = new Uint8Array(data);\r\n }\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(\r\n storageBuffer.underlyingResource,\r\n offset ?? 0,\r\n gpuBuffer,\r\n 0,\r\n size\r\n );\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 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 }, (reason) => reject(reason));\r\n });\r\n });\r\n};\r\n\r\nWebGPUEngine.prototype.setStorageBuffer = function (name: string, buffer: Nullable<StorageBuffer>): void {\r\n this._currentMaterialContext?.setBuffer(name, buffer?.getBuffer() as WebGPUDataBuffer ?? null);\r\n};\r\n"]}
1
+ {"version":3,"file":"engine.storageBuffer.js","sourceRoot":"","sources":["../../../../../sourceES6/core/Engines/WebGPU/Extensions/engine.storageBuffer.ts"],"names":[],"mappings":"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","sourcesContent":["import { DataBuffer } from \"../../../Buffers/dataBuffer\";\r\nimport { WebGPUDataBuffer } from \"../../../Meshes/WebGPU/webgpuDataBuffer\";\r\nimport { DataArray, Nullable } from \"../../../types\";\r\n\r\nimport { WebGPUEngine } from \"../../webgpuEngine\";\r\nimport * as WebGPUConstants from '../webgpuConstants';\r\nimport { Effect } from \"../../../Materials/effect\";\r\n\r\ndeclare type StorageBuffer = import(\"../../../Buffers/storageBuffer\").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 | 32);\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 }\r\n else if (data instanceof ArrayBuffer) {\r\n view = new Uint8Array(data);\r\n }\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 }\r\n else if (data instanceof ArrayBuffer) {\r\n view = new Uint8Array(data);\r\n }\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(\r\n storageBuffer.underlyingResource,\r\n offset ?? 0,\r\n gpuBuffer,\r\n 0,\r\n size\r\n );\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 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 }, (reason) => reject(reason));\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"]}
@@ -40,7 +40,7 @@ WebGPUEngine.prototype.updateUniformBuffer = function (uniformBuffer, elements,
40
40
  this._bufferManager.setSubData(dataBuffer, offset, view, 0, count);
41
41
  };
42
42
  WebGPUEngine.prototype.bindUniformBufferBase = function (buffer, location, name) {
43
- this._currentMaterialContext.setBuffer(name, buffer);
43
+ this._currentDrawContext.setBuffer(name, buffer);
44
44
  };
45
45
  WebGPUEngine.prototype.bindUniformBlock = function (pipelineContext, blockName, index) {
46
46
  };
@@ -1 +1 @@
1
- {"version":3,"file":"engine.uniformBuffer.js","sourceRoot":"","sources":["../../../../../sourceES6/core/Engines/WebGPU/Extensions/engine.uniformBuffer.ts"],"names":[],"mappings":"AAIA,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;SACI;QACD,IAAI,GAAG,QAAQ,CAAC;KACnB;IAED,IAAM,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,IAAM,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,uBAAuB,CAAC,SAAS,CAAC,IAAI,EAAE,MAA0B,CAAC,CAAC;AAC7E,CAAC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,gBAAgB,GAAG,UAAU,eAAiC,EAAE,SAAiB,EAAE,KAAa;AACvH,CAAC,CAAC","sourcesContent":["import { DataBuffer } from \"../../../Buffers/dataBuffer\";\r\nimport { WebGPUDataBuffer } from \"../../../Meshes/WebGPU/webgpuDataBuffer\";\r\nimport { FloatArray } from \"../../../types\";\r\nimport { IPipelineContext } from \"../../IPipelineContext\";\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 }\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._currentMaterialContext.setBuffer(name, buffer as WebGPUDataBuffer);\r\n};\r\n\r\nWebGPUEngine.prototype.bindUniformBlock = function (pipelineContext: IPipelineContext, blockName: string, index: number): void {\r\n};\r\n"]}
1
+ {"version":3,"file":"engine.uniformBuffer.js","sourceRoot":"","sources":["../../../../../sourceES6/core/Engines/WebGPU/Extensions/engine.uniformBuffer.ts"],"names":[],"mappings":"AAIA,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;SACI;QACD,IAAI,GAAG,QAAQ,CAAC;KACnB;IAED,IAAM,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,IAAM,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,UAAU,eAAiC,EAAE,SAAiB,EAAE,KAAa;AACvH,CAAC,CAAC","sourcesContent":["import { DataBuffer } from \"../../../Buffers/dataBuffer\";\r\nimport { WebGPUDataBuffer } from \"../../../Meshes/WebGPU/webgpuDataBuffer\";\r\nimport { FloatArray } from \"../../../types\";\r\nimport { IPipelineContext } from \"../../IPipelineContext\";\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 }\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 (pipelineContext: IPipelineContext, blockName: string, index: number): void {\r\n};\r\n"]}
@@ -9,6 +9,7 @@ export declare class WebGPUBufferManager {
9
9
  constructor(device: GPUDevice);
10
10
  createRawBuffer(viewOrSize: ArrayBufferView | number, flags: GPUBufferUsageFlags, mappedAtCreation?: boolean): GPUBuffer;
11
11
  createBuffer(viewOrSize: ArrayBufferView | number, flags: GPUBufferUsageFlags): DataBuffer;
12
+ setRawData(buffer: GPUBuffer, dstByteOffset: number, src: ArrayBufferView, srcByteOffset: number, byteLength: number): void;
12
13
  setSubData(dataBuffer: WebGPUDataBuffer, dstByteOffset: number, src: ArrayBufferView, srcByteOffset?: number, byteLength?: number): void;
13
14
  private _GetHalfFloatAsFloatRGBAArrayBuffer;
14
15
  readDataFromBuffer(gpuBuffer: GPUBuffer, size: number, width: number, height: number, bytesPerRow: number, bytesPerRowAligned: number, type?: number, offset?: number, buffer?: Nullable<ArrayBufferView>, destroyBuffer?: boolean, noDataConversion?: boolean): Promise<ArrayBufferView>;
@@ -32,6 +32,9 @@ var WebGPUBufferManager = /** @class */ (function () {
32
32
  }
33
33
  return dataBuffer;
34
34
  };
35
+ WebGPUBufferManager.prototype.setRawData = function (buffer, dstByteOffset, src, srcByteOffset, byteLength) {
36
+ this._device.queue.writeBuffer(buffer, dstByteOffset, src.buffer, srcByteOffset, byteLength);
37
+ };
35
38
  WebGPUBufferManager.prototype.setSubData = function (dataBuffer, dstByteOffset, src, srcByteOffset, byteLength) {
36
39
  if (srcByteOffset === void 0) { srcByteOffset = 0; }
37
40
  if (byteLength === void 0) { byteLength = 0; }
@@ -1 +1 @@
1
- {"version":3,"file":"webgpuBufferManager.js","sourceRoot":"","sources":["../../../../sourceES6/core/Engines/WebGPU/webgpuBufferManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { DataBuffer } from '../../Buffers/dataBuffer';\r\nimport { WebGPUDataBuffer } from '../../Meshes/WebGPU/webgpuDataBuffer';\r\nimport { FromHalfFloat } from \"../../Misc/textureTools\";\r\nimport { Nullable } from '../../types';\r\n\r\nimport { allocateAndCopyTypedBuffer } from \"../Extensions/engine.readTexture\";\r\nimport * as WebGPUConstants from './webgpuConstants';\r\n\r\n/** @hidden */\r\nexport class WebGPUBufferManager {\r\n\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): DataBuffer {\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 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(gpuBuffer: GPUBuffer, size: number, width: number, height: number, bytesPerRow: number, bytesPerRowAligned: number, type = 0, offset = 0,\r\n buffer: Nullable<ArrayBufferView> = null, destroyBuffer = true, noDataConversion = false): Promise<ArrayBufferView>\r\n {\r\n const floatFormat = type === 1 ? 2 : type === 2 ? 1 : 0;\r\n return new Promise((resolve, reject) => {\r\n gpuBuffer.mapAsync(WebGPUConstants.MapMode.Read, offset, size).then(() => {\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, 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 }, (reason) => reject(reason));\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}"]}
1
+ {"version":3,"file":"webgpuBufferManager.js","sourceRoot":"","sources":["../../../../sourceES6/core/Engines/WebGPU/webgpuBufferManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { DataBuffer } from '../../Buffers/dataBuffer';\r\nimport { WebGPUDataBuffer } from '../../Meshes/WebGPU/webgpuDataBuffer';\r\nimport { FromHalfFloat } from \"../../Misc/textureTools\";\r\nimport { Nullable } from '../../types';\r\n\r\nimport { allocateAndCopyTypedBuffer } from \"../Extensions/engine.readTexture\";\r\nimport * as WebGPUConstants from './webgpuConstants';\r\n\r\n/** @hidden */\r\nexport class WebGPUBufferManager {\r\n\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): DataBuffer {\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(gpuBuffer: GPUBuffer, size: number, width: number, height: number, bytesPerRow: number, bytesPerRowAligned: number, type = 0, offset = 0,\r\n buffer: Nullable<ArrayBufferView> = null, destroyBuffer = true, noDataConversion = false): Promise<ArrayBufferView>\r\n {\r\n const floatFormat = type === 1 ? 2 : type === 2 ? 1 : 0;\r\n return new Promise((resolve, reject) => {\r\n gpuBuffer.mapAsync(WebGPUConstants.MapMode.Read, offset, size).then(() => {\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, 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 }, (reason) => reject(reason));\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}"]}
@@ -2,6 +2,7 @@ import { WebGPUCacheSampler } from "./webgpuCacheSampler";
2
2
  import { WebGPUMaterialContext } from "./webgpuMaterialContext";
3
3
  import { WebGPUPipelineContext } from "./webgpuPipelineContext";
4
4
  import { WebGPUEngine } from "../webgpuEngine";
5
+ import { WebGPUDrawContext } from "./webgpuDrawContext";
5
6
  /** @hidden */
6
7
  export declare class WebGPUCacheBindGroups {
7
8
  static NumBindGroupsCreatedTotal: number;
@@ -25,9 +26,9 @@ export declare class WebGPUCacheBindGroups {
25
26
  constructor(device: GPUDevice, cacheSampler: WebGPUCacheSampler, engine: WebGPUEngine);
26
27
  endFrame(): void;
27
28
  /**
28
- * Cache is currently based on the uniform buffers, samplers and textures used by the binding groups.
29
+ * Cache is currently based on the uniform/storage buffers, samplers and textures used by the binding groups.
29
30
  * Note that all uniform buffers have an offset of 0 in Babylon and we don't have a use case where we would have the same buffer used with different capacity values:
30
31
  * that means we don't need to factor in the offset/size of the buffer in the cache, only the id
31
32
  */
32
- getBindGroups(webgpuPipelineContext: WebGPUPipelineContext, materialContext: WebGPUMaterialContext): GPUBindGroup[];
33
+ getBindGroups(webgpuPipelineContext: WebGPUPipelineContext, drawContext: WebGPUDrawContext, materialContext: WebGPUMaterialContext): GPUBindGroup[];
33
34
  }
@@ -34,23 +34,23 @@ var WebGPUCacheBindGroups = /** @class */ (function () {
34
34
  WebGPUCacheBindGroups._NumBindGroupsNoLookupCurrentFrame = 0;
35
35
  };
36
36
  /**
37
- * Cache is currently based on the uniform buffers, samplers and textures used by the binding groups.
37
+ * Cache is currently based on the uniform/storage buffers, samplers and textures used by the binding groups.
38
38
  * Note that all uniform buffers have an offset of 0 in Babylon and we don't have a use case where we would have the same buffer used with different capacity values:
39
39
  * that means we don't need to factor in the offset/size of the buffer in the cache, only the id
40
40
  */
41
- WebGPUCacheBindGroups.prototype.getBindGroups = function (webgpuPipelineContext, materialContext) {
41
+ WebGPUCacheBindGroups.prototype.getBindGroups = function (webgpuPipelineContext, drawContext, materialContext) {
42
42
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
43
43
  var bindGroups = undefined;
44
44
  var node = WebGPUCacheBindGroups._Cache;
45
45
  var cacheIsDisabled = this.disabled || materialContext.forceBindGroupCreation;
46
46
  if (!cacheIsDisabled) {
47
- if (!materialContext.isDirty) {
47
+ if (!drawContext.isDirty && !materialContext.isDirty) {
48
48
  WebGPUCacheBindGroups._NumBindGroupsNoLookupCurrentFrame++;
49
- return materialContext.bindGroups;
49
+ return drawContext.bindGroups;
50
50
  }
51
51
  for (var _i = 0, _l = webgpuPipelineContext.shaderProcessingContext.bufferNames; _i < _l.length; _i++) {
52
52
  var bufferName = _l[_i];
53
- var uboId = (_b = (_a = materialContext.buffers[bufferName]) === null || _a === void 0 ? void 0 : _a.uniqueId) !== null && _b !== void 0 ? _b : 0;
53
+ var uboId = (_b = (_a = drawContext.buffers[bufferName]) === null || _a === void 0 ? void 0 : _a.uniqueId) !== null && _b !== void 0 ? _b : 0;
54
54
  var nextNode = node.values[uboId];
55
55
  if (!nextNode) {
56
56
  nextNode = new WebGPUBindGroupCacheNode();
@@ -80,14 +80,15 @@ var WebGPUCacheBindGroups = /** @class */ (function () {
80
80
  }
81
81
  bindGroups = node.bindGroups;
82
82
  }
83
+ drawContext.isDirty = false;
83
84
  materialContext.isDirty = false;
84
85
  if (bindGroups) {
85
- materialContext.bindGroups = bindGroups;
86
+ drawContext.bindGroups = bindGroups;
86
87
  WebGPUCacheBindGroups._NumBindGroupsLookupCurrentFrame++;
87
88
  return bindGroups;
88
89
  }
89
90
  bindGroups = [];
90
- materialContext.bindGroups = bindGroups;
91
+ drawContext.bindGroups = bindGroups;
91
92
  if (!cacheIsDisabled) {
92
93
  node.bindGroups = bindGroups;
93
94
  }
@@ -107,7 +108,7 @@ var WebGPUCacheBindGroups = /** @class */ (function () {
107
108
  var sampler = bindingInfo.sampler;
108
109
  if (!sampler) {
109
110
  if (this._engine.dbgSanityChecks) {
110
- Logger.Error("Trying to bind a null sampler! entry=" + JSON.stringify(entry) + ", bindingInfo=" + JSON.stringify(bindingInfo, function (key, value) { return key === 'texture' ? '<no dump>' : value; }), 50);
111
+ Logger.Error("Trying to bind a null sampler! entry=" + JSON.stringify(entry) + ", bindingInfo=" + JSON.stringify(bindingInfo, function (key, value) { return key === 'texture' ? '<no dump>' : value; }) + ", materialContext.uniqueId=" + materialContext.uniqueId, 50);
111
112
  }
112
113
  continue;
113
114
  }
@@ -121,12 +122,12 @@ var WebGPUCacheBindGroups = /** @class */ (function () {
121
122
  var bindingInfo = materialContext.textures[name_1];
122
123
  if (bindingInfo) {
123
124
  if (this._engine.dbgSanityChecks && bindingInfo.texture === null) {
124
- Logger.Error("Trying to bind a null texture! entry=" + JSON.stringify(entry) + ", bindingInfo=" + JSON.stringify(bindingInfo, function (key, value) { return key === 'texture' ? '<no dump>' : value; }), 50);
125
+ Logger.Error("Trying to bind a null texture! entry=" + JSON.stringify(entry) + ", bindingInfo=" + JSON.stringify(bindingInfo, function (key, value) { return key === 'texture' ? '<no dump>' : value; }) + ", materialContext.uniqueId=" + materialContext.uniqueId, 50);
125
126
  continue;
126
127
  }
127
128
  var hardwareTexture = bindingInfo.texture._hardwareTexture;
128
129
  if (this._engine.dbgSanityChecks && (!hardwareTexture || !hardwareTexture.view)) {
129
- Logger.Error("Trying to bind a null gpu texture! entry=" + JSON.stringify(entry) + ", bindingInfo=" + JSON.stringify(bindingInfo, function (key, value) { return key === 'texture' ? '<no dump>' : value; }) + ", isReady=" + ((_j = bindingInfo.texture) === null || _j === void 0 ? void 0 : _j.isReady), 50);
130
+ Logger.Error("Trying to bind a null gpu texture! entry=" + JSON.stringify(entry) + ", bindingInfo=" + JSON.stringify(bindingInfo, function (key, value) { return key === 'texture' ? '<no dump>' : value; }) + ", isReady=" + ((_j = bindingInfo.texture) === null || _j === void 0 ? void 0 : _j.isReady) + ", materialContext.uniqueId=" + materialContext.uniqueId, 50);
130
131
  continue;
131
132
  }
132
133
  entries[j].resource = hardwareTexture.view;
@@ -139,12 +140,12 @@ var WebGPUCacheBindGroups = /** @class */ (function () {
139
140
  var bindingInfo = materialContext.textures[name_1];
140
141
  if (bindingInfo) {
141
142
  if (this._engine.dbgSanityChecks && bindingInfo.texture === null) {
142
- Logger.Error("Trying to bind a null external texture! entry=" + JSON.stringify(entry) + ", bindingInfo=" + JSON.stringify(bindingInfo, function (key, value) { return key === 'texture' ? '<no dump>' : value; }), 50);
143
+ Logger.Error("Trying to bind a null external texture! entry=" + JSON.stringify(entry) + ", bindingInfo=" + JSON.stringify(bindingInfo, function (key, value) { return key === 'texture' ? '<no dump>' : value; }) + ", materialContext.uniqueId=" + materialContext.uniqueId, 50);
143
144
  continue;
144
145
  }
145
146
  var externalTexture = bindingInfo.texture.underlyingResource;
146
147
  if (this._engine.dbgSanityChecks && !externalTexture) {
147
- Logger.Error("Trying to bind a null gpu external texture! entry=" + JSON.stringify(entry) + ", bindingInfo=" + JSON.stringify(bindingInfo, function (key, value) { return key === 'texture' ? '<no dump>' : value; }) + ", isReady=" + ((_k = bindingInfo.texture) === null || _k === void 0 ? void 0 : _k.isReady), 50);
148
+ Logger.Error("Trying to bind a null gpu external texture! entry=" + JSON.stringify(entry) + ", bindingInfo=" + JSON.stringify(bindingInfo, function (key, value) { return key === 'texture' ? '<no dump>' : value; }) + ", isReady=" + ((_k = bindingInfo.texture) === null || _k === void 0 ? void 0 : _k.isReady) + ", materialContext.uniqueId=" + materialContext.uniqueId, 50);
148
149
  continue;
149
150
  }
150
151
  entries[j].resource = this._device.importExternalTexture({ source: externalTexture });
@@ -154,14 +155,14 @@ var WebGPUCacheBindGroups = /** @class */ (function () {
154
155
  }
155
156
  }
156
157
  else if (entry.buffer) {
157
- var dataBuffer = materialContext.buffers[name_1];
158
+ var dataBuffer = drawContext.buffers[name_1];
158
159
  if (dataBuffer) {
159
160
  var webgpuBuffer = dataBuffer.underlyingResource;
160
161
  entries[j].resource.buffer = webgpuBuffer;
161
162
  entries[j].resource.size = dataBuffer.capacity;
162
163
  }
163
164
  else {
164
- Logger.Error("Can't find buffer \"" + name_1 + "\". entry=" + JSON.stringify(entry) + ", buffers=" + JSON.stringify(materialContext.buffers), 50);
165
+ Logger.Error("Can't find buffer \"" + name_1 + "\". entry=" + JSON.stringify(entry) + ", buffers=" + JSON.stringify(drawContext.buffers) + ", drawContext.uniqueId=" + drawContext.uniqueId, 50);
165
166
  }
166
167
  }
167
168
  }
@@ -1 +1 @@
1
- {"version":3,"file":"webgpuCacheBindGroups.js","sourceRoot":"","sources":["../../../../sourceES6/core/Engines/WebGPU/webgpuCacheBindGroups.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from \"../../Misc/logger\";\r\nimport { WebGPUCacheSampler } from \"./webgpuCacheSampler\";\r\nimport { WebGPUMaterialContext } from \"./webgpuMaterialContext\";\r\nimport { WebGPUPipelineContext } from \"./webgpuPipelineContext\";\r\nimport { WebGPUEngine } from \"../webgpuEngine\";\r\nimport { WebGPUHardwareTexture } from \"./webgpuHardwareTexture\";\r\nimport { InternalTexture } from \"../../Materials/Textures/internalTexture\";\r\nimport { ExternalTexture } from \"../../Materials/Textures/externalTexture\";\r\n\r\nclass WebGPUBindGroupCacheNode {\r\n public values: { [id: number]: WebGPUBindGroupCacheNode };\r\n public bindGroups: GPUBindGroup[];\r\n\r\n constructor() {\r\n this.values = {};\r\n }\r\n}\r\n\r\n/** @hidden */\r\nexport class WebGPUCacheBindGroups {\r\n\r\n public static NumBindGroupsCreatedTotal = 0;\r\n public static NumBindGroupsCreatedLastFrame = 0;\r\n public static NumBindGroupsLookupLastFrame = 0;\r\n public static NumBindGroupsNoLookupLastFrame = 0;\r\n\r\n private static _Cache: WebGPUBindGroupCacheNode = new WebGPUBindGroupCacheNode();\r\n\r\n private static _NumBindGroupsCreatedCurrentFrame = 0;\r\n private static _NumBindGroupsLookupCurrentFrame = 0;\r\n private static _NumBindGroupsNoLookupCurrentFrame = 0;\r\n\r\n private _device: GPUDevice;\r\n private _cacheSampler: WebGPUCacheSampler;\r\n private _engine: WebGPUEngine;\r\n\r\n public disabled = false;\r\n\r\n public static get Statistics() {\r\n return {\r\n totalCreated: WebGPUCacheBindGroups.NumBindGroupsCreatedTotal,\r\n lastFrameCreated: WebGPUCacheBindGroups.NumBindGroupsCreatedLastFrame,\r\n lookupLastFrame: WebGPUCacheBindGroups.NumBindGroupsLookupLastFrame,\r\n noLookupLastFrame: WebGPUCacheBindGroups.NumBindGroupsNoLookupLastFrame,\r\n };\r\n }\r\n\r\n constructor(device: GPUDevice, cacheSampler: WebGPUCacheSampler, engine: WebGPUEngine) {\r\n this._device = device;\r\n this._cacheSampler = cacheSampler;\r\n this._engine = engine;\r\n }\r\n\r\n public endFrame(): void {\r\n WebGPUCacheBindGroups.NumBindGroupsCreatedLastFrame = WebGPUCacheBindGroups._NumBindGroupsCreatedCurrentFrame;\r\n WebGPUCacheBindGroups.NumBindGroupsLookupLastFrame = WebGPUCacheBindGroups._NumBindGroupsLookupCurrentFrame;\r\n WebGPUCacheBindGroups.NumBindGroupsNoLookupLastFrame = WebGPUCacheBindGroups._NumBindGroupsNoLookupCurrentFrame;\r\n WebGPUCacheBindGroups._NumBindGroupsCreatedCurrentFrame = 0;\r\n WebGPUCacheBindGroups._NumBindGroupsLookupCurrentFrame = 0;\r\n WebGPUCacheBindGroups._NumBindGroupsNoLookupCurrentFrame = 0;\r\n }\r\n\r\n /**\r\n * Cache is currently based on the uniform buffers, samplers and textures used by the binding groups.\r\n * Note that all uniform buffers have an offset of 0 in Babylon and we don't have a use case where we would have the same buffer used with different capacity values:\r\n * that means we don't need to factor in the offset/size of the buffer in the cache, only the id\r\n */\r\n public getBindGroups(webgpuPipelineContext: WebGPUPipelineContext, materialContext: WebGPUMaterialContext): GPUBindGroup[] {\r\n let bindGroups: GPUBindGroup[] | undefined = undefined;\r\n let node = WebGPUCacheBindGroups._Cache;\r\n\r\n const cacheIsDisabled = this.disabled || materialContext.forceBindGroupCreation;\r\n if (!cacheIsDisabled) {\r\n if (!materialContext.isDirty) {\r\n WebGPUCacheBindGroups._NumBindGroupsNoLookupCurrentFrame++;\r\n return materialContext.bindGroups;\r\n }\r\n\r\n for (const bufferName of webgpuPipelineContext.shaderProcessingContext.bufferNames) {\r\n const uboId = materialContext.buffers[bufferName]?.uniqueId ?? 0;\r\n let nextNode = node.values[uboId];\r\n if (!nextNode) {\r\n nextNode = new WebGPUBindGroupCacheNode();\r\n node.values[uboId] = nextNode;\r\n }\r\n node = nextNode;\r\n }\r\n\r\n for (const samplerName of webgpuPipelineContext.shaderProcessingContext.samplerNames) {\r\n const samplerHashCode = materialContext.samplers[samplerName]?.hashCode ?? 0;\r\n let nextNode = node.values[samplerHashCode];\r\n if (!nextNode) {\r\n nextNode = new WebGPUBindGroupCacheNode();\r\n node.values[samplerHashCode] = nextNode;\r\n }\r\n node = nextNode;\r\n }\r\n\r\n for (const textureName of webgpuPipelineContext.shaderProcessingContext.textureNames) {\r\n const textureId = materialContext.textures[textureName]?.texture?.uniqueId ?? 0;\r\n let nextNode = node.values[textureId];\r\n if (!nextNode) {\r\n nextNode = new WebGPUBindGroupCacheNode();\r\n node.values[textureId] = nextNode;\r\n }\r\n node = nextNode;\r\n }\r\n\r\n bindGroups = node.bindGroups;\r\n }\r\n\r\n materialContext.isDirty = false;\r\n\r\n if (bindGroups) {\r\n materialContext.bindGroups = bindGroups;\r\n WebGPUCacheBindGroups._NumBindGroupsLookupCurrentFrame++;\r\n return bindGroups;\r\n }\r\n\r\n bindGroups = [];\r\n materialContext.bindGroups = bindGroups;\r\n\r\n if (!cacheIsDisabled) {\r\n node.bindGroups = bindGroups;\r\n }\r\n\r\n WebGPUCacheBindGroups.NumBindGroupsCreatedTotal++;\r\n WebGPUCacheBindGroups._NumBindGroupsCreatedCurrentFrame++;\r\n\r\n const bindGroupLayouts = webgpuPipelineContext.bindGroupLayouts;\r\n for (let i = 0; i < webgpuPipelineContext.shaderProcessingContext.bindGroupLayoutEntries.length; i++) {\r\n const setDefinition = webgpuPipelineContext.shaderProcessingContext.bindGroupLayoutEntries[i];\r\n\r\n const entries = webgpuPipelineContext.shaderProcessingContext.bindGroupEntries[i];\r\n for (let j = 0; j < setDefinition.length; j++) {\r\n const entry = webgpuPipelineContext.shaderProcessingContext.bindGroupLayoutEntries[i][j];\r\n const entryInfo = webgpuPipelineContext.shaderProcessingContext.bindGroupLayoutEntryInfo[i][entry.binding];\r\n const name = entryInfo.nameInArrayOfTexture ?? entryInfo.name;\r\n\r\n if (entry.sampler) {\r\n const bindingInfo = materialContext.samplers[name];\r\n if (bindingInfo) {\r\n const sampler = bindingInfo.sampler;\r\n if (!sampler) {\r\n if (this._engine.dbgSanityChecks) {\r\n Logger.Error(`Trying to bind a null sampler! entry=${JSON.stringify(entry)}, bindingInfo=${JSON.stringify(bindingInfo, (key: string, value: any) => key === 'texture' ? '<no dump>' : value)}`, 50);\r\n }\r\n continue;\r\n }\r\n entries[j].resource = this._cacheSampler.getSampler(sampler, false, bindingInfo.hashCode);\r\n } else {\r\n Logger.Error(`Sampler \"${name}\" could not be bound. entry=${JSON.stringify(entry)}, materialContext=${JSON.stringify(materialContext, (key: string, value: any) => key === 'texture' || key === 'sampler' ? '<no dump>' : value)}`, 50);\r\n }\r\n } else if (entry.texture || entry.storageTexture) {\r\n const bindingInfo = materialContext.textures[name];\r\n if (bindingInfo) {\r\n if (this._engine.dbgSanityChecks && bindingInfo.texture === null) {\r\n Logger.Error(`Trying to bind a null texture! entry=${JSON.stringify(entry)}, bindingInfo=${JSON.stringify(bindingInfo, (key: string, value: any) => key === 'texture' ? '<no dump>' : value)}`, 50);\r\n continue;\r\n }\r\n const hardwareTexture = (bindingInfo.texture as InternalTexture)._hardwareTexture as WebGPUHardwareTexture;\r\n\r\n if (this._engine.dbgSanityChecks && (!hardwareTexture || !hardwareTexture.view)) {\r\n Logger.Error(`Trying to bind a null gpu texture! entry=${JSON.stringify(entry)}, bindingInfo=${JSON.stringify(bindingInfo, (key: string, value: any) => key === 'texture' ? '<no dump>' : value)}, isReady=${bindingInfo.texture?.isReady}`, 50);\r\n continue;\r\n }\r\n\r\n entries[j].resource = hardwareTexture.view!;\r\n } else {\r\n Logger.Error(`Texture \"${name}\" could not be bound. entry=${JSON.stringify(entry)}, materialContext=${JSON.stringify(materialContext, (key: string, value: any) => key === 'texture' || key === 'sampler' ? '<no dump>' : value)}`, 50);\r\n }\r\n } else if (entry.externalTexture) {\r\n const bindingInfo = materialContext.textures[name];\r\n if (bindingInfo) {\r\n if (this._engine.dbgSanityChecks && bindingInfo.texture === null) {\r\n Logger.Error(`Trying to bind a null external texture! entry=${JSON.stringify(entry)}, bindingInfo=${JSON.stringify(bindingInfo, (key: string, value: any) => key === 'texture' ? '<no dump>' : value)}`, 50);\r\n continue;\r\n }\r\n const externalTexture = (bindingInfo.texture as ExternalTexture).underlyingResource;\r\n\r\n if (this._engine.dbgSanityChecks && !externalTexture) {\r\n Logger.Error(`Trying to bind a null gpu external texture! entry=${JSON.stringify(entry)}, bindingInfo=${JSON.stringify(bindingInfo, (key: string, value: any) => key === 'texture' ? '<no dump>' : value)}, isReady=${bindingInfo.texture?.isReady}`, 50);\r\n continue;\r\n }\r\n\r\n entries[j].resource = this._device.importExternalTexture({ source: externalTexture });\r\n } else {\r\n Logger.Error(`Texture \"${name}\" could not be bound. entry=${JSON.stringify(entry)}, materialContext=${JSON.stringify(materialContext, (key: string, value: any) => key === 'texture' || key === 'sampler' ? '<no dump>' : value)}`, 50);\r\n }\r\n } else if (entry.buffer) {\r\n const dataBuffer = materialContext.buffers[name];\r\n if (dataBuffer) {\r\n const webgpuBuffer = dataBuffer.underlyingResource as GPUBuffer;\r\n (entries[j].resource as GPUBufferBinding).buffer = webgpuBuffer;\r\n (entries[j].resource as GPUBufferBinding).size = dataBuffer.capacity;\r\n } else {\r\n Logger.Error(`Can't find buffer \"${name}\". entry=${JSON.stringify(entry)}, buffers=${JSON.stringify(materialContext.buffers)}`, 50);\r\n }\r\n }\r\n }\r\n\r\n let groupLayout = bindGroupLayouts[i];\r\n bindGroups[i] = this._device.createBindGroup({\r\n layout: groupLayout,\r\n entries,\r\n });\r\n }\r\n\r\n return bindGroups;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"webgpuCacheBindGroups.js","sourceRoot":"","sources":["../../../../sourceES6/core/Engines/WebGPU/webgpuCacheBindGroups.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from \"../../Misc/logger\";\r\nimport { WebGPUCacheSampler } from \"./webgpuCacheSampler\";\r\nimport { WebGPUMaterialContext } from \"./webgpuMaterialContext\";\r\nimport { WebGPUPipelineContext } from \"./webgpuPipelineContext\";\r\nimport { WebGPUEngine } from \"../webgpuEngine\";\r\nimport { WebGPUHardwareTexture } from \"./webgpuHardwareTexture\";\r\nimport { InternalTexture } from \"../../Materials/Textures/internalTexture\";\r\nimport { ExternalTexture } from \"../../Materials/Textures/externalTexture\";\r\nimport { WebGPUDrawContext } from \"./webgpuDrawContext\";\r\n\r\nclass WebGPUBindGroupCacheNode {\r\n public values: { [id: number]: WebGPUBindGroupCacheNode };\r\n public bindGroups: GPUBindGroup[];\r\n\r\n constructor() {\r\n this.values = {};\r\n }\r\n}\r\n\r\n/** @hidden */\r\nexport class WebGPUCacheBindGroups {\r\n\r\n public static NumBindGroupsCreatedTotal = 0;\r\n public static NumBindGroupsCreatedLastFrame = 0;\r\n public static NumBindGroupsLookupLastFrame = 0;\r\n public static NumBindGroupsNoLookupLastFrame = 0;\r\n\r\n private static _Cache: WebGPUBindGroupCacheNode = new WebGPUBindGroupCacheNode();\r\n\r\n private static _NumBindGroupsCreatedCurrentFrame = 0;\r\n private static _NumBindGroupsLookupCurrentFrame = 0;\r\n private static _NumBindGroupsNoLookupCurrentFrame = 0;\r\n\r\n private _device: GPUDevice;\r\n private _cacheSampler: WebGPUCacheSampler;\r\n private _engine: WebGPUEngine;\r\n\r\n public disabled = false;\r\n\r\n public static get Statistics() {\r\n return {\r\n totalCreated: WebGPUCacheBindGroups.NumBindGroupsCreatedTotal,\r\n lastFrameCreated: WebGPUCacheBindGroups.NumBindGroupsCreatedLastFrame,\r\n lookupLastFrame: WebGPUCacheBindGroups.NumBindGroupsLookupLastFrame,\r\n noLookupLastFrame: WebGPUCacheBindGroups.NumBindGroupsNoLookupLastFrame,\r\n };\r\n }\r\n\r\n constructor(device: GPUDevice, cacheSampler: WebGPUCacheSampler, engine: WebGPUEngine) {\r\n this._device = device;\r\n this._cacheSampler = cacheSampler;\r\n this._engine = engine;\r\n }\r\n\r\n public endFrame(): void {\r\n WebGPUCacheBindGroups.NumBindGroupsCreatedLastFrame = WebGPUCacheBindGroups._NumBindGroupsCreatedCurrentFrame;\r\n WebGPUCacheBindGroups.NumBindGroupsLookupLastFrame = WebGPUCacheBindGroups._NumBindGroupsLookupCurrentFrame;\r\n WebGPUCacheBindGroups.NumBindGroupsNoLookupLastFrame = WebGPUCacheBindGroups._NumBindGroupsNoLookupCurrentFrame;\r\n WebGPUCacheBindGroups._NumBindGroupsCreatedCurrentFrame = 0;\r\n WebGPUCacheBindGroups._NumBindGroupsLookupCurrentFrame = 0;\r\n WebGPUCacheBindGroups._NumBindGroupsNoLookupCurrentFrame = 0;\r\n }\r\n\r\n /**\r\n * Cache is currently based on the uniform/storage buffers, samplers and textures used by the binding groups.\r\n * Note that all uniform buffers have an offset of 0 in Babylon and we don't have a use case where we would have the same buffer used with different capacity values:\r\n * that means we don't need to factor in the offset/size of the buffer in the cache, only the id\r\n */\r\n public getBindGroups(webgpuPipelineContext: WebGPUPipelineContext, drawContext: WebGPUDrawContext, materialContext: WebGPUMaterialContext): GPUBindGroup[] {\r\n let bindGroups: GPUBindGroup[] | undefined = undefined;\r\n let node = WebGPUCacheBindGroups._Cache;\r\n\r\n const cacheIsDisabled = this.disabled || materialContext.forceBindGroupCreation;\r\n if (!cacheIsDisabled) {\r\n if (!drawContext.isDirty && !materialContext.isDirty) {\r\n WebGPUCacheBindGroups._NumBindGroupsNoLookupCurrentFrame++;\r\n return drawContext.bindGroups!;\r\n }\r\n\r\n for (const bufferName of webgpuPipelineContext.shaderProcessingContext.bufferNames) {\r\n const uboId = drawContext.buffers[bufferName]?.uniqueId ?? 0;\r\n let nextNode = node.values[uboId];\r\n if (!nextNode) {\r\n nextNode = new WebGPUBindGroupCacheNode();\r\n node.values[uboId] = nextNode;\r\n }\r\n node = nextNode;\r\n }\r\n\r\n for (const samplerName of webgpuPipelineContext.shaderProcessingContext.samplerNames) {\r\n const samplerHashCode = materialContext.samplers[samplerName]?.hashCode ?? 0;\r\n let nextNode = node.values[samplerHashCode];\r\n if (!nextNode) {\r\n nextNode = new WebGPUBindGroupCacheNode();\r\n node.values[samplerHashCode] = nextNode;\r\n }\r\n node = nextNode;\r\n }\r\n\r\n for (const textureName of webgpuPipelineContext.shaderProcessingContext.textureNames) {\r\n const textureId = materialContext.textures[textureName]?.texture?.uniqueId ?? 0;\r\n let nextNode = node.values[textureId];\r\n if (!nextNode) {\r\n nextNode = new WebGPUBindGroupCacheNode();\r\n node.values[textureId] = nextNode;\r\n }\r\n node = nextNode;\r\n }\r\n\r\n bindGroups = node.bindGroups;\r\n }\r\n\r\n drawContext.isDirty = false;\r\n materialContext.isDirty = false;\r\n\r\n if (bindGroups) {\r\n drawContext.bindGroups = bindGroups;\r\n WebGPUCacheBindGroups._NumBindGroupsLookupCurrentFrame++;\r\n return bindGroups;\r\n }\r\n\r\n bindGroups = [];\r\n drawContext.bindGroups = bindGroups;\r\n\r\n if (!cacheIsDisabled) {\r\n node.bindGroups = bindGroups;\r\n }\r\n\r\n WebGPUCacheBindGroups.NumBindGroupsCreatedTotal++;\r\n WebGPUCacheBindGroups._NumBindGroupsCreatedCurrentFrame++;\r\n\r\n const bindGroupLayouts = webgpuPipelineContext.bindGroupLayouts;\r\n for (let i = 0; i < webgpuPipelineContext.shaderProcessingContext.bindGroupLayoutEntries.length; i++) {\r\n const setDefinition = webgpuPipelineContext.shaderProcessingContext.bindGroupLayoutEntries[i];\r\n\r\n const entries = webgpuPipelineContext.shaderProcessingContext.bindGroupEntries[i];\r\n for (let j = 0; j < setDefinition.length; j++) {\r\n const entry = webgpuPipelineContext.shaderProcessingContext.bindGroupLayoutEntries[i][j];\r\n const entryInfo = webgpuPipelineContext.shaderProcessingContext.bindGroupLayoutEntryInfo[i][entry.binding];\r\n const name = entryInfo.nameInArrayOfTexture ?? entryInfo.name;\r\n\r\n if (entry.sampler) {\r\n const bindingInfo = materialContext.samplers[name];\r\n if (bindingInfo) {\r\n const sampler = bindingInfo.sampler;\r\n if (!sampler) {\r\n if (this._engine.dbgSanityChecks) {\r\n Logger.Error(`Trying to bind a null sampler! entry=${JSON.stringify(entry)}, bindingInfo=${JSON.stringify(bindingInfo, (key: string, value: any) => key === 'texture' ? '<no dump>' : value)}, materialContext.uniqueId=${materialContext.uniqueId}`, 50);\r\n }\r\n continue;\r\n }\r\n entries[j].resource = this._cacheSampler.getSampler(sampler, false, bindingInfo.hashCode);\r\n } else {\r\n Logger.Error(`Sampler \"${name}\" could not be bound. entry=${JSON.stringify(entry)}, materialContext=${JSON.stringify(materialContext, (key: string, value: any) => key === 'texture' || key === 'sampler' ? '<no dump>' : value)}`, 50);\r\n }\r\n } else if (entry.texture || entry.storageTexture) {\r\n const bindingInfo = materialContext.textures[name];\r\n if (bindingInfo) {\r\n if (this._engine.dbgSanityChecks && bindingInfo.texture === null) {\r\n Logger.Error(`Trying to bind a null texture! entry=${JSON.stringify(entry)}, bindingInfo=${JSON.stringify(bindingInfo, (key: string, value: any) => key === 'texture' ? '<no dump>' : value)}, materialContext.uniqueId=${materialContext.uniqueId}`, 50);\r\n continue;\r\n }\r\n const hardwareTexture = (bindingInfo.texture as InternalTexture)._hardwareTexture as WebGPUHardwareTexture;\r\n\r\n if (this._engine.dbgSanityChecks && (!hardwareTexture || !hardwareTexture.view)) {\r\n Logger.Error(`Trying to bind a null gpu texture! entry=${JSON.stringify(entry)}, bindingInfo=${JSON.stringify(bindingInfo, (key: string, value: any) => key === 'texture' ? '<no dump>' : value)}, isReady=${bindingInfo.texture?.isReady}, materialContext.uniqueId=${materialContext.uniqueId}`, 50);\r\n continue;\r\n }\r\n\r\n entries[j].resource = hardwareTexture.view!;\r\n } else {\r\n Logger.Error(`Texture \"${name}\" could not be bound. entry=${JSON.stringify(entry)}, materialContext=${JSON.stringify(materialContext, (key: string, value: any) => key === 'texture' || key === 'sampler' ? '<no dump>' : value)}`, 50);\r\n }\r\n } else if (entry.externalTexture) {\r\n const bindingInfo = materialContext.textures[name];\r\n if (bindingInfo) {\r\n if (this._engine.dbgSanityChecks && bindingInfo.texture === null) {\r\n Logger.Error(`Trying to bind a null external texture! entry=${JSON.stringify(entry)}, bindingInfo=${JSON.stringify(bindingInfo, (key: string, value: any) => key === 'texture' ? '<no dump>' : value)}, materialContext.uniqueId=${materialContext.uniqueId}`, 50);\r\n continue;\r\n }\r\n const externalTexture = (bindingInfo.texture as ExternalTexture).underlyingResource;\r\n\r\n if (this._engine.dbgSanityChecks && !externalTexture) {\r\n Logger.Error(`Trying to bind a null gpu external texture! entry=${JSON.stringify(entry)}, bindingInfo=${JSON.stringify(bindingInfo, (key: string, value: any) => key === 'texture' ? '<no dump>' : value)}, isReady=${bindingInfo.texture?.isReady}, materialContext.uniqueId=${materialContext.uniqueId}`, 50);\r\n continue;\r\n }\r\n\r\n entries[j].resource = this._device.importExternalTexture({ source: externalTexture });\r\n } else {\r\n Logger.Error(`Texture \"${name}\" could not be bound. entry=${JSON.stringify(entry)}, materialContext=${JSON.stringify(materialContext, (key: string, value: any) => key === 'texture' || key === 'sampler' ? '<no dump>' : value)}`, 50);\r\n }\r\n } else if (entry.buffer) {\r\n const dataBuffer = drawContext.buffers[name];\r\n if (dataBuffer) {\r\n const webgpuBuffer = dataBuffer.underlyingResource as GPUBuffer;\r\n (entries[j].resource as GPUBufferBinding).buffer = webgpuBuffer;\r\n (entries[j].resource as GPUBufferBinding).size = dataBuffer.capacity;\r\n } else {\r\n Logger.Error(`Can't find buffer \"${name}\". entry=${JSON.stringify(entry)}, buffers=${JSON.stringify(drawContext.buffers)}, drawContext.uniqueId=${drawContext.uniqueId}`, 50);\r\n }\r\n }\r\n }\r\n\r\n let groupLayout = bindGroupLayouts[i];\r\n bindGroups[i] = this._device.createBindGroup({\r\n layout: groupLayout,\r\n entries,\r\n });\r\n }\r\n\r\n return bindGroups;\r\n }\r\n}\r\n"]}
@@ -18,6 +18,8 @@ export declare class WebGPUCacheRenderPipelineTree extends WebGPUCacheRenderPipe
18
18
  nodeCount: number;
19
19
  pipelineCount: number;
20
20
  };
21
+ static _GetPipelines(node: NodeState, pipelines: Array<Array<number>>, curPath: Array<number>, curPathLen: number): void;
22
+ static GetPipelines(): Array<Array<number>>;
21
23
  constructor(device: GPUDevice, emptyVertexBuffer: VertexBuffer, useTextureStage: boolean);
22
24
  protected _getRenderPipeline(param: {
23
25
  token: any;
@@ -31,6 +31,23 @@ var WebGPUCacheRenderPipelineTree = /** @class */ (function (_super) {
31
31
  var counts = WebGPUCacheRenderPipelineTree._Cache.count();
32
32
  return { nodeCount: counts[0], pipelineCount: counts[1] };
33
33
  };
34
+ WebGPUCacheRenderPipelineTree._GetPipelines = function (node, pipelines, curPath, curPathLen) {
35
+ if (node.pipeline) {
36
+ var path = curPath.slice();
37
+ path.length = curPathLen;
38
+ pipelines.push(path);
39
+ }
40
+ for (var value in node.values) {
41
+ var nnode = node.values[value];
42
+ curPath[curPathLen] = parseInt(value);
43
+ WebGPUCacheRenderPipelineTree._GetPipelines(nnode, pipelines, curPath, curPathLen + 1);
44
+ }
45
+ };
46
+ WebGPUCacheRenderPipelineTree.GetPipelines = function () {
47
+ var pipelines = [];
48
+ WebGPUCacheRenderPipelineTree._GetPipelines(WebGPUCacheRenderPipelineTree._Cache, pipelines, [], 0);
49
+ return pipelines;
50
+ };
34
51
  WebGPUCacheRenderPipelineTree.prototype._getRenderPipeline = function (param) {
35
52
  var node = this._nodeStack[this._stateDirtyLowestIndex];
36
53
  for (var i = this._stateDirtyLowestIndex; i < this._statesLength; ++i) {
@@ -1 +1 @@
1
- {"version":3,"file":"webgpuCacheRenderPipelineTree.js","sourceRoot":"","sources":["../../../../sourceES6/core/Engines/WebGPU/webgpuCacheRenderPipelineTree.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE,cAAc;AACd;IAII;QACI,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACrB,CAAC;IAEM,yBAAK,GAAZ;QACI,IAAI,SAAS,GAAG,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,KAAK,IAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE;YAC7B,IAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAA,KAAwC,IAAK,CAAC,KAAK,EAAE,EAApD,eAAe,QAAA,EAAE,kBAAkB,QAAiB,CAAC;YAC5D,SAAS,IAAI,eAAe,CAAC;YAC7B,aAAa,IAAI,kBAAkB,CAAC;YACpC,SAAS,EAAE,CAAC;SACf;QACD,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACtC,CAAC;IACL,gBAAC;AAAD,CAAC,AAnBD,IAmBC;AAED,cAAc;AACd;IAAmD,iDAAyB;IAYxE,uCAAY,MAAiB,EAAE,iBAA+B,EAAE,eAAwB;QAAxF,YACI,kBAAM,MAAM,EAAE,iBAAiB,EAAE,eAAe,CAAC,SAGpD;QAFG,KAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,KAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,6BAA6B,CAAC,MAAM,CAAC;;IAC9D,CAAC;IAVa,2CAAa,GAA3B;QACI,IAAM,MAAM,GAAG,6BAA6B,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAE5D,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,CAAC;IAQS,0DAAkB,GAA5B,UAA6B,KAA4D;QACrF,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACxD,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,EAAE;YACnE,IAAI,EAAE,GAA0B,IAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,IAAI,CAAC,EAAE,EAAE;gBACL,EAAE,GAAG,IAAI,SAAS,EAAE,CAAC;gBACrB,IAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;aACtC;YACD,IAAI,GAAG,EAAE,CAAC;YACV,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;SACjC;QAED,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;QACnB,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IACnC,CAAC;IAES,0DAAkB,GAA5B,UAA6B,KAAkE;QAC3F,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAS,CAAC;IAC3C,CAAC;IAlCc,oCAAM,GAAc,IAAI,SAAS,EAAE,CAAC;IAmCvD,oCAAC;CAAA,AArCD,CAAmD,yBAAyB,GAqC3E;SArCY,6BAA6B","sourcesContent":["import { VertexBuffer } from \"../../Buffers/buffer\";\r\nimport { Nullable } from \"../../types\";\r\nimport { WebGPUCacheRenderPipeline } from \"./webgpuCacheRenderPipeline\";\r\n\r\n/** @hidden */\r\nclass NodeState {\r\n public values: { [name: number]: NodeState };\r\n public pipeline: GPURenderPipeline;\r\n\r\n constructor() {\r\n this.values = {};\r\n }\r\n\r\n public count(): [number, number] {\r\n let countNode = 0, countPipeline = this.pipeline ? 1 : 0;\r\n for (const value in this.values) {\r\n const node = this.values[value];\r\n const [childCountNodes, childCoundPipeline] = node!.count();\r\n countNode += childCountNodes;\r\n countPipeline += childCoundPipeline;\r\n countNode++;\r\n }\r\n return [countNode, countPipeline];\r\n }\r\n}\r\n\r\n/** @hidden */\r\nexport class WebGPUCacheRenderPipelineTree extends WebGPUCacheRenderPipeline {\r\n\r\n private static _Cache: NodeState = new NodeState();\r\n\r\n private _nodeStack: NodeState[];\r\n\r\n public static GetNodeCounts(): { nodeCount: number, pipelineCount: number } {\r\n const counts = WebGPUCacheRenderPipelineTree._Cache.count();\r\n\r\n return { nodeCount: counts[0], pipelineCount: counts[1] };\r\n }\r\n\r\n constructor(device: GPUDevice, emptyVertexBuffer: VertexBuffer, useTextureStage: boolean) {\r\n super(device, emptyVertexBuffer, useTextureStage);\r\n this._nodeStack = [];\r\n this._nodeStack[0] = WebGPUCacheRenderPipelineTree._Cache;\r\n }\r\n\r\n protected _getRenderPipeline(param: { token: any, pipeline: Nullable<GPURenderPipeline> }): void {\r\n let node = this._nodeStack[this._stateDirtyLowestIndex];\r\n for (let i = this._stateDirtyLowestIndex; i < this._statesLength; ++i) {\r\n let nn: NodeState | undefined = node!.values[this._states[i]];\r\n if (!nn) {\r\n nn = new NodeState();\r\n node!.values[this._states[i]] = nn;\r\n }\r\n node = nn;\r\n this._nodeStack[i + 1] = node;\r\n }\r\n\r\n param.token = node;\r\n param.pipeline = node.pipeline;\r\n }\r\n\r\n protected _setRenderPipeline(param: { token: NodeState, pipeline: Nullable<GPURenderPipeline> }): void {\r\n param.token.pipeline = param.pipeline!;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"webgpuCacheRenderPipelineTree.js","sourceRoot":"","sources":["../../../../sourceES6/core/Engines/WebGPU/webgpuCacheRenderPipelineTree.ts"],"names":[],"mappings":"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","sourcesContent":["import { VertexBuffer } from \"../../Buffers/buffer\";\r\nimport { Nullable } from \"../../types\";\r\nimport { WebGPUCacheRenderPipeline } from \"./webgpuCacheRenderPipeline\";\r\n\r\n/** @hidden */\r\nclass NodeState {\r\n public values: { [name: number]: NodeState };\r\n public pipeline: GPURenderPipeline;\r\n\r\n constructor() {\r\n this.values = {};\r\n }\r\n\r\n public count(): [number, number] {\r\n let countNode = 0, countPipeline = this.pipeline ? 1 : 0;\r\n for (const value in this.values) {\r\n const node = this.values[value];\r\n const [childCountNodes, childCoundPipeline] = node!.count();\r\n countNode += childCountNodes;\r\n countPipeline += childCoundPipeline;\r\n countNode++;\r\n }\r\n return [countNode, countPipeline];\r\n }\r\n}\r\n\r\n/** @hidden */\r\nexport class WebGPUCacheRenderPipelineTree extends WebGPUCacheRenderPipeline {\r\n\r\n private static _Cache: NodeState = new NodeState();\r\n\r\n private _nodeStack: NodeState[];\r\n\r\n public static GetNodeCounts(): { nodeCount: number, pipelineCount: number } {\r\n const counts = WebGPUCacheRenderPipelineTree._Cache.count();\r\n\r\n return { nodeCount: counts[0], pipelineCount: counts[1] };\r\n }\r\n\r\n public static _GetPipelines(node: NodeState, pipelines: Array<Array<number>>, curPath: Array<number>, curPathLen: number): void {\r\n if (node.pipeline) {\r\n const path = curPath.slice();\r\n path.length = curPathLen;\r\n pipelines.push(path);\r\n }\r\n for (const value in node.values) {\r\n const nnode = node.values[value];\r\n curPath[curPathLen] = parseInt(value);\r\n WebGPUCacheRenderPipelineTree._GetPipelines(nnode, pipelines, curPath, curPathLen + 1);\r\n }\r\n }\r\n\r\n public static GetPipelines(): Array<Array<number>> {\r\n const pipelines: Array<Array<number>> = [];\r\n WebGPUCacheRenderPipelineTree._GetPipelines(WebGPUCacheRenderPipelineTree._Cache, pipelines, [], 0);\r\n return pipelines;\r\n }\r\n\r\n constructor(device: GPUDevice, emptyVertexBuffer: VertexBuffer, useTextureStage: boolean) {\r\n super(device, emptyVertexBuffer, useTextureStage);\r\n this._nodeStack = [];\r\n this._nodeStack[0] = WebGPUCacheRenderPipelineTree._Cache;\r\n }\r\n\r\n protected _getRenderPipeline(param: { token: any, pipeline: Nullable<GPURenderPipeline> }): void {\r\n let node = this._nodeStack[this._stateDirtyLowestIndex];\r\n for (let i = this._stateDirtyLowestIndex; i < this._statesLength; ++i) {\r\n let nn: NodeState | undefined = node!.values[this._states[i]];\r\n if (!nn) {\r\n nn = new NodeState();\r\n node!.values[this._states[i]] = nn;\r\n }\r\n node = nn;\r\n this._nodeStack[i + 1] = node;\r\n }\r\n\r\n param.token = node;\r\n param.pipeline = node.pipeline;\r\n }\r\n\r\n protected _setRenderPipeline(param: { token: NodeState, pipeline: Nullable<GPURenderPipeline> }): void {\r\n param.token.pipeline = param.pipeline!;\r\n }\r\n}\r\n"]}
@@ -1,8 +1,27 @@
1
+ import { WebGPUDataBuffer } from "../../Meshes/WebGPU/webgpuDataBuffer";
2
+ import { Nullable } from "../../types";
1
3
  import { IDrawContext } from "../IDrawContext";
4
+ import { WebGPUBufferManager } from "./webgpuBufferManager";
2
5
  /** @hidden */
3
6
  export declare class WebGPUDrawContext implements IDrawContext {
4
7
  private static _Counter;
5
- fastBundle: GPURenderBundle;
8
+ fastBundle?: GPURenderBundle;
9
+ bindGroups?: GPUBindGroup[];
6
10
  uniqueId: number;
7
- constructor();
11
+ isDirty: boolean;
12
+ buffers: {
13
+ [name: string]: Nullable<WebGPUDataBuffer>;
14
+ };
15
+ indirectDrawBuffer?: GPUBuffer;
16
+ private _bufferManager;
17
+ private _useInstancing;
18
+ private _indirectDrawData?;
19
+ private _currentInstanceCount;
20
+ get useInstancing(): boolean;
21
+ set useInstancing(use: boolean);
22
+ constructor(bufferManager: WebGPUBufferManager);
23
+ reset(): void;
24
+ setBuffer(name: string, buffer: Nullable<WebGPUDataBuffer>): void;
25
+ setIndirectData(indexOrVertexCount: number, instanceCount: number, firstIndexOrVertex: number): void;
26
+ dispose(): void;
8
27
  }
@@ -1,8 +1,74 @@
1
+ import * as WebGPUConstants from './webgpuConstants.js';
1
2
  /** @hidden */
2
3
  var WebGPUDrawContext = /** @class */ (function () {
3
- function WebGPUDrawContext() {
4
+ function WebGPUDrawContext(bufferManager) {
5
+ this._bufferManager = bufferManager;
4
6
  this.uniqueId = WebGPUDrawContext._Counter++;
7
+ this._useInstancing = false;
8
+ this._currentInstanceCount = 0;
9
+ this.reset();
5
10
  }
11
+ Object.defineProperty(WebGPUDrawContext.prototype, "useInstancing", {
12
+ get: function () {
13
+ return this._useInstancing;
14
+ },
15
+ set: function (use) {
16
+ if (this._useInstancing === use) {
17
+ return;
18
+ }
19
+ if (!use) {
20
+ if (this.indirectDrawBuffer) {
21
+ this._bufferManager.releaseBuffer(this.indirectDrawBuffer);
22
+ }
23
+ this.indirectDrawBuffer = undefined;
24
+ this._indirectDrawData = undefined;
25
+ }
26
+ else {
27
+ this.indirectDrawBuffer = this._bufferManager.createRawBuffer(40, WebGPUConstants.BufferUsage.CopyDst | WebGPUConstants.BufferUsage.Indirect);
28
+ this._indirectDrawData = new Uint32Array(5);
29
+ this._indirectDrawData[3] = 0;
30
+ this._indirectDrawData[4] = 0;
31
+ }
32
+ this._useInstancing = use;
33
+ this._currentInstanceCount = -1;
34
+ },
35
+ enumerable: false,
36
+ configurable: true
37
+ });
38
+ WebGPUDrawContext.prototype.reset = function () {
39
+ this.buffers = {};
40
+ this.isDirty = true;
41
+ this.fastBundle = undefined;
42
+ this.bindGroups = undefined;
43
+ };
44
+ WebGPUDrawContext.prototype.setBuffer = function (name, buffer) {
45
+ var _a;
46
+ this.isDirty || (this.isDirty = (buffer === null || buffer === void 0 ? void 0 : buffer.uniqueId) !== ((_a = this.buffers[name]) === null || _a === void 0 ? void 0 : _a.uniqueId));
47
+ this.buffers[name] = buffer;
48
+ };
49
+ WebGPUDrawContext.prototype.setIndirectData = function (indexOrVertexCount, instanceCount, firstIndexOrVertex) {
50
+ if (instanceCount === this._currentInstanceCount || !this.indirectDrawBuffer || !this._indirectDrawData) {
51
+ // The current buffer is already up to date so do nothing
52
+ // Note that we only check for instanceCount and not indexOrVertexCount nor firstIndexOrVertex because those values
53
+ // are supposed to not change during the lifetime of a draw context
54
+ return;
55
+ }
56
+ this._currentInstanceCount = instanceCount;
57
+ this._indirectDrawData[0] = indexOrVertexCount;
58
+ this._indirectDrawData[1] = instanceCount;
59
+ this._indirectDrawData[2] = firstIndexOrVertex;
60
+ this._bufferManager.setRawData(this.indirectDrawBuffer, 0, this._indirectDrawData, 0, 20);
61
+ };
62
+ WebGPUDrawContext.prototype.dispose = function () {
63
+ if (this.indirectDrawBuffer) {
64
+ this._bufferManager.releaseBuffer(this.indirectDrawBuffer);
65
+ this.indirectDrawBuffer = undefined;
66
+ this._indirectDrawData = undefined;
67
+ }
68
+ this.fastBundle = undefined;
69
+ this.bindGroups = undefined;
70
+ this.buffers = undefined;
71
+ };
6
72
  WebGPUDrawContext._Counter = 0;
7
73
  return WebGPUDrawContext;
8
74
  }());
@@ -1 +1 @@
1
- {"version":3,"file":"webgpuDrawContext.js","sourceRoot":"","sources":["../../../../sourceES6/core/Engines/WebGPU/webgpuDrawContext.ts"],"names":[],"mappings":"AAEA,cAAc;AACd;IAOI;QACI,IAAI,CAAC,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,EAAE,CAAC;IACjD,CAAC;IARc,0BAAQ,GAAG,CAAC,CAAC;IAShC,wBAAC;CAAA,AAVD,IAUC;SAVY,iBAAiB","sourcesContent":["import { IDrawContext } from \"../IDrawContext\";\r\n\r\n/** @hidden */\r\nexport class WebGPUDrawContext implements IDrawContext {\r\n private static _Counter = 0;\r\n\r\n public fastBundle: GPURenderBundle;\r\n\r\n public uniqueId: number;\r\n\r\n constructor() {\r\n this.uniqueId = WebGPUDrawContext._Counter++;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"webgpuDrawContext.js","sourceRoot":"","sources":["../../../../sourceES6/core/Engines/WebGPU/webgpuDrawContext.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebGPUDataBuffer } from \"../../Meshes/WebGPU/webgpuDataBuffer\";\r\nimport { Nullable } from \"../../types\";\r\nimport { IDrawContext } from \"../IDrawContext\";\r\nimport { WebGPUBufferManager } from \"./webgpuBufferManager\";\r\nimport * as WebGPUConstants from './webgpuConstants';\r\n\r\n/** @hidden */\r\nexport class WebGPUDrawContext implements IDrawContext {\r\n private static _Counter = 0;\r\n\r\n public fastBundle?: GPURenderBundle; // used only when compatibilityMode==false (fast mode)\r\n public bindGroups?: GPUBindGroup[]; // cache of the bind groups. Will be reused for the next draw if isDirty==false (and materialContext.isDirty==false)\r\n\r\n public uniqueId: number;\r\n\r\n public isDirty: boolean;\r\n public buffers: { [name: string]: Nullable<WebGPUDataBuffer> };\r\n\r\n public indirectDrawBuffer?: GPUBuffer;\r\n\r\n private _bufferManager: WebGPUBufferManager;\r\n private _useInstancing: boolean;\r\n private _indirectDrawData?: Uint32Array;\r\n private _currentInstanceCount: number;\r\n\r\n public get useInstancing() {\r\n return this._useInstancing;\r\n }\r\n\r\n public set useInstancing(use: boolean) {\r\n if (this._useInstancing === use) {\r\n return;\r\n }\r\n\r\n if (!use) {\r\n if (this.indirectDrawBuffer) {\r\n this._bufferManager.releaseBuffer(this.indirectDrawBuffer);\r\n }\r\n this.indirectDrawBuffer = undefined;\r\n this._indirectDrawData = undefined;\r\n } else {\r\n this.indirectDrawBuffer = this._bufferManager.createRawBuffer(40, WebGPUConstants.BufferUsage.CopyDst | WebGPUConstants.BufferUsage.Indirect);\r\n this._indirectDrawData = new Uint32Array(5);\r\n this._indirectDrawData[3] = 0;\r\n this._indirectDrawData[4] = 0;\r\n }\r\n\r\n this._useInstancing = use;\r\n this._currentInstanceCount = -1;\r\n }\r\n\r\n constructor(bufferManager: WebGPUBufferManager) {\r\n this._bufferManager = bufferManager;\r\n this.uniqueId = WebGPUDrawContext._Counter++;\r\n this._useInstancing = false;\r\n this._currentInstanceCount = 0;\r\n this.reset();\r\n }\r\n\r\n public reset(): void {\r\n this.buffers = {};\r\n this.isDirty = true;\r\n this.fastBundle = undefined;\r\n this.bindGroups = undefined;\r\n }\r\n\r\n public setBuffer(name: string, buffer: Nullable<WebGPUDataBuffer>): void {\r\n this.isDirty ||= buffer?.uniqueId !== this.buffers[name]?.uniqueId;\r\n\r\n this.buffers[name] = buffer;\r\n }\r\n\r\n public setIndirectData(indexOrVertexCount: number, instanceCount: number, firstIndexOrVertex: number): void {\r\n if (instanceCount === this._currentInstanceCount || !this.indirectDrawBuffer || !this._indirectDrawData) {\r\n // The current buffer is already up to date so do nothing\r\n // Note that we only check for instanceCount and not indexOrVertexCount nor firstIndexOrVertex because those values\r\n // are supposed to not change during the lifetime of a draw context\r\n return;\r\n }\r\n this._currentInstanceCount = instanceCount;\r\n\r\n this._indirectDrawData![0] = indexOrVertexCount;\r\n this._indirectDrawData![1] = instanceCount;\r\n this._indirectDrawData![2] = firstIndexOrVertex;\r\n\r\n this._bufferManager.setRawData(this.indirectDrawBuffer, 0, this._indirectDrawData, 0, 20);\r\n }\r\n\r\n public dispose(): void {\r\n if (this.indirectDrawBuffer) {\r\n this._bufferManager.releaseBuffer(this.indirectDrawBuffer);\r\n this.indirectDrawBuffer = undefined;\r\n this._indirectDrawData = undefined;\r\n }\r\n this.fastBundle = undefined;\r\n this.bindGroups = undefined;\r\n this.buffers = undefined as any;\r\n }\r\n}\r\n"]}
@@ -1,7 +1,6 @@
1
1
  import { ExternalTexture } from "../../Materials/Textures/externalTexture";
2
2
  import { InternalTexture } from "../../Materials/Textures/internalTexture";
3
3
  import { TextureSampler } from "../../Materials/Textures/textureSampler";
4
- import { WebGPUDataBuffer } from "../../Meshes/WebGPU/webgpuDataBuffer";
5
4
  import { Nullable } from "../../types";
6
5
  import { IMaterialContext } from "../IMaterialContext";
7
6
  /** @hidden */
@@ -26,10 +25,6 @@ export declare class WebGPUMaterialContext implements IMaterialContext {
26
25
  textures: {
27
26
  [name: string]: Nullable<IWebGPUMaterialContextTextureCache>;
28
27
  };
29
- buffers: {
30
- [name: string]: Nullable<WebGPUDataBuffer>;
31
- };
32
- bindGroups: GPUBindGroup[];
33
28
  get forceBindGroupCreation(): boolean;
34
29
  get hasFloatTextures(): boolean;
35
30
  protected _numFloatTextures: number;
@@ -38,6 +33,5 @@ export declare class WebGPUMaterialContext implements IMaterialContext {
38
33
  reset(): void;
39
34
  setSampler(name: string, sampler: Nullable<TextureSampler>): void;
40
35
  setTexture(name: string, texture: Nullable<InternalTexture | ExternalTexture>): void;
41
- setBuffer(name: string, buffer: Nullable<WebGPUDataBuffer>): void;
42
36
  }
43
37
  export {};