@onerjs/core 8.42.6 → 8.42.8

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 (480) hide show
  1. package/Animations/animatable.core.js +1 -1
  2. package/Animations/animatable.core.js.map +1 -1
  3. package/Animations/animatorAvatar.d.ts +5 -2
  4. package/Animations/animatorAvatar.js +42 -29
  5. package/Animations/animatorAvatar.js.map +1 -1
  6. package/Animations/runtimeAnimation.js +1 -1
  7. package/Animations/runtimeAnimation.js.map +1 -1
  8. package/Audio/audioSceneComponent.js +1 -2
  9. package/Audio/audioSceneComponent.js.map +1 -1
  10. package/AudioV2/webAudio/subNodes/webAudioBusAndSoundSubGraph.js +3 -3
  11. package/AudioV2/webAudio/subNodes/webAudioBusAndSoundSubGraph.js.map +1 -1
  12. package/AudioV2/webAudio/webAudioEngine.js +1 -1
  13. package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
  14. package/Behaviors/Meshes/followBehavior.js +1 -1
  15. package/Behaviors/Meshes/followBehavior.js.map +1 -1
  16. package/Behaviors/Meshes/pointerDragBehavior.js +1 -1
  17. package/Behaviors/Meshes/pointerDragBehavior.js.map +1 -1
  18. package/Bones/boneLookController.js +1 -1
  19. package/Bones/boneLookController.js.map +1 -1
  20. package/Buffers/buffer.js +1 -1
  21. package/Buffers/buffer.js.map +1 -1
  22. package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js +2 -2
  23. package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js.map +1 -1
  24. package/Cameras/Inputs/geospatialCameraMouseWheelInput.d.ts +1 -2
  25. package/Cameras/Inputs/geospatialCameraMouseWheelInput.js +1 -2
  26. package/Cameras/Inputs/geospatialCameraMouseWheelInput.js.map +1 -1
  27. package/Cameras/Inputs/geospatialCameraPointersInput.d.ts +0 -4
  28. package/Cameras/Inputs/geospatialCameraPointersInput.js +1 -5
  29. package/Cameras/Inputs/geospatialCameraPointersInput.js.map +1 -1
  30. package/Cameras/camera.js +2 -2
  31. package/Cameras/camera.js.map +1 -1
  32. package/Cameras/cameraMovement.d.ts +1 -4
  33. package/Cameras/cameraMovement.js +1 -4
  34. package/Cameras/cameraMovement.js.map +1 -1
  35. package/Cameras/geospatialCamera.d.ts +22 -4
  36. package/Cameras/geospatialCamera.js +27 -9
  37. package/Cameras/geospatialCamera.js.map +1 -1
  38. package/Cameras/geospatialCameraMovement.d.ts +3 -3
  39. package/Cameras/geospatialCameraMovement.js +18 -18
  40. package/Cameras/geospatialCameraMovement.js.map +1 -1
  41. package/Engines/AbstractEngine/abstractEngine.renderPass.js +1 -0
  42. package/Engines/AbstractEngine/abstractEngine.renderPass.js.map +1 -1
  43. package/Engines/Extensions/engine.query.js +1 -1
  44. package/Engines/Extensions/engine.query.js.map +1 -1
  45. package/Engines/Processors/shaderProcessor.js +2 -3
  46. package/Engines/Processors/shaderProcessor.js.map +1 -1
  47. package/Engines/WebGL/webGLRenderTargetWrapper.js +1 -1
  48. package/Engines/WebGL/webGLRenderTargetWrapper.js.map +1 -1
  49. package/Engines/WebGPU/Extensions/engine.debugging.d.ts +87 -0
  50. package/Engines/WebGPU/Extensions/engine.debugging.js +135 -21
  51. package/Engines/WebGPU/Extensions/engine.debugging.js.map +1 -1
  52. package/Engines/WebGPU/webgpuBufferManager.js +1 -1
  53. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  54. package/Engines/WebGPU/webgpuShaderProcessor.js +1 -1
  55. package/Engines/WebGPU/webgpuShaderProcessor.js.map +1 -1
  56. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js +1 -1
  57. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js.map +1 -1
  58. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +1 -1
  59. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  60. package/Engines/WebGPU/webgpuTextureManager.js +10 -5
  61. package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
  62. package/Engines/abstractEngine.js +2 -2
  63. package/Engines/abstractEngine.js.map +1 -1
  64. package/Engines/engine.common.js +2 -2
  65. package/Engines/engine.common.js.map +1 -1
  66. package/Engines/engine.js +0 -1
  67. package/Engines/engine.js.map +1 -1
  68. package/Engines/engineFeatures.d.ts +0 -2
  69. package/Engines/engineFeatures.js.map +1 -1
  70. package/Engines/nullEngine.js +0 -1
  71. package/Engines/nullEngine.js.map +1 -1
  72. package/Engines/thinEngine.functions.js +1 -1
  73. package/Engines/thinEngine.functions.js.map +1 -1
  74. package/Engines/thinEngine.js +4 -6
  75. package/Engines/thinEngine.js.map +1 -1
  76. package/Engines/thinNativeEngine.js +2 -6
  77. package/Engines/thinNativeEngine.js.map +1 -1
  78. package/Engines/thinWebGPUEngine.d.ts +11 -4
  79. package/Engines/thinWebGPUEngine.js +58 -34
  80. package/Engines/thinWebGPUEngine.js.map +1 -1
  81. package/Engines/webgpuEngine.d.ts +3 -1
  82. package/Engines/webgpuEngine.js +30 -169
  83. package/Engines/webgpuEngine.js.map +1 -1
  84. package/FlowGraph/flowGraph.d.ts +1 -0
  85. package/FlowGraph/flowGraph.js.map +1 -1
  86. package/FlowGraph/flowGraphBlock.d.ts +1 -0
  87. package/FlowGraph/flowGraphBlock.js.map +1 -1
  88. package/FlowGraph/flowGraphContext.d.ts +1 -0
  89. package/FlowGraph/flowGraphContext.js.map +1 -1
  90. package/FlowGraph/flowGraphCoordinator.d.ts +1 -0
  91. package/FlowGraph/flowGraphCoordinator.js.map +1 -1
  92. package/FrameGraph/Node/nodeRenderGraph.d.ts +12 -1
  93. package/FrameGraph/Node/nodeRenderGraph.js +36 -2
  94. package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
  95. package/FrameGraph/Passes/renderPass.js +0 -3
  96. package/FrameGraph/Passes/renderPass.js.map +1 -1
  97. package/FrameGraph/Tasks/Layers/baseLayerTask.js +1 -1
  98. package/FrameGraph/Tasks/Layers/baseLayerTask.js.map +1 -1
  99. package/FrameGraph/Tasks/PostProcesses/ssao2RenderingPipelineTask.js +3 -0
  100. package/FrameGraph/Tasks/PostProcesses/ssao2RenderingPipelineTask.js.map +1 -1
  101. package/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.js +3 -0
  102. package/FrameGraph/Tasks/PostProcesses/ssrRenderingPipelineTask.js.map +1 -1
  103. package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.d.ts +3 -1
  104. package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.js +14 -0
  105. package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.js.map +1 -1
  106. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.d.ts +2 -2
  107. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js +20 -14
  108. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js.map +1 -1
  109. package/FrameGraph/Tasks/Rendering/objectRendererTask.d.ts +2 -3
  110. package/FrameGraph/Tasks/Rendering/objectRendererTask.js +5 -29
  111. package/FrameGraph/Tasks/Rendering/objectRendererTask.js.map +1 -1
  112. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.d.ts +3 -2
  113. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js +38 -14
  114. package/FrameGraph/Tasks/Rendering/shadowGeneratorTask.js.map +1 -1
  115. package/FrameGraph/frameGraph.js +3 -0
  116. package/FrameGraph/frameGraph.js.map +1 -1
  117. package/FrameGraph/frameGraphContext.js +1 -1
  118. package/FrameGraph/frameGraphContext.js.map +1 -1
  119. package/FrameGraph/frameGraphTask.d.ts +0 -2
  120. package/FrameGraph/frameGraphTask.js +15 -17
  121. package/FrameGraph/frameGraphTask.js.map +1 -1
  122. package/FrameGraph/frameGraphTextureManager.js +1 -1
  123. package/FrameGraph/frameGraphTextureManager.js.map +1 -1
  124. package/Gizmos/axisScaleGizmo.js +2 -2
  125. package/Gizmos/axisScaleGizmo.js.map +1 -1
  126. package/Gizmos/cameraGizmo.d.ts +1 -1
  127. package/Gizmos/cameraGizmo.js +1 -1
  128. package/Gizmos/cameraGizmo.js.map +1 -1
  129. package/Gizmos/gizmo.d.ts +4 -4
  130. package/Gizmos/gizmo.js +5 -5
  131. package/Gizmos/gizmo.js.map +1 -1
  132. package/Gizmos/gizmoManager.d.ts +2 -2
  133. package/Gizmos/gizmoManager.js +1 -1
  134. package/Gizmos/gizmoManager.js.map +1 -1
  135. package/Gizmos/planeRotationGizmo.d.ts +2 -2
  136. package/Gizmos/planeRotationGizmo.js +2 -3
  137. package/Gizmos/planeRotationGizmo.js.map +1 -1
  138. package/Gizmos/positionGizmo.d.ts +1 -1
  139. package/Gizmos/positionGizmo.js +2 -2
  140. package/Gizmos/positionGizmo.js.map +1 -1
  141. package/Gizmos/rotationGizmo.d.ts +1 -1
  142. package/Gizmos/rotationGizmo.js +3 -3
  143. package/Gizmos/rotationGizmo.js.map +1 -1
  144. package/Gizmos/scaleGizmo.d.ts +1 -1
  145. package/Gizmos/scaleGizmo.js +1 -1
  146. package/Gizmos/scaleGizmo.js.map +1 -1
  147. package/Layers/glowLayer.js +1 -1
  148. package/Layers/glowLayer.js.map +1 -1
  149. package/Layers/highlightLayer.js +1 -1
  150. package/Layers/highlightLayer.js.map +1 -1
  151. package/Lights/Shadows/cascadedShadowGenerator.js +0 -1
  152. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  153. package/Lights/Shadows/shadowGenerator.d.ts +28 -1
  154. package/Lights/Shadows/shadowGenerator.js +77 -11
  155. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  156. package/Lights/lightingVolume.d.ts +1 -0
  157. package/Lights/lightingVolume.js +10 -2
  158. package/Lights/lightingVolume.js.map +1 -1
  159. package/Loading/Plugins/babylonFileLoader.js +44 -14
  160. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  161. package/Loading/sceneLoader.js +1 -1
  162. package/Loading/sceneLoader.js.map +1 -1
  163. package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.d.ts +12 -3
  164. package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.js +33 -8
  165. package/Materials/GaussianSplatting/gaussianSplattingSolidColorMaterialPlugin.js.map +1 -1
  166. package/Materials/Node/Blocks/Dual/fogBlock.js +1 -1
  167. package/Materials/Node/Blocks/Dual/fogBlock.js.map +1 -1
  168. package/Materials/Node/Blocks/Dual/imageSourceBlock.js +1 -1
  169. package/Materials/Node/Blocks/Dual/imageSourceBlock.js.map +1 -1
  170. package/Materials/Node/Blocks/PBR/sheenBlock.js +1 -2
  171. package/Materials/Node/Blocks/PBR/sheenBlock.js.map +1 -1
  172. package/Materials/Node/Blocks/cloudBlock.js +1 -1
  173. package/Materials/Node/Blocks/cloudBlock.js.map +1 -1
  174. package/Materials/Node/Blocks/curveBlock.js +2 -3
  175. package/Materials/Node/Blocks/curveBlock.js.map +1 -1
  176. package/Materials/Node/nodeMaterial.js +1 -2
  177. package/Materials/Node/nodeMaterial.js.map +1 -1
  178. package/Materials/PBR/openpbrMaterial.js +3 -5
  179. package/Materials/PBR/openpbrMaterial.js.map +1 -1
  180. package/Materials/PBR/pbrBaseMaterial.js +2 -3
  181. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  182. package/Materials/Textures/Procedurals/proceduralTexture.js +0 -1
  183. package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
  184. package/Materials/Textures/cubeTexture.js +1 -1
  185. package/Materials/Textures/cubeTexture.js.map +1 -1
  186. package/Materials/Textures/htmlElementTexture.js +2 -2
  187. package/Materials/Textures/htmlElementTexture.js.map +1 -1
  188. package/Materials/Textures/multiRenderTarget.js +1 -1
  189. package/Materials/Textures/multiRenderTarget.js.map +1 -1
  190. package/Materials/Textures/renderTargetTexture.js +13 -2
  191. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  192. package/Materials/effect.js +2 -1
  193. package/Materials/effect.js.map +1 -1
  194. package/Materials/materialHelper.functions.js +1 -1
  195. package/Materials/materialHelper.functions.js.map +1 -1
  196. package/Materials/multiMaterial.js +1 -1
  197. package/Materials/multiMaterial.js.map +1 -1
  198. package/Materials/standardMaterial.js +1 -2
  199. package/Materials/standardMaterial.js.map +1 -1
  200. package/Materials/uniformBuffer.d.ts +0 -4
  201. package/Materials/uniformBuffer.js +0 -8
  202. package/Materials/uniformBuffer.js.map +1 -1
  203. package/Maths/index.d.ts +2 -0
  204. package/Maths/index.js +2 -0
  205. package/Maths/index.js.map +1 -1
  206. package/Maths/math.geospatial.d.ts +27 -0
  207. package/Maths/math.geospatial.functions.d.ts +33 -0
  208. package/Maths/math.geospatial.functions.js +60 -0
  209. package/Maths/math.geospatial.functions.js.map +1 -0
  210. package/Maths/math.geospatial.js +2 -0
  211. package/Maths/math.geospatial.js.map +1 -0
  212. package/Maths/math.path.js +1 -1
  213. package/Maths/math.path.js.map +1 -1
  214. package/Maths/math.scalar.functions.js +3 -3
  215. package/Maths/math.scalar.functions.js.map +1 -1
  216. package/Maths/math.vector.js +1 -1
  217. package/Maths/math.vector.js.map +1 -1
  218. package/Meshes/Builders/boxBuilder.js +1 -2
  219. package/Meshes/Builders/boxBuilder.js.map +1 -1
  220. package/Meshes/Builders/cylinderBuilder.js +2 -2
  221. package/Meshes/Builders/cylinderBuilder.js.map +1 -1
  222. package/Meshes/Builders/decalBuilder.js +1 -2
  223. package/Meshes/Builders/decalBuilder.js.map +1 -1
  224. package/Meshes/Builders/latheBuilder.js +2 -2
  225. package/Meshes/Builders/latheBuilder.js.map +1 -1
  226. package/Meshes/Builders/linesBuilder.js +11 -15
  227. package/Meshes/Builders/linesBuilder.js.map +1 -1
  228. package/Meshes/Builders/polygonBuilder.js +6 -6
  229. package/Meshes/Builders/polygonBuilder.js.map +1 -1
  230. package/Meshes/Builders/polyhedronBuilder.js +2 -2
  231. package/Meshes/Builders/polyhedronBuilder.js.map +1 -1
  232. package/Meshes/Builders/ribbonBuilder.js +6 -6
  233. package/Meshes/Builders/ribbonBuilder.js.map +1 -1
  234. package/Meshes/Builders/shapeBuilder.js +2 -3
  235. package/Meshes/Builders/shapeBuilder.js.map +1 -1
  236. package/Meshes/Builders/tiledBoxBuilder.js +1 -1
  237. package/Meshes/Builders/tiledBoxBuilder.js.map +1 -1
  238. package/Meshes/Builders/tiledPlaneBuilder.js +1 -1
  239. package/Meshes/Builders/tiledPlaneBuilder.js.map +1 -1
  240. package/Meshes/GreasedLine/greasedLineMesh.js +1 -2
  241. package/Meshes/GreasedLine/greasedLineMesh.js.map +1 -1
  242. package/Meshes/GreasedLine/greasedLineRibbonMesh.js +1 -1
  243. package/Meshes/GreasedLine/greasedLineRibbonMesh.js.map +1 -1
  244. package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.js +1 -1
  245. package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.js.map +1 -1
  246. package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.js +1 -1
  247. package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.js.map +1 -1
  248. package/Meshes/Node/Blocks/mappingBlock.js +1 -1
  249. package/Meshes/Node/Blocks/mappingBlock.js.map +1 -1
  250. package/Meshes/abstractMesh.d.ts +4 -0
  251. package/Meshes/abstractMesh.js +14 -10
  252. package/Meshes/abstractMesh.js.map +1 -1
  253. package/Meshes/csg.js +1 -1
  254. package/Meshes/csg.js.map +1 -1
  255. package/Meshes/csg2.js +1 -1
  256. package/Meshes/csg2.js.map +1 -1
  257. package/Meshes/geodesicMesh.js +11 -13
  258. package/Meshes/geodesicMesh.js.map +1 -1
  259. package/Meshes/geometry.js +2 -2
  260. package/Meshes/geometry.js.map +1 -1
  261. package/Meshes/groundMesh.js +7 -7
  262. package/Meshes/groundMesh.js.map +1 -1
  263. package/Meshes/mesh.d.ts +2 -0
  264. package/Meshes/mesh.js +22 -8
  265. package/Meshes/mesh.js.map +1 -1
  266. package/Meshes/mesh.vertexData.js +22 -22
  267. package/Meshes/mesh.vertexData.js.map +1 -1
  268. package/Meshes/meshSimplification.js +1 -1
  269. package/Meshes/meshSimplification.js.map +1 -1
  270. package/Meshes/polygonMesh.js +1 -1
  271. package/Meshes/polygonMesh.js.map +1 -1
  272. package/Meshes/trailMesh.js +1 -1
  273. package/Meshes/trailMesh.js.map +1 -1
  274. package/Misc/HighDynamicRange/hdr.js +4 -6
  275. package/Misc/HighDynamicRange/hdr.js.map +1 -1
  276. package/Misc/HighDynamicRange/panoramaToCubemap.js +1 -1
  277. package/Misc/HighDynamicRange/panoramaToCubemap.js.map +1 -1
  278. package/Misc/basisWorker.js +1 -1
  279. package/Misc/basisWorker.js.map +1 -1
  280. package/Misc/environmentTextureTools.js +1 -1
  281. package/Misc/environmentTextureTools.js.map +1 -1
  282. package/Misc/meshExploder.js +1 -2
  283. package/Misc/meshExploder.js.map +1 -1
  284. package/Misc/tga.js +2 -2
  285. package/Misc/tga.js.map +1 -1
  286. package/Misc/timer.js +4 -2
  287. package/Misc/timer.js.map +1 -1
  288. package/Misc/tools.d.ts +7 -0
  289. package/Misc/tools.js +20 -6
  290. package/Misc/tools.js.map +1 -1
  291. package/Morph/morphTargetManager.js +1 -1
  292. package/Morph/morphTargetManager.js.map +1 -1
  293. package/Navigation/INavigationEngine.d.ts +2 -2
  294. package/Navigation/INavigationEngine.js.map +1 -1
  295. package/Navigation/Plugins/recastJSPlugin.d.ts +2 -2
  296. package/Navigation/Plugins/recastJSPlugin.js +14 -5
  297. package/Navigation/Plugins/recastJSPlugin.js.map +1 -1
  298. package/Particles/Node/Blocks/Update/updateNoiseBlock.js +1 -1
  299. package/Particles/Node/Blocks/Update/updateNoiseBlock.js.map +1 -1
  300. package/Particles/Node/Blocks/particleSourceTextureBlock.d.ts +11 -1
  301. package/Particles/Node/Blocks/particleSourceTextureBlock.js +25 -11
  302. package/Particles/Node/Blocks/particleSourceTextureBlock.js.map +1 -1
  303. package/Particles/Node/nodeParticleSystemSet.helper.js +3 -3
  304. package/Particles/Node/nodeParticleSystemSet.helper.js.map +1 -1
  305. package/Particles/Node/nodeParticleSystemSet.js +1 -1
  306. package/Particles/Node/nodeParticleSystemSet.js.map +1 -1
  307. package/Particles/computeShaderParticleSystem.js +2 -0
  308. package/Particles/computeShaderParticleSystem.js.map +1 -1
  309. package/Particles/gpuParticleSystem.d.ts +14 -0
  310. package/Particles/gpuParticleSystem.js +94 -12
  311. package/Particles/gpuParticleSystem.js.map +1 -1
  312. package/Particles/particleSystem.js +4 -1
  313. package/Particles/particleSystem.js.map +1 -1
  314. package/Particles/pointsCloudSystem.js +46 -47
  315. package/Particles/pointsCloudSystem.js.map +1 -1
  316. package/Particles/solidParticleSystem.js +5 -6
  317. package/Particles/solidParticleSystem.js.map +1 -1
  318. package/Particles/thinParticleSystem.js +3 -4
  319. package/Particles/thinParticleSystem.js.map +1 -1
  320. package/Particles/webgl2ParticleSystem.js +2 -1
  321. package/Particles/webgl2ParticleSystem.js.map +1 -1
  322. package/Physics/castingResult.d.ts +4 -1
  323. package/Physics/castingResult.js +1 -1
  324. package/Physics/castingResult.js.map +1 -1
  325. package/Physics/joinedPhysicsEngineComponent.js +1 -1
  326. package/Physics/joinedPhysicsEngineComponent.js.map +1 -1
  327. package/Physics/physicsHelper.d.ts +8 -8
  328. package/Physics/physicsHelper.js +7 -7
  329. package/Physics/physicsHelper.js.map +1 -1
  330. package/Physics/shapeCastResult.d.ts +4 -0
  331. package/Physics/shapeCastResult.js +7 -0
  332. package/Physics/shapeCastResult.js.map +1 -1
  333. package/Physics/v1/Plugins/ammoJSPlugin.js +0 -8
  334. package/Physics/v1/Plugins/ammoJSPlugin.js.map +1 -1
  335. package/Physics/v2/IPhysicsEnginePlugin.d.ts +51 -4
  336. package/Physics/v2/IPhysicsEnginePlugin.js +12 -12
  337. package/Physics/v2/IPhysicsEnginePlugin.js.map +1 -1
  338. package/Physics/v2/characterController.js +4 -8
  339. package/Physics/v2/characterController.js.map +1 -1
  340. package/Physics/v2/physicsBody.js.map +1 -1
  341. package/Physics/v2/physicsConstraint.d.ts +1 -1
  342. package/Physics/v2/physicsConstraint.js +1 -1
  343. package/Physics/v2/physicsConstraint.js.map +1 -1
  344. package/Physics/v2/physicsEngine.d.ts +0 -5
  345. package/Physics/v2/physicsEngine.js +0 -5
  346. package/Physics/v2/physicsEngine.js.map +1 -1
  347. package/Physics/v2/physicsEngineComponent.d.ts +1 -1
  348. package/Physics/v2/physicsEngineComponent.js.map +1 -1
  349. package/Physics/v2/physicsMaterial.d.ts +6 -0
  350. package/Physics/v2/physicsMaterial.js +2 -2
  351. package/Physics/v2/physicsMaterial.js.map +1 -1
  352. package/Physics/v2/ragdoll.js +1 -2
  353. package/Physics/v2/ragdoll.js.map +1 -1
  354. package/PostProcesses/postProcess.js +3 -3
  355. package/PostProcesses/postProcess.js.map +1 -1
  356. package/PostProcesses/thinDepthOfFieldEffect.js +2 -2
  357. package/PostProcesses/thinDepthOfFieldEffect.js.map +1 -1
  358. package/Probes/reflectionProbe.js +0 -1
  359. package/Probes/reflectionProbe.js.map +1 -1
  360. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +0 -5
  361. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  362. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +4 -1
  363. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
  364. package/Rendering/depthRenderer.js +0 -11
  365. package/Rendering/depthRenderer.js.map +1 -1
  366. package/Rendering/depthRendererSceneComponent.js +1 -1
  367. package/Rendering/depthRendererSceneComponent.js.map +1 -1
  368. package/Rendering/edgesRenderer.js +1 -0
  369. package/Rendering/edgesRenderer.js.map +1 -1
  370. package/Rendering/geometryBufferRenderer.js +0 -1
  371. package/Rendering/geometryBufferRenderer.js.map +1 -1
  372. package/Rendering/objectRenderer.js +15 -9
  373. package/Rendering/objectRenderer.js.map +1 -1
  374. package/Rendering/renderingGroup.d.ts +1 -1
  375. package/Rendering/renderingGroup.js +1 -1
  376. package/Rendering/renderingGroup.js.map +1 -1
  377. package/Rendering/renderingManager.d.ts +1 -1
  378. package/Rendering/renderingManager.js.map +1 -1
  379. package/Rendering/thinDepthPeelingRenderer.js +1 -1
  380. package/Rendering/thinDepthPeelingRenderer.js.map +1 -1
  381. package/Rendering/utilityLayerRenderer.js +1 -1
  382. package/Rendering/utilityLayerRenderer.js.map +1 -1
  383. package/Shaders/ShadersInclude/screenSpaceRayTrace.js +18 -8
  384. package/Shaders/ShadersInclude/screenSpaceRayTrace.js.map +1 -1
  385. package/Shaders/gpuRenderParticles.vertex.js +4 -0
  386. package/Shaders/gpuRenderParticles.vertex.js.map +1 -1
  387. package/Shaders/gpuUpdateParticles.vertex.js +15 -3
  388. package/Shaders/gpuUpdateParticles.vertex.js.map +1 -1
  389. package/Shaders/iblVoxelGrid.fragment.js +4 -1
  390. package/Shaders/iblVoxelGrid.fragment.js.map +1 -1
  391. package/ShadersWGSL/ShadersInclude/screenSpaceRayTrace.js +18 -7
  392. package/ShadersWGSL/ShadersInclude/screenSpaceRayTrace.js.map +1 -1
  393. package/ShadersWGSL/background.vertex.js +8 -8
  394. package/ShadersWGSL/background.vertex.js.map +1 -1
  395. package/ShadersWGSL/boundingBoxRenderer.vertex.js +2 -2
  396. package/ShadersWGSL/boundingBoxRenderer.vertex.js.map +1 -1
  397. package/ShadersWGSL/clearQuad.vertex.js +1 -1
  398. package/ShadersWGSL/clearQuad.vertex.js.map +1 -1
  399. package/ShadersWGSL/color.vertex.js +1 -1
  400. package/ShadersWGSL/color.vertex.js.map +1 -1
  401. package/ShadersWGSL/depth.vertex.js +3 -3
  402. package/ShadersWGSL/depth.vertex.js.map +1 -1
  403. package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js +2 -2
  404. package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js.map +1 -1
  405. package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.js +2 -2
  406. package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.js.map +1 -1
  407. package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js +2 -2
  408. package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js.map +1 -1
  409. package/ShadersWGSL/fxaa.vertex.js +1 -1
  410. package/ShadersWGSL/fxaa.vertex.js.map +1 -1
  411. package/ShadersWGSL/gaussianSplatting.vertex.js +3 -3
  412. package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
  413. package/ShadersWGSL/gaussianSplattingDepth.vertex.js +3 -3
  414. package/ShadersWGSL/gaussianSplattingDepth.vertex.js.map +1 -1
  415. package/ShadersWGSL/geometry.vertex.js +4 -4
  416. package/ShadersWGSL/geometry.vertex.js.map +1 -1
  417. package/ShadersWGSL/glowMapGeneration.vertex.js +4 -4
  418. package/ShadersWGSL/glowMapGeneration.vertex.js.map +1 -1
  419. package/ShadersWGSL/glowMapMerge.vertex.js +1 -1
  420. package/ShadersWGSL/glowMapMerge.vertex.js.map +1 -1
  421. package/ShadersWGSL/gpuUpdateParticles.compute.js +16 -1
  422. package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
  423. package/ShadersWGSL/greasedLine.vertex.js +10 -4
  424. package/ShadersWGSL/greasedLine.vertex.js.map +1 -1
  425. package/ShadersWGSL/hdrFiltering.vertex.js +1 -1
  426. package/ShadersWGSL/hdrFiltering.vertex.js.map +1 -1
  427. package/ShadersWGSL/hdrIrradianceFiltering.vertex.js +1 -1
  428. package/ShadersWGSL/hdrIrradianceFiltering.vertex.js.map +1 -1
  429. package/ShadersWGSL/iblVoxelGrid.vertex.js +2 -2
  430. package/ShadersWGSL/iblVoxelGrid.vertex.js.map +1 -1
  431. package/ShadersWGSL/iblVoxelSlabDebug.vertex.js +1 -1
  432. package/ShadersWGSL/iblVoxelSlabDebug.vertex.js.map +1 -1
  433. package/ShadersWGSL/kernelBlur.vertex.js +2 -2
  434. package/ShadersWGSL/kernelBlur.vertex.js.map +1 -1
  435. package/ShadersWGSL/layer.vertex.js +1 -1
  436. package/ShadersWGSL/layer.vertex.js.map +1 -1
  437. package/ShadersWGSL/lensFlare.vertex.js +1 -1
  438. package/ShadersWGSL/lensFlare.vertex.js.map +1 -1
  439. package/ShadersWGSL/line.vertex.js +2 -2
  440. package/ShadersWGSL/line.vertex.js.map +1 -1
  441. package/ShadersWGSL/meshUVSpaceRenderer.vertex.js +2 -2
  442. package/ShadersWGSL/meshUVSpaceRenderer.vertex.js.map +1 -1
  443. package/ShadersWGSL/meshUVSpaceRendererFinaliser.vertex.js +1 -1
  444. package/ShadersWGSL/meshUVSpaceRendererFinaliser.vertex.js.map +1 -1
  445. package/ShadersWGSL/meshUVSpaceRendererMasker.vertex.js +1 -1
  446. package/ShadersWGSL/meshUVSpaceRendererMasker.vertex.js.map +1 -1
  447. package/ShadersWGSL/particles.vertex.js +9 -9
  448. package/ShadersWGSL/particles.vertex.js.map +1 -1
  449. package/ShadersWGSL/picking.vertex.js +2 -2
  450. package/ShadersWGSL/picking.vertex.js.map +1 -1
  451. package/ShadersWGSL/procedural.vertex.js +1 -1
  452. package/ShadersWGSL/procedural.vertex.js.map +1 -1
  453. package/ShadersWGSL/shadowMap.vertex.js +4 -4
  454. package/ShadersWGSL/shadowMap.vertex.js.map +1 -1
  455. package/ShadersWGSL/sprites.vertex.js +3 -3
  456. package/ShadersWGSL/sprites.vertex.js.map +1 -1
  457. package/Sprites/spriteManager.js +4 -4
  458. package/Sprites/spriteManager.js.map +1 -1
  459. package/XR/features/WebXRAnchorSystem.js +2 -2
  460. package/XR/features/WebXRAnchorSystem.js.map +1 -1
  461. package/XR/features/WebXRControllerPhysics.js +0 -2
  462. package/XR/features/WebXRControllerPhysics.js.map +1 -1
  463. package/XR/features/WebXRHandTracking.js +4 -7
  464. package/XR/features/WebXRHandTracking.js.map +1 -1
  465. package/XR/features/WebXRNearInteraction.js +1 -1
  466. package/XR/features/WebXRNearInteraction.js.map +1 -1
  467. package/XR/motionController/webXRMicrosoftMixedRealityController.js +1 -1
  468. package/XR/motionController/webXRMicrosoftMixedRealityController.js.map +1 -1
  469. package/XR/motionController/webXROculusTouchMotionController.js +1 -1
  470. package/XR/motionController/webXROculusTouchMotionController.js.map +1 -1
  471. package/XR/webXRFeaturesManager.js +1 -1
  472. package/XR/webXRFeaturesManager.js.map +1 -1
  473. package/assetContainer.js +1 -1
  474. package/assetContainer.js.map +1 -1
  475. package/package.json +1 -1
  476. package/scene.d.ts +16 -0
  477. package/scene.js +30 -1
  478. package/scene.js.map +1 -1
  479. package/sceneComponent.js +1 -1
  480. package/sceneComponent.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"webGLRenderTargetWrapper.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGL/webGLRenderTargetWrapper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InternalTexture } from \"../../Materials/Textures/internalTexture\";\r\nimport type { TextureSize } from \"../../Materials/Textures/textureCreationOptions\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Constants } from \"../constants\";\r\nimport type { Engine } from \"../engine\";\r\nimport { RenderTargetWrapper } from \"../renderTargetWrapper\";\r\nimport type { ThinEngine } from \"../thinEngine\";\r\nimport type { WebGLHardwareTexture } from \"./webGLHardwareTexture\";\r\nimport { HasStencilAspect } from \"core/Materials/Textures/textureHelper.functions\";\r\n\r\n/** @internal */\r\nexport class WebGLRenderTargetWrapper extends RenderTargetWrapper {\r\n private _context: WebGLRenderingContext;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _framebuffer: Nullable<WebGLFramebuffer> = null;\r\n /**\r\n * @internal\r\n */\r\n public _depthStencilBuffer: Nullable<WebGLRenderbuffer> = null;\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public _MSAAFramebuffer: Nullable<WebGLFramebuffer> = null;\r\n\r\n // Multiview\r\n /**\r\n * @internal\r\n */\r\n public _colorTextureArray: Nullable<WebGLTexture> = null;\r\n /**\r\n * @internal\r\n */\r\n public _depthStencilTextureArray: Nullable<WebGLTexture> = null;\r\n /**\r\n * @internal\r\n */\r\n public _disposeOnlyFramebuffers = false;\r\n /**\r\n * @internal\r\n */\r\n public _currentLOD = 0;\r\n\r\n public override setDepthStencilTexture(texture: Nullable<InternalTexture>, disposeExisting = true) {\r\n super.setDepthStencilTexture(texture, disposeExisting);\r\n\r\n if (!texture) {\r\n return;\r\n }\r\n\r\n const engine = this._engine as ThinEngine;\r\n const gl = this._context as WebGL2RenderingContext;\r\n const hardwareTexture = texture._hardwareTexture as Nullable<WebGLHardwareTexture>;\r\n\r\n if (hardwareTexture && texture._autoMSAAManagement && this._MSAAFramebuffer) {\r\n const currentFb = engine._currentFramebuffer;\r\n engine._bindUnboundFramebuffer(this._MSAAFramebuffer);\r\n gl.framebufferRenderbuffer(\r\n gl.FRAMEBUFFER,\r\n HasStencilAspect(texture.format) ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT,\r\n gl.RENDERBUFFER,\r\n hardwareTexture.getMSAARenderBuffer()\r\n );\r\n engine._bindUnboundFramebuffer(currentFb);\r\n }\r\n }\r\n\r\n constructor(isMulti: boolean, isCube: boolean, size: TextureSize, engine: ThinEngine, context: WebGLRenderingContext) {\r\n super(isMulti, isCube, size, engine);\r\n\r\n this._context = context;\r\n }\r\n\r\n protected override _cloneRenderTargetWrapper(): Nullable<RenderTargetWrapper> {\r\n let rtw: Nullable<RenderTargetWrapper> = null;\r\n\r\n if (this._colorTextureArray && this._depthStencilTextureArray) {\r\n rtw = (this._engine as Engine).createMultiviewRenderTargetTexture(this.width, this.height);\r\n rtw.texture!.isReady = true;\r\n } else {\r\n rtw = super._cloneRenderTargetWrapper();\r\n }\r\n\r\n return rtw;\r\n }\r\n\r\n protected override _swapRenderTargetWrapper(target: WebGLRenderTargetWrapper): void {\r\n super._swapRenderTargetWrapper(target);\r\n\r\n target._framebuffer = this._framebuffer;\r\n target._depthStencilBuffer = this._depthStencilBuffer;\r\n target._MSAAFramebuffer = this._MSAAFramebuffer;\r\n target._colorTextureArray = this._colorTextureArray;\r\n target._depthStencilTextureArray = this._depthStencilTextureArray;\r\n\r\n this._framebuffer = this._depthStencilBuffer = this._MSAAFramebuffer = this._colorTextureArray = this._depthStencilTextureArray = null;\r\n }\r\n\r\n /**\r\n * Creates the depth/stencil texture\r\n * @param comparisonFunction Comparison function to use for the texture\r\n * @param bilinearFiltering true if bilinear filtering should be used when sampling the texture\r\n * @param generateStencil true if the stencil aspect should also be created\r\n * @param samples sample count to use when creating the texture\r\n * @param format format of the depth texture\r\n * @param label defines the label to use for the texture (for debugging purpose only)\r\n * @returns the depth/stencil created texture\r\n */\r\n public override createDepthStencilTexture(\r\n comparisonFunction: number = 0,\r\n bilinearFiltering: boolean = true,\r\n generateStencil: boolean = false,\r\n samples: number = 1,\r\n format: number = Constants.TEXTUREFORMAT_DEPTH32_FLOAT,\r\n label?: string\r\n ): InternalTexture {\r\n if (this._depthStencilBuffer) {\r\n const engine = this._engine as ThinEngine;\r\n // Dispose previous depth/stencil render buffers and clear the corresponding attachment.\r\n // Next time this framebuffer is bound, the new depth/stencil texture will be attached.\r\n const currentFrameBuffer = engine._currentFramebuffer;\r\n const gl = this._context;\r\n\r\n engine._bindUnboundFramebuffer(this._framebuffer);\r\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, null);\r\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, null);\r\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.RENDERBUFFER, null);\r\n engine._bindUnboundFramebuffer(currentFrameBuffer);\r\n gl.deleteRenderbuffer(this._depthStencilBuffer);\r\n\r\n this._depthStencilBuffer = null;\r\n }\r\n\r\n return super.createDepthStencilTexture(comparisonFunction, bilinearFiltering, generateStencil, samples, format, label);\r\n }\r\n\r\n /**\r\n * Shares the depth buffer of this render target with another render target.\r\n * @param renderTarget Destination renderTarget\r\n */\r\n public override shareDepth(renderTarget: WebGLRenderTargetWrapper): void {\r\n super.shareDepth(renderTarget);\r\n\r\n const gl = this._context;\r\n const depthbuffer = this._depthStencilBuffer;\r\n const framebuffer = renderTarget._MSAAFramebuffer || renderTarget._framebuffer;\r\n const engine = this._engine as ThinEngine;\r\n\r\n if (renderTarget._depthStencilBuffer && renderTarget._depthStencilBuffer !== depthbuffer) {\r\n gl.deleteRenderbuffer(renderTarget._depthStencilBuffer);\r\n }\r\n renderTarget._depthStencilBuffer = depthbuffer;\r\n const attachment = renderTarget._generateStencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;\r\n engine._bindUnboundFramebuffer(framebuffer);\r\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, depthbuffer);\r\n engine._bindUnboundFramebuffer(null);\r\n }\r\n\r\n /**\r\n * Binds a texture to this render target on a specific attachment\r\n * @param texture The texture to bind to the framebuffer\r\n * @param attachmentIndex Index of the attachment\r\n * @param faceIndexOrLayer The face or layer of the texture to render to in case of cube texture or array texture\r\n * @param lodLevel defines the lod level to bind to the frame buffer\r\n */\r\n private _bindTextureRenderTarget(texture: InternalTexture, attachmentIndex: number = 0, faceIndexOrLayer?: number, lodLevel: number = 0) {\r\n const hardwareTexture = texture._hardwareTexture as WebGLHardwareTexture;\r\n if (!hardwareTexture) {\r\n return;\r\n }\r\n\r\n const framebuffer = this._framebuffer;\r\n const engine = this._engine as ThinEngine;\r\n const currentFb = engine._currentFramebuffer;\r\n engine._bindUnboundFramebuffer(framebuffer);\r\n\r\n let attachment: any;\r\n if (engine.webGLVersion > 1) {\r\n const gl = this._context as WebGL2RenderingContext;\r\n\r\n attachment = (<any>gl)[\"COLOR_ATTACHMENT\" + attachmentIndex];\r\n if (texture.is2DArray || texture.is3D) {\r\n faceIndexOrLayer = faceIndexOrLayer ?? this.layerIndices?.[attachmentIndex] ?? 0;\r\n gl.framebufferTextureLayer(gl.FRAMEBUFFER, attachment, hardwareTexture.underlyingResource, lodLevel, faceIndexOrLayer);\r\n } else if (texture.isCube) {\r\n // if face index is not specified, try to query it from faceIndices\r\n // default is face 0\r\n faceIndexOrLayer = faceIndexOrLayer ?? this.faceIndices?.[attachmentIndex] ?? 0;\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndexOrLayer, hardwareTexture.underlyingResource, lodLevel);\r\n } else {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, hardwareTexture.underlyingResource, lodLevel);\r\n }\r\n } else {\r\n // Default behavior (WebGL)\r\n const gl = this._context;\r\n\r\n attachment = (<any>gl)[\"COLOR_ATTACHMENT\" + attachmentIndex + \"_WEBGL\"];\r\n const target = faceIndexOrLayer !== undefined ? gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndexOrLayer : gl.TEXTURE_2D;\r\n\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, target, hardwareTexture.underlyingResource, lodLevel);\r\n }\r\n\r\n if (texture._autoMSAAManagement && this._MSAAFramebuffer) {\r\n const gl = this._context;\r\n engine._bindUnboundFramebuffer(this._MSAAFramebuffer);\r\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, hardwareTexture.getMSAARenderBuffer());\r\n }\r\n\r\n engine._bindUnboundFramebuffer(currentFb);\r\n }\r\n\r\n /**\r\n * Set a texture in the textures array\r\n * @param texture the texture to set\r\n * @param index the index in the textures array to set\r\n * @param disposePrevious If this function should dispose the previous texture\r\n */\r\n public override setTexture(texture: InternalTexture, index: number = 0, disposePrevious: boolean = true) {\r\n super.setTexture(texture, index, disposePrevious);\r\n this._bindTextureRenderTarget(texture, index);\r\n }\r\n\r\n /**\r\n * Sets the layer and face indices of every render target texture\r\n * @param layers The layer of the texture to be set (make negative to not modify)\r\n * @param faces The face of the texture to be set (make negative to not modify)\r\n */\r\n public override setLayerAndFaceIndices(layers: number[], faces: number[]) {\r\n super.setLayerAndFaceIndices(layers, faces);\r\n\r\n if (!this.textures || !this.layerIndices || !this.faceIndices) {\r\n return;\r\n }\r\n\r\n // the length of this._attachments is the right one as it does not count the depth texture, in case we generated it\r\n const textureCount = this._attachments?.length ?? this.textures.length;\r\n for (let index = 0; index < textureCount; index++) {\r\n const texture = this.textures[index];\r\n if (!texture) {\r\n // The target type was probably -1 at creation time and setTexture has not been called yet for this index\r\n continue;\r\n }\r\n if (texture.is2DArray || texture.is3D) {\r\n this._bindTextureRenderTarget(texture, index, this.layerIndices[index]);\r\n } else if (texture.isCube) {\r\n this._bindTextureRenderTarget(texture, index, this.faceIndices[index]);\r\n } else {\r\n this._bindTextureRenderTarget(texture, index);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Set the face and layer indices of a texture in the textures array\r\n * @param index The index of the texture in the textures array to modify\r\n * @param layer The layer of the texture to be set\r\n * @param face The face of the texture to be set\r\n */\r\n public override setLayerAndFaceIndex(index: number = 0, layer?: number, face?: number): void {\r\n super.setLayerAndFaceIndex(index, layer, face);\r\n\r\n if (!this.textures || !this.layerIndices || !this.faceIndices) {\r\n return;\r\n }\r\n\r\n const texture = this.textures[index];\r\n if (texture.is2DArray || texture.is3D) {\r\n this._bindTextureRenderTarget(this.textures[index], index, this.layerIndices[index]);\r\n } else if (texture.isCube) {\r\n this._bindTextureRenderTarget(this.textures[index], index, this.faceIndices[index]);\r\n }\r\n }\r\n\r\n public override resolveMSAATextures(): void {\r\n const engine = this._engine as ThinEngine;\r\n const currentFramebuffer = engine._currentFramebuffer;\r\n\r\n engine._bindUnboundFramebuffer(this._MSAAFramebuffer);\r\n\r\n super.resolveMSAATextures();\r\n\r\n engine._bindUnboundFramebuffer(currentFramebuffer);\r\n }\r\n\r\n public override dispose(disposeOnlyFramebuffers = this._disposeOnlyFramebuffers): void {\r\n const gl = this._context;\r\n\r\n if (!disposeOnlyFramebuffers) {\r\n if (this._colorTextureArray) {\r\n this._context.deleteTexture(this._colorTextureArray);\r\n this._colorTextureArray = null;\r\n }\r\n if (this._depthStencilTextureArray) {\r\n this._context.deleteTexture(this._depthStencilTextureArray);\r\n this._depthStencilTextureArray = null;\r\n }\r\n }\r\n\r\n if (this._framebuffer) {\r\n gl.deleteFramebuffer(this._framebuffer);\r\n this._framebuffer = null;\r\n }\r\n\r\n if (this._depthStencilBuffer) {\r\n gl.deleteRenderbuffer(this._depthStencilBuffer);\r\n this._depthStencilBuffer = null;\r\n }\r\n\r\n if (this._MSAAFramebuffer) {\r\n gl.deleteFramebuffer(this._MSAAFramebuffer);\r\n this._MSAAFramebuffer = null;\r\n }\r\n\r\n super.dispose(disposeOnlyFramebuffers);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"webGLRenderTargetWrapper.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGL/webGLRenderTargetWrapper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InternalTexture } from \"../../Materials/Textures/internalTexture\";\r\nimport type { TextureSize } from \"../../Materials/Textures/textureCreationOptions\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Constants } from \"../constants\";\r\nimport type { Engine } from \"../engine\";\r\nimport { RenderTargetWrapper } from \"../renderTargetWrapper\";\r\nimport type { ThinEngine } from \"../thinEngine\";\r\nimport type { WebGLHardwareTexture } from \"./webGLHardwareTexture\";\r\nimport { HasStencilAspect } from \"core/Materials/Textures/textureHelper.functions\";\r\n\r\n/** @internal */\r\nexport class WebGLRenderTargetWrapper extends RenderTargetWrapper {\r\n private _context: WebGLRenderingContext;\r\n\r\n /**\r\n * @internal\r\n */\r\n public _framebuffer: Nullable<WebGLFramebuffer> = null;\r\n /**\r\n * @internal\r\n */\r\n public _depthStencilBuffer: Nullable<WebGLRenderbuffer> = null;\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n /**\r\n * @internal\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public _MSAAFramebuffer: Nullable<WebGLFramebuffer> = null;\r\n\r\n // Multiview\r\n /**\r\n * @internal\r\n */\r\n public _colorTextureArray: Nullable<WebGLTexture> = null;\r\n /**\r\n * @internal\r\n */\r\n public _depthStencilTextureArray: Nullable<WebGLTexture> = null;\r\n /**\r\n * @internal\r\n */\r\n public _disposeOnlyFramebuffers = false;\r\n /**\r\n * @internal\r\n */\r\n public _currentLOD = 0;\r\n\r\n public override setDepthStencilTexture(texture: Nullable<InternalTexture>, disposeExisting = true) {\r\n super.setDepthStencilTexture(texture, disposeExisting);\r\n\r\n if (!texture) {\r\n return;\r\n }\r\n\r\n const engine = this._engine as ThinEngine;\r\n const gl = this._context as WebGL2RenderingContext;\r\n const hardwareTexture = texture._hardwareTexture as Nullable<WebGLHardwareTexture>;\r\n\r\n if (hardwareTexture && texture._autoMSAAManagement && this._MSAAFramebuffer) {\r\n const currentFb = engine._currentFramebuffer;\r\n engine._bindUnboundFramebuffer(this._MSAAFramebuffer);\r\n gl.framebufferRenderbuffer(\r\n gl.FRAMEBUFFER,\r\n HasStencilAspect(texture.format) ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT,\r\n gl.RENDERBUFFER,\r\n hardwareTexture.getMSAARenderBuffer()\r\n );\r\n engine._bindUnboundFramebuffer(currentFb);\r\n }\r\n }\r\n\r\n constructor(isMulti: boolean, isCube: boolean, size: TextureSize, engine: ThinEngine, context: WebGLRenderingContext) {\r\n super(isMulti, isCube, size, engine);\r\n\r\n this._context = context;\r\n }\r\n\r\n protected override _cloneRenderTargetWrapper(): Nullable<RenderTargetWrapper> {\r\n let rtw: Nullable<RenderTargetWrapper>;\r\n\r\n if (this._colorTextureArray && this._depthStencilTextureArray) {\r\n rtw = (this._engine as Engine).createMultiviewRenderTargetTexture(this.width, this.height);\r\n rtw.texture!.isReady = true;\r\n } else {\r\n rtw = super._cloneRenderTargetWrapper();\r\n }\r\n\r\n return rtw;\r\n }\r\n\r\n protected override _swapRenderTargetWrapper(target: WebGLRenderTargetWrapper): void {\r\n super._swapRenderTargetWrapper(target);\r\n\r\n target._framebuffer = this._framebuffer;\r\n target._depthStencilBuffer = this._depthStencilBuffer;\r\n target._MSAAFramebuffer = this._MSAAFramebuffer;\r\n target._colorTextureArray = this._colorTextureArray;\r\n target._depthStencilTextureArray = this._depthStencilTextureArray;\r\n\r\n this._framebuffer = this._depthStencilBuffer = this._MSAAFramebuffer = this._colorTextureArray = this._depthStencilTextureArray = null;\r\n }\r\n\r\n /**\r\n * Creates the depth/stencil texture\r\n * @param comparisonFunction Comparison function to use for the texture\r\n * @param bilinearFiltering true if bilinear filtering should be used when sampling the texture\r\n * @param generateStencil true if the stencil aspect should also be created\r\n * @param samples sample count to use when creating the texture\r\n * @param format format of the depth texture\r\n * @param label defines the label to use for the texture (for debugging purpose only)\r\n * @returns the depth/stencil created texture\r\n */\r\n public override createDepthStencilTexture(\r\n comparisonFunction: number = 0,\r\n bilinearFiltering: boolean = true,\r\n generateStencil: boolean = false,\r\n samples: number = 1,\r\n format: number = Constants.TEXTUREFORMAT_DEPTH32_FLOAT,\r\n label?: string\r\n ): InternalTexture {\r\n if (this._depthStencilBuffer) {\r\n const engine = this._engine as ThinEngine;\r\n // Dispose previous depth/stencil render buffers and clear the corresponding attachment.\r\n // Next time this framebuffer is bound, the new depth/stencil texture will be attached.\r\n const currentFrameBuffer = engine._currentFramebuffer;\r\n const gl = this._context;\r\n\r\n engine._bindUnboundFramebuffer(this._framebuffer);\r\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, null);\r\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, null);\r\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT, gl.RENDERBUFFER, null);\r\n engine._bindUnboundFramebuffer(currentFrameBuffer);\r\n gl.deleteRenderbuffer(this._depthStencilBuffer);\r\n\r\n this._depthStencilBuffer = null;\r\n }\r\n\r\n return super.createDepthStencilTexture(comparisonFunction, bilinearFiltering, generateStencil, samples, format, label);\r\n }\r\n\r\n /**\r\n * Shares the depth buffer of this render target with another render target.\r\n * @param renderTarget Destination renderTarget\r\n */\r\n public override shareDepth(renderTarget: WebGLRenderTargetWrapper): void {\r\n super.shareDepth(renderTarget);\r\n\r\n const gl = this._context;\r\n const depthbuffer = this._depthStencilBuffer;\r\n const framebuffer = renderTarget._MSAAFramebuffer || renderTarget._framebuffer;\r\n const engine = this._engine as ThinEngine;\r\n\r\n if (renderTarget._depthStencilBuffer && renderTarget._depthStencilBuffer !== depthbuffer) {\r\n gl.deleteRenderbuffer(renderTarget._depthStencilBuffer);\r\n }\r\n renderTarget._depthStencilBuffer = depthbuffer;\r\n const attachment = renderTarget._generateStencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;\r\n engine._bindUnboundFramebuffer(framebuffer);\r\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, depthbuffer);\r\n engine._bindUnboundFramebuffer(null);\r\n }\r\n\r\n /**\r\n * Binds a texture to this render target on a specific attachment\r\n * @param texture The texture to bind to the framebuffer\r\n * @param attachmentIndex Index of the attachment\r\n * @param faceIndexOrLayer The face or layer of the texture to render to in case of cube texture or array texture\r\n * @param lodLevel defines the lod level to bind to the frame buffer\r\n */\r\n private _bindTextureRenderTarget(texture: InternalTexture, attachmentIndex: number = 0, faceIndexOrLayer?: number, lodLevel: number = 0) {\r\n const hardwareTexture = texture._hardwareTexture as WebGLHardwareTexture;\r\n if (!hardwareTexture) {\r\n return;\r\n }\r\n\r\n const framebuffer = this._framebuffer;\r\n const engine = this._engine as ThinEngine;\r\n const currentFb = engine._currentFramebuffer;\r\n engine._bindUnboundFramebuffer(framebuffer);\r\n\r\n let attachment: any;\r\n if (engine.webGLVersion > 1) {\r\n const gl = this._context as WebGL2RenderingContext;\r\n\r\n attachment = (<any>gl)[\"COLOR_ATTACHMENT\" + attachmentIndex];\r\n if (texture.is2DArray || texture.is3D) {\r\n faceIndexOrLayer = faceIndexOrLayer ?? this.layerIndices?.[attachmentIndex] ?? 0;\r\n gl.framebufferTextureLayer(gl.FRAMEBUFFER, attachment, hardwareTexture.underlyingResource, lodLevel, faceIndexOrLayer);\r\n } else if (texture.isCube) {\r\n // if face index is not specified, try to query it from faceIndices\r\n // default is face 0\r\n faceIndexOrLayer = faceIndexOrLayer ?? this.faceIndices?.[attachmentIndex] ?? 0;\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndexOrLayer, hardwareTexture.underlyingResource, lodLevel);\r\n } else {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, hardwareTexture.underlyingResource, lodLevel);\r\n }\r\n } else {\r\n // Default behavior (WebGL)\r\n const gl = this._context;\r\n\r\n attachment = (<any>gl)[\"COLOR_ATTACHMENT\" + attachmentIndex + \"_WEBGL\"];\r\n const target = faceIndexOrLayer !== undefined ? gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndexOrLayer : gl.TEXTURE_2D;\r\n\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, target, hardwareTexture.underlyingResource, lodLevel);\r\n }\r\n\r\n if (texture._autoMSAAManagement && this._MSAAFramebuffer) {\r\n const gl = this._context;\r\n engine._bindUnboundFramebuffer(this._MSAAFramebuffer);\r\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, hardwareTexture.getMSAARenderBuffer());\r\n }\r\n\r\n engine._bindUnboundFramebuffer(currentFb);\r\n }\r\n\r\n /**\r\n * Set a texture in the textures array\r\n * @param texture the texture to set\r\n * @param index the index in the textures array to set\r\n * @param disposePrevious If this function should dispose the previous texture\r\n */\r\n public override setTexture(texture: InternalTexture, index: number = 0, disposePrevious: boolean = true) {\r\n super.setTexture(texture, index, disposePrevious);\r\n this._bindTextureRenderTarget(texture, index);\r\n }\r\n\r\n /**\r\n * Sets the layer and face indices of every render target texture\r\n * @param layers The layer of the texture to be set (make negative to not modify)\r\n * @param faces The face of the texture to be set (make negative to not modify)\r\n */\r\n public override setLayerAndFaceIndices(layers: number[], faces: number[]) {\r\n super.setLayerAndFaceIndices(layers, faces);\r\n\r\n if (!this.textures || !this.layerIndices || !this.faceIndices) {\r\n return;\r\n }\r\n\r\n // the length of this._attachments is the right one as it does not count the depth texture, in case we generated it\r\n const textureCount = this._attachments?.length ?? this.textures.length;\r\n for (let index = 0; index < textureCount; index++) {\r\n const texture = this.textures[index];\r\n if (!texture) {\r\n // The target type was probably -1 at creation time and setTexture has not been called yet for this index\r\n continue;\r\n }\r\n if (texture.is2DArray || texture.is3D) {\r\n this._bindTextureRenderTarget(texture, index, this.layerIndices[index]);\r\n } else if (texture.isCube) {\r\n this._bindTextureRenderTarget(texture, index, this.faceIndices[index]);\r\n } else {\r\n this._bindTextureRenderTarget(texture, index);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Set the face and layer indices of a texture in the textures array\r\n * @param index The index of the texture in the textures array to modify\r\n * @param layer The layer of the texture to be set\r\n * @param face The face of the texture to be set\r\n */\r\n public override setLayerAndFaceIndex(index: number = 0, layer?: number, face?: number): void {\r\n super.setLayerAndFaceIndex(index, layer, face);\r\n\r\n if (!this.textures || !this.layerIndices || !this.faceIndices) {\r\n return;\r\n }\r\n\r\n const texture = this.textures[index];\r\n if (texture.is2DArray || texture.is3D) {\r\n this._bindTextureRenderTarget(this.textures[index], index, this.layerIndices[index]);\r\n } else if (texture.isCube) {\r\n this._bindTextureRenderTarget(this.textures[index], index, this.faceIndices[index]);\r\n }\r\n }\r\n\r\n public override resolveMSAATextures(): void {\r\n const engine = this._engine as ThinEngine;\r\n const currentFramebuffer = engine._currentFramebuffer;\r\n\r\n engine._bindUnboundFramebuffer(this._MSAAFramebuffer);\r\n\r\n super.resolveMSAATextures();\r\n\r\n engine._bindUnboundFramebuffer(currentFramebuffer);\r\n }\r\n\r\n public override dispose(disposeOnlyFramebuffers = this._disposeOnlyFramebuffers): void {\r\n const gl = this._context;\r\n\r\n if (!disposeOnlyFramebuffers) {\r\n if (this._colorTextureArray) {\r\n this._context.deleteTexture(this._colorTextureArray);\r\n this._colorTextureArray = null;\r\n }\r\n if (this._depthStencilTextureArray) {\r\n this._context.deleteTexture(this._depthStencilTextureArray);\r\n this._depthStencilTextureArray = null;\r\n }\r\n }\r\n\r\n if (this._framebuffer) {\r\n gl.deleteFramebuffer(this._framebuffer);\r\n this._framebuffer = null;\r\n }\r\n\r\n if (this._depthStencilBuffer) {\r\n gl.deleteRenderbuffer(this._depthStencilBuffer);\r\n this._depthStencilBuffer = null;\r\n }\r\n\r\n if (this._MSAAFramebuffer) {\r\n gl.deleteFramebuffer(this._MSAAFramebuffer);\r\n this._MSAAFramebuffer = null;\r\n }\r\n\r\n super.dispose(disposeOnlyFramebuffers);\r\n }\r\n}\r\n"]}
