@onerjs/core 9.0.1 → 9.0.3
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.
- package/Animations/animationGroup.pure.js.map +1 -1
- package/Buffers/buffer.pure.js +4 -0
- package/Buffers/buffer.pure.js.map +1 -1
- package/Cameras/camera.pure.d.ts +14 -0
- package/Cameras/camera.pure.js +15 -0
- package/Cameras/camera.pure.js.map +1 -1
- package/Compute/computeShader.pure.d.ts +2 -1
- package/Compute/computeShader.pure.js +29 -10
- package/Compute/computeShader.pure.js.map +1 -1
- package/Culling/ray.core.js +22 -9
- package/Culling/ray.core.js.map +1 -1
- package/Engines/IDrawContext.d.ts +2 -0
- package/Engines/IDrawContext.js.map +1 -1
- package/Engines/Native/nativeInterfaces.d.ts +55 -4
- package/Engines/Native/nativeInterfaces.js.map +1 -1
- package/Engines/Native/nativeRenderTargetWrapper.d.ts +1 -0
- package/Engines/Native/nativeRenderTargetWrapper.js +5 -1
- package/Engines/Native/nativeRenderTargetWrapper.js.map +1 -1
- package/Engines/Processors/shaderCodeInliner.d.ts +2 -0
- package/Engines/Processors/shaderCodeInliner.js +251 -6
- package/Engines/Processors/shaderCodeInliner.js.map +1 -1
- package/Engines/Processors/shaderProcessor.js +10 -1
- package/Engines/Processors/shaderProcessor.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.debugging.pure.js +12 -0
- package/Engines/WebGPU/Extensions/engine.debugging.pure.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.multiRender.pure.js +0 -1
- package/Engines/WebGPU/Extensions/engine.multiRender.pure.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.query.pure.js +5 -0
- package/Engines/WebGPU/Extensions/engine.query.pure.js.map +1 -1
- package/Engines/WebGPU/webgpuBufferManager.js +7 -0
- package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheTextureView.d.ts +1 -1
- package/Engines/WebGPU/webgpuCacheTextureView.js +20 -8
- package/Engines/WebGPU/webgpuCacheTextureView.js.map +1 -1
- package/Engines/WebGPU/webgpuDrawContext.d.ts +2 -0
- package/Engines/WebGPU/webgpuDrawContext.js +6 -0
- package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
- package/Engines/WebGPU/webgpuQuerySet.d.ts +3 -3
- package/Engines/WebGPU/webgpuQuerySet.js +23 -9
- package/Engines/WebGPU/webgpuQuerySet.js.map +1 -1
- package/Engines/WebGPU/webgpuRenderPassCommandStream.d.ts +156 -0
- package/Engines/WebGPU/webgpuRenderPassCommandStream.js +323 -0
- package/Engines/WebGPU/webgpuRenderPassCommandStream.js.map +1 -0
- package/Engines/WebGPU/webgpuTextureManager.d.ts +1 -1
- package/Engines/WebGPU/webgpuTextureManager.js +4 -3
- package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
- package/Engines/WebGPU/webgpuTimestampQuery.d.ts +3 -1
- package/Engines/WebGPU/webgpuTimestampQuery.js +9 -6
- package/Engines/WebGPU/webgpuTimestampQuery.js.map +1 -1
- package/Engines/abstractEngine.pure.d.ts +2 -0
- package/Engines/abstractEngine.pure.js +14 -5
- package/Engines/abstractEngine.pure.js.map +1 -1
- package/Engines/constants.d.ts +6 -0
- package/Engines/constants.js +6 -0
- package/Engines/constants.js.map +1 -1
- package/Engines/engine.d.ts +198 -24
- package/Engines/pure.d.ts +1 -0
- package/Engines/pure.js +1 -0
- package/Engines/pure.js.map +1 -1
- package/Engines/renderCommandBatcher.pure.d.ts +16 -0
- package/Engines/renderCommandBatcher.pure.js +24 -0
- package/Engines/renderCommandBatcher.pure.js.map +1 -0
- package/Engines/thinEngine.functions.js +3 -2
- package/Engines/thinEngine.functions.js.map +1 -1
- package/Engines/thinEngine.pure.js +18 -2
- package/Engines/thinEngine.pure.js.map +1 -1
- package/Engines/thinNativeEngine.pure.d.ts +10 -7
- package/Engines/thinNativeEngine.pure.js +117 -46
- package/Engines/thinNativeEngine.pure.js.map +1 -1
- package/Engines/thinWebGPUEngine.d.ts +8 -0
- package/Engines/thinWebGPUEngine.js +11 -0
- package/Engines/thinWebGPUEngine.js.map +1 -1
- package/Engines/webgpuEngine.pure.d.ts +60 -1
- package/Engines/webgpuEngine.pure.js +238 -42
- package/Engines/webgpuEngine.pure.js.map +1 -1
- package/FlowGraph/Blocks/Data/Audio/flowGraphGetSoundVolumeBlock.pure.d.ts +3 -3
- package/FlowGraph/Blocks/Data/Audio/flowGraphGetSoundVolumeBlock.pure.js +2 -1
- package/FlowGraph/Blocks/Data/Audio/flowGraphGetSoundVolumeBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Data/Audio/flowGraphIsSoundPlayingBlock.pure.d.ts +3 -3
- package/FlowGraph/Blocks/Data/Audio/flowGraphIsSoundPlayingBlock.pure.js +2 -1
- package/FlowGraph/Blocks/Data/Audio/flowGraphIsSoundPlayingBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.d.ts +5 -0
- package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.js +8 -0
- package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.js.map +1 -0
- package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.pure.d.ts +77 -0
- package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.pure.js +141 -0
- package/FlowGraph/Blocks/Event/flowGraphMeshIntersectionEventBlock.pure.js.map +1 -0
- package/FlowGraph/Blocks/Event/flowGraphSoundEndedEventBlock.pure.d.ts +5 -3
- package/FlowGraph/Blocks/Event/flowGraphSoundEndedEventBlock.pure.js +38 -7
- package/FlowGraph/Blocks/Event/flowGraphSoundEndedEventBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/index.d.ts +1 -0
- package/FlowGraph/Blocks/Event/index.js +1 -0
- package/FlowGraph/Blocks/Event/index.js.map +1 -1
- package/FlowGraph/Blocks/Event/pure.d.ts +1 -0
- package/FlowGraph/Blocks/Event/pure.js +1 -0
- package/FlowGraph/Blocks/Event/pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphPauseSoundBlock.pure.d.ts +3 -3
- package/FlowGraph/Blocks/Execution/Audio/flowGraphPauseSoundBlock.pure.js +2 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphPauseSoundBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphPlaySoundBlock.pure.d.ts +3 -3
- package/FlowGraph/Blocks/Execution/Audio/flowGraphPlaySoundBlock.pure.js +2 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphPlaySoundBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphSetSoundVolumeBlock.pure.d.ts +3 -3
- package/FlowGraph/Blocks/Execution/Audio/flowGraphSetSoundVolumeBlock.pure.js +2 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphSetSoundVolumeBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphStopSoundBlock.pure.d.ts +3 -3
- package/FlowGraph/Blocks/Execution/Audio/flowGraphStopSoundBlock.pure.js +2 -1
- package/FlowGraph/Blocks/Execution/Audio/flowGraphStopSoundBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/allBlocks.pure.js +2 -0
- package/FlowGraph/Blocks/allBlocks.pure.js.map +1 -1
- package/FlowGraph/Blocks/flowGraphBlockFactory.js +2 -0
- package/FlowGraph/Blocks/flowGraphBlockFactory.js.map +1 -1
- package/FlowGraph/Blocks/flowGraphBlockNames.d.ts +1 -0
- package/FlowGraph/Blocks/flowGraphBlockNames.js +1 -0
- package/FlowGraph/Blocks/flowGraphBlockNames.js.map +1 -1
- package/FlowGraph/flowGraph.d.ts +12 -1
- package/FlowGraph/flowGraph.js +38 -0
- package/FlowGraph/flowGraph.js.map +1 -1
- package/FlowGraph/flowGraphCoordinator.d.ts +44 -0
- package/FlowGraph/flowGraphCoordinator.js +141 -0
- package/FlowGraph/flowGraphCoordinator.js.map +1 -1
- package/FlowGraph/flowGraphDataConnection.pure.js +41 -14
- package/FlowGraph/flowGraphDataConnection.pure.js.map +1 -1
- package/FlowGraph/flowGraphParser.js +105 -5
- package/FlowGraph/flowGraphParser.js.map +1 -1
- package/FlowGraph/flowGraphSoundAssets.d.ts +40 -0
- package/FlowGraph/flowGraphSoundAssets.js +33 -0
- package/FlowGraph/flowGraphSoundAssets.js.map +1 -0
- package/FlowGraph/index.d.ts +1 -0
- package/FlowGraph/index.js +1 -0
- package/FlowGraph/index.js.map +1 -1
- package/FlowGraph/pure.d.ts +1 -0
- package/FlowGraph/pure.js +1 -0
- package/FlowGraph/pure.js.map +1 -1
- package/FlowGraph/serialization.d.ts +8 -0
- package/FlowGraph/serialization.js +31 -12
- package/FlowGraph/serialization.js.map +1 -1
- package/FlowGraph/typeDefinitions.d.ts +25 -0
- package/FlowGraph/typeDefinitions.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/taaTask.js +2 -0
- package/FrameGraph/Tasks/PostProcesses/taaTask.js.map +1 -1
- package/Instrumentation/engineInstrumentation.d.ts +1 -0
- package/Instrumentation/engineInstrumentation.js +25 -6
- package/Instrumentation/engineInstrumentation.js.map +1 -1
- package/Lights/Clustered/clusteredLightContainer.pure.js +2 -0
- package/Lights/Clustered/clusteredLightContainer.pure.js.map +1 -1
- package/Lights/Shadows/cascadedShadowGenerator.pure.d.ts +36 -1
- package/Lights/Shadows/cascadedShadowGenerator.pure.js +202 -27
- package/Lights/Shadows/cascadedShadowGenerator.pure.js.map +1 -1
- package/Lights/directionalLight.pure.d.ts +24 -10
- package/Lights/directionalLight.pure.js +29 -11
- package/Lights/directionalLight.pure.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js +4 -4
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js.map +1 -1
- package/Materials/Node/Blocks/Dual/lightBlock.pure.js +1 -1
- package/Materials/Node/Blocks/Dual/lightBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/Input/inputBlock.pure.js +4 -0
- package/Materials/Node/Blocks/Input/inputBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.d.ts +9 -0
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js +23 -3
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js.map +1 -1
- package/Materials/PBR/openpbrMaterial.pure.js +1 -1
- package/Materials/PBR/openpbrMaterial.pure.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.pure.d.ts +9 -0
- package/Materials/PBR/pbrBaseMaterial.pure.js +60 -1
- package/Materials/PBR/pbrBaseMaterial.pure.js.map +1 -1
- package/Materials/PBR/pbrBaseSimpleMaterial.d.ts +11 -0
- package/Materials/PBR/pbrBaseSimpleMaterial.js +21 -2
- package/Materials/PBR/pbrBaseSimpleMaterial.js.map +1 -1
- package/Materials/PBR/pbrMaterial.pure.d.ts +12 -0
- package/Materials/PBR/pbrMaterial.pure.js +23 -3
- package/Materials/PBR/pbrMaterial.pure.js.map +1 -1
- package/Materials/Textures/Filtering/hdrIrradianceFiltering.d.ts +1 -0
- package/Materials/Textures/Filtering/hdrIrradianceFiltering.js +10 -0
- package/Materials/Textures/Filtering/hdrIrradianceFiltering.js.map +1 -1
- package/Materials/Textures/HTML/htmlInCanvasPolyfill.d.ts +5 -0
- package/Materials/Textures/HTML/htmlInCanvasPolyfill.js +7 -0
- package/Materials/Textures/HTML/htmlInCanvasPolyfill.js.map +1 -1
- package/Materials/Textures/HTML/htmlInteractionManager.d.ts +9 -3
- package/Materials/Textures/HTML/htmlInteractionManager.js +64 -5
- package/Materials/Textures/HTML/htmlInteractionManager.js.map +1 -1
- package/Materials/Textures/HTML/htmlTexture.d.ts +11 -11
- package/Materials/Textures/HTML/htmlTexture.js +106 -65
- package/Materials/Textures/HTML/htmlTexture.js.map +1 -1
- package/Materials/Textures/Loaders/internalTextureLoader.d.ts +2 -1
- package/Materials/Textures/Loaders/internalTextureLoader.js.map +1 -1
- package/Materials/Textures/Loaders/ktxTextureLoader.d.ts +2 -1
- package/Materials/Textures/Loaders/ktxTextureLoader.js +4 -50
- package/Materials/Textures/Loaders/ktxTextureLoader.js.map +1 -1
- package/Materials/Textures/Procedurals/proceduralTexture.pure.js +10 -0
- package/Materials/Textures/Procedurals/proceduralTexture.pure.js.map +1 -1
- package/Materials/Textures/dynamicTexture.pure.js +6 -0
- package/Materials/Textures/dynamicTexture.pure.js.map +1 -1
- package/Materials/Textures/ktx2encoderTypes.d.ts +51 -0
- package/Materials/Textures/ktx2encoderTypes.js +2 -0
- package/Materials/Textures/ktx2encoderTypes.js.map +1 -0
- package/Materials/Textures/renderTargetTexture.pure.js +10 -2
- package/Materials/Textures/renderTargetTexture.pure.js.map +1 -1
- package/Materials/Textures/texture.pure.js +7 -1
- package/Materials/Textures/texture.pure.js.map +1 -1
- package/Materials/Textures/textureMerger.d.ts +11 -0
- package/Materials/Textures/textureMerger.js +34 -19
- package/Materials/Textures/textureMerger.js.map +1 -1
- package/Materials/Textures/textureProcessor.d.ts +145 -0
- package/Materials/Textures/textureProcessor.js +445 -45
- package/Materials/Textures/textureProcessor.js.map +1 -1
- package/Materials/Textures/textureSampling.functions.d.ts +41 -0
- package/Materials/Textures/textureSampling.functions.js +82 -0
- package/Materials/Textures/textureSampling.functions.js.map +1 -0
- package/Materials/drawWrapper.d.ts +8 -0
- package/Materials/drawWrapper.js +19 -0
- package/Materials/drawWrapper.js.map +1 -1
- package/Materials/effect.pure.d.ts +6 -0
- package/Materials/effect.pure.js +28 -6
- package/Materials/effect.pure.js.map +1 -1
- package/Materials/effect.webgl.functions.pure.js +1 -1
- package/Materials/effect.webgl.functions.pure.js.map +1 -1
- package/Materials/material.pure.d.ts +5 -0
- package/Materials/material.pure.js +9 -2
- package/Materials/material.pure.js.map +1 -1
- package/Materials/materialFlags.d.ts +6 -0
- package/Materials/materialFlags.js +14 -0
- package/Materials/materialFlags.js.map +1 -1
- package/Materials/materialHelper.functions.d.ts +2 -1
- package/Materials/materialHelper.functions.js +36 -2
- package/Materials/materialHelper.functions.js.map +1 -1
- package/Materials/materialHelper.geometryrendering.js +19 -16
- package/Materials/materialHelper.geometryrendering.js.map +1 -1
- package/Materials/materialPluginManager.pure.js +12 -8
- package/Materials/materialPluginManager.pure.js.map +1 -1
- package/Materials/prePassConfiguration.js +19 -16
- package/Materials/prePassConfiguration.js.map +1 -1
- package/Materials/shaderMaterial.pure.js +19 -6
- package/Materials/shaderMaterial.pure.js.map +1 -1
- package/Materials/shadowDepthWrapper.d.ts +6 -0
- package/Materials/shadowDepthWrapper.js +17 -0
- package/Materials/shadowDepthWrapper.js.map +1 -1
- package/Meshes/Compression/dracoCodec.d.ts +14 -0
- package/Meshes/Compression/dracoCodec.js +22 -0
- package/Meshes/Compression/dracoCodec.js.map +1 -1
- package/Meshes/Compression/dracoDecoder.d.ts +1 -0
- package/Meshes/Compression/dracoDecoder.js +27 -0
- package/Meshes/Compression/dracoDecoder.js.map +1 -1
- package/Meshes/Compression/dracoEncoder.d.ts +1 -0
- package/Meshes/Compression/dracoEncoder.js +8 -0
- package/Meshes/Compression/dracoEncoder.js.map +1 -1
- package/Meshes/Compression/meshoptCompression.d.ts +1 -0
- package/Meshes/Compression/meshoptCompression.js +9 -0
- package/Meshes/Compression/meshoptCompression.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingGpuSorter.d.ts +415 -0
- package/Meshes/GaussianSplatting/gaussianSplattingGpuSorter.js +912 -0
- package/Meshes/GaussianSplatting/gaussianSplattingGpuSorter.js.map +1 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.d.ts +3 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js +40 -9
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.d.ts +112 -8
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +696 -74
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
- package/Meshes/abstractMesh.pure.js +12 -4
- package/Meshes/abstractMesh.pure.js.map +1 -1
- package/Meshes/geometry.d.ts +5 -0
- package/Meshes/geometry.js +25 -0
- package/Meshes/geometry.js.map +1 -1
- package/Meshes/index.d.ts +1 -0
- package/Meshes/index.js +1 -0
- package/Meshes/index.js.map +1 -1
- package/Meshes/mesh.pure.d.ts +7 -0
- package/Meshes/mesh.pure.js +18 -13
- package/Meshes/mesh.pure.js.map +1 -1
- package/Meshes/pure.d.ts +1 -0
- package/Meshes/pure.js +1 -0
- package/Meshes/pure.js.map +1 -1
- package/Meshes/subMesh.pure.d.ts +3 -0
- package/Meshes/subMesh.pure.js +26 -0
- package/Meshes/subMesh.pure.js.map +1 -1
- package/Meshes/thinInstanceMesh.pure.js +5 -3
- package/Meshes/thinInstanceMesh.pure.js.map +1 -1
- package/Misc/index.d.ts +1 -0
- package/Misc/index.js +1 -0
- package/Misc/index.js.map +1 -1
- package/Misc/khronosTextureContainer2.d.ts +3 -2
- package/Misc/khronosTextureContainer2.js +24 -6
- package/Misc/khronosTextureContainer2.js.map +1 -1
- package/Misc/khronosTextureContainer2Encoder.d.ts +166 -0
- package/Misc/khronosTextureContainer2Encoder.js +556 -0
- package/Misc/khronosTextureContainer2Encoder.js.map +1 -0
- package/Misc/khronosTextureContainer2EncoderWorker.d.ts +61 -0
- package/Misc/khronosTextureContainer2EncoderWorker.js +55 -0
- package/Misc/khronosTextureContainer2EncoderWorker.js.map +1 -0
- package/Misc/pure.d.ts +1 -0
- package/Misc/pure.js +1 -0
- package/Misc/pure.js.map +1 -1
- package/Misc/textureFormat.functions.d.ts +6 -0
- package/Misc/textureFormat.functions.js +54 -0
- package/Misc/textureFormat.functions.js.map +1 -0
- package/Misc/textureTools.d.ts +6 -2
- package/Misc/textureTools.js +100 -42
- package/Misc/textureTools.js.map +1 -1
- package/Misc/tools.pure.js +1 -1
- package/Misc/tools.pure.js.map +1 -1
- package/Particles/Node/Blocks/systemBlock.pure.d.ts +1 -1
- package/Particles/Node/Blocks/systemBlock.pure.js +6 -3
- package/Particles/Node/Blocks/systemBlock.pure.js.map +1 -1
- package/Particles/computeShaderParticleSystem.pure.js +5 -0
- package/Particles/computeShaderParticleSystem.pure.js.map +1 -1
- package/Particles/gpuParticleSystem.pure.d.ts +2 -0
- package/Particles/gpuParticleSystem.pure.js +25 -1
- package/Particles/gpuParticleSystem.pure.js.map +1 -1
- package/Particles/solidParticle.d.ts +5 -0
- package/Particles/solidParticle.js +5 -0
- package/Particles/solidParticle.js.map +1 -1
- package/Particles/solidParticleSystem.d.ts +10 -0
- package/Particles/solidParticleSystem.js +72 -13
- package/Particles/solidParticleSystem.js.map +1 -1
- package/Particles/thinParticleSystem.pure.js +4 -0
- package/Particles/thinParticleSystem.pure.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.pure.d.ts +27 -6
- package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.pure.js +60 -5
- package/PostProcesses/RenderPipeline/Pipelines/taaMaterialManager.pure.js.map +1 -1
- package/PostProcesses/thinTAAPostProcess.d.ts +1 -0
- package/PostProcesses/thinTAAPostProcess.js +17 -1
- package/PostProcesses/thinTAAPostProcess.js.map +1 -1
- package/PostProcesses/volumetricLightScatteringPostProcess.pure.d.ts +2 -1
- package/PostProcesses/volumetricLightScatteringPostProcess.pure.js +6 -5
- package/PostProcesses/volumetricLightScatteringPostProcess.pure.js.map +1 -1
- package/Rendering/boundingBoxRenderer.pure.js +2 -3
- package/Rendering/boundingBoxRenderer.pure.js.map +1 -1
- package/Rendering/geometryBufferRenderer.pure.js +8 -2
- package/Rendering/geometryBufferRenderer.pure.js.map +1 -1
- package/Rendering/objectRenderer.d.ts +1 -0
- package/Rendering/objectRenderer.js +14 -0
- package/Rendering/objectRenderer.js.map +1 -1
- package/Shaders/ShadersInclude/bumpFragmentMainFunctions.js +2 -2
- package/Shaders/ShadersInclude/bumpFragmentMainFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/bumpVertex.js +1 -1
- package/Shaders/ShadersInclude/bumpVertex.js.map +1 -1
- package/Shaders/ShadersInclude/bumpVertexDeclaration.js +1 -1
- package/Shaders/ShadersInclude/bumpVertexDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/hdrFilteringFunctions.js +5 -1
- package/Shaders/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/helperFunctions.js +2 -2
- package/Shaders/ShadersInclude/helperFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrBackgroundTransmission.js +1 -1
- package/Shaders/ShadersInclude/openpbrBackgroundTransmission.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrVertexDeclaration.js +6 -0
- package/Shaders/ShadersInclude/openpbrVertexDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockFinalLitComponents.js +11 -1
- package/Shaders/ShadersInclude/pbrBlockFinalLitComponents.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockNormalFinal.js +9 -0
- package/Shaders/ShadersInclude/pbrBlockNormalFinal.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockReflectance.js +1 -1
- package/Shaders/ShadersInclude/pbrBlockReflectance.js.map +1 -1
- package/Shaders/ShadersInclude/pbrClusteredLightingFunctions.js +1 -1
- package/Shaders/ShadersInclude/pbrClusteredLightingFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/pbrFragmentDeclaration.js +7 -1
- package/Shaders/ShadersInclude/pbrFragmentDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js +1 -0
- package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/pbrIBLFunctions.js +12 -0
- package/Shaders/ShadersInclude/pbrIBLFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/pbrUboDeclaration.js +1 -1
- package/Shaders/ShadersInclude/pbrUboDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/pbrVertexDeclaration.js +3 -0
- package/Shaders/ShadersInclude/pbrVertexDeclaration.js.map +1 -1
- package/Shaders/geometry.vertex.js +6 -6
- package/Shaders/geometry.vertex.js.map +1 -1
- package/Shaders/gpuUpdateParticles.vertex.js +1 -1
- package/Shaders/gpuUpdateParticles.vertex.js.map +1 -1
- package/Shaders/lod.fragment.js +15 -2
- package/Shaders/lod.fragment.js.map +1 -1
- package/Shaders/lod3D.fragment.js +15 -2
- package/Shaders/lod3D.fragment.js.map +1 -1
- package/Shaders/lodCube.fragment.js +15 -2
- package/Shaders/lodCube.fragment.js.map +1 -1
- package/Shaders/openpbr.vertex.js +2 -0
- package/Shaders/openpbr.vertex.js.map +1 -1
- package/Shaders/pbr.fragment.js +12 -1
- package/Shaders/pbr.fragment.js.map +1 -1
- package/Shaders/pbr.vertex.js +2 -0
- package/Shaders/pbr.vertex.js.map +1 -1
- package/Shaders/textureMerger.fragment.js +28 -0
- package/Shaders/textureMerger.fragment.js.map +1 -1
- package/Shaders/textureProcessor.fragment.js +26 -4
- package/Shaders/textureProcessor.fragment.js.map +1 -1
- package/Shaders/volumetricLightScattering.fragment.js +1 -1
- package/Shaders/volumetricLightScattering.fragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/bumpFragmentMainFunctions.js +2 -2
- package/ShadersWGSL/ShadersInclude/bumpFragmentMainFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/bumpVertex.js +1 -1
- package/ShadersWGSL/ShadersInclude/bumpVertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/bumpVertexDeclaration.js +1 -1
- package/ShadersWGSL/ShadersInclude/bumpVertexDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js +1 -1
- package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/helperFunctions.js +2 -2
- package/ShadersWGSL/ShadersInclude/helperFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/lightFragment.js +44 -2
- package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js +17 -3
- package/ShadersWGSL/ShadersInclude/lightUboDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/lightVxUboDeclaration.js +12 -1
- package/ShadersWGSL/ShadersInclude/lightVxUboDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrBackgroundTransmission.js +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrBackgroundTransmission.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.js +11 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockNormalFinal.js +9 -0
- package/ShadersWGSL/ShadersInclude/pbrBlockNormalFinal.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockReflectance.js +1 -1
- package/ShadersWGSL/ShadersInclude/pbrBlockReflectance.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrClusteredLightingFunctions.js +1 -1
- package/ShadersWGSL/ShadersInclude/pbrClusteredLightingFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.js +1 -1
- package/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.js +1 -0
- package/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrIBLFunctions.js +8 -0
- package/ShadersWGSL/ShadersInclude/pbrIBLFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrUboDeclaration.js +1 -1
- package/ShadersWGSL/ShadersInclude/pbrUboDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/prePassVertex.js +2 -2
- package/ShadersWGSL/ShadersInclude/prePassVertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/prePassVertexDeclaration.js +1 -1
- package/ShadersWGSL/ShadersInclude/prePassVertexDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/sceneUboDeclaration.js +3 -1
- package/ShadersWGSL/ShadersInclude/sceneUboDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/shadowsVertex.js +16 -0
- package/ShadersWGSL/ShadersInclude/shadowsVertex.js.map +1 -1
- package/ShadersWGSL/default.fragment.js +4 -4
- package/ShadersWGSL/default.fragment.js.map +1 -1
- package/ShadersWGSL/default.vertex.js +1 -1
- package/ShadersWGSL/default.vertex.js.map +1 -1
- package/ShadersWGSL/gaussianSplatting.vertex.js +3 -3
- package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
- package/ShadersWGSL/gpuUpdateParticles.compute.js +1 -1
- package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
- package/ShadersWGSL/gsSortCount.compute.d.ts +5 -0
- package/ShadersWGSL/gsSortCount.compute.js +19 -0
- package/ShadersWGSL/gsSortCount.compute.js.map +1 -0
- package/ShadersWGSL/gsSortKeys.compute.d.ts +5 -0
- package/ShadersWGSL/gsSortKeys.compute.js +49 -0
- package/ShadersWGSL/gsSortKeys.compute.js.map +1 -0
- package/ShadersWGSL/gsSortOutput.compute.d.ts +5 -0
- package/ShadersWGSL/gsSortOutput.compute.js +28 -0
- package/ShadersWGSL/gsSortOutput.compute.js.map +1 -0
- package/ShadersWGSL/gsSortScanLocal.compute.d.ts +5 -0
- package/ShadersWGSL/gsSortScanLocal.compute.js +23 -0
- package/ShadersWGSL/gsSortScanLocal.compute.js.map +1 -0
- package/ShadersWGSL/gsSortScanSums.compute.d.ts +5 -0
- package/ShadersWGSL/gsSortScanSums.compute.js +19 -0
- package/ShadersWGSL/gsSortScanSums.compute.js.map +1 -0
- package/ShadersWGSL/gsSortScatter.compute.d.ts +5 -0
- package/ShadersWGSL/gsSortScatter.compute.js +33 -0
- package/ShadersWGSL/gsSortScatter.compute.js.map +1 -0
- package/ShadersWGSL/lod.fragment.js +14 -2
- package/ShadersWGSL/lod.fragment.js.map +1 -1
- package/ShadersWGSL/lod3D.fragment.js +14 -2
- package/ShadersWGSL/lod3D.fragment.js.map +1 -1
- package/ShadersWGSL/lodCube.fragment.js +14 -2
- package/ShadersWGSL/lodCube.fragment.js.map +1 -1
- package/ShadersWGSL/openpbr.vertex.js +3 -1
- package/ShadersWGSL/openpbr.vertex.js.map +1 -1
- package/ShadersWGSL/pbr.fragment.js +11 -0
- package/ShadersWGSL/pbr.fragment.js.map +1 -1
- package/ShadersWGSL/pbr.vertex.js +3 -1
- package/ShadersWGSL/pbr.vertex.js.map +1 -1
- package/ShadersWGSL/textureMerger.fragment.js +40 -4
- package/ShadersWGSL/textureMerger.fragment.js.map +1 -1
- package/ShadersWGSL/textureProcessor.fragment.js +26 -4
- package/ShadersWGSL/textureProcessor.fragment.js.map +1 -1
- package/Sprites/spriteRenderer.js +15 -5
- package/Sprites/spriteRenderer.js.map +1 -1
- package/package.json +1 -1
- package/scene.pure.d.ts +23 -1
- package/scene.pure.js +83 -1
- package/scene.pure.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpuQuerySet.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuQuerySet.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable babylonjs/available */\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type WebGPUEngine } from \"../webgpuEngine\";\r\nimport { type WebGPUBufferManager } from \"./webgpuBufferManager\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\nimport { type QueryType } from \"./webgpuConstants\";\r\n\r\n/** @internal */\r\nexport class WebGPUQuerySet {\r\n private _engine: WebGPUEngine;\r\n private _device: GPUDevice;\r\n private _bufferManager: WebGPUBufferManager;\r\n\r\n private _count: number;\r\n private _canUseMultipleBuffers: boolean;\r\n private _querySet: GPUQuerySet;\r\n private _queryBuffer: GPUBuffer;\r\n private _dstBuffers: GPUBuffer[] = [];\r\n\r\n public get querySet(): GPUQuerySet {\r\n return this._querySet;\r\n }\r\n\r\n constructor(engine: WebGPUEngine, count: number, type: QueryType, device: GPUDevice, bufferManager: WebGPUBufferManager, canUseMultipleBuffers = true, label?: string) {\r\n this._engine = engine;\r\n this._device = device;\r\n this._bufferManager = bufferManager;\r\n this._count = count;\r\n this._canUseMultipleBuffers = canUseMultipleBuffers;\r\n\r\n this._querySet = device.createQuerySet({\r\n label: label ?? \"QuerySet\",\r\n type,\r\n count,\r\n });\r\n\r\n this._queryBuffer = bufferManager.createRawBuffer(8 * count, WebGPUConstants.BufferUsage.QueryResolve | WebGPUConstants.BufferUsage.CopySrc, undefined, \"QueryBuffer\");\r\n\r\n if (!canUseMultipleBuffers) {\r\n this._dstBuffers.push(\r\n this._bufferManager.createRawBuffer(\r\n 8 * this._count,\r\n WebGPUConstants.BufferUsage.MapRead | WebGPUConstants.BufferUsage.CopyDst,\r\n undefined,\r\n \"QueryBufferNoMultipleBuffers\"\r\n )\r\n );\r\n }\r\n }\r\n\r\n private _getBuffer(firstQuery: number, queryCount: number): GPUBuffer | null {\r\n if (!this._canUseMultipleBuffers && this._dstBuffers.length === 0) {\r\n return null;\r\n }\r\n\r\n const encoderResult = this._device.createCommandEncoder();\r\n\r\n let buffer: GPUBuffer;\r\n if (this._dstBuffers.length === 0) {\r\n buffer = this._bufferManager.createRawBuffer(\r\n 8 * this._count,\r\n WebGPUConstants.BufferUsage.MapRead | WebGPUConstants.BufferUsage.CopyDst,\r\n undefined,\r\n \"QueryBufferAdditionalBuffer\"\r\n );\r\n } else {\r\n buffer = this._dstBuffers[this._dstBuffers.length - 1];\r\n this._dstBuffers.length--;\r\n }\r\n\r\n encoderResult.resolveQuerySet(this._querySet, firstQuery, queryCount, this._queryBuffer, 0);\r\n encoderResult.copyBufferToBuffer(this._queryBuffer, 0, buffer, 0, 8 * queryCount);\r\n\r\n this._device.queue.submit([encoderResult.finish()]);\r\n\r\n return buffer;\r\n }\r\n\r\n public async readValues(firstQuery = 0, queryCount = 1): Promise<BigUint64Array | null> {\r\n const buffer = this._getBuffer(firstQuery, queryCount);\r\n if (buffer === null) {\r\n return null;\r\n }\r\n const engineId = this._engine.uniqueId;\r\n\r\n try {\r\n await buffer.mapAsync(WebGPUConstants.MapMode.Read);\r\n const arrayBuf = new BigUint64Array(buffer.getMappedRange()).slice();\r\n\r\n buffer.unmap();\r\n\r\n this._dstBuffers[this._dstBuffers.length] = buffer;\r\n\r\n return arrayBuf;\r\n } catch (err) {\r\n if (this._engine.isDisposed || this._engine.uniqueId !== engineId) {\r\n // Engine disposed or context loss/restoration\r\n return null;\r\n }\r\n throw err;\r\n }\r\n }\r\n\r\n public async readValue(firstQuery = 0): Promise<number | null> {\r\n const buffer = this._getBuffer(firstQuery, 1);\r\n if (buffer === null) {\r\n return null;\r\n }\r\n const engineId = this._engine.uniqueId;\r\n\r\n try {\r\n await buffer.mapAsync(WebGPUConstants.MapMode.Read);\r\n const arrayBuf = new BigUint64Array(buffer.getMappedRange());\r\n const value = Number(arrayBuf[0]);\r\n\r\n buffer.unmap();\r\n\r\n this._dstBuffers[this._dstBuffers.length] = buffer;\r\n\r\n return value;\r\n } catch (err) {\r\n if (this._engine.isDisposed || this._engine.uniqueId !== engineId) {\r\n // Engine disposed or context loss/restoration\r\n return 0;\r\n }\r\n throw err;\r\n }\r\n }\r\n\r\n public async readTwoValuesAndSubtract(firstQuery = 0): Promise<number | null> {\r\n const buffer = this._getBuffer(firstQuery, 2);\r\n if (buffer === null) {\r\n return null;\r\n }\r\n const engineId = this._engine.uniqueId;\r\n\r\n try {\r\n await buffer.mapAsync(WebGPUConstants.MapMode.Read);\r\n const arrayBuf = new BigUint64Array(buffer.getMappedRange());\r\n const value = Number(arrayBuf[1] - arrayBuf[0]);\r\n\r\n buffer.unmap();\r\n\r\n this._dstBuffers[this._dstBuffers.length] = buffer;\r\n\r\n return value;\r\n } catch (err) {\r\n if (this._engine.isDisposed || this._engine.uniqueId !== engineId) {\r\n // Engine disposed or context loss/restoration\r\n return 0;\r\n }\r\n throw err;\r\n }\r\n }\r\n\r\n public dispose() {\r\n this._querySet.destroy();\r\n this._bufferManager.releaseBuffer(this._queryBuffer);\r\n for (let i = 0; i < this._dstBuffers.length; ++i) {\r\n this._bufferManager.releaseBuffer(this._dstBuffers[i]);\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"webgpuQuerySet.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuQuerySet.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable babylonjs/available */\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\nimport { type WebGPUEngine } from \"../webgpuEngine\";\r\nimport { type WebGPUBufferManager } from \"./webgpuBufferManager\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\nimport { type QueryType } from \"./webgpuConstants\";\r\n\r\n/** @internal */\r\nexport class WebGPUQuerySet {\r\n private _engine: WebGPUEngine;\r\n private _device: GPUDevice;\r\n private _bufferManager: WebGPUBufferManager;\r\n\r\n private _count: number;\r\n private _canUseMultipleBuffers: boolean;\r\n private _querySet: GPUQuerySet;\r\n private _queryBuffer: GPUBuffer;\r\n private _dstBuffers: GPUBuffer[] = [];\r\n\r\n public get querySet(): GPUQuerySet {\r\n return this._querySet;\r\n }\r\n\r\n constructor(engine: WebGPUEngine, count: number, type: QueryType, device: GPUDevice, bufferManager: WebGPUBufferManager, canUseMultipleBuffers = true, label?: string) {\r\n this._engine = engine;\r\n this._device = device;\r\n this._bufferManager = bufferManager;\r\n this._count = count;\r\n this._canUseMultipleBuffers = canUseMultipleBuffers;\r\n\r\n this._querySet = device.createQuerySet({\r\n label: label ?? \"QuerySet\",\r\n type,\r\n count,\r\n });\r\n\r\n this._queryBuffer = bufferManager.createRawBuffer(8 * count, WebGPUConstants.BufferUsage.QueryResolve | WebGPUConstants.BufferUsage.CopySrc, undefined, \"QueryBuffer\");\r\n\r\n if (!canUseMultipleBuffers) {\r\n this._dstBuffers.push(\r\n this._bufferManager.createRawBuffer(\r\n 8 * this._count,\r\n WebGPUConstants.BufferUsage.MapRead | WebGPUConstants.BufferUsage.CopyDst,\r\n undefined,\r\n \"QueryBufferNoMultipleBuffers\"\r\n )\r\n );\r\n }\r\n }\r\n\r\n private _getBuffer(firstQuery: number, queryCount: number, encoder?: GPUCommandEncoder): GPUBuffer | null {\r\n if (!this._canUseMultipleBuffers && this._dstBuffers.length === 0) {\r\n return null;\r\n }\r\n\r\n const encoderResult = encoder ?? this._device.createCommandEncoder();\r\n\r\n let buffer: GPUBuffer;\r\n if (this._dstBuffers.length === 0) {\r\n buffer = this._bufferManager.createRawBuffer(\r\n 8 * this._count,\r\n WebGPUConstants.BufferUsage.MapRead | WebGPUConstants.BufferUsage.CopyDst,\r\n undefined,\r\n \"QueryBufferAdditionalBuffer\"\r\n );\r\n } else {\r\n buffer = this._dstBuffers[this._dstBuffers.length - 1];\r\n this._dstBuffers.length--;\r\n }\r\n\r\n encoderResult.resolveQuerySet(this._querySet, firstQuery, queryCount, this._queryBuffer, 0);\r\n encoderResult.copyBufferToBuffer(this._queryBuffer, 0, buffer, 0, 8 * queryCount);\r\n\r\n if (!encoder) {\r\n this._device.queue.submit([encoderResult.finish()]);\r\n }\r\n\r\n return buffer;\r\n }\r\n\r\n public async readValues(firstQuery = 0, queryCount = 1, encoder?: GPUCommandEncoder): Promise<BigUint64Array | null> {\r\n const buffer = this._getBuffer(firstQuery, queryCount, encoder);\r\n if (buffer === null) {\r\n return null;\r\n }\r\n const engineId = this._engine.uniqueId;\r\n\r\n try {\r\n if (encoder) {\r\n // resolved in that encoder after its queries: mapped once the engine submits it, a wait its readbacks share\r\n await this._engine._whenSubmittedAsync();\r\n }\r\n await buffer.mapAsync(WebGPUConstants.MapMode.Read);\r\n const arrayBuf = new BigUint64Array(buffer.getMappedRange()).slice();\r\n\r\n buffer.unmap();\r\n\r\n this._dstBuffers[this._dstBuffers.length] = buffer;\r\n\r\n return arrayBuf;\r\n } catch (err) {\r\n if (this._engine.isDisposed || this._engine.uniqueId !== engineId) {\r\n // Engine disposed or context loss/restoration\r\n return null;\r\n }\r\n throw err;\r\n }\r\n }\r\n\r\n public async readValue(firstQuery = 0, encoder?: GPUCommandEncoder): Promise<number | null> {\r\n const buffer = this._getBuffer(firstQuery, 1, encoder);\r\n if (buffer === null) {\r\n return null;\r\n }\r\n const engineId = this._engine.uniqueId;\r\n\r\n try {\r\n if (encoder) {\r\n // resolved in that encoder after its queries: mapped once the engine submits it, a wait its readbacks share\r\n await this._engine._whenSubmittedAsync();\r\n }\r\n await buffer.mapAsync(WebGPUConstants.MapMode.Read);\r\n const arrayBuf = new BigUint64Array(buffer.getMappedRange());\r\n const value = Number(arrayBuf[0]);\r\n\r\n buffer.unmap();\r\n\r\n this._dstBuffers[this._dstBuffers.length] = buffer;\r\n\r\n return value;\r\n } catch (err) {\r\n if (this._engine.isDisposed || this._engine.uniqueId !== engineId) {\r\n // Engine disposed or context loss/restoration\r\n return 0;\r\n }\r\n throw err;\r\n }\r\n }\r\n\r\n public async readTwoValuesAndSubtract(firstQuery = 0, encoder?: GPUCommandEncoder): Promise<number | null> {\r\n const buffer = this._getBuffer(firstQuery, 2, encoder);\r\n if (buffer === null) {\r\n return null;\r\n }\r\n const engineId = this._engine.uniqueId;\r\n\r\n try {\r\n if (encoder) {\r\n // resolved in that encoder after its queries: mapped once the engine submits it, a wait its readbacks share\r\n await this._engine._whenSubmittedAsync();\r\n }\r\n await buffer.mapAsync(WebGPUConstants.MapMode.Read);\r\n const arrayBuf = new BigUint64Array(buffer.getMappedRange());\r\n const value = Number(arrayBuf[1] - arrayBuf[0]);\r\n\r\n buffer.unmap();\r\n\r\n this._dstBuffers[this._dstBuffers.length] = buffer;\r\n\r\n return value;\r\n } catch (err) {\r\n if (this._engine.isDisposed || this._engine.uniqueId !== engineId) {\r\n // Engine disposed or context loss/restoration\r\n return 0;\r\n }\r\n throw err;\r\n }\r\n }\r\n\r\n public dispose() {\r\n this._querySet.destroy();\r\n this._bufferManager.releaseBuffer(this._queryBuffer);\r\n for (let i = 0; i < this._dstBuffers.length; ++i) {\r\n this._bufferManager.releaseBuffer(this._dstBuffers[i]);\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render-pass command-stream lowering for hosts where each WebGPU encoder call crosses a JS/native
|
|
3
|
+
* boundary (e.g. BabylonNative over wgpu-native). This is the WebGPU counterpart of the
|
|
4
|
+
* CommandBufferEncoder + NativeDataStream pairing used by the bgfx-based NativeEngine (see
|
|
5
|
+
* thinNativeEngine.pure.ts): commands are encoded as words into a reused buffer and submitted across
|
|
6
|
+
* the bridge in batches, guarded by a protocol-version handshake against JS/native drift. The
|
|
7
|
+
* conduits necessarily differ: WebGPUEngine also ships to browsers, so the host contract is injected
|
|
8
|
+
* (IWebGPURenderPassCommandRecorderProvider) rather than read from the _native global, command
|
|
9
|
+
* tokens are protocol integers rather than native-provided handles, and commands carry WebGPU
|
|
10
|
+
* render-pass semantics (pipelines, bind groups, draws) referencing host resource-handle ids.
|
|
11
|
+
*/
|
|
12
|
+
import { type VertexBuffer } from "../../Buffers/buffer.pure.js";
|
|
13
|
+
import { type DataBuffer } from "../../Buffers/dataBuffer.js";
|
|
14
|
+
import { type Nullable } from "../../types.js";
|
|
15
|
+
/**
|
|
16
|
+
* Version of the render-pass command-stream encoding. The host decoder reports the version it was
|
|
17
|
+
* built against through IWebGPURenderPassCommandRecorderProvider.protocolVersion; when the versions
|
|
18
|
+
* differ, the stream disables itself and draws fall back to direct encoder calls. This mirrors the
|
|
19
|
+
* PROTOCOL_VERSION guard of the bgfx-based NativeEngine, soft-failing instead of throwing because
|
|
20
|
+
* this path is an optimization rather than the engine's only transport. Bump it whenever opcodes or
|
|
21
|
+
* command layouts change.
|
|
22
|
+
*/
|
|
23
|
+
export declare const WebGPURenderPassCommandStreamProtocolVersion = 1;
|
|
24
|
+
/** @internal */
|
|
25
|
+
export declare const WebGPURenderPassCommandOpcode: {
|
|
26
|
+
readonly setPipeline: 1;
|
|
27
|
+
readonly setBindGroup: 2;
|
|
28
|
+
readonly setVertexBuffer: 3;
|
|
29
|
+
readonly setIndexBuffer: 4;
|
|
30
|
+
readonly draw: 9;
|
|
31
|
+
readonly drawIndexed: 10;
|
|
32
|
+
readonly drawIndirect: 11;
|
|
33
|
+
readonly drawIndexedIndirect: 12;
|
|
34
|
+
};
|
|
35
|
+
/** @internal */
|
|
36
|
+
export declare const WebGPURenderPassDrawKind: {
|
|
37
|
+
readonly INDEXED: 0;
|
|
38
|
+
readonly NON_INDEXED: 1;
|
|
39
|
+
};
|
|
40
|
+
/** @internal */
|
|
41
|
+
export type WebGPURenderPassDrawKind = (typeof WebGPURenderPassDrawKind)[keyof typeof WebGPURenderPassDrawKind];
|
|
42
|
+
/**
|
|
43
|
+
* Render pass encoder extended with an optional host recording hook.
|
|
44
|
+
* The recorder must consume the command words synchronously: the buffer is owned by the stream and
|
|
45
|
+
* is reused as soon as the call returns.
|
|
46
|
+
* @internal
|
|
47
|
+
*/
|
|
48
|
+
export interface IWebGPUCommandRecordingRenderPass extends GPURenderPassEncoder {
|
|
49
|
+
_recordCommands?: (commands: Uint32Array, drawCount: number, multiDrawCallCount: number, multiDrawDrawCount: number, wordCount: number) => boolean;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Contract implemented by hosts whose WebGPU backend can record batched render-pass command streams
|
|
53
|
+
* (e.g. BabylonNative over wgpu-native, where every render-pass encoder call crosses the JS/native
|
|
54
|
+
* boundary). Install an implementation through WebGPUEngine.renderPassCommandRecorderProvider to let
|
|
55
|
+
* compatibility-mode draws be encoded into a command stream and submitted in batches instead of one
|
|
56
|
+
* encoder call per state change and draw.
|
|
57
|
+
*/
|
|
58
|
+
export interface IWebGPURenderPassCommandRecorderProvider {
|
|
59
|
+
/**
|
|
60
|
+
* The command-stream protocol version the host decoder was built against (see
|
|
61
|
+
* WebGPURenderPassCommandStreamProtocolVersion). A mismatch permanently disables the stream for
|
|
62
|
+
* the engine and draws fall back to direct encoder calls.
|
|
63
|
+
*/
|
|
64
|
+
protocolVersion: number;
|
|
65
|
+
/**
|
|
66
|
+
* Returns true while command-stream recording is enabled on the host.
|
|
67
|
+
*/
|
|
68
|
+
isEnabled(): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Returns the host handle id for a backend resource (pipeline, buffer or bind group), or 0 when
|
|
71
|
+
* the resource has no host handle (which makes the draw fall back to direct encoder calls).
|
|
72
|
+
* Ids must be positive safe integers (at most Number.MAX_SAFE_INTEGER) so they encode losslessly
|
|
73
|
+
* into 64-bit command words; out-of-range ids are treated as missing.
|
|
74
|
+
* @param resource the backend resource to identify
|
|
75
|
+
*/
|
|
76
|
+
getResourceId(resource: Nullable<object>): number;
|
|
77
|
+
/**
|
|
78
|
+
* Optionally returns the host's last backend error, used to enrich diagnostics when recording fails.
|
|
79
|
+
*/
|
|
80
|
+
getLastError?(): string | undefined;
|
|
81
|
+
}
|
|
82
|
+
/** @internal */
|
|
83
|
+
interface IWebGPURenderPassDrawCommandBase {
|
|
84
|
+
renderPass: GPURenderPassEncoder | GPURenderBundleEncoder;
|
|
85
|
+
drawKind: WebGPURenderPassDrawKind;
|
|
86
|
+
pipeline: GPURenderPipeline;
|
|
87
|
+
bindGroups: GPUBindGroup[];
|
|
88
|
+
vertexBuffers: VertexBuffer[];
|
|
89
|
+
count: number;
|
|
90
|
+
instancesCount: number;
|
|
91
|
+
start: number;
|
|
92
|
+
indirectDrawBuffer: Nullable<GPUBuffer>;
|
|
93
|
+
}
|
|
94
|
+
/** @internal */
|
|
95
|
+
export interface IWebGPURenderPassIndexedDrawCommand extends IWebGPURenderPassDrawCommandBase {
|
|
96
|
+
drawKind: typeof WebGPURenderPassDrawKind.INDEXED;
|
|
97
|
+
indexBuffer: DataBuffer;
|
|
98
|
+
indexFormat: GPUIndexFormat;
|
|
99
|
+
}
|
|
100
|
+
/** @internal */
|
|
101
|
+
export interface IWebGPURenderPassNonIndexedDrawCommand extends IWebGPURenderPassDrawCommandBase {
|
|
102
|
+
drawKind: typeof WebGPURenderPassDrawKind.NON_INDEXED;
|
|
103
|
+
indexBuffer: null;
|
|
104
|
+
indexFormat: null;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Draw commands are consumed synchronously by both the lowering and the replay paths, so callers may
|
|
108
|
+
* (and the engine does) reuse a single command instance across draws to keep the hot path allocation-free.
|
|
109
|
+
* @internal
|
|
110
|
+
*/
|
|
111
|
+
export type IWebGPURenderPassDrawCommand = IWebGPURenderPassIndexedDrawCommand | IWebGPURenderPassNonIndexedDrawCommand;
|
|
112
|
+
/**
|
|
113
|
+
* Creates a reusable indexed draw command. Every field must be (re)assigned before each submission.
|
|
114
|
+
* @internal
|
|
115
|
+
*/
|
|
116
|
+
export declare function CreateWebGPURenderPassIndexedDrawCommand(): IWebGPURenderPassIndexedDrawCommand;
|
|
117
|
+
/**
|
|
118
|
+
* Creates a reusable non-indexed draw command. Every field must be (re)assigned before each submission.
|
|
119
|
+
* @internal
|
|
120
|
+
*/
|
|
121
|
+
export declare function CreateWebGPURenderPassNonIndexedDrawCommand(): IWebGPURenderPassNonIndexedDrawCommand;
|
|
122
|
+
/** @internal */
|
|
123
|
+
export interface IWebGPURenderPassCommandStreamOptions {
|
|
124
|
+
getProvider: () => Nullable<IWebGPURenderPassCommandRecorderProvider>;
|
|
125
|
+
}
|
|
126
|
+
/** @internal */
|
|
127
|
+
export declare function ApplyWebGPURenderPassDrawCommand(command: IWebGPURenderPassDrawCommand): void;
|
|
128
|
+
/** @internal */
|
|
129
|
+
export declare class WebGPURenderPassCommandStream {
|
|
130
|
+
private readonly _options;
|
|
131
|
+
private _commandWords;
|
|
132
|
+
private _commandWordCount;
|
|
133
|
+
private _drawCount;
|
|
134
|
+
private _renderPass;
|
|
135
|
+
private _pipelineId;
|
|
136
|
+
private _indexBufferId;
|
|
137
|
+
private _indexFormat;
|
|
138
|
+
private _vertexBufferIds;
|
|
139
|
+
private _vertexBufferOffsets;
|
|
140
|
+
private _bindGroupIds;
|
|
141
|
+
private _scratchVertexBufferIds;
|
|
142
|
+
private _scratchVertexBufferOffsets;
|
|
143
|
+
private _scratchBindGroupIds;
|
|
144
|
+
private _disabledAfterFailure;
|
|
145
|
+
constructor(_options: IWebGPURenderPassCommandStreamOptions);
|
|
146
|
+
flush(): boolean;
|
|
147
|
+
reset(): void;
|
|
148
|
+
tryAppend(command: IWebGPURenderPassDrawCommand): boolean;
|
|
149
|
+
private _getValidResourceId;
|
|
150
|
+
private _disable;
|
|
151
|
+
private _ensureCapacity;
|
|
152
|
+
private _pushU32;
|
|
153
|
+
private _pushU64;
|
|
154
|
+
private _pushU64Max;
|
|
155
|
+
}
|
|
156
|
+
export {};
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import { Logger } from "../../Misc/logger.js";
|
|
2
|
+
/**
|
|
3
|
+
* Version of the render-pass command-stream encoding. The host decoder reports the version it was
|
|
4
|
+
* built against through IWebGPURenderPassCommandRecorderProvider.protocolVersion; when the versions
|
|
5
|
+
* differ, the stream disables itself and draws fall back to direct encoder calls. This mirrors the
|
|
6
|
+
* PROTOCOL_VERSION guard of the bgfx-based NativeEngine, soft-failing instead of throwing because
|
|
7
|
+
* this path is an optimization rather than the engine's only transport. Bump it whenever opcodes or
|
|
8
|
+
* command layouts change.
|
|
9
|
+
*/
|
|
10
|
+
export const WebGPURenderPassCommandStreamProtocolVersion = 1;
|
|
11
|
+
/** @internal */
|
|
12
|
+
export const WebGPURenderPassCommandOpcode = {
|
|
13
|
+
setPipeline: 1,
|
|
14
|
+
setBindGroup: 2,
|
|
15
|
+
setVertexBuffer: 3,
|
|
16
|
+
setIndexBuffer: 4,
|
|
17
|
+
draw: 9,
|
|
18
|
+
drawIndexed: 10,
|
|
19
|
+
drawIndirect: 11,
|
|
20
|
+
drawIndexedIndirect: 12,
|
|
21
|
+
};
|
|
22
|
+
/** @internal */
|
|
23
|
+
export const WebGPURenderPassDrawKind = {
|
|
24
|
+
INDEXED: 0,
|
|
25
|
+
NON_INDEXED: 1,
|
|
26
|
+
};
|
|
27
|
+
const DefaultBufferOffset = 0;
|
|
28
|
+
const DefaultBaseVertex = 0;
|
|
29
|
+
const DefaultFirstInstance = 0;
|
|
30
|
+
const NoDynamicOffsets = 0;
|
|
31
|
+
/**
|
|
32
|
+
* Creates a reusable indexed draw command. Every field must be (re)assigned before each submission.
|
|
33
|
+
* @internal
|
|
34
|
+
*/
|
|
35
|
+
export function CreateWebGPURenderPassIndexedDrawCommand() {
|
|
36
|
+
return {
|
|
37
|
+
renderPass: null,
|
|
38
|
+
drawKind: WebGPURenderPassDrawKind.INDEXED,
|
|
39
|
+
pipeline: null,
|
|
40
|
+
bindGroups: [],
|
|
41
|
+
vertexBuffers: [],
|
|
42
|
+
indexBuffer: null,
|
|
43
|
+
indexFormat: "uint32" /* WebGPUConstants.IndexFormat.Uint32 */,
|
|
44
|
+
count: 0,
|
|
45
|
+
instancesCount: 0,
|
|
46
|
+
start: 0,
|
|
47
|
+
indirectDrawBuffer: null,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Creates a reusable non-indexed draw command. Every field must be (re)assigned before each submission.
|
|
52
|
+
* @internal
|
|
53
|
+
*/
|
|
54
|
+
export function CreateWebGPURenderPassNonIndexedDrawCommand() {
|
|
55
|
+
return {
|
|
56
|
+
renderPass: null,
|
|
57
|
+
drawKind: WebGPURenderPassDrawKind.NON_INDEXED,
|
|
58
|
+
pipeline: null,
|
|
59
|
+
bindGroups: [],
|
|
60
|
+
vertexBuffers: [],
|
|
61
|
+
indexBuffer: null,
|
|
62
|
+
indexFormat: null,
|
|
63
|
+
count: 0,
|
|
64
|
+
instancesCount: 0,
|
|
65
|
+
start: 0,
|
|
66
|
+
indirectDrawBuffer: null,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/** @internal */
|
|
70
|
+
export function ApplyWebGPURenderPassDrawCommand(command) {
|
|
71
|
+
const renderPass = command.renderPass;
|
|
72
|
+
const isIndexedDraw = command.drawKind === WebGPURenderPassDrawKind.INDEXED;
|
|
73
|
+
renderPass.setPipeline(command.pipeline);
|
|
74
|
+
if (isIndexedDraw) {
|
|
75
|
+
renderPass.setIndexBuffer(command.indexBuffer.underlyingResource, command.indexFormat, DefaultBufferOffset);
|
|
76
|
+
}
|
|
77
|
+
for (let index = 0; index < command.vertexBuffers.length; index++) {
|
|
78
|
+
const vertexBuffer = command.vertexBuffers[index];
|
|
79
|
+
const buffer = vertexBuffer.effectiveBuffer;
|
|
80
|
+
if (buffer) {
|
|
81
|
+
renderPass.setVertexBuffer(index, buffer.underlyingResource, vertexBuffer._validOffsetRange ? 0 : vertexBuffer.byteOffset);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
for (let i = 0; i < command.bindGroups.length; i++) {
|
|
85
|
+
renderPass.setBindGroup(i, command.bindGroups[i]);
|
|
86
|
+
}
|
|
87
|
+
if (command.indirectDrawBuffer) {
|
|
88
|
+
if (isIndexedDraw) {
|
|
89
|
+
renderPass.drawIndexedIndirect(command.indirectDrawBuffer, DefaultBufferOffset);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
renderPass.drawIndirect(command.indirectDrawBuffer, DefaultBufferOffset);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else if (isIndexedDraw) {
|
|
96
|
+
renderPass.drawIndexed(command.count, command.instancesCount || 1, command.start, DefaultBaseVertex, DefaultFirstInstance);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
renderPass.draw(command.count, command.instancesCount || 1, command.start, DefaultFirstInstance);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/** @internal */
|
|
103
|
+
export class WebGPURenderPassCommandStream {
|
|
104
|
+
constructor(_options) {
|
|
105
|
+
this._options = _options;
|
|
106
|
+
this._commandWords = new Uint32Array(256);
|
|
107
|
+
this._commandWordCount = 0;
|
|
108
|
+
this._drawCount = 0;
|
|
109
|
+
this._renderPass = null;
|
|
110
|
+
this._pipelineId = 0;
|
|
111
|
+
this._indexBufferId = 0;
|
|
112
|
+
this._indexFormat = null;
|
|
113
|
+
this._vertexBufferIds = [];
|
|
114
|
+
this._vertexBufferOffsets = [];
|
|
115
|
+
this._bindGroupIds = [];
|
|
116
|
+
this._scratchVertexBufferIds = [];
|
|
117
|
+
this._scratchVertexBufferOffsets = [];
|
|
118
|
+
this._scratchBindGroupIds = [];
|
|
119
|
+
this._disabledAfterFailure = false;
|
|
120
|
+
}
|
|
121
|
+
flush() {
|
|
122
|
+
const renderPass = this._renderPass;
|
|
123
|
+
const wordCount = this._commandWordCount;
|
|
124
|
+
if (!renderPass || wordCount === 0) {
|
|
125
|
+
// Nothing is pending: keep this path free of any work so disabled engines pay nothing per draw.
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
const recordCommands = renderPass._recordCommands;
|
|
129
|
+
if (typeof recordCommands !== "function") {
|
|
130
|
+
this.reset();
|
|
131
|
+
this._disable("WebGPU render pass command stream cannot flush: the active render pass does not support command recording.");
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
const success = recordCommands.call(renderPass, this._commandWords, this._drawCount, 0, 0, wordCount) === true;
|
|
135
|
+
this.reset();
|
|
136
|
+
if (!success) {
|
|
137
|
+
// The encoded words cannot be replayed (commands are consumed as they are encoded, which is
|
|
138
|
+
// what keeps the draw path allocation-free), so the draws in this batch are dropped from the
|
|
139
|
+
// current frame. A recording failure past the protocol-version handshake indicates a broken
|
|
140
|
+
// host decoder, so log once and fall back permanently to direct encoder calls.
|
|
141
|
+
const lastError = this._options.getProvider()?.getLastError?.();
|
|
142
|
+
const detail = lastError && lastError.length > 0 ? `: ${lastError}` : "";
|
|
143
|
+
this._disable(`WebGPU render pass command stream recording failed${detail}. The draws batched for this flush were dropped.`);
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
reset() {
|
|
149
|
+
this._commandWordCount = 0;
|
|
150
|
+
this._drawCount = 0;
|
|
151
|
+
this._renderPass = null;
|
|
152
|
+
this._pipelineId = 0;
|
|
153
|
+
this._indexBufferId = 0;
|
|
154
|
+
this._indexFormat = null;
|
|
155
|
+
this._vertexBufferIds.length = 0;
|
|
156
|
+
this._vertexBufferOffsets.length = 0;
|
|
157
|
+
this._bindGroupIds.length = 0;
|
|
158
|
+
}
|
|
159
|
+
tryAppend(command) {
|
|
160
|
+
if (this._disabledAfterFailure) {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
const provider = this._options.getProvider();
|
|
164
|
+
if (!provider || !provider.isEnabled()) {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
if (provider.protocolVersion !== WebGPURenderPassCommandStreamProtocolVersion) {
|
|
168
|
+
this._disable(`WebGPU render pass command stream protocol mismatch: the host decoder reports version ${provider.protocolVersion} but the engine encodes version ${WebGPURenderPassCommandStreamProtocolVersion}.`);
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
const recordCommands = command.renderPass._recordCommands;
|
|
172
|
+
if (typeof recordCommands !== "function") {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
const pipelineId = this._getValidResourceId(provider, command.pipeline);
|
|
176
|
+
if (pipelineId === 0) {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
const isIndexedDraw = command.drawKind === WebGPURenderPassDrawKind.INDEXED;
|
|
180
|
+
const indexBufferId = isIndexedDraw ? this._getValidResourceId(provider, command.indexBuffer.underlyingResource) : 0;
|
|
181
|
+
if (isIndexedDraw && indexBufferId === 0) {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
const vertexBufferIds = this._scratchVertexBufferIds;
|
|
185
|
+
const vertexBufferOffsets = this._scratchVertexBufferOffsets;
|
|
186
|
+
for (let index = 0; index < command.vertexBuffers.length; index++) {
|
|
187
|
+
const vertexBuffer = command.vertexBuffers[index];
|
|
188
|
+
const buffer = vertexBuffer.effectiveBuffer;
|
|
189
|
+
if (!buffer) {
|
|
190
|
+
vertexBufferIds[index] = 0;
|
|
191
|
+
vertexBufferOffsets[index] = 0;
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
const bufferId = this._getValidResourceId(provider, buffer.underlyingResource);
|
|
195
|
+
if (bufferId === 0) {
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
vertexBufferIds[index] = bufferId;
|
|
199
|
+
vertexBufferOffsets[index] = vertexBuffer._validOffsetRange ? 0 : vertexBuffer.byteOffset;
|
|
200
|
+
}
|
|
201
|
+
const bindGroupIds = this._scratchBindGroupIds;
|
|
202
|
+
for (let i = 0; i < command.bindGroups.length; i++) {
|
|
203
|
+
const bindGroupId = this._getValidResourceId(provider, command.bindGroups[i]);
|
|
204
|
+
if (bindGroupId === 0) {
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
bindGroupIds[i] = bindGroupId;
|
|
208
|
+
}
|
|
209
|
+
const indirectDrawBufferId = command.indirectDrawBuffer ? this._getValidResourceId(provider, command.indirectDrawBuffer) : 0;
|
|
210
|
+
if (command.indirectDrawBuffer && indirectDrawBufferId === 0) {
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
if (this._renderPass && this._renderPass !== command.renderPass) {
|
|
214
|
+
this.flush();
|
|
215
|
+
if (this._disabledAfterFailure) {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
this._renderPass = command.renderPass;
|
|
220
|
+
if (this._pipelineId !== pipelineId) {
|
|
221
|
+
this._pushU32(WebGPURenderPassCommandOpcode.setPipeline);
|
|
222
|
+
this._pushU64(pipelineId);
|
|
223
|
+
this._pipelineId = pipelineId;
|
|
224
|
+
}
|
|
225
|
+
if (isIndexedDraw) {
|
|
226
|
+
if (this._indexBufferId !== indexBufferId || this._indexFormat !== command.indexFormat) {
|
|
227
|
+
this._pushU32(WebGPURenderPassCommandOpcode.setIndexBuffer);
|
|
228
|
+
this._pushU64(indexBufferId);
|
|
229
|
+
this._pushU32(command.indexFormat === "uint32" /* WebGPUConstants.IndexFormat.Uint32 */ ? 1 : 0);
|
|
230
|
+
this._pushU64(DefaultBufferOffset);
|
|
231
|
+
this._pushU64Max();
|
|
232
|
+
this._indexBufferId = indexBufferId;
|
|
233
|
+
this._indexFormat = command.indexFormat;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
for (let index = 0; index < command.vertexBuffers.length; index++) {
|
|
237
|
+
const bufferId = vertexBufferIds[index];
|
|
238
|
+
if (!bufferId) {
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
const offset = vertexBufferOffsets[index];
|
|
242
|
+
if (this._vertexBufferIds[index] !== bufferId || this._vertexBufferOffsets[index] !== offset) {
|
|
243
|
+
this._pushU32(WebGPURenderPassCommandOpcode.setVertexBuffer);
|
|
244
|
+
this._pushU32(index);
|
|
245
|
+
this._pushU64(bufferId);
|
|
246
|
+
this._pushU64(offset);
|
|
247
|
+
this._pushU64Max();
|
|
248
|
+
this._vertexBufferIds[index] = bufferId;
|
|
249
|
+
this._vertexBufferOffsets[index] = offset;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
for (let i = 0; i < command.bindGroups.length; i++) {
|
|
253
|
+
const bindGroupId = bindGroupIds[i];
|
|
254
|
+
if (this._bindGroupIds[i] !== bindGroupId) {
|
|
255
|
+
this._pushU32(WebGPURenderPassCommandOpcode.setBindGroup);
|
|
256
|
+
this._pushU32(i);
|
|
257
|
+
this._pushU64(bindGroupId);
|
|
258
|
+
this._pushU32(NoDynamicOffsets);
|
|
259
|
+
this._bindGroupIds[i] = bindGroupId;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
if (command.indirectDrawBuffer) {
|
|
263
|
+
this._pushU32(isIndexedDraw ? WebGPURenderPassCommandOpcode.drawIndexedIndirect : WebGPURenderPassCommandOpcode.drawIndirect);
|
|
264
|
+
this._pushU64(indirectDrawBufferId);
|
|
265
|
+
this._pushU64(DefaultBufferOffset);
|
|
266
|
+
}
|
|
267
|
+
else if (isIndexedDraw) {
|
|
268
|
+
this._pushU32(WebGPURenderPassCommandOpcode.drawIndexed);
|
|
269
|
+
this._pushU32(command.count);
|
|
270
|
+
this._pushU32(command.instancesCount || 1);
|
|
271
|
+
this._pushU32(command.start);
|
|
272
|
+
this._pushU32(DefaultBaseVertex);
|
|
273
|
+
this._pushU32(DefaultFirstInstance);
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
this._pushU32(WebGPURenderPassCommandOpcode.draw);
|
|
277
|
+
this._pushU32(command.count);
|
|
278
|
+
this._pushU32(command.instancesCount || 1);
|
|
279
|
+
this._pushU32(command.start);
|
|
280
|
+
this._pushU32(DefaultFirstInstance);
|
|
281
|
+
}
|
|
282
|
+
this._drawCount++;
|
|
283
|
+
return true;
|
|
284
|
+
}
|
|
285
|
+
_getValidResourceId(provider, resource) {
|
|
286
|
+
const id = provider.getResourceId(resource);
|
|
287
|
+
// Ids are encoded into u64 command words from a JS number: reject ids that cannot round-trip exactly.
|
|
288
|
+
return id > 0 && Number.isSafeInteger(id) ? id : 0;
|
|
289
|
+
}
|
|
290
|
+
_disable(message) {
|
|
291
|
+
this._disabledAfterFailure = true;
|
|
292
|
+
Logger.Error(`${message} Subsequent draws fall back to direct encoder calls.`);
|
|
293
|
+
}
|
|
294
|
+
_ensureCapacity(additionalWords) {
|
|
295
|
+
const requiredWords = this._commandWordCount + additionalWords;
|
|
296
|
+
if (requiredWords <= this._commandWords.length) {
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
let capacity = this._commandWords.length;
|
|
300
|
+
while (capacity < requiredWords) {
|
|
301
|
+
capacity *= 2;
|
|
302
|
+
}
|
|
303
|
+
const commands = new Uint32Array(capacity);
|
|
304
|
+
commands.set(this._commandWords.subarray(0, this._commandWordCount));
|
|
305
|
+
this._commandWords = commands;
|
|
306
|
+
}
|
|
307
|
+
_pushU32(value) {
|
|
308
|
+
this._ensureCapacity(1);
|
|
309
|
+
this._commandWords[this._commandWordCount++] = value >>> 0;
|
|
310
|
+
}
|
|
311
|
+
_pushU64(value) {
|
|
312
|
+
const normalized = Number.isFinite(value) && value > 0 ? value : 0;
|
|
313
|
+
this._ensureCapacity(2);
|
|
314
|
+
this._commandWords[this._commandWordCount++] = normalized >>> 0;
|
|
315
|
+
this._commandWords[this._commandWordCount++] = Math.floor(normalized / 0x100000000) >>> 0;
|
|
316
|
+
}
|
|
317
|
+
_pushU64Max() {
|
|
318
|
+
this._ensureCapacity(2);
|
|
319
|
+
this._commandWords[this._commandWordCount++] = 0xffffffff;
|
|
320
|
+
this._commandWords[this._commandWordCount++] = 0xffffffff;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=webgpuRenderPassCommandStream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgpuRenderPassCommandStream.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuRenderPassCommandStream.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Render-pass command-stream lowering for hosts where each WebGPU encoder call crosses a JS/native\n * boundary (e.g. BabylonNative over wgpu-native). This is the WebGPU counterpart of the\n * CommandBufferEncoder + NativeDataStream pairing used by the bgfx-based NativeEngine (see\n * thinNativeEngine.pure.ts): commands are encoded as words into a reused buffer and submitted across\n * the bridge in batches, guarded by a protocol-version handshake against JS/native drift. The\n * conduits necessarily differ: WebGPUEngine also ships to browsers, so the host contract is injected\n * (IWebGPURenderPassCommandRecorderProvider) rather than read from the _native global, command\n * tokens are protocol integers rather than native-provided handles, and commands carry WebGPU\n * render-pass semantics (pipelines, bind groups, draws) referencing host resource-handle ids.\n */\nimport { type VertexBuffer } from \"../../Buffers/buffer.pure\";\nimport { type DataBuffer } from \"../../Buffers/dataBuffer\";\nimport { Logger } from \"../../Misc/logger\";\nimport { type Nullable } from \"../../types\";\nimport * as WebGPUConstants from \"./webgpuConstants\";\n\n/**\n * Version of the render-pass command-stream encoding. The host decoder reports the version it was\n * built against through IWebGPURenderPassCommandRecorderProvider.protocolVersion; when the versions\n * differ, the stream disables itself and draws fall back to direct encoder calls. This mirrors the\n * PROTOCOL_VERSION guard of the bgfx-based NativeEngine, soft-failing instead of throwing because\n * this path is an optimization rather than the engine's only transport. Bump it whenever opcodes or\n * command layouts change.\n */\nexport const WebGPURenderPassCommandStreamProtocolVersion = 1;\n\n/** @internal */\nexport const WebGPURenderPassCommandOpcode = {\n setPipeline: 1,\n setBindGroup: 2,\n setVertexBuffer: 3,\n setIndexBuffer: 4,\n draw: 9,\n drawIndexed: 10,\n drawIndirect: 11,\n drawIndexedIndirect: 12,\n} as const;\n\n/** @internal */\nexport const WebGPURenderPassDrawKind = {\n INDEXED: 0,\n NON_INDEXED: 1,\n} as const;\n\n/** @internal */\nexport type WebGPURenderPassDrawKind = (typeof WebGPURenderPassDrawKind)[keyof typeof WebGPURenderPassDrawKind];\n\nconst DefaultBufferOffset = 0;\nconst DefaultBaseVertex = 0;\nconst DefaultFirstInstance = 0;\nconst NoDynamicOffsets = 0;\n\n/**\n * Render pass encoder extended with an optional host recording hook.\n * The recorder must consume the command words synchronously: the buffer is owned by the stream and\n * is reused as soon as the call returns.\n * @internal\n */\nexport interface IWebGPUCommandRecordingRenderPass extends GPURenderPassEncoder {\n _recordCommands?: (commands: Uint32Array, drawCount: number, multiDrawCallCount: number, multiDrawDrawCount: number, wordCount: number) => boolean;\n}\n\n/**\n * Contract implemented by hosts whose WebGPU backend can record batched render-pass command streams\n * (e.g. BabylonNative over wgpu-native, where every render-pass encoder call crosses the JS/native\n * boundary). Install an implementation through WebGPUEngine.renderPassCommandRecorderProvider to let\n * compatibility-mode draws be encoded into a command stream and submitted in batches instead of one\n * encoder call per state change and draw.\n */\nexport interface IWebGPURenderPassCommandRecorderProvider {\n /**\n * The command-stream protocol version the host decoder was built against (see\n * WebGPURenderPassCommandStreamProtocolVersion). A mismatch permanently disables the stream for\n * the engine and draws fall back to direct encoder calls.\n */\n protocolVersion: number;\n /**\n * Returns true while command-stream recording is enabled on the host.\n */\n isEnabled(): boolean;\n /**\n * Returns the host handle id for a backend resource (pipeline, buffer or bind group), or 0 when\n * the resource has no host handle (which makes the draw fall back to direct encoder calls).\n * Ids must be positive safe integers (at most Number.MAX_SAFE_INTEGER) so they encode losslessly\n * into 64-bit command words; out-of-range ids are treated as missing.\n * @param resource the backend resource to identify\n */\n getResourceId(resource: Nullable<object>): number;\n /**\n * Optionally returns the host's last backend error, used to enrich diagnostics when recording fails.\n */\n getLastError?(): string | undefined;\n}\n\n/** @internal */\ninterface IWebGPURenderPassDrawCommandBase {\n renderPass: GPURenderPassEncoder | GPURenderBundleEncoder;\n drawKind: WebGPURenderPassDrawKind;\n pipeline: GPURenderPipeline;\n bindGroups: GPUBindGroup[];\n vertexBuffers: VertexBuffer[];\n count: number;\n instancesCount: number;\n start: number;\n indirectDrawBuffer: Nullable<GPUBuffer>;\n}\n\n/** @internal */\nexport interface IWebGPURenderPassIndexedDrawCommand extends IWebGPURenderPassDrawCommandBase {\n drawKind: typeof WebGPURenderPassDrawKind.INDEXED;\n indexBuffer: DataBuffer;\n indexFormat: GPUIndexFormat;\n}\n\n/** @internal */\nexport interface IWebGPURenderPassNonIndexedDrawCommand extends IWebGPURenderPassDrawCommandBase {\n drawKind: typeof WebGPURenderPassDrawKind.NON_INDEXED;\n indexBuffer: null;\n indexFormat: null;\n}\n\n/**\n * Draw commands are consumed synchronously by both the lowering and the replay paths, so callers may\n * (and the engine does) reuse a single command instance across draws to keep the hot path allocation-free.\n * @internal\n */\nexport type IWebGPURenderPassDrawCommand = IWebGPURenderPassIndexedDrawCommand | IWebGPURenderPassNonIndexedDrawCommand;\n\n/**\n * Creates a reusable indexed draw command. Every field must be (re)assigned before each submission.\n * @internal\n */\nexport function CreateWebGPURenderPassIndexedDrawCommand(): IWebGPURenderPassIndexedDrawCommand {\n return {\n renderPass: null as unknown as GPURenderPassEncoder,\n drawKind: WebGPURenderPassDrawKind.INDEXED,\n pipeline: null as unknown as GPURenderPipeline,\n bindGroups: [],\n vertexBuffers: [],\n indexBuffer: null as unknown as DataBuffer,\n indexFormat: WebGPUConstants.IndexFormat.Uint32,\n count: 0,\n instancesCount: 0,\n start: 0,\n indirectDrawBuffer: null,\n };\n}\n\n/**\n * Creates a reusable non-indexed draw command. Every field must be (re)assigned before each submission.\n * @internal\n */\nexport function CreateWebGPURenderPassNonIndexedDrawCommand(): IWebGPURenderPassNonIndexedDrawCommand {\n return {\n renderPass: null as unknown as GPURenderPassEncoder,\n drawKind: WebGPURenderPassDrawKind.NON_INDEXED,\n pipeline: null as unknown as GPURenderPipeline,\n bindGroups: [],\n vertexBuffers: [],\n indexBuffer: null,\n indexFormat: null,\n count: 0,\n instancesCount: 0,\n start: 0,\n indirectDrawBuffer: null,\n };\n}\n\n/** @internal */\nexport interface IWebGPURenderPassCommandStreamOptions {\n getProvider: () => Nullable<IWebGPURenderPassCommandRecorderProvider>;\n}\n\n/** @internal */\nexport function ApplyWebGPURenderPassDrawCommand(command: IWebGPURenderPassDrawCommand): void {\n const renderPass = command.renderPass;\n const isIndexedDraw = command.drawKind === WebGPURenderPassDrawKind.INDEXED;\n\n renderPass.setPipeline(command.pipeline);\n\n if (isIndexedDraw) {\n renderPass.setIndexBuffer(command.indexBuffer.underlyingResource, command.indexFormat, DefaultBufferOffset);\n }\n\n for (let index = 0; index < command.vertexBuffers.length; index++) {\n const vertexBuffer = command.vertexBuffers[index];\n const buffer = vertexBuffer.effectiveBuffer;\n if (buffer) {\n renderPass.setVertexBuffer(index, buffer.underlyingResource, vertexBuffer._validOffsetRange ? 0 : vertexBuffer.byteOffset);\n }\n }\n\n for (let i = 0; i < command.bindGroups.length; i++) {\n renderPass.setBindGroup(i, command.bindGroups[i]);\n }\n\n if (command.indirectDrawBuffer) {\n if (isIndexedDraw) {\n renderPass.drawIndexedIndirect(command.indirectDrawBuffer, DefaultBufferOffset);\n } else {\n renderPass.drawIndirect(command.indirectDrawBuffer, DefaultBufferOffset);\n }\n } else if (isIndexedDraw) {\n renderPass.drawIndexed(command.count, command.instancesCount || 1, command.start, DefaultBaseVertex, DefaultFirstInstance);\n } else {\n renderPass.draw(command.count, command.instancesCount || 1, command.start, DefaultFirstInstance);\n }\n}\n\n/** @internal */\nexport class WebGPURenderPassCommandStream {\n private _commandWords = new Uint32Array(256);\n private _commandWordCount = 0;\n private _drawCount = 0;\n private _renderPass: Nullable<GPURenderPassEncoder | GPURenderBundleEncoder> = null;\n private _pipelineId = 0;\n private _indexBufferId = 0;\n private _indexFormat: Nullable<GPUIndexFormat> = null;\n private _vertexBufferIds: number[] = [];\n private _vertexBufferOffsets: number[] = [];\n private _bindGroupIds: number[] = [];\n private _scratchVertexBufferIds: number[] = [];\n private _scratchVertexBufferOffsets: number[] = [];\n private _scratchBindGroupIds: number[] = [];\n private _disabledAfterFailure = false;\n\n public constructor(private readonly _options: IWebGPURenderPassCommandStreamOptions) {}\n\n public flush(): boolean {\n const renderPass = this._renderPass;\n const wordCount = this._commandWordCount;\n if (!renderPass || wordCount === 0) {\n // Nothing is pending: keep this path free of any work so disabled engines pay nothing per draw.\n return false;\n }\n\n const recordCommands = (renderPass as IWebGPUCommandRecordingRenderPass)._recordCommands;\n if (typeof recordCommands !== \"function\") {\n this.reset();\n this._disable(\"WebGPU render pass command stream cannot flush: the active render pass does not support command recording.\");\n return false;\n }\n\n const success = recordCommands.call(renderPass, this._commandWords, this._drawCount, 0, 0, wordCount) === true;\n this.reset();\n\n if (!success) {\n // The encoded words cannot be replayed (commands are consumed as they are encoded, which is\n // what keeps the draw path allocation-free), so the draws in this batch are dropped from the\n // current frame. A recording failure past the protocol-version handshake indicates a broken\n // host decoder, so log once and fall back permanently to direct encoder calls.\n const lastError = this._options.getProvider()?.getLastError?.();\n const detail = lastError && lastError.length > 0 ? `: ${lastError}` : \"\";\n this._disable(`WebGPU render pass command stream recording failed${detail}. The draws batched for this flush were dropped.`);\n return false;\n }\n\n return true;\n }\n\n public reset(): void {\n this._commandWordCount = 0;\n this._drawCount = 0;\n this._renderPass = null;\n this._pipelineId = 0;\n this._indexBufferId = 0;\n this._indexFormat = null;\n this._vertexBufferIds.length = 0;\n this._vertexBufferOffsets.length = 0;\n this._bindGroupIds.length = 0;\n }\n\n public tryAppend(command: IWebGPURenderPassDrawCommand): boolean {\n if (this._disabledAfterFailure) {\n return false;\n }\n\n const provider = this._options.getProvider();\n if (!provider || !provider.isEnabled()) {\n return false;\n }\n\n if (provider.protocolVersion !== WebGPURenderPassCommandStreamProtocolVersion) {\n this._disable(\n `WebGPU render pass command stream protocol mismatch: the host decoder reports version ${provider.protocolVersion} but the engine encodes version ${WebGPURenderPassCommandStreamProtocolVersion}.`\n );\n return false;\n }\n\n const recordCommands = (command.renderPass as IWebGPUCommandRecordingRenderPass)._recordCommands;\n if (typeof recordCommands !== \"function\") {\n return false;\n }\n\n const pipelineId = this._getValidResourceId(provider, command.pipeline);\n if (pipelineId === 0) {\n return false;\n }\n\n const isIndexedDraw = command.drawKind === WebGPURenderPassDrawKind.INDEXED;\n const indexBufferId = isIndexedDraw ? this._getValidResourceId(provider, command.indexBuffer.underlyingResource) : 0;\n if (isIndexedDraw && indexBufferId === 0) {\n return false;\n }\n\n const vertexBufferIds = this._scratchVertexBufferIds;\n const vertexBufferOffsets = this._scratchVertexBufferOffsets;\n for (let index = 0; index < command.vertexBuffers.length; index++) {\n const vertexBuffer = command.vertexBuffers[index];\n const buffer = vertexBuffer.effectiveBuffer;\n if (!buffer) {\n vertexBufferIds[index] = 0;\n vertexBufferOffsets[index] = 0;\n continue;\n }\n\n const bufferId = this._getValidResourceId(provider, buffer.underlyingResource);\n if (bufferId === 0) {\n return false;\n }\n vertexBufferIds[index] = bufferId;\n vertexBufferOffsets[index] = vertexBuffer._validOffsetRange ? 0 : vertexBuffer.byteOffset;\n }\n\n const bindGroupIds = this._scratchBindGroupIds;\n for (let i = 0; i < command.bindGroups.length; i++) {\n const bindGroupId = this._getValidResourceId(provider, command.bindGroups[i]);\n if (bindGroupId === 0) {\n return false;\n }\n bindGroupIds[i] = bindGroupId;\n }\n\n const indirectDrawBufferId = command.indirectDrawBuffer ? this._getValidResourceId(provider, command.indirectDrawBuffer) : 0;\n if (command.indirectDrawBuffer && indirectDrawBufferId === 0) {\n return false;\n }\n\n if (this._renderPass && this._renderPass !== command.renderPass) {\n this.flush();\n if (this._disabledAfterFailure) {\n return false;\n }\n }\n\n this._renderPass = command.renderPass;\n if (this._pipelineId !== pipelineId) {\n this._pushU32(WebGPURenderPassCommandOpcode.setPipeline);\n this._pushU64(pipelineId);\n this._pipelineId = pipelineId;\n }\n\n if (isIndexedDraw) {\n if (this._indexBufferId !== indexBufferId || this._indexFormat !== command.indexFormat) {\n this._pushU32(WebGPURenderPassCommandOpcode.setIndexBuffer);\n this._pushU64(indexBufferId);\n this._pushU32(command.indexFormat === WebGPUConstants.IndexFormat.Uint32 ? 1 : 0);\n this._pushU64(DefaultBufferOffset);\n this._pushU64Max();\n this._indexBufferId = indexBufferId;\n this._indexFormat = command.indexFormat;\n }\n }\n\n for (let index = 0; index < command.vertexBuffers.length; index++) {\n const bufferId = vertexBufferIds[index];\n if (!bufferId) {\n continue;\n }\n\n const offset = vertexBufferOffsets[index];\n if (this._vertexBufferIds[index] !== bufferId || this._vertexBufferOffsets[index] !== offset) {\n this._pushU32(WebGPURenderPassCommandOpcode.setVertexBuffer);\n this._pushU32(index);\n this._pushU64(bufferId);\n this._pushU64(offset);\n this._pushU64Max();\n this._vertexBufferIds[index] = bufferId;\n this._vertexBufferOffsets[index] = offset;\n }\n }\n\n for (let i = 0; i < command.bindGroups.length; i++) {\n const bindGroupId = bindGroupIds[i];\n if (this._bindGroupIds[i] !== bindGroupId) {\n this._pushU32(WebGPURenderPassCommandOpcode.setBindGroup);\n this._pushU32(i);\n this._pushU64(bindGroupId);\n this._pushU32(NoDynamicOffsets);\n this._bindGroupIds[i] = bindGroupId;\n }\n }\n\n if (command.indirectDrawBuffer) {\n this._pushU32(isIndexedDraw ? WebGPURenderPassCommandOpcode.drawIndexedIndirect : WebGPURenderPassCommandOpcode.drawIndirect);\n this._pushU64(indirectDrawBufferId);\n this._pushU64(DefaultBufferOffset);\n } else if (isIndexedDraw) {\n this._pushU32(WebGPURenderPassCommandOpcode.drawIndexed);\n this._pushU32(command.count);\n this._pushU32(command.instancesCount || 1);\n this._pushU32(command.start);\n this._pushU32(DefaultBaseVertex);\n this._pushU32(DefaultFirstInstance);\n } else {\n this._pushU32(WebGPURenderPassCommandOpcode.draw);\n this._pushU32(command.count);\n this._pushU32(command.instancesCount || 1);\n this._pushU32(command.start);\n this._pushU32(DefaultFirstInstance);\n }\n\n this._drawCount++;\n return true;\n }\n\n private _getValidResourceId(provider: IWebGPURenderPassCommandRecorderProvider, resource: Nullable<object>): number {\n const id = provider.getResourceId(resource);\n // Ids are encoded into u64 command words from a JS number: reject ids that cannot round-trip exactly.\n return id > 0 && Number.isSafeInteger(id) ? id : 0;\n }\n\n private _disable(message: string): void {\n this._disabledAfterFailure = true;\n Logger.Error(`${message} Subsequent draws fall back to direct encoder calls.`);\n }\n\n private _ensureCapacity(additionalWords: number): void {\n const requiredWords = this._commandWordCount + additionalWords;\n if (requiredWords <= this._commandWords.length) {\n return;\n }\n\n let capacity = this._commandWords.length;\n while (capacity < requiredWords) {\n capacity *= 2;\n }\n const commands = new Uint32Array(capacity);\n commands.set(this._commandWords.subarray(0, this._commandWordCount));\n this._commandWords = commands;\n }\n\n private _pushU32(value: number): void {\n this._ensureCapacity(1);\n this._commandWords[this._commandWordCount++] = value >>> 0;\n }\n\n private _pushU64(value: number): void {\n const normalized = Number.isFinite(value) && value > 0 ? value : 0;\n this._ensureCapacity(2);\n this._commandWords[this._commandWordCount++] = normalized >>> 0;\n this._commandWords[this._commandWordCount++] = Math.floor(normalized / 0x100000000) >>> 0;\n }\n\n private _pushU64Max(): void {\n this._ensureCapacity(2);\n this._commandWords[this._commandWordCount++] = 0xffffffff;\n this._commandWords[this._commandWordCount++] = 0xffffffff;\n }\n}\n"]}
|
|
@@ -36,7 +36,7 @@ export declare class WebGPUTextureManager {
|
|
|
36
36
|
width: number;
|
|
37
37
|
height: number;
|
|
38
38
|
layers: number;
|
|
39
|
-
}, hasMipmaps?: boolean, generateMipmaps?: boolean, invertY?: boolean, premultiplyAlpha?: boolean, is3D?: boolean, format?: GPUTextureFormat, sampleCount?: number, commandEncoder?: GPUCommandEncoder, usage?: number, additionalUsages?: number, label?: string, mipLevelCount?: number): GPUTexture;
|
|
39
|
+
}, hasMipmaps?: boolean, generateMipmaps?: boolean, invertY?: boolean, premultiplyAlpha?: boolean, is3D?: boolean, format?: GPUTextureFormat, sampleCount?: number, commandEncoder?: GPUCommandEncoder, usage?: number, additionalUsages?: number, label?: string, mipLevelCount?: number, noRenderAttachment?: boolean): GPUTexture;
|
|
40
40
|
createCubeTexture(imageBitmaps: ImageBitmap[] | {
|
|
41
41
|
width: number;
|
|
42
42
|
height: number;
|
|
@@ -817,7 +817,7 @@ export class WebGPUTextureManager {
|
|
|
817
817
|
//------------------------------------------------------------------------------
|
|
818
818
|
// Creation
|
|
819
819
|
//------------------------------------------------------------------------------
|
|
820
|
-
createTexture(imageBitmap, hasMipmaps = false, generateMipmaps = false, invertY = false, premultiplyAlpha = false, is3D = false, format = "rgba8unorm" /* WebGPUConstants.TextureFormat.RGBA8Unorm */, sampleCount = 1, commandEncoder, usage = -1, additionalUsages = 0, label, mipLevelCount) {
|
|
820
|
+
createTexture(imageBitmap, hasMipmaps = false, generateMipmaps = false, invertY = false, premultiplyAlpha = false, is3D = false, format = "rgba8unorm" /* WebGPUConstants.TextureFormat.RGBA8Unorm */, sampleCount = 1, commandEncoder, usage = -1, additionalUsages = 0, label, mipLevelCount, noRenderAttachment = false) {
|
|
821
821
|
sampleCount = WebGPUTextureHelper.GetSample(sampleCount);
|
|
822
822
|
if (is3D && WebGPUTextureHelper.IsImageBitmap(imageBitmap)) {
|
|
823
823
|
throw new Error("Uploading an ImageBitmap to a WebGPU 3D texture is not supported.");
|
|
@@ -836,7 +836,8 @@ export class WebGPUTextureManager {
|
|
|
836
836
|
additionalUsages |= hasMipmaps && !isCompressedFormat ? 1 /* WebGPUConstants.TextureUsage.CopySrc */ | renderAttachmentFlag : 0;
|
|
837
837
|
if (!isCompressedFormat && !is3D) {
|
|
838
838
|
// we don't know in advance if the texture will be updated with copyExternalImageToTexture (which requires to have those flags), so we need to force the flags all the times
|
|
839
|
-
|
|
839
|
+
// unless the caller guarantees the texture is only filled from typed arrays: render attachment textures can use a GPU memory layout that is much slower for random texel fetches
|
|
840
|
+
additionalUsages |= (noRenderAttachment ? 0 : renderAttachmentFlag) | 2 /* WebGPUConstants.TextureUsage.CopyDst */;
|
|
840
841
|
}
|
|
841
842
|
const gpuTexture = this._device.createTexture({
|
|
842
843
|
label: `BabylonWebGPUDevice${this._engine.uniqueId}_Texture${is3D ? "3D" : "2D"}_${label ? label + "_" : ""}${textureSize.width}x${textureSize.height}x${textureSize.depthOrArrayLayers}_${hasMipmaps ? "wmips" : "womips"}_${format}_samples${sampleCount}`,
|
|
@@ -1138,7 +1139,7 @@ export class WebGPUTextureManager {
|
|
|
1138
1139
|
}, isStorageTexture);
|
|
1139
1140
|
}
|
|
1140
1141
|
else {
|
|
1141
|
-
const gpuTexture = this.createTexture({ width, height, layers: layerCount }, hasMipMaps, texture.generateMipMaps, texture.invertY, false, texture.is3D, gpuTextureWrapper.format, 1, this._commandEncoderForCreation, gpuTextureWrapper.textureUsages, gpuTextureWrapper.textureAdditionalUsages, label, texture.is3D ? mipmapCount : undefined);
|
|
1142
|
+
const gpuTexture = this.createTexture({ width, height, layers: layerCount }, hasMipMaps, texture.generateMipMaps, texture.invertY, false, texture.is3D, gpuTextureWrapper.format, 1, this._commandEncoderForCreation, gpuTextureWrapper.textureUsages, gpuTextureWrapper.textureAdditionalUsages, label, texture.is3D ? mipmapCount : undefined, ((creationFlags ?? 0) & 2) !== 0 && !hasMipMaps && !texture.invertY && !texture.is3D);
|
|
1142
1143
|
gpuTextureWrapper.set(gpuTexture);
|
|
1143
1144
|
const arrayLayerCount = texture.is3D ? 1 : layerCount;
|
|
1144
1145
|
const format = WebGPUTextureHelper.GetDepthFormatOnly(gpuTextureWrapper.format);
|