@@ -1 +1,88 @@
1
+ /**
2
+ * # WebGPU Debug Marker Implementation — Problem Statement
3
+ *
4
+ * ## Background
5
+ *
6
+ * WebGPU exposes `pushDebugGroup` / `popDebugGroup` on two distinct objects:
7
+ * - The **render encoder** (`GPUCommandEncoder`), which lives for the lifetime of an entire
8
+ * submission (one call to `flushFramebuffer`).
9
+ * - The **render pass encoder** (`GPURenderPassEncoder`), which lives only for the duration of
10
+ * a single render pass.
11
+ *
12
+ * WebGPU requires that every push/pop pair is issued on the **same** object, and that all open
13
+ * groups are closed before the object ends. Violating either rule is a validation error.
14
+ *
15
+ * ## The Core Problem
16
+ *
17
+ * From the Babylon.js side, the user calls `_debugPushGroup` / `_debugPopGroup` at arbitrary
18
+ * points in time — completely independently of whether a render pass is currently active or not.
19
+ * This creates several mismatched-context scenarios that must be handled transparently.
20
+ *
21
+ * ## Scenario 1 — Push on render encoder, pop inside a render pass
22
+ *
23
+ * 1. User calls `_debugPushGroup` while no render pass is active → group is pushed on the
24
+ * render encoder and recorded in `_debugMarkersEncoderGroups`.
25
+ * 2. A render pass starts (`_currentRenderPass` becomes non-null).
26
+ * 3. User calls `_debugPopGroup` while the render pass is active. The pop must logically target
27
+ * the render encoder group, but we cannot call `popDebugGroup` on the render encoder while a
28
+ * render pass is active (the pass is the live object).
29
+ * 4. We detect this mismatch because `_debugMarkersPassGroups` is empty (no group was pushed
30
+ * during this render pass), so we increment `_debugMarkersPendingEncoderPops` instead of
31
+ * issuing the pop immediately.
32
+ * 5. When the render pass ends (`_endCurrentRenderPass`), `_debugPendingPop` drains the
33
+ * `_debugMarkersPendingEncoderPops` counter and issues the deferred pops on the render encoder.
34
+ *
35
+ * **Edge case — deferred pop followed by a render-pass push:** if the user pushes another group
36
+ * during the same render pass *after* the deferred pop was recorded, that new group goes into
37
+ * `_debugMarkersPassGroups`. When the pass ends, `_debugPopBeforeEndOfEncoder` auto-pops the
38
+ * pass-level group, leaving it floating in `_debugMarkersPassGroups`. `_debugPendingPop` then
39
+ * pops from `_debugMarkersEncoderGroups` — a separate array that can never contain pass-level
40
+ * entries — so the floating pass-level group is preserved intact and will be re-pushed on the
41
+ * next render pass by `_debugPushAfterStartOfEncoder`.
42
+ *
43
+ * ## Scenario 2 — Push inside a render pass, render pass ends before pop
44
+ *
45
+ * 1. User calls `_debugPushGroup` while a render pass is active → group is pushed on the render
46
+ * pass encoder and recorded in `_debugMarkersPassGroups`.
47
+ * 2. The render pass ends (e.g. a new render target is bound) before the user calls
48
+ * `_debugPopGroup`. All open render-pass groups must be closed before
49
+ * `GPURenderPassEncoder.end()` is called.
50
+ * 3. `_debugPopBeforeEndOfEncoder` auto-pops every group in `_debugMarkersPassGroups` from the
51
+ * render pass encoder. The names remain in `_debugMarkersPassGroups` (the array is not
52
+ * cleared) so the logical nesting is preserved and the groups are now "floating".
53
+ * 4. After the next render pass is created, `_debugPushAfterStartOfEncoder` re-pushes all
54
+ * floating pass groups onto it, so that when the user eventually calls `_debugPopGroup`
55
+ * there is always a matching push on the current live object.
56
+ *
57
+ * ## Scenario 3 — `flushFramebuffer` called mid-frame (multiple times per frame)
58
+ *
59
+ * `flushFramebuffer` submits all recorded GPU commands and creates a brand-new pair of encoders.
60
+ * It can be called more than once during a single Babylon.js frame (e.g. for read-back
61
+ * operations, multi-view rendering, or explicit flushes). Each call:
62
+ * 1. Ends the current render pass if any (`_endCurrentRenderPass`), which triggers the
63
+ * render-pass auto-pop and pending-pop handling described above.
64
+ * 2. Calls `_debugPopBeforeEndOfEncoder` to close every still-open group on the render encoder
65
+ * before it is finalised and submitted. Only encoder-level groups (`_debugMarkersEncoderGroups`)
66
+ * are popped from the encoder; pass-level groups (`_debugMarkersPassGroups`) are already
67
+ * floating after step 1 and were never pushed on the encoder, so they are left alone.
68
+ * 3. Creates new `_uploadEncoder` / `_renderEncoder` instances.
69
+ * 4. Calls `_debugPushAfterStartOfEncoder` to re-open the encoder-level groups on the new render
70
+ * encoder, so the user's subsequent pops still find a matching push.
71
+ * When `flushFramebuffer` is called from `endFrame` (the last flush of the frame), both arrays
72
+ * are cleared (`_debugMarkersEncoderGroups` and `_debugMarkersPassGroups`) because any groups
73
+ * still open at end-of-frame are considered abandoned.
74
+ *
75
+ * ## State variables
76
+ *
77
+ * - `_debugMarkersEncoderGroups` — names of groups currently open on the render encoder (pushed
78
+ * while no render pass was active). These are re-pushed on the new render encoder after each
79
+ * mid-frame flush.
80
+ * - `_debugMarkersPassGroups` — names of groups pushed while a render pass was active. While a
81
+ * pass is live these are open on that pass encoder. When a pass ends they become "floating" —
82
+ * auto-popped from the finished pass but not yet on any GPU object — and remain here until the
83
+ * next render pass starts and `_debugPushAfterStartOfEncoder` re-opens them on it.
84
+ * - `_debugMarkersPendingEncoderPops` — count of user pops that arrived while a render pass was
85
+ * active but whose matching push lived on the render encoder. These pops are deferred and
86
+ * replayed on the render encoder once the render pass ends.
87
+ */
1
88
  export {};
@@ -1,44 +1,158 @@
1
+ /**
2
+ * # WebGPU Debug Marker Implementation — Problem Statement
3
+ *
4
+ * ## Background
5
+ *
6
+ * WebGPU exposes `pushDebugGroup` / `popDebugGroup` on two distinct objects:
7
+ * - The **render encoder** (`GPUCommandEncoder`), which lives for the lifetime of an entire
8
+ * submission (one call to `flushFramebuffer`).
9
+ * - The **render pass encoder** (`GPURenderPassEncoder`), which lives only for the duration of
10
+ * a single render pass.
11
+ *
12
+ * WebGPU requires that every push/pop pair is issued on the **same** object, and that all open
13
+ * groups are closed before the object ends. Violating either rule is a validation error.
14
+ *
15
+ * ## The Core Problem
16
+ *
17
+ * From the Babylon.js side, the user calls `_debugPushGroup` / `_debugPopGroup` at arbitrary
18
+ * points in time — completely independently of whether a render pass is currently active or not.
19
+ * This creates several mismatched-context scenarios that must be handled transparently.
20
+ *
21
+ * ## Scenario 1 — Push on render encoder, pop inside a render pass
22
+ *
23
+ * 1. User calls `_debugPushGroup` while no render pass is active → group is pushed on the
24
+ * render encoder and recorded in `_debugMarkersEncoderGroups`.
25
+ * 2. A render pass starts (`_currentRenderPass` becomes non-null).
26
+ * 3. User calls `_debugPopGroup` while the render pass is active. The pop must logically target
27
+ * the render encoder group, but we cannot call `popDebugGroup` on the render encoder while a
28
+ * render pass is active (the pass is the live object).
29
+ * 4. We detect this mismatch because `_debugMarkersPassGroups` is empty (no group was pushed
30
+ * during this render pass), so we increment `_debugMarkersPendingEncoderPops` instead of
31
+ * issuing the pop immediately.
32
+ * 5. When the render pass ends (`_endCurrentRenderPass`), `_debugPendingPop` drains the
33
+ * `_debugMarkersPendingEncoderPops` counter and issues the deferred pops on the render encoder.
34
+ *
35
+ * **Edge case — deferred pop followed by a render-pass push:** if the user pushes another group
36
+ * during the same render pass *after* the deferred pop was recorded, that new group goes into
37
+ * `_debugMarkersPassGroups`. When the pass ends, `_debugPopBeforeEndOfEncoder` auto-pops the
38
+ * pass-level group, leaving it floating in `_debugMarkersPassGroups`. `_debugPendingPop` then
39
+ * pops from `_debugMarkersEncoderGroups` — a separate array that can never contain pass-level
40
+ * entries — so the floating pass-level group is preserved intact and will be re-pushed on the
41
+ * next render pass by `_debugPushAfterStartOfEncoder`.
42
+ *
43
+ * ## Scenario 2 — Push inside a render pass, render pass ends before pop
44
+ *
45
+ * 1. User calls `_debugPushGroup` while a render pass is active → group is pushed on the render
46
+ * pass encoder and recorded in `_debugMarkersPassGroups`.
47
+ * 2. The render pass ends (e.g. a new render target is bound) before the user calls
48
+ * `_debugPopGroup`. All open render-pass groups must be closed before
49
+ * `GPURenderPassEncoder.end()` is called.
50
+ * 3. `_debugPopBeforeEndOfEncoder` auto-pops every group in `_debugMarkersPassGroups` from the
51
+ * render pass encoder. The names remain in `_debugMarkersPassGroups` (the array is not
52
+ * cleared) so the logical nesting is preserved and the groups are now "floating".
53
+ * 4. After the next render pass is created, `_debugPushAfterStartOfEncoder` re-pushes all
54
+ * floating pass groups onto it, so that when the user eventually calls `_debugPopGroup`
55
+ * there is always a matching push on the current live object.
56
+ *
57
+ * ## Scenario 3 — `flushFramebuffer` called mid-frame (multiple times per frame)
58
+ *
59
+ * `flushFramebuffer` submits all recorded GPU commands and creates a brand-new pair of encoders.
60
+ * It can be called more than once during a single Babylon.js frame (e.g. for read-back
61
+ * operations, multi-view rendering, or explicit flushes). Each call:
62
+ * 1. Ends the current render pass if any (`_endCurrentRenderPass`), which triggers the
63
+ * render-pass auto-pop and pending-pop handling described above.
64
+ * 2. Calls `_debugPopBeforeEndOfEncoder` to close every still-open group on the render encoder
65
+ * before it is finalised and submitted. Only encoder-level groups (`_debugMarkersEncoderGroups`)
66
+ * are popped from the encoder; pass-level groups (`_debugMarkersPassGroups`) are already
67
+ * floating after step 1 and were never pushed on the encoder, so they are left alone.
68
+ * 3. Creates new `_uploadEncoder` / `_renderEncoder` instances.
69
+ * 4. Calls `_debugPushAfterStartOfEncoder` to re-open the encoder-level groups on the new render
70
+ * encoder, so the user's subsequent pops still find a matching push.
71
+ * When `flushFramebuffer` is called from `endFrame` (the last flush of the frame), both arrays
72
+ * are cleared (`_debugMarkersEncoderGroups` and `_debugMarkersPassGroups`) because any groups
73
+ * still open at end-of-frame are considered abandoned.
74
+ *
75
+ * ## State variables
76
+ *
77
+ * - `_debugMarkersEncoderGroups` — names of groups currently open on the render encoder (pushed
78
+ * while no render pass was active). These are re-pushed on the new render encoder after each
79
+ * mid-frame flush.
80
+ * - `_debugMarkersPassGroups` — names of groups pushed while a render pass was active. While a
81
+ * pass is live these are open on that pass encoder. When a pass ends they become "floating" —
82
+ * auto-popped from the finished pass but not yet on any GPU object — and remain here until the
83
+ * next render pass starts and `_debugPushAfterStartOfEncoder` re-opens them on it.
84
+ * - `_debugMarkersPendingEncoderPops` — count of user pops that arrived while a render pass was
85
+ * active but whose matching push lived on the render encoder. These pops are deferred and
86
+ * replayed on the render encoder once the render pass ends.
87
+ */
88
+ import { Logger } from "../../../Misc/logger.js";
1
89
  import { WebGPUEngine } from "../../webgpuEngine.js";
2
90
  WebGPUEngine.prototype._debugPushGroup = function (groupName) {
3
- if (!this._options.enableGPUDebugMarkers) {
91
+ if (!this._enableGPUDebugMarkers) {
4
92
  return;
5
93
  }
6
- if (this._currentRenderTarget && !this._currentRenderPass) {
7
- this._startRenderTargetRenderPass(this._currentRenderTarget, false, null, false, false);
8
- }
94
+ const debugCommands = this._currentRenderPass ?? this._renderEncoder;
95
+ debugCommands.pushDebugGroup(groupName);
9
96
  if (this._currentRenderPass) {
10
- this._currentRenderPass.pushDebugGroup(groupName);
97
+ this._debugMarkersPassGroups.push(groupName);
11
98
  }
12
99
  else {
13
- this._renderEncoder.pushDebugGroup(groupName);
100
+ this._debugMarkersEncoderGroups.push(groupName);
101
+ }
102
+ if (this._showGPUDebugMarkersLog) {
103
+ Logger.Log(`[${this.frameId}] [E${this._debugMarkersEncoderGroups.length}|P${this._debugMarkersPassGroups.length}] Pushing debug group '${groupName}' on '${debugCommands.label}'.`);
14
104
  }
15
105
  };
16
106
  WebGPUEngine.prototype._debugPopGroup = function () {
17
- if (!this._options.enableGPUDebugMarkers) {
107
+ if (!this._enableGPUDebugMarkers) {
18
108
  return;
19
109
  }
20
- if (this._currentRenderTarget && !this._currentRenderPass) {
21
- this._startRenderTargetRenderPass(this._currentRenderTarget, false, null, false, false);
22
- }
110
+ const debugCommands = this._currentRenderPass ?? this._renderEncoder;
23
111
  if (this._currentRenderPass) {
24
- this._currentRenderPass.popDebugGroup();
112
+ if (this._debugMarkersPassGroups.length > 0) {
113
+ // Normal case: pop the most-recent pass-level group from the active render pass.
114
+ const groupName = this._debugMarkersPassGroups.pop();
115
+ debugCommands.popDebugGroup();
116
+ if (this._showGPUDebugMarkersLog) {
117
+ Logger.Log(`[${this.frameId}] [E${this._debugMarkersEncoderGroups.length}|P${this._debugMarkersPassGroups.length}] Popping debug group '${groupName}' on '${debugCommands.label}'.`);
118
+ }
119
+ }
120
+ else {
121
+ // The group was pushed on the render encoder (before this pass started); we cannot pop
122
+ // it while the pass is active, so defer it until the pass ends.
123
+ this._debugMarkersPendingEncoderPops++;
124
+ if (this._showGPUDebugMarkersLog) {
125
+ Logger.Log(`[${this.frameId}] [E${this._debugMarkersEncoderGroups.length}|P${this._debugMarkersPassGroups.length}] Deferring pop of encoder-level group on '${debugCommands.label}' (pending: ${this._debugMarkersPendingEncoderPops}).`);
126
+ }
127
+ }
25
128
  }
26
129
  else {
27
- this._renderEncoder.popDebugGroup();
130
+ if (this._debugMarkersPassGroups.length > 0) {
131
+ // The group was pushed during a render pass that has since ended (floating). No GPU
132
+ // object currently holds this push, so we just discard the name without any GPU call.
133
+ const groupName = this._debugMarkersPassGroups.pop();
134
+ if (this._showGPUDebugMarkersLog) {
135
+ Logger.Log(`[${this.frameId}] [E${this._debugMarkersEncoderGroups.length}|P${this._debugMarkersPassGroups.length}] Popping floating pass-level debug group '${groupName}' (no GPU pop needed).`);
136
+ }
137
+ }
138
+ else {
139
+ // Normal case: pop the most-recent encoder-level group from the render encoder.
140
+ const groupName = this._debugMarkersEncoderGroups.pop();
141
+ debugCommands.popDebugGroup();
142
+ if (this._showGPUDebugMarkersLog) {
143
+ Logger.Log(`[${this.frameId}] [E${this._debugMarkersEncoderGroups.length}|P${this._debugMarkersPassGroups.length}] Popping debug group '${groupName}' on '${debugCommands.label}'.`);
144
+ }
145
+ }
28
146
  }
29
147
  };
30
148
  WebGPUEngine.prototype._debugInsertMarker = function (text) {
31
- if (!this._options.enableGPUDebugMarkers) {
149
+ if (!this._enableGPUDebugMarkers) {
32
150
  return;
33
151
  }
34
- if (this._currentRenderTarget && !this._currentRenderPass) {
35
- this._startRenderTargetRenderPass(this._currentRenderTarget, false, null, false, false);
36
- }
37
- if (this._currentRenderPass) {
38
- this._currentRenderPass.insertDebugMarker(text);
39
- }
40
- else {
41
- this._renderEncoder.insertDebugMarker(text);
152
+ const debugCommands = this._currentRenderPass ?? this._renderEncoder;
153
+ if (this._showGPUDebugMarkersLog) {
154
+ Logger.Log(`[${this.frameId}] [E${this._debugMarkersEncoderGroups.length}|P${this._debugMarkersPassGroups.length}] Inserting debug marker '${text}' on '${debugCommands.label}'`);
42
155
  }
156
+ debugCommands.insertDebugMarker(text);
43
157
  };
44
158
  //# sourceMappingURL=engine.debugging.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"engine.debugging.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Engines/WebGPU/Extensions/engine.debugging.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,YAAY,CAAC,SAAS,CAAC,eAAe,GAAG,UAAU,SAAiB;IAChE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC;QACvC,OAAO;IACX,CAAC;IAED,IAAI,IAAI,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxD,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACJ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC;AACL,CAAC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,cAAc,GAAG;IACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC;QACvC,OAAO;IACX,CAAC;IAED,IAAI,IAAI,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxD,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,CAAC;IAC5C,CAAC;SAAM,CAAC;QACJ,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC;IACxC,CAAC;AACL,CAAC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAAU,IAAY;IAC9D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,qBAAqB,EAAE,CAAC;QACvC,OAAO;IACX,CAAC;IAED,IAAI,IAAI,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxD,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACJ,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;AACL,CAAC,CAAC","sourcesContent":["import { WebGPUEngine } from \"../../webgpuEngine\";\r\n\r\nWebGPUEngine.prototype._debugPushGroup = function (groupName: string): void {\r\n if (!this._options.enableGPUDebugMarkers) {\r\n return;\r\n }\r\n\r\n if (this._currentRenderTarget && !this._currentRenderPass) {\r\n this._startRenderTargetRenderPass(this._currentRenderTarget, false, null, false, false);\r\n }\r\n\r\n if (this._currentRenderPass) {\r\n this._currentRenderPass.pushDebugGroup(groupName);\r\n } else {\r\n this._renderEncoder.pushDebugGroup(groupName);\r\n }\r\n};\r\n\r\nWebGPUEngine.prototype._debugPopGroup = function (): void {\r\n if (!this._options.enableGPUDebugMarkers) {\r\n return;\r\n }\r\n\r\n if (this._currentRenderTarget && !this._currentRenderPass) {\r\n this._startRenderTargetRenderPass(this._currentRenderTarget, false, null, false, false);\r\n }\r\n\r\n if (this._currentRenderPass) {\r\n this._currentRenderPass.popDebugGroup();\r\n } else {\r\n this._renderEncoder.popDebugGroup();\r\n }\r\n};\r\n\r\nWebGPUEngine.prototype._debugInsertMarker = function (text: string): void {\r\n if (!this._options.enableGPUDebugMarkers) {\r\n return;\r\n }\r\n\r\n if (this._currentRenderTarget && !this._currentRenderPass) {\r\n this._startRenderTargetRenderPass(this._currentRenderTarget, false, null, false, false);\r\n }\r\n\r\n if (this._currentRenderPass) {\r\n this._currentRenderPass.insertDebugMarker(text);\r\n } else {\r\n this._renderEncoder.insertDebugMarker(text);\r\n }\r\n};\r\n"]}
1
+ {"version":3,"file":"engine.debugging.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Engines/WebGPU/Extensions/engine.debugging.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * # WebGPU Debug Marker Implementation — Problem Statement\r\n *\r\n * ## Background\r\n *\r\n * WebGPU exposes `pushDebugGroup` / `popDebugGroup` on two distinct objects:\r\n * - The **render encoder** (`GPUCommandEncoder`), which lives for the lifetime of an entire\r\n * submission (one call to `flushFramebuffer`).\r\n * - The **render pass encoder** (`GPURenderPassEncoder`), which lives only for the duration of\r\n * a single render pass.\r\n *\r\n * WebGPU requires that every push/pop pair is issued on the **same** object, and that all open\r\n * groups are closed before the object ends. Violating either rule is a validation error.\r\n *\r\n * ## The Core Problem\r\n *\r\n * From the Babylon.js side, the user calls `_debugPushGroup` / `_debugPopGroup` at arbitrary\r\n * points in time — completely independently of whether a render pass is currently active or not.\r\n * This creates several mismatched-context scenarios that must be handled transparently.\r\n *\r\n * ## Scenario 1 — Push on render encoder, pop inside a render pass\r\n *\r\n * 1. User calls `_debugPushGroup` while no render pass is active → group is pushed on the\r\n * render encoder and recorded in `_debugMarkersEncoderGroups`.\r\n * 2. A render pass starts (`_currentRenderPass` becomes non-null).\r\n * 3. User calls `_debugPopGroup` while the render pass is active. The pop must logically target\r\n * the render encoder group, but we cannot call `popDebugGroup` on the render encoder while a\r\n * render pass is active (the pass is the live object).\r\n * 4. We detect this mismatch because `_debugMarkersPassGroups` is empty (no group was pushed\r\n * during this render pass), so we increment `_debugMarkersPendingEncoderPops` instead of\r\n * issuing the pop immediately.\r\n * 5. When the render pass ends (`_endCurrentRenderPass`), `_debugPendingPop` drains the\r\n * `_debugMarkersPendingEncoderPops` counter and issues the deferred pops on the render encoder.\r\n *\r\n * **Edge case — deferred pop followed by a render-pass push:** if the user pushes another group\r\n * during the same render pass *after* the deferred pop was recorded, that new group goes into\r\n * `_debugMarkersPassGroups`. When the pass ends, `_debugPopBeforeEndOfEncoder` auto-pops the\r\n * pass-level group, leaving it floating in `_debugMarkersPassGroups`. `_debugPendingPop` then\r\n * pops from `_debugMarkersEncoderGroups` — a separate array that can never contain pass-level\r\n * entries — so the floating pass-level group is preserved intact and will be re-pushed on the\r\n * next render pass by `_debugPushAfterStartOfEncoder`.\r\n *\r\n * ## Scenario 2 — Push inside a render pass, render pass ends before pop\r\n *\r\n * 1. User calls `_debugPushGroup` while a render pass is active → group is pushed on the render\r\n * pass encoder and recorded in `_debugMarkersPassGroups`.\r\n * 2. The render pass ends (e.g. a new render target is bound) before the user calls\r\n * `_debugPopGroup`. All open render-pass groups must be closed before\r\n * `GPURenderPassEncoder.end()` is called.\r\n * 3. `_debugPopBeforeEndOfEncoder` auto-pops every group in `_debugMarkersPassGroups` from the\r\n * render pass encoder. The names remain in `_debugMarkersPassGroups` (the array is not\r\n * cleared) so the logical nesting is preserved and the groups are now \"floating\".\r\n * 4. After the next render pass is created, `_debugPushAfterStartOfEncoder` re-pushes all\r\n * floating pass groups onto it, so that when the user eventually calls `_debugPopGroup`\r\n * there is always a matching push on the current live object.\r\n *\r\n * ## Scenario 3 — `flushFramebuffer` called mid-frame (multiple times per frame)\r\n *\r\n * `flushFramebuffer` submits all recorded GPU commands and creates a brand-new pair of encoders.\r\n * It can be called more than once during a single Babylon.js frame (e.g. for read-back\r\n * operations, multi-view rendering, or explicit flushes). Each call:\r\n * 1. Ends the current render pass if any (`_endCurrentRenderPass`), which triggers the\r\n * render-pass auto-pop and pending-pop handling described above.\r\n * 2. Calls `_debugPopBeforeEndOfEncoder` to close every still-open group on the render encoder\r\n * before it is finalised and submitted. Only encoder-level groups (`_debugMarkersEncoderGroups`)\r\n * are popped from the encoder; pass-level groups (`_debugMarkersPassGroups`) are already\r\n * floating after step 1 and were never pushed on the encoder, so they are left alone.\r\n * 3. Creates new `_uploadEncoder` / `_renderEncoder` instances.\r\n * 4. Calls `_debugPushAfterStartOfEncoder` to re-open the encoder-level groups on the new render\r\n * encoder, so the user's subsequent pops still find a matching push.\r\n * When `flushFramebuffer` is called from `endFrame` (the last flush of the frame), both arrays\r\n * are cleared (`_debugMarkersEncoderGroups` and `_debugMarkersPassGroups`) because any groups\r\n * still open at end-of-frame are considered abandoned.\r\n *\r\n * ## State variables\r\n *\r\n * - `_debugMarkersEncoderGroups` — names of groups currently open on the render encoder (pushed\r\n * while no render pass was active). These are re-pushed on the new render encoder after each\r\n * mid-frame flush.\r\n * - `_debugMarkersPassGroups` — names of groups pushed while a render pass was active. While a\r\n * pass is live these are open on that pass encoder. When a pass ends they become \"floating\" —\r\n * auto-popped from the finished pass but not yet on any GPU object — and remain here until the\r\n * next render pass starts and `_debugPushAfterStartOfEncoder` re-opens them on it.\r\n * - `_debugMarkersPendingEncoderPops` — count of user pops that arrived while a render pass was\r\n * active but whose matching push lived on the render encoder. These pops are deferred and\r\n * replayed on the render encoder once the render pass ends.\r\n */\r\n\r\nimport { Logger } from \"../../../Misc/logger\";\r\nimport { WebGPUEngine } from \"../../webgpuEngine\";\r\n\r\nWebGPUEngine.prototype._debugPushGroup = function (groupName: string): void {\r\n if (!this._enableGPUDebugMarkers) {\r\n return;\r\n }\r\n\r\n const debugCommands = this._currentRenderPass ?? this._renderEncoder;\r\n\r\n debugCommands.pushDebugGroup(groupName);\r\n\r\n if (this._currentRenderPass) {\r\n this._debugMarkersPassGroups.push(groupName);\r\n } else {\r\n this._debugMarkersEncoderGroups.push(groupName);\r\n }\r\n\r\n if (this._showGPUDebugMarkersLog) {\r\n Logger.Log(\r\n `[${this.frameId}] [E${this._debugMarkersEncoderGroups.length}|P${this._debugMarkersPassGroups.length}] Pushing debug group '${groupName}' on '${debugCommands.label}'.`\r\n );\r\n }\r\n};\r\n\r\nWebGPUEngine.prototype._debugPopGroup = function (): void {\r\n if (!this._enableGPUDebugMarkers) {\r\n return;\r\n }\r\n\r\n const debugCommands = this._currentRenderPass ?? this._renderEncoder;\r\n\r\n if (this._currentRenderPass) {\r\n if (this._debugMarkersPassGroups.length > 0) {\r\n // Normal case: pop the most-recent pass-level group from the active render pass.\r\n const groupName = this._debugMarkersPassGroups.pop();\r\n debugCommands.popDebugGroup();\r\n if (this._showGPUDebugMarkersLog) {\r\n Logger.Log(\r\n `[${this.frameId}] [E${this._debugMarkersEncoderGroups.length}|P${this._debugMarkersPassGroups.length}] Popping debug group '${groupName}' on '${debugCommands.label}'.`\r\n );\r\n }\r\n } else {\r\n // The group was pushed on the render encoder (before this pass started); we cannot pop\r\n // it while the pass is active, so defer it until the pass ends.\r\n this._debugMarkersPendingEncoderPops++;\r\n if (this._showGPUDebugMarkersLog) {\r\n Logger.Log(\r\n `[${this.frameId}] [E${this._debugMarkersEncoderGroups.length}|P${this._debugMarkersPassGroups.length}] Deferring pop of encoder-level group on '${debugCommands.label}' (pending: ${this._debugMarkersPendingEncoderPops}).`\r\n );\r\n }\r\n }\r\n } else {\r\n if (this._debugMarkersPassGroups.length > 0) {\r\n // The group was pushed during a render pass that has since ended (floating). No GPU\r\n // object currently holds this push, so we just discard the name without any GPU call.\r\n const groupName = this._debugMarkersPassGroups.pop();\r\n if (this._showGPUDebugMarkersLog) {\r\n Logger.Log(\r\n `[${this.frameId}] [E${this._debugMarkersEncoderGroups.length}|P${this._debugMarkersPassGroups.length}] Popping floating pass-level debug group '${groupName}' (no GPU pop needed).`\r\n );\r\n }\r\n } else {\r\n // Normal case: pop the most-recent encoder-level group from the render encoder.\r\n const groupName = this._debugMarkersEncoderGroups.pop();\r\n debugCommands.popDebugGroup();\r\n if (this._showGPUDebugMarkersLog) {\r\n Logger.Log(\r\n `[${this.frameId}] [E${this._debugMarkersEncoderGroups.length}|P${this._debugMarkersPassGroups.length}] Popping debug group '${groupName}' on '${debugCommands.label}'.`\r\n );\r\n }\r\n }\r\n }\r\n};\r\n\r\nWebGPUEngine.prototype._debugInsertMarker = function (text: string): void {\r\n if (!this._enableGPUDebugMarkers) {\r\n return;\r\n }\r\n\r\n const debugCommands = this._currentRenderPass ?? this._renderEncoder;\r\n\r\n if (this._showGPUDebugMarkersLog) {\r\n Logger.Log(\r\n `[${this.frameId}] [E${this._debugMarkersEncoderGroups.length}|P${this._debugMarkersPassGroups.length}] Inserting debug marker '${text}' on '${debugCommands.label}'`\r\n );\r\n }\r\n\r\n debugCommands.insertDebugMarker(text);\r\n};\r\n"]}
@@ -154,7 +154,7 @@ export class WebGPUBufferManager {
154
154
  bytesPerRowAligned *= 2;
155
155
  }
156
156
  const data2 = new Uint8Array(data.buffer);
157
- let offset = bytesPerRow, offset2 = 0;
157
+ let offset = bytesPerRow, offset2;
158
158
  for (let y = 1; y < height; ++y) {
159
159
  offset2 = y * bytesPerRowAligned;
160
160
  for (let x = 0; x < bytesPerRow; ++x) {
@@ -1 +1 @@
1
- {"version":3,"file":"webgpuBufferManager.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuBufferManager.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable babylonjs/available */\r\nimport type { DataBuffer } from \"../../Buffers/dataBuffer\";\r\nimport { WebGPUDataBuffer } from \"../../Meshes/WebGPU/webgpuDataBuffer\";\r\nimport { FromHalfFloat } from \"../../Misc/textureTools\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { allocateAndCopyTypedBuffer } from \"../abstractEngine.functions\";\r\nimport { Constants } from \"../constants\";\r\nimport type { WebGPUEngine } from \"../webgpuEngine\";\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\n\r\n/** @internal */\r\nexport class WebGPUBufferManager {\r\n private _engine: WebGPUEngine;\r\n private _device: GPUDevice;\r\n private _deferredReleaseBuffers: Array<GPUBuffer> = [];\r\n\r\n private static _IsGPUBuffer(buffer: DataBuffer | GPUBuffer): buffer is GPUBuffer {\r\n return (buffer as DataBuffer).underlyingResource === undefined;\r\n }\r\n\r\n private static _FlagsToString(flags: GPUBufferUsageFlags, suffix = \"\") {\r\n let result = suffix;\r\n\r\n for (let i = 0; i <= 9; ++i) {\r\n if (flags & (1 << i)) {\r\n if (result) {\r\n result += \"_\";\r\n }\r\n result += WebGPUConstants.BufferUsage[1 << i];\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n constructor(engine: WebGPUEngine, device: GPUDevice) {\r\n this._engine = engine;\r\n this._device = device;\r\n }\r\n\r\n public createRawBuffer(viewOrSize: ArrayBufferView | number, flags: GPUBufferUsageFlags, mappedAtCreation = false, label?: string): GPUBuffer {\r\n const alignedLength = (viewOrSize as ArrayBufferView).byteLength !== undefined ? ((viewOrSize as ArrayBufferView).byteLength + 3) & ~3 : ((viewOrSize as number) + 3) & ~3; // 4 bytes alignments (because of the upload which requires this)\r\n const verticesBufferDescriptor = {\r\n label: \"BabylonWebGPUDevice\" + this._engine.uniqueId + \"_\" + WebGPUBufferManager._FlagsToString(flags, label ?? \"Buffer\") + \"_size\" + alignedLength,\r\n mappedAtCreation,\r\n size: alignedLength,\r\n usage: flags,\r\n };\r\n\r\n return this._device.createBuffer(verticesBufferDescriptor);\r\n }\r\n\r\n public createBuffer(viewOrSize: ArrayBufferView | number, flags: GPUBufferUsageFlags, label?: string): WebGPUDataBuffer {\r\n const isView = (viewOrSize as ArrayBufferView).byteLength !== undefined;\r\n const dataBuffer = new WebGPUDataBuffer();\r\n const labelId = \"DataBufferUniqueId=\" + dataBuffer.uniqueId;\r\n dataBuffer.buffer = this.createRawBuffer(viewOrSize, flags, undefined, label ? labelId + \"-\" + label : labelId);\r\n dataBuffer.references = 1;\r\n // Next line should work, because the \"size\" property of GPUBuffer is required by the spec, but it seems that it fails in the CI / in playwright tests. So, we will recalculate the aligned size ourselves.\r\n //dataBuffer.capacity = dataBuffer.buffer.size;\r\n dataBuffer.capacity = (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 dataBuffer.engineId = this._engine.uniqueId;\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 // This calls GPUBuffer.writeBuffer() with no alignment corrections\r\n // dstByteOffset and byteLength must both be aligned to 4 bytes and bytes moved must be within src and dst arrays\r\n public setRawData(buffer: GPUBuffer, dstByteOffset: number, src: ArrayBufferView, srcByteOffset: number, byteLength: number): void {\r\n srcByteOffset += src.byteOffset;\r\n\r\n this._device.queue.writeBuffer(buffer, dstByteOffset, src.buffer, srcByteOffset, byteLength);\r\n }\r\n\r\n // This calls GPUBuffer.writeBuffer() with alignment corrections (dstByteOffset and byteLength will be aligned to 4 byte boundaries)\r\n // If alignment is needed, src must be a full copy of dataBuffer, or at least should be large enough to cope with the additional bytes copied because of alignment!\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 - srcByteOffset;\r\n\r\n // Make sure the dst offset is aligned to 4 bytes\r\n const startPre = dstByteOffset & 3;\r\n\r\n srcByteOffset -= startPre;\r\n dstByteOffset -= startPre;\r\n\r\n // Make sure the byte length is aligned to 4 bytes\r\n const originalByteLength = byteLength;\r\n\r\n byteLength = (byteLength + startPre + 3) & ~3;\r\n\r\n // Check if the backing buffer of src is large enough to cope with the additional bytes copied because of alignment\r\n const backingBufferSize = src.buffer.byteLength - src.byteOffset;\r\n\r\n if (backingBufferSize < byteLength) {\r\n // Not enough place in the backing buffer for the aligned copy.\r\n // Creates a new buffer and copy the source data to it.\r\n // The buffer will have byteLength - originalByteLength zeros at the end.\r\n const tmpBuffer = new Uint8Array(byteLength);\r\n tmpBuffer.set(new Uint8Array(src.buffer, src.byteOffset + srcByteOffset, originalByteLength));\r\n src = tmpBuffer;\r\n srcByteOffset = 0;\r\n }\r\n\r\n this.setRawData(buffer, dstByteOffset, src, srcByteOffset, byteLength);\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 } else {\r\n dataLength = Math.min(dataLength, destArray.length);\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 // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/promise-function-async\r\n public readDataFromBuffer(\r\n gpuBuffer: GPUBuffer,\r\n size: number,\r\n width: number,\r\n height: number,\r\n bytesPerRow: number,\r\n bytesPerRowAligned: number,\r\n type = Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n offset = 0,\r\n buffer: Nullable<ArrayBufferView> = null,\r\n destroyBuffer = true,\r\n noDataConversion = false\r\n ): Promise<ArrayBufferView> {\r\n const floatFormat = type === Constants.TEXTURETYPE_FLOAT ? 2 : type === Constants.TEXTURETYPE_HALF_FLOAT ? 1 : 0;\r\n const engineId = this._engine.uniqueId;\r\n return new Promise((resolve, reject) => {\r\n // eslint-disable-next-line github/no-then\r\n gpuBuffer.mapAsync(WebGPUConstants.MapMode.Read, offset, size).then(\r\n () => {\r\n const copyArrayBuffer = gpuBuffer.getMappedRange(offset, size);\r\n let data: Nullable<ArrayBufferView> | Uint8Array | Float32Array = buffer;\r\n if (noDataConversion) {\r\n if (data === null) {\r\n data = allocateAndCopyTypedBuffer(type, size, true, copyArrayBuffer);\r\n } else {\r\n data = allocateAndCopyTypedBuffer(type, data.buffer, undefined, copyArrayBuffer);\r\n }\r\n } else {\r\n if (data === null) {\r\n switch (floatFormat) {\r\n case 0: // byte format\r\n data = new Uint8Array(size);\r\n (data as Uint8Array).set(new Uint8Array(copyArrayBuffer));\r\n break;\r\n case 1: // half float\r\n // TODO WEBGPU use computer shaders (or render pass) to make the conversion?\r\n data = this._getHalfFloatAsFloatRGBAArrayBuffer(size / 2, copyArrayBuffer);\r\n break;\r\n case 2: // float\r\n data = new Float32Array(size / 4);\r\n (data as Float32Array).set(new Float32Array(copyArrayBuffer));\r\n break;\r\n }\r\n } else {\r\n switch (floatFormat) {\r\n case 0: // byte format\r\n data = new Uint8Array(data.buffer);\r\n (data as Uint8Array).set(new Uint8Array(copyArrayBuffer, 0, Math.min(data.byteLength, size)));\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, 0, data.byteLength / 4));\r\n break;\r\n }\r\n }\r\n }\r\n if (bytesPerRow !== bytesPerRowAligned) {\r\n // TODO WEBGPU use computer shaders (or render pass) to build the final buffer data?\r\n if (floatFormat === 1 && !noDataConversion) {\r\n // half float have been converted to float above\r\n bytesPerRow *= 2;\r\n bytesPerRowAligned *= 2;\r\n }\r\n const data2 = new Uint8Array(data.buffer);\r\n let offset = bytesPerRow,\r\n offset2 = 0;\r\n for (let y = 1; y < height; ++y) {\r\n offset2 = y * bytesPerRowAligned;\r\n for (let x = 0; x < bytesPerRow; ++x) {\r\n data2[offset++] = data2[offset2++];\r\n }\r\n }\r\n if (floatFormat !== 0 && !noDataConversion) {\r\n data = new Float32Array(data2.buffer, 0, offset / 4);\r\n } else {\r\n data = new Uint8Array(data2.buffer, 0, offset);\r\n }\r\n }\r\n gpuBuffer.unmap();\r\n if (destroyBuffer) {\r\n this.releaseBuffer(gpuBuffer);\r\n }\r\n resolve(data);\r\n },\r\n (reason) => {\r\n if (this._engine.isDisposed || this._engine.uniqueId !== engineId) {\r\n // The engine was disposed while waiting for the promise, or a context loss/restoration has occurred: don't reject\r\n resolve(new Uint8Array());\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(reason);\r\n }\r\n }\r\n );\r\n });\r\n }\r\n\r\n public releaseBuffer(buffer: DataBuffer | GPUBuffer): boolean {\r\n if (WebGPUBufferManager._IsGPUBuffer(buffer)) {\r\n this._deferredReleaseBuffers.push(buffer);\r\n return true;\r\n }\r\n\r\n buffer.references--;\r\n\r\n if (buffer.references === 0) {\r\n this._deferredReleaseBuffers.push(buffer.underlyingResource as GPUBuffer);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public destroyDeferredBuffers(): void {\r\n for (let i = 0; i < this._deferredReleaseBuffers.length; ++i) {\r\n this._deferredReleaseBuffers[i].destroy();\r\n }\r\n\r\n this._deferredReleaseBuffers.length = 0;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"webgpuBufferManager.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuBufferManager.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable babylonjs/available */\r\nimport type { DataBuffer } from \"../../Buffers/dataBuffer\";\r\nimport { WebGPUDataBuffer } from \"../../Meshes/WebGPU/webgpuDataBuffer\";\r\nimport { FromHalfFloat } from \"../../Misc/textureTools\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { allocateAndCopyTypedBuffer } from \"../abstractEngine.functions\";\r\nimport { Constants } from \"../constants\";\r\nimport type { WebGPUEngine } from \"../webgpuEngine\";\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\n\r\n/** @internal */\r\nexport class WebGPUBufferManager {\r\n private _engine: WebGPUEngine;\r\n private _device: GPUDevice;\r\n private _deferredReleaseBuffers: Array<GPUBuffer> = [];\r\n\r\n private static _IsGPUBuffer(buffer: DataBuffer | GPUBuffer): buffer is GPUBuffer {\r\n return (buffer as DataBuffer).underlyingResource === undefined;\r\n }\r\n\r\n private static _FlagsToString(flags: GPUBufferUsageFlags, suffix = \"\") {\r\n let result = suffix;\r\n\r\n for (let i = 0; i <= 9; ++i) {\r\n if (flags & (1 << i)) {\r\n if (result) {\r\n result += \"_\";\r\n }\r\n result += WebGPUConstants.BufferUsage[1 << i];\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n constructor(engine: WebGPUEngine, device: GPUDevice) {\r\n this._engine = engine;\r\n this._device = device;\r\n }\r\n\r\n public createRawBuffer(viewOrSize: ArrayBufferView | number, flags: GPUBufferUsageFlags, mappedAtCreation = false, label?: string): GPUBuffer {\r\n const alignedLength = (viewOrSize as ArrayBufferView).byteLength !== undefined ? ((viewOrSize as ArrayBufferView).byteLength + 3) & ~3 : ((viewOrSize as number) + 3) & ~3; // 4 bytes alignments (because of the upload which requires this)\r\n const verticesBufferDescriptor = {\r\n label: \"BabylonWebGPUDevice\" + this._engine.uniqueId + \"_\" + WebGPUBufferManager._FlagsToString(flags, label ?? \"Buffer\") + \"_size\" + alignedLength,\r\n mappedAtCreation,\r\n size: alignedLength,\r\n usage: flags,\r\n };\r\n\r\n return this._device.createBuffer(verticesBufferDescriptor);\r\n }\r\n\r\n public createBuffer(viewOrSize: ArrayBufferView | number, flags: GPUBufferUsageFlags, label?: string): WebGPUDataBuffer {\r\n const isView = (viewOrSize as ArrayBufferView).byteLength !== undefined;\r\n const dataBuffer = new WebGPUDataBuffer();\r\n const labelId = \"DataBufferUniqueId=\" + dataBuffer.uniqueId;\r\n dataBuffer.buffer = this.createRawBuffer(viewOrSize, flags, undefined, label ? labelId + \"-\" + label : labelId);\r\n dataBuffer.references = 1;\r\n // Next line should work, because the \"size\" property of GPUBuffer is required by the spec, but it seems that it fails in the CI / in playwright tests. So, we will recalculate the aligned size ourselves.\r\n //dataBuffer.capacity = dataBuffer.buffer.size;\r\n dataBuffer.capacity = (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 dataBuffer.engineId = this._engine.uniqueId;\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 // This calls GPUBuffer.writeBuffer() with no alignment corrections\r\n // dstByteOffset and byteLength must both be aligned to 4 bytes and bytes moved must be within src and dst arrays\r\n public setRawData(buffer: GPUBuffer, dstByteOffset: number, src: ArrayBufferView, srcByteOffset: number, byteLength: number): void {\r\n srcByteOffset += src.byteOffset;\r\n\r\n this._device.queue.writeBuffer(buffer, dstByteOffset, src.buffer, srcByteOffset, byteLength);\r\n }\r\n\r\n // This calls GPUBuffer.writeBuffer() with alignment corrections (dstByteOffset and byteLength will be aligned to 4 byte boundaries)\r\n // If alignment is needed, src must be a full copy of dataBuffer, or at least should be large enough to cope with the additional bytes copied because of alignment!\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 - srcByteOffset;\r\n\r\n // Make sure the dst offset is aligned to 4 bytes\r\n const startPre = dstByteOffset & 3;\r\n\r\n srcByteOffset -= startPre;\r\n dstByteOffset -= startPre;\r\n\r\n // Make sure the byte length is aligned to 4 bytes\r\n const originalByteLength = byteLength;\r\n\r\n byteLength = (byteLength + startPre + 3) & ~3;\r\n\r\n // Check if the backing buffer of src is large enough to cope with the additional bytes copied because of alignment\r\n const backingBufferSize = src.buffer.byteLength - src.byteOffset;\r\n\r\n if (backingBufferSize < byteLength) {\r\n // Not enough place in the backing buffer for the aligned copy.\r\n // Creates a new buffer and copy the source data to it.\r\n // The buffer will have byteLength - originalByteLength zeros at the end.\r\n const tmpBuffer = new Uint8Array(byteLength);\r\n tmpBuffer.set(new Uint8Array(src.buffer, src.byteOffset + srcByteOffset, originalByteLength));\r\n src = tmpBuffer;\r\n srcByteOffset = 0;\r\n }\r\n\r\n this.setRawData(buffer, dstByteOffset, src, srcByteOffset, byteLength);\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 } else {\r\n dataLength = Math.min(dataLength, destArray.length);\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 // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/promise-function-async\r\n public readDataFromBuffer(\r\n gpuBuffer: GPUBuffer,\r\n size: number,\r\n width: number,\r\n height: number,\r\n bytesPerRow: number,\r\n bytesPerRowAligned: number,\r\n type = Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n offset = 0,\r\n buffer: Nullable<ArrayBufferView> = null,\r\n destroyBuffer = true,\r\n noDataConversion = false\r\n ): Promise<ArrayBufferView> {\r\n const floatFormat = type === Constants.TEXTURETYPE_FLOAT ? 2 : type === Constants.TEXTURETYPE_HALF_FLOAT ? 1 : 0;\r\n const engineId = this._engine.uniqueId;\r\n return new Promise((resolve, reject) => {\r\n // eslint-disable-next-line github/no-then\r\n gpuBuffer.mapAsync(WebGPUConstants.MapMode.Read, offset, size).then(\r\n () => {\r\n const copyArrayBuffer = gpuBuffer.getMappedRange(offset, size);\r\n let data: Nullable<ArrayBufferView> | Uint8Array | Float32Array = buffer;\r\n if (noDataConversion) {\r\n if (data === null) {\r\n data = allocateAndCopyTypedBuffer(type, size, true, copyArrayBuffer);\r\n } else {\r\n data = allocateAndCopyTypedBuffer(type, data.buffer, undefined, copyArrayBuffer);\r\n }\r\n } else {\r\n if (data === null) {\r\n switch (floatFormat) {\r\n case 0: // byte format\r\n data = new Uint8Array(size);\r\n (data as Uint8Array).set(new Uint8Array(copyArrayBuffer));\r\n break;\r\n case 1: // half float\r\n // TODO WEBGPU use computer shaders (or render pass) to make the conversion?\r\n data = this._getHalfFloatAsFloatRGBAArrayBuffer(size / 2, copyArrayBuffer);\r\n break;\r\n case 2: // float\r\n data = new Float32Array(size / 4);\r\n (data as Float32Array).set(new Float32Array(copyArrayBuffer));\r\n break;\r\n }\r\n } else {\r\n switch (floatFormat) {\r\n case 0: // byte format\r\n data = new Uint8Array(data.buffer);\r\n (data as Uint8Array).set(new Uint8Array(copyArrayBuffer, 0, Math.min(data.byteLength, size)));\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, 0, data.byteLength / 4));\r\n break;\r\n }\r\n }\r\n }\r\n if (bytesPerRow !== bytesPerRowAligned) {\r\n // TODO WEBGPU use computer shaders (or render pass) to build the final buffer data?\r\n if (floatFormat === 1 && !noDataConversion) {\r\n // half float have been converted to float above\r\n bytesPerRow *= 2;\r\n bytesPerRowAligned *= 2;\r\n }\r\n const data2 = new Uint8Array(data.buffer);\r\n let offset = bytesPerRow,\r\n offset2: number;\r\n for (let y = 1; y < height; ++y) {\r\n offset2 = y * bytesPerRowAligned;\r\n for (let x = 0; x < bytesPerRow; ++x) {\r\n data2[offset++] = data2[offset2++];\r\n }\r\n }\r\n if (floatFormat !== 0 && !noDataConversion) {\r\n data = new Float32Array(data2.buffer, 0, offset / 4);\r\n } else {\r\n data = new Uint8Array(data2.buffer, 0, offset);\r\n }\r\n }\r\n gpuBuffer.unmap();\r\n if (destroyBuffer) {\r\n this.releaseBuffer(gpuBuffer);\r\n }\r\n resolve(data);\r\n },\r\n (reason) => {\r\n if (this._engine.isDisposed || this._engine.uniqueId !== engineId) {\r\n // The engine was disposed while waiting for the promise, or a context loss/restoration has occurred: don't reject\r\n resolve(new Uint8Array());\r\n } else {\r\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\r\n reject(reason);\r\n }\r\n }\r\n );\r\n });\r\n }\r\n\r\n public releaseBuffer(buffer: DataBuffer | GPUBuffer): boolean {\r\n if (WebGPUBufferManager._IsGPUBuffer(buffer)) {\r\n this._deferredReleaseBuffers.push(buffer);\r\n return true;\r\n }\r\n\r\n buffer.references--;\r\n\r\n if (buffer.references === 0) {\r\n this._deferredReleaseBuffers.push(buffer.underlyingResource as GPUBuffer);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n public destroyDeferredBuffers(): void {\r\n for (let i = 0; i < this._deferredReleaseBuffers.length; ++i) {\r\n this._deferredReleaseBuffers[i].destroy();\r\n }\r\n\r\n this._deferredReleaseBuffers.length = 0;\r\n }\r\n}\r\n"]}
@@ -4,7 +4,7 @@ export class WebGPUShaderProcessor {
4
4
  this.shaderLanguage = 0 /* ShaderLanguage.GLSL */;
5
5
  }
6
6
  _addUniformToLeftOverUBO(name, uniformType, preProcessors) {
7
- let length = 0;
7
+ let length;
8
8
  [name, uniformType, length] = this._getArraySize(name, uniformType, preProcessors);
9
9
  for (let i = 0; i < this._webgpuProcessingContext.leftOverUniforms.length; i++) {
10
10
  if (this._webgpuProcessingContext.leftOverUniforms[i].name === name) {