@onerjs/core 9.0.2 → 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/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/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":"engine.multiRender.pure.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Engines/WebGPU/Extensions/engine.multiRender.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { InternalTexture, InternalTextureSource } from \"../../../Materials/Textures/internalTexture\";\r\nimport { type IMultiRenderTargetOptions } from \"../../../Materials/Textures/multiRenderTarget.pure\";\r\nimport { Logger } from \"../../../Misc/logger\";\r\nimport { type Nullable } from \"../../../types\";\r\nimport { Constants } from \"../../constants\";\r\nimport { type TextureSize } from \"../../../Materials/Textures/textureCreationOptions\";\r\nimport { type RenderTargetWrapper } from \"../../renderTargetWrapper\";\r\nimport { WebGPUEngine } from \"../../webgpuEngine.pure\";\r\nimport { type WebGPURenderTargetWrapper } from \"../webgpuRenderTargetWrapper\";\r\nimport { type WebGPUHardwareTexture } from \"../webgpuHardwareTexture\";\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for enginesWebGPUExtensionsEngineMultiRender.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterEnginesWebGPUExtensionsEngineMultiRender(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n WebGPUEngine.prototype.unBindMultiColorAttachmentFramebuffer = function (\r\n rtWrapper: RenderTargetWrapper,\r\n disableGenerateMipMaps: boolean = false,\r\n onBeforeUnbind?: () => void\r\n ): void {\r\n if (onBeforeUnbind) {\r\n onBeforeUnbind();\r\n }\r\n\r\n this._endCurrentRenderPass();\r\n\r\n if (!rtWrapper.disableAutomaticMSAAResolve) {\r\n this.resolveMultiFramebuffer(rtWrapper, false);\r\n }\r\n\r\n if (!disableGenerateMipMaps) {\r\n this.generateMipMapsMultiFramebuffer(rtWrapper);\r\n }\r\n\r\n this._currentRenderTarget = null;\r\n\r\n this._mrtAttachments = [];\r\n this._cacheRenderPipeline.setMRT([]);\r\n this._cacheRenderPipeline.setMRTAttachments(this._mrtAttachments);\r\n };\r\n\r\n WebGPUEngine.prototype.createMultipleRenderTarget = function (size: TextureSize, options: IMultiRenderTargetOptions, initializeBuffers?: boolean): RenderTargetWrapper {\r\n let generateMipMaps = false;\r\n let generateDepthBuffer = true;\r\n let generateStencilBuffer = false;\r\n let generateDepthTexture = false;\r\n let depthTextureFormat = Constants.TEXTUREFORMAT_DEPTH16;\r\n let textureCount = 1;\r\n let samples = 1;\r\n\r\n const defaultType = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n const defaultSamplingMode = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE;\r\n const defaultUseSRGBBuffer = false;\r\n const defaultFormat = Constants.TEXTUREFORMAT_RGBA;\r\n const defaultTarget = Constants.TEXTURE_2D;\r\n\r\n let types: number[] = [];\r\n let samplingModes: number[] = [];\r\n let useSRGBBuffers: boolean[] = [];\r\n let formats: number[] = [];\r\n let targets: number[] = [];\r\n let faceIndex: number[] = [];\r\n let layerIndex: number[] = [];\r\n let layers: number[] = [];\r\n let labels: string[] = [];\r\n let creationFlags: number[] = [];\r\n let dontCreateTextures = false;\r\n\r\n const rtWrapper = this._createHardwareRenderTargetWrapper(true, false, size) as WebGPURenderTargetWrapper;\r\n\r\n if (options !== undefined) {\r\n generateMipMaps = options.generateMipMaps ?? false;\r\n generateDepthBuffer = options.generateDepthBuffer ?? true;\r\n generateStencilBuffer = options.generateStencilBuffer ?? false;\r\n generateDepthTexture = options.generateDepthTexture ?? false;\r\n textureCount = options.textureCount ?? 1;\r\n depthTextureFormat = options.depthTextureFormat ?? Constants.TEXTUREFORMAT_DEPTH16;\r\n types = options.types || types;\r\n samplingModes = options.samplingModes || samplingModes;\r\n useSRGBBuffers = options.useSRGBBuffers || useSRGBBuffers;\r\n formats = options.formats || formats;\r\n targets = options.targetTypes || targets;\r\n faceIndex = options.faceIndex || faceIndex;\r\n layerIndex = options.layerIndex || layerIndex;\r\n layers = options.layerCounts || layers;\r\n labels = options.labels || labels;\r\n creationFlags = options.creationFlags || creationFlags;\r\n samples = options.samples ?? samples;\r\n dontCreateTextures = options.dontCreateTextures ?? false;\r\n }\r\n\r\n const width = (<{ width: number; height: number }>size).width ?? <number>size;\r\n const height = (<{ width: number; height: number }>size).height ?? <number>size;\r\n\r\n const textures: InternalTexture[] = [];\r\n const attachments: number[] = [];\r\n const defaultAttachments: number[] = [];\r\n\r\n rtWrapper.label = options?.label ?? \"MultiRenderTargetWrapper\";\r\n rtWrapper._generateDepthBuffer = generateDepthBuffer;\r\n rtWrapper._generateStencilBuffer = generateStencilBuffer;\r\n rtWrapper._attachments = attachments;\r\n rtWrapper._defaultAttachments = defaultAttachments;\r\n\r\n let depthStencilTexture: Nullable<InternalTexture> = null;\r\n if ((generateDepthBuffer || generateStencilBuffer || generateDepthTexture) && !dontCreateTextures) {\r\n if (!generateDepthTexture) {\r\n // The caller doesn't want a depth texture, so we are free to use the depth texture format we want.\r\n // So, we will align with what the WebGL engine does\r\n if (generateDepthBuffer && generateStencilBuffer) {\r\n depthTextureFormat = Constants.TEXTUREFORMAT_DEPTH24_STENCIL8;\r\n } else if (generateDepthBuffer) {\r\n depthTextureFormat = Constants.TEXTUREFORMAT_DEPTH32_FLOAT;\r\n } else {\r\n depthTextureFormat = Constants.TEXTUREFORMAT_STENCIL8;\r\n }\r\n }\r\n depthStencilTexture = rtWrapper.createDepthStencilTexture(0, false, generateStencilBuffer, 1, depthTextureFormat, rtWrapper.label + \"-DepthStencil\");\r\n }\r\n\r\n const mipmapsCreationOnly = options !== undefined && typeof options === \"object\" && options.createMipMaps && !generateMipMaps;\r\n\r\n for (let i = 0; i < textureCount; i++) {\r\n let samplingMode = samplingModes[i] || defaultSamplingMode;\r\n let type = types[i] || defaultType;\r\n\r\n const format = formats[i] || defaultFormat;\r\n const useSRGBBuffer = (useSRGBBuffers[i] || defaultUseSRGBBuffer) && this._caps.supportSRGBBuffers;\r\n\r\n const target = targets[i] || defaultTarget;\r\n const layerCount = layers[i] ?? 1;\r\n const creationFlag = creationFlags[i];\r\n\r\n if (type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloatLinearFiltering) {\r\n // if floating point linear (FLOAT) then force to NEAREST_SAMPLINGMODE\r\n samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n } else if (type === Constants.TEXTURETYPE_HALF_FLOAT && !this._caps.textureHalfFloatLinearFiltering) {\r\n // if floating point linear (HALF_FLOAT) then force to NEAREST_SAMPLINGMODE\r\n samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n }\r\n\r\n if (type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloat) {\r\n type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n Logger.Warn(\"Float textures are not supported. Render target forced to TEXTURETYPE_UNSIGNED_BYTE type\");\r\n }\r\n\r\n attachments.push(i + 1);\r\n defaultAttachments.push(initializeBuffers ? i + 1 : i === 0 ? 1 : 0);\r\n\r\n if (target === -1 || dontCreateTextures) {\r\n continue;\r\n }\r\n\r\n const texture = new InternalTexture(this, InternalTextureSource.MultiRenderTarget);\r\n textures[i] = texture;\r\n\r\n switch (target) {\r\n case Constants.TEXTURE_CUBE_MAP:\r\n texture.isCube = true;\r\n break;\r\n case Constants.TEXTURE_3D:\r\n texture.is3D = true;\r\n texture.baseDepth = texture.depth = layerCount;\r\n break;\r\n case Constants.TEXTURE_2D_ARRAY:\r\n texture.is2DArray = true;\r\n texture.baseDepth = texture.depth = layerCount;\r\n break;\r\n }\r\n\r\n texture.baseWidth = width;\r\n texture.baseHeight = height;\r\n texture.width = width;\r\n texture.height = height;\r\n texture.isReady = true;\r\n texture.samples = 1;\r\n texture.generateMipMaps = generateMipMaps;\r\n texture.samplingMode = samplingMode;\r\n texture.type = type;\r\n texture._cachedWrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n texture._cachedWrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n texture._useSRGBBuffer = useSRGBBuffer;\r\n texture.format = format;\r\n texture.label = labels[i] ?? rtWrapper.label + \"-Texture\" + i;\r\n\r\n this._internalTexturesCache.push(texture);\r\n\r\n if (mipmapsCreationOnly) {\r\n // createGPUTextureForInternalTexture will only create a texture with mipmaps if generateMipMaps is true, as InternalTexture has no createMipMaps property, separate from generateMipMaps.\r\n texture.generateMipMaps = true;\r\n }\r\n\r\n this._textureHelper.createGPUTextureForInternalTexture(texture, undefined, undefined, undefined, creationFlag);\r\n\r\n if (mipmapsCreationOnly) {\r\n texture.generateMipMaps = false;\r\n }\r\n }\r\n\r\n if (depthStencilTexture) {\r\n depthStencilTexture.incrementReferences();\r\n textures[textureCount] = depthStencilTexture;\r\n this._internalTexturesCache.push(depthStencilTexture);\r\n }\r\n\r\n rtWrapper.setTextures(textures);\r\n rtWrapper.setLayerAndFaceIndices(layerIndex, faceIndex);\r\n\r\n if (!dontCreateTextures) {\r\n this.updateMultipleRenderTargetTextureSampleCount(rtWrapper, samples);\r\n } else {\r\n rtWrapper._samples = samples;\r\n }\r\n\r\n return rtWrapper;\r\n };\r\n\r\n WebGPUEngine.prototype.updateMultipleRenderTargetTextureSampleCount = function (rtWrapper: Nullable<RenderTargetWrapper>, samples: number): number {\r\n if (!rtWrapper || !rtWrapper.textures || rtWrapper.textures.length === 0 || rtWrapper.textures[0].samples === samples) {\r\n return samples;\r\n }\r\n\r\n const count = rtWrapper.textures.length;\r\n\r\n if (count === 0) {\r\n return 1;\r\n }\r\n\r\n samples = Math.min(samples, this.getCaps().maxMSAASamples);\r\n\r\n // Release existing MSAA textures\r\n for (let i = 0; i < count; ++i) {\r\n const texture = rtWrapper.textures[i];\r\n const gpuTextureWrapper = texture._hardwareTexture as Nullable<WebGPUHardwareTexture>;\r\n\r\n gpuTextureWrapper?.releaseMSAATextures();\r\n }\r\n\r\n // Sets new sample count. The MSAA textures will be created on demand.\r\n for (let i = 0; i < count; ++i) {\r\n const texture = rtWrapper.textures[i];\r\n texture.samples = samples;\r\n }\r\n\r\n if (rtWrapper._depthStencilTexture) {\r\n rtWrapper._depthStencilTexture.samples = samples;\r\n }\r\n\r\n rtWrapper._samples = samples;\r\n\r\n return samples;\r\n };\r\n\r\n WebGPUEngine.prototype.generateMipMapsMultiFramebuffer = function (texture: RenderTargetWrapper): void {\r\n const rtWrapper = texture as WebGPURenderTargetWrapper;\r\n\r\n if (!rtWrapper.isMulti) {\r\n return;\r\n }\r\n\r\n const attachments = rtWrapper._attachments!;\r\n const count = attachments.length;\r\n\r\n for (let i = 0; i < count; i++) {\r\n const texture = rtWrapper.textures![i];\r\n if (texture.generateMipMaps && !texture.isCube && !texture.is3D) {\r\n this._generateMipmaps(texture);\r\n }\r\n }\r\n };\r\n\r\n WebGPUEngine.prototype.resolveMultiFramebuffer = function (texture: RenderTargetWrapper, resolveColors: boolean = true): void {\r\n this.resolveFramebuffer(texture, resolveColors);\r\n };\r\n\r\n WebGPUEngine.prototype.bindAttachments = function (attachments: number[]): void {\r\n if (attachments.length === 0 || !this._currentRenderTarget) {\r\n return;\r\n }\r\n\r\n this._mrtAttachments = attachments;\r\n if (this._currentRenderPass) {\r\n // the render pass has already been created, we need to call setMRTAttachments to update the state of the attachments\r\n this._cacheRenderPipeline.setMRTAttachments(attachments);\r\n } else {\r\n // the render pass is not created yet so we don't need to call setMRTAttachments: it will be called as part of the render pass creation (see WebGPUEngine._startRenderTargetRenderPass)\r\n }\r\n };\r\n\r\n WebGPUEngine.prototype.clearAttachments = function (color, attachments, clearColor, clearDepth, clearStencil = false, stencilClearValue = 0): void {\r\n this.bindAttachments(attachments);\r\n this.clear(color, clearColor, clearDepth, clearStencil, stencilClearValue);\r\n };\r\n\r\n WebGPUEngine.prototype.buildTextureLayout = function (textureStatus: boolean[], backBufferLayout = false): number[] {\r\n const result = [];\r\n\r\n if (backBufferLayout) {\r\n result.push(1);\r\n } else {\r\n for (let i = 0; i < textureStatus.length; i++) {\r\n if (textureStatus[i]) {\r\n result.push(i + 1);\r\n } else {\r\n result.push(0);\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n };\r\n\r\n WebGPUEngine.prototype.restoreSingleAttachment = function (): void {\r\n // not sure what to do, probably nothing... This function and restoreSingleAttachmentForRenderTarget are not called in Babylon.js so it's hard to know the use case\r\n };\r\n\r\n WebGPUEngine.prototype.restoreSingleAttachmentForRenderTarget = function (): void {\r\n // not sure what to do, probably nothing... This function and restoreSingleAttachment are not called in Babylon.js so it's hard to know the use case\r\n };\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"engine.multiRender.pure.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Engines/WebGPU/Extensions/engine.multiRender.pure.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,OAAO,EAAE,eAAe,EAAyB,MAAM,6CAA6C,CAAC;AAErG,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAIvD,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB;;;GAGG;AACH,MAAM,UAAU,gDAAgD;IAC5D,IAAI,WAAW,EAAE,CAAC;QACd,OAAO;IACX,CAAC;IACD,WAAW,GAAG,IAAI,CAAC;IAEnB,YAAY,CAAC,SAAS,CAAC,qCAAqC,GAAG,UAC3D,SAA8B,EAC9B,yBAAkC,KAAK,EACvC,cAA2B;QAE3B,IAAI,cAAc,EAAE,CAAC;YACjB,cAAc,EAAE,CAAC;QACrB,CAAC;QAED,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE7B,IAAI,CAAC,SAAS,CAAC,2BAA2B,EAAE,CAAC;YACzC,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC1B,IAAI,CAAC,+BAA+B,CAAC,SAAS,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QAEjC,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACtE,CAAC,CAAC;IAEF,YAAY,CAAC,SAAS,CAAC,0BAA0B,GAAG,UAAU,IAAiB,EAAE,OAAkC,EAAE,iBAA2B;QAC5I,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,IAAI,mBAAmB,GAAG,IAAI,CAAC;QAC/B,IAAI,qBAAqB,GAAG,KAAK,CAAC;QAClC,IAAI,oBAAoB,GAAG,KAAK,CAAC;QACjC,IAAI,kBAAkB,GAAG,SAAS,CAAC,qBAAqB,CAAC;QACzD,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,MAAM,WAAW,GAAG,SAAS,CAAC,yBAAyB,CAAC;QACxD,MAAM,mBAAmB,GAAG,SAAS,CAAC,8BAA8B,CAAC;QACrE,MAAM,oBAAoB,GAAG,KAAK,CAAC;QACnC,MAAM,aAAa,GAAG,SAAS,CAAC,kBAAkB,CAAC;QACnD,MAAM,aAAa,GAAG,SAAS,CAAC,UAAU,CAAC;QAE3C,IAAI,KAAK,GAAa,EAAE,CAAC;QACzB,IAAI,aAAa,GAAa,EAAE,CAAC;QACjC,IAAI,cAAc,GAAc,EAAE,CAAC;QACnC,IAAI,OAAO,GAAa,EAAE,CAAC;QAC3B,IAAI,OAAO,GAAa,EAAE,CAAC;QAC3B,IAAI,SAAS,GAAa,EAAE,CAAC;QAC7B,IAAI,UAAU,GAAa,EAAE,CAAC;QAC9B,IAAI,MAAM,GAAa,EAAE,CAAC;QAC1B,IAAI,MAAM,GAAa,EAAE,CAAC;QAC1B,IAAI,aAAa,GAAa,EAAE,CAAC;QACjC,IAAI,kBAAkB,GAAG,KAAK,CAAC;QAE/B,MAAM,SAAS,GAAG,IAAI,CAAC,kCAAkC,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAA8B,CAAC;QAE1G,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACxB,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,KAAK,CAAC;YACnD,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,IAAI,IAAI,CAAC;YAC1D,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,IAAI,KAAK,CAAC;YAC/D,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,IAAI,KAAK,CAAC;YAC7D,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;YACzC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,IAAI,SAAS,CAAC,qBAAqB,CAAC;YACnF,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;YAC/B,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,aAAa,CAAC;YACvD,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,cAAc,CAAC;YAC1D,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC;YACrC,OAAO,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC;YACzC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,SAAS,CAAC;YAC3C,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,UAAU,CAAC;YAC9C,MAAM,GAAG,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC;YACvC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC;YAClC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,aAAa,CAAC;YACvD,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC;YACrC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,IAAI,KAAK,CAAC;QAC7D,CAAC;QAED,MAAM,KAAK,GAAuC,IAAK,CAAC,KAAK,IAAY,IAAI,CAAC;QAC9E,MAAM,MAAM,GAAuC,IAAK,CAAC,MAAM,IAAY,IAAI,CAAC;QAEhF,MAAM,QAAQ,GAAsB,EAAE,CAAC;QACvC,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,MAAM,kBAAkB,GAAa,EAAE,CAAC;QAExC,SAAS,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,0BAA0B,CAAC;QAC/D,SAAS,CAAC,oBAAoB,GAAG,mBAAmB,CAAC;QACrD,SAAS,CAAC,sBAAsB,GAAG,qBAAqB,CAAC;QACzD,SAAS,CAAC,YAAY,GAAG,WAAW,CAAC;QACrC,SAAS,CAAC,mBAAmB,GAAG,kBAAkB,CAAC;QAEnD,IAAI,mBAAmB,GAA8B,IAAI,CAAC;QAC1D,IAAI,CAAC,mBAAmB,IAAI,qBAAqB,IAAI,oBAAoB,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAChG,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBACxB,mGAAmG;gBACnG,oDAAoD;gBACpD,IAAI,mBAAmB,IAAI,qBAAqB,EAAE,CAAC;oBAC/C,kBAAkB,GAAG,SAAS,CAAC,8BAA8B,CAAC;gBAClE,CAAC;qBAAM,IAAI,mBAAmB,EAAE,CAAC;oBAC7B,kBAAkB,GAAG,SAAS,CAAC,2BAA2B,CAAC;gBAC/D,CAAC;qBAAM,CAAC;oBACJ,kBAAkB,GAAG,SAAS,CAAC,sBAAsB,CAAC;gBAC1D,CAAC;YACL,CAAC;YACD,mBAAmB,GAAG,SAAS,CAAC,yBAAyB,CAAC,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,EAAE,kBAAkB,EAAE,SAAS,CAAC,KAAK,GAAG,eAAe,CAAC,CAAC;QACzJ,CAAC;QAED,MAAM,mBAAmB,GAAG,OAAO,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,aAAa,IAAI,CAAC,eAAe,CAAC;QAE9H,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,IAAI,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,mBAAmB,CAAC;YAC3D,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC;YAEnC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC;YAC3C,MAAM,aAAa,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,oBAAoB,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC;YAEnG,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC;YAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YAEtC,IAAI,IAAI,KAAK,SAAS,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,2BAA2B,EAAE,CAAC;gBAClF,sEAAsE;gBACtE,YAAY,GAAG,SAAS,CAAC,4BAA4B,CAAC;YAC1D,CAAC;iBAAM,IAAI,IAAI,KAAK,SAAS,CAAC,sBAAsB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,+BAA+B,EAAE,CAAC;gBAClG,2EAA2E;gBAC3E,YAAY,GAAG,SAAS,CAAC,4BAA4B,CAAC;YAC1D,CAAC;YAED,IAAI,IAAI,KAAK,SAAS,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;gBACnE,IAAI,GAAG,SAAS,CAAC,yBAAyB,CAAC;gBAC3C,MAAM,CAAC,IAAI,CAAC,0FAA0F,CAAC,CAAC;YAC5G,CAAC;YAED,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACxB,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAErE,IAAI,MAAM,KAAK,CAAC,CAAC,IAAI,kBAAkB,EAAE,CAAC;gBACtC,SAAS;YACb,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,IAAI,kDAA0C,CAAC;YACnF,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;YAEtB,QAAQ,MAAM,EAAE,CAAC;gBACb,KAAK,SAAS,CAAC,gBAAgB;oBAC3B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;oBACtB,MAAM;gBACV,KAAK,SAAS,CAAC,UAAU;oBACrB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;oBACpB,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC;oBAC/C,MAAM;gBACV,KAAK,SAAS,CAAC,gBAAgB;oBAC3B,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;oBACzB,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC;oBAC/C,MAAM;YACd,CAAC;YAED,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;YAC1B,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC;YAC5B,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;YACtB,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;YACxB,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;YACvB,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC;YACpB,OAAO,CAAC,eAAe,GAAG,eAAe,CAAC;YAC1C,OAAO,CAAC,YAAY,GAAG,YAAY,CAAC;YACpC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YACpB,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,yBAAyB,CAAC;YAC3D,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,yBAAyB,CAAC;YAC3D,OAAO,CAAC,cAAc,GAAG,aAAa,CAAC;YACvC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;YACxB,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC;YAE9D,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE1C,IAAI,mBAAmB,EAAE,CAAC;gBACtB,0LAA0L;gBAC1L,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;YACnC,CAAC;YAED,IAAI,CAAC,cAAc,CAAC,kCAAkC,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;YAE/G,IAAI,mBAAmB,EAAE,CAAC;gBACtB,OAAO,CAAC,eAAe,GAAG,KAAK,CAAC;YACpC,CAAC;QACL,CAAC;QAED,IAAI,mBAAmB,EAAE,CAAC;YACtB,mBAAmB,CAAC,mBAAmB,EAAE,CAAC;YAC1C,QAAQ,CAAC,YAAY,CAAC,GAAG,mBAAmB,CAAC;QACjD,CAAC;QAED,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAChC,SAAS,CAAC,sBAAsB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAExD,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACtB,IAAI,CAAC,4CAA4C,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC1E,CAAC;aAAM,CAAC;YACJ,SAAS,CAAC,QAAQ,GAAG,OAAO,CAAC;QACjC,CAAC;QAED,OAAO,SAAS,CAAC;IACrB,CAAC,CAAC;IAEF,YAAY,CAAC,SAAS,CAAC,4CAA4C,GAAG,UAAU,SAAwC,EAAE,OAAe;QACrI,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YACpH,OAAO,OAAO,CAAC;QACnB,CAAC;QAED,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;QAExC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YACd,OAAO,CAAC,CAAC;QACb,CAAC;QAED,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,cAAc,CAAC,CAAC;QAE3D,iCAAiC;QACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACtC,MAAM,iBAAiB,GAAG,OAAO,CAAC,gBAAmD,CAAC;YAEtF,iBAAiB,EAAE,mBAAmB,EAAE,CAAC;QAC7C,CAAC;QAED,sEAAsE;QACtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;QAC9B,CAAC;QAED,IAAI,SAAS,CAAC,oBAAoB,EAAE,CAAC;YACjC,SAAS,CAAC,oBAAoB,CAAC,OAAO,GAAG,OAAO,CAAC;QACrD,CAAC;QAED,SAAS,CAAC,QAAQ,GAAG,OAAO,CAAC;QAE7B,OAAO,OAAO,CAAC;IACnB,CAAC,CAAC;IAEF,YAAY,CAAC,SAAS,CAAC,+BAA+B,GAAG,UAAU,OAA4B;QAC3F,MAAM,SAAS,GAAG,OAAoC,CAAC;QAEvD,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO;QACX,CAAC;QAED,MAAM,WAAW,GAAG,SAAS,CAAC,YAAa,CAAC;QAC5C,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC;QAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,SAAS,CAAC,QAAS,CAAC,CAAC,CAAC,CAAC;YACvC,IAAI,OAAO,CAAC,eAAe,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC9D,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YACnC,CAAC;QACL,CAAC;IACL,CAAC,CAAC;IAEF,YAAY,CAAC,SAAS,CAAC,uBAAuB,GAAG,UAAU,OAA4B,EAAE,gBAAyB,IAAI;QAClH,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACpD,CAAC,CAAC;IAEF,YAAY,CAAC,SAAS,CAAC,eAAe,GAAG,UAAU,WAAqB;QACpE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACzD,OAAO;QACX,CAAC;QAED,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC;QACnC,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,qHAAqH;YACrH,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACJ,uLAAuL;QAC3L,CAAC;IACL,CAAC,CAAC;IAEF,YAAY,CAAC,SAAS,CAAC,gBAAgB,GAAG,UAAU,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,GAAG,KAAK,EAAE,iBAAiB,GAAG,CAAC;QACvI,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAAC;IAC/E,CAAC,CAAC;IAEF,YAAY,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAAU,aAAwB,EAAE,gBAAgB,GAAG,KAAK;QACpG,MAAM,MAAM,GAAG,EAAE,CAAC;QAElB,IAAI,gBAAgB,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;aAAM,CAAC;YACJ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;oBACnB,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACvB,CAAC;qBAAM,CAAC;oBACJ,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACnB,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC,CAAC;IAEF,YAAY,CAAC,SAAS,CAAC,uBAAuB,GAAG;QAC7C,mKAAmK;IACvK,CAAC,CAAC;IAEF,YAAY,CAAC,SAAS,CAAC,sCAAsC,GAAG;QAC5D,oJAAoJ;IACxJ,CAAC,CAAC;AACN,CAAC","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { InternalTexture, InternalTextureSource } from \"../../../Materials/Textures/internalTexture\";\r\nimport { type IMultiRenderTargetOptions } from \"../../../Materials/Textures/multiRenderTarget.pure\";\r\nimport { Logger } from \"../../../Misc/logger\";\r\nimport { type Nullable } from \"../../../types\";\r\nimport { Constants } from \"../../constants\";\r\nimport { type TextureSize } from \"../../../Materials/Textures/textureCreationOptions\";\r\nimport { type RenderTargetWrapper } from \"../../renderTargetWrapper\";\r\nimport { WebGPUEngine } from \"../../webgpuEngine.pure\";\r\nimport { type WebGPURenderTargetWrapper } from \"../webgpuRenderTargetWrapper\";\r\nimport { type WebGPUHardwareTexture } from \"../webgpuHardwareTexture\";\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for enginesWebGPUExtensionsEngineMultiRender.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterEnginesWebGPUExtensionsEngineMultiRender(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n WebGPUEngine.prototype.unBindMultiColorAttachmentFramebuffer = function (\r\n rtWrapper: RenderTargetWrapper,\r\n disableGenerateMipMaps: boolean = false,\r\n onBeforeUnbind?: () => void\r\n ): void {\r\n if (onBeforeUnbind) {\r\n onBeforeUnbind();\r\n }\r\n\r\n this._endCurrentRenderPass();\r\n\r\n if (!rtWrapper.disableAutomaticMSAAResolve) {\r\n this.resolveMultiFramebuffer(rtWrapper, false);\r\n }\r\n\r\n if (!disableGenerateMipMaps) {\r\n this.generateMipMapsMultiFramebuffer(rtWrapper);\r\n }\r\n\r\n this._currentRenderTarget = null;\r\n\r\n this._mrtAttachments = [];\r\n this._cacheRenderPipeline.setMRT([]);\r\n this._cacheRenderPipeline.setMRTAttachments(this._mrtAttachments);\r\n };\r\n\r\n WebGPUEngine.prototype.createMultipleRenderTarget = function (size: TextureSize, options: IMultiRenderTargetOptions, initializeBuffers?: boolean): RenderTargetWrapper {\r\n let generateMipMaps = false;\r\n let generateDepthBuffer = true;\r\n let generateStencilBuffer = false;\r\n let generateDepthTexture = false;\r\n let depthTextureFormat = Constants.TEXTUREFORMAT_DEPTH16;\r\n let textureCount = 1;\r\n let samples = 1;\r\n\r\n const defaultType = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n const defaultSamplingMode = Constants.TEXTURE_TRILINEAR_SAMPLINGMODE;\r\n const defaultUseSRGBBuffer = false;\r\n const defaultFormat = Constants.TEXTUREFORMAT_RGBA;\r\n const defaultTarget = Constants.TEXTURE_2D;\r\n\r\n let types: number[] = [];\r\n let samplingModes: number[] = [];\r\n let useSRGBBuffers: boolean[] = [];\r\n let formats: number[] = [];\r\n let targets: number[] = [];\r\n let faceIndex: number[] = [];\r\n let layerIndex: number[] = [];\r\n let layers: number[] = [];\r\n let labels: string[] = [];\r\n let creationFlags: number[] = [];\r\n let dontCreateTextures = false;\r\n\r\n const rtWrapper = this._createHardwareRenderTargetWrapper(true, false, size) as WebGPURenderTargetWrapper;\r\n\r\n if (options !== undefined) {\r\n generateMipMaps = options.generateMipMaps ?? false;\r\n generateDepthBuffer = options.generateDepthBuffer ?? true;\r\n generateStencilBuffer = options.generateStencilBuffer ?? false;\r\n generateDepthTexture = options.generateDepthTexture ?? false;\r\n textureCount = options.textureCount ?? 1;\r\n depthTextureFormat = options.depthTextureFormat ?? Constants.TEXTUREFORMAT_DEPTH16;\r\n types = options.types || types;\r\n samplingModes = options.samplingModes || samplingModes;\r\n useSRGBBuffers = options.useSRGBBuffers || useSRGBBuffers;\r\n formats = options.formats || formats;\r\n targets = options.targetTypes || targets;\r\n faceIndex = options.faceIndex || faceIndex;\r\n layerIndex = options.layerIndex || layerIndex;\r\n layers = options.layerCounts || layers;\r\n labels = options.labels || labels;\r\n creationFlags = options.creationFlags || creationFlags;\r\n samples = options.samples ?? samples;\r\n dontCreateTextures = options.dontCreateTextures ?? false;\r\n }\r\n\r\n const width = (<{ width: number; height: number }>size).width ?? <number>size;\r\n const height = (<{ width: number; height: number }>size).height ?? <number>size;\r\n\r\n const textures: InternalTexture[] = [];\r\n const attachments: number[] = [];\r\n const defaultAttachments: number[] = [];\r\n\r\n rtWrapper.label = options?.label ?? \"MultiRenderTargetWrapper\";\r\n rtWrapper._generateDepthBuffer = generateDepthBuffer;\r\n rtWrapper._generateStencilBuffer = generateStencilBuffer;\r\n rtWrapper._attachments = attachments;\r\n rtWrapper._defaultAttachments = defaultAttachments;\r\n\r\n let depthStencilTexture: Nullable<InternalTexture> = null;\r\n if ((generateDepthBuffer || generateStencilBuffer || generateDepthTexture) && !dontCreateTextures) {\r\n if (!generateDepthTexture) {\r\n // The caller doesn't want a depth texture, so we are free to use the depth texture format we want.\r\n // So, we will align with what the WebGL engine does\r\n if (generateDepthBuffer && generateStencilBuffer) {\r\n depthTextureFormat = Constants.TEXTUREFORMAT_DEPTH24_STENCIL8;\r\n } else if (generateDepthBuffer) {\r\n depthTextureFormat = Constants.TEXTUREFORMAT_DEPTH32_FLOAT;\r\n } else {\r\n depthTextureFormat = Constants.TEXTUREFORMAT_STENCIL8;\r\n }\r\n }\r\n depthStencilTexture = rtWrapper.createDepthStencilTexture(0, false, generateStencilBuffer, 1, depthTextureFormat, rtWrapper.label + \"-DepthStencil\");\r\n }\r\n\r\n const mipmapsCreationOnly = options !== undefined && typeof options === \"object\" && options.createMipMaps && !generateMipMaps;\r\n\r\n for (let i = 0; i < textureCount; i++) {\r\n let samplingMode = samplingModes[i] || defaultSamplingMode;\r\n let type = types[i] || defaultType;\r\n\r\n const format = formats[i] || defaultFormat;\r\n const useSRGBBuffer = (useSRGBBuffers[i] || defaultUseSRGBBuffer) && this._caps.supportSRGBBuffers;\r\n\r\n const target = targets[i] || defaultTarget;\r\n const layerCount = layers[i] ?? 1;\r\n const creationFlag = creationFlags[i];\r\n\r\n if (type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloatLinearFiltering) {\r\n // if floating point linear (FLOAT) then force to NEAREST_SAMPLINGMODE\r\n samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n } else if (type === Constants.TEXTURETYPE_HALF_FLOAT && !this._caps.textureHalfFloatLinearFiltering) {\r\n // if floating point linear (HALF_FLOAT) then force to NEAREST_SAMPLINGMODE\r\n samplingMode = Constants.TEXTURE_NEAREST_SAMPLINGMODE;\r\n }\r\n\r\n if (type === Constants.TEXTURETYPE_FLOAT && !this._caps.textureFloat) {\r\n type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n Logger.Warn(\"Float textures are not supported. Render target forced to TEXTURETYPE_UNSIGNED_BYTE type\");\r\n }\r\n\r\n attachments.push(i + 1);\r\n defaultAttachments.push(initializeBuffers ? i + 1 : i === 0 ? 1 : 0);\r\n\r\n if (target === -1 || dontCreateTextures) {\r\n continue;\r\n }\r\n\r\n const texture = new InternalTexture(this, InternalTextureSource.MultiRenderTarget);\r\n textures[i] = texture;\r\n\r\n switch (target) {\r\n case Constants.TEXTURE_CUBE_MAP:\r\n texture.isCube = true;\r\n break;\r\n case Constants.TEXTURE_3D:\r\n texture.is3D = true;\r\n texture.baseDepth = texture.depth = layerCount;\r\n break;\r\n case Constants.TEXTURE_2D_ARRAY:\r\n texture.is2DArray = true;\r\n texture.baseDepth = texture.depth = layerCount;\r\n break;\r\n }\r\n\r\n texture.baseWidth = width;\r\n texture.baseHeight = height;\r\n texture.width = width;\r\n texture.height = height;\r\n texture.isReady = true;\r\n texture.samples = 1;\r\n texture.generateMipMaps = generateMipMaps;\r\n texture.samplingMode = samplingMode;\r\n texture.type = type;\r\n texture._cachedWrapU = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n texture._cachedWrapV = Constants.TEXTURE_CLAMP_ADDRESSMODE;\r\n texture._useSRGBBuffer = useSRGBBuffer;\r\n texture.format = format;\r\n texture.label = labels[i] ?? rtWrapper.label + \"-Texture\" + i;\r\n\r\n this._internalTexturesCache.push(texture);\r\n\r\n if (mipmapsCreationOnly) {\r\n // createGPUTextureForInternalTexture will only create a texture with mipmaps if generateMipMaps is true, as InternalTexture has no createMipMaps property, separate from generateMipMaps.\r\n texture.generateMipMaps = true;\r\n }\r\n\r\n this._textureHelper.createGPUTextureForInternalTexture(texture, undefined, undefined, undefined, creationFlag);\r\n\r\n if (mipmapsCreationOnly) {\r\n texture.generateMipMaps = false;\r\n }\r\n }\r\n\r\n if (depthStencilTexture) {\r\n depthStencilTexture.incrementReferences();\r\n textures[textureCount] = depthStencilTexture;\r\n }\r\n\r\n rtWrapper.setTextures(textures);\r\n rtWrapper.setLayerAndFaceIndices(layerIndex, faceIndex);\r\n\r\n if (!dontCreateTextures) {\r\n this.updateMultipleRenderTargetTextureSampleCount(rtWrapper, samples);\r\n } else {\r\n rtWrapper._samples = samples;\r\n }\r\n\r\n return rtWrapper;\r\n };\r\n\r\n WebGPUEngine.prototype.updateMultipleRenderTargetTextureSampleCount = function (rtWrapper: Nullable<RenderTargetWrapper>, samples: number): number {\r\n if (!rtWrapper || !rtWrapper.textures || rtWrapper.textures.length === 0 || rtWrapper.textures[0].samples === samples) {\r\n return samples;\r\n }\r\n\r\n const count = rtWrapper.textures.length;\r\n\r\n if (count === 0) {\r\n return 1;\r\n }\r\n\r\n samples = Math.min(samples, this.getCaps().maxMSAASamples);\r\n\r\n // Release existing MSAA textures\r\n for (let i = 0; i < count; ++i) {\r\n const texture = rtWrapper.textures[i];\r\n const gpuTextureWrapper = texture._hardwareTexture as Nullable<WebGPUHardwareTexture>;\r\n\r\n gpuTextureWrapper?.releaseMSAATextures();\r\n }\r\n\r\n // Sets new sample count. The MSAA textures will be created on demand.\r\n for (let i = 0; i < count; ++i) {\r\n const texture = rtWrapper.textures[i];\r\n texture.samples = samples;\r\n }\r\n\r\n if (rtWrapper._depthStencilTexture) {\r\n rtWrapper._depthStencilTexture.samples = samples;\r\n }\r\n\r\n rtWrapper._samples = samples;\r\n\r\n return samples;\r\n };\r\n\r\n WebGPUEngine.prototype.generateMipMapsMultiFramebuffer = function (texture: RenderTargetWrapper): void {\r\n const rtWrapper = texture as WebGPURenderTargetWrapper;\r\n\r\n if (!rtWrapper.isMulti) {\r\n return;\r\n }\r\n\r\n const attachments = rtWrapper._attachments!;\r\n const count = attachments.length;\r\n\r\n for (let i = 0; i < count; i++) {\r\n const texture = rtWrapper.textures![i];\r\n if (texture.generateMipMaps && !texture.isCube && !texture.is3D) {\r\n this._generateMipmaps(texture);\r\n }\r\n }\r\n };\r\n\r\n WebGPUEngine.prototype.resolveMultiFramebuffer = function (texture: RenderTargetWrapper, resolveColors: boolean = true): void {\r\n this.resolveFramebuffer(texture, resolveColors);\r\n };\r\n\r\n WebGPUEngine.prototype.bindAttachments = function (attachments: number[]): void {\r\n if (attachments.length === 0 || !this._currentRenderTarget) {\r\n return;\r\n }\r\n\r\n this._mrtAttachments = attachments;\r\n if (this._currentRenderPass) {\r\n // the render pass has already been created, we need to call setMRTAttachments to update the state of the attachments\r\n this._cacheRenderPipeline.setMRTAttachments(attachments);\r\n } else {\r\n // the render pass is not created yet so we don't need to call setMRTAttachments: it will be called as part of the render pass creation (see WebGPUEngine._startRenderTargetRenderPass)\r\n }\r\n };\r\n\r\n WebGPUEngine.prototype.clearAttachments = function (color, attachments, clearColor, clearDepth, clearStencil = false, stencilClearValue = 0): void {\r\n this.bindAttachments(attachments);\r\n this.clear(color, clearColor, clearDepth, clearStencil, stencilClearValue);\r\n };\r\n\r\n WebGPUEngine.prototype.buildTextureLayout = function (textureStatus: boolean[], backBufferLayout = false): number[] {\r\n const result = [];\r\n\r\n if (backBufferLayout) {\r\n result.push(1);\r\n } else {\r\n for (let i = 0; i < textureStatus.length; i++) {\r\n if (textureStatus[i]) {\r\n result.push(i + 1);\r\n } else {\r\n result.push(0);\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n };\r\n\r\n WebGPUEngine.prototype.restoreSingleAttachment = function (): void {\r\n // not sure what to do, probably nothing... This function and restoreSingleAttachmentForRenderTarget are not called in Babylon.js so it's hard to know the use case\r\n };\r\n\r\n WebGPUEngine.prototype.restoreSingleAttachmentForRenderTarget = function (): void {\r\n // not sure what to do, probably nothing... This function and restoreSingleAttachment are not called in Babylon.js so it's hard to know the use case\r\n };\r\n}\r\n"]}
|
|
@@ -37,6 +37,8 @@ export function RegisterEnginesWebGPUExtensionsEngineQuery() {
|
|
|
37
37
|
}
|
|
38
38
|
const renderPass = this._getCurrentRenderPass();
|
|
39
39
|
if (renderPass && this._occlusionQuery.canBeginQuery(query)) {
|
|
40
|
+
// Batched draws issued before the query must not be counted by it.
|
|
41
|
+
this._flushRenderPassCommands();
|
|
40
42
|
renderPass.beginOcclusionQuery(query);
|
|
41
43
|
this._occlusionQueryActive = true;
|
|
42
44
|
return true;
|
|
@@ -51,6 +53,9 @@ export function RegisterEnginesWebGPUExtensionsEngineQuery() {
|
|
|
51
53
|
ThinWebGPUEngine.prototype.endOcclusionQuery = function () {
|
|
52
54
|
if (this.compatibilityMode) {
|
|
53
55
|
if (this._occlusionQueryActive) {
|
|
56
|
+
// Batched draws issued while the query was open must be recorded inside it, otherwise the
|
|
57
|
+
// query reports zero samples and the mesh is wrongly considered occluded.
|
|
58
|
+
this._flushRenderPassCommands();
|
|
54
59
|
this._currentRenderPass?.endOcclusionQuery();
|
|
55
60
|
this._occlusionQueryActive = false;
|
|
56
61
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.query.pure.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Engines/WebGPU/Extensions/engine.query.pure.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,mCAAmC,EAAE,iCAAiC,EAAE,MAAM,qBAAqB,CAAC;AAU7G,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB;;;GAGG;AACH,MAAM,UAAU,0CAA0C;IACtD,IAAI,WAAW,EAAE,CAAC;QACd,OAAO;IACX,CAAC;IACD,WAAW,GAAG,IAAI,CAAC;IAEnB,gBAAgB,CAAC,SAAS,CAAC,sBAAsB,GAAG;QAChD,OAAO,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC;IACpD,CAAC,CAAC;IAEF,gBAAgB,CAAC,SAAS,CAAC,mBAAmB,GAAG,UAAU,KAAc;QACrE,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;IACnE,CAAC,CAAC;IAEF,gBAAgB,CAAC,SAAS,CAAC,WAAW,GAAG;QACrC,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;IAC9C,CAAC,CAAC;IAEF,gBAAgB,CAAC,SAAS,CAAC,WAAW,GAAG,UAAU,KAAqB;QACpE,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,KAAe,CAAC,CAAC;QAElD,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC;IAEF,gBAAgB,CAAC,SAAS,CAAC,sBAAsB,GAAG,UAAU,KAAqB;QAC/E,OAAO,IAAI,CAAC,eAAe,CAAC,sBAAsB,CAAC,KAAe,CAAC,CAAC;IACxE,CAAC,CAAC;IAEF,gBAAgB,CAAC,SAAS,CAAC,cAAc,GAAG,UAAU,KAAqB;QACvE,OAAO,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,KAAe,CAAC,CAAC;IAChE,CAAC,CAAC;IAEF,gBAAgB,CAAC,SAAS,CAAC,mBAAmB,GAAG,UAAU,aAAqB,EAAE,KAAqB;QACnG,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAC7B,OAAO,KAAK,CAAC;YACjB,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAChD,IAAI,UAAU,IAAI,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,KAAe,CAAC,EAAE,CAAC;gBACpE,UAAU,CAAC,mBAAmB,CAAC,KAAe,CAAC,CAAC;gBAChD,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;gBAClC,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,mCAAmC,CAAC,KAAe,CAAC,CAAC,CAAC;YACnF,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC,CAAC;IAEF,gBAAgB,CAAC,SAAS,CAAC,iBAAiB,GAAG;QAC3C,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAC7B,IAAI,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;gBAC7C,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;YACvC,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,iCAAiC,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC;AACN,CAAC","sourcesContent":["/** This file must only contain pure code and pure imports */\
|
|
1
|
+
{"version":3,"file":"engine.query.pure.js","sourceRoot":"","sources":["../../../../../../dev/core/src/Engines/WebGPU/Extensions/engine.query.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\n\nimport { ThinWebGPUEngine } from \"core/Engines/thinWebGPUEngine\";\nimport { WebGPURenderItemBeginOcclusionQuery, WebGPURenderItemEndOcclusionQuery } from \"../webgpuBundleList\";\nimport { type PerfCounter } from \"../../../Misc/perfCounter\";\nimport { type OcclusionQuery } from \"../../../Engines/AbstractEngine/abstractEngine.query.pure\";\n\n// eslint-disable-next-line import/no-duplicates\n\n// eslint-disable-next-line import/no-duplicates\n\nexport {};\n\nlet _Registered = false;\n/**\n * Register side effects for enginesWebGPUExtensionsEngineQuery.\n * Safe to call multiple times; only the first call has an effect.\n */\nexport function RegisterEnginesWebGPUExtensionsEngineQuery(): void {\n if (_Registered) {\n return;\n }\n _Registered = true;\n\n ThinWebGPUEngine.prototype.getGPUFrameTimeCounter = function (): PerfCounter {\n return this._timestampQuery.gpuFrameTimeCounter;\n };\n\n ThinWebGPUEngine.prototype.captureGPUFrameTime = function (value: boolean) {\n this._timestampQuery.enable = value && !!this._caps.timerQuery;\n };\n\n ThinWebGPUEngine.prototype.createQuery = function (): OcclusionQuery {\n return this._occlusionQuery.createQuery();\n };\n\n ThinWebGPUEngine.prototype.deleteQuery = function (query: OcclusionQuery): ThinWebGPUEngine {\n this._occlusionQuery.deleteQuery(query as number);\n\n return this;\n };\n\n ThinWebGPUEngine.prototype.isQueryResultAvailable = function (query: OcclusionQuery): boolean {\n return this._occlusionQuery.isQueryResultAvailable(query as number);\n };\n\n ThinWebGPUEngine.prototype.getQueryResult = function (query: OcclusionQuery): number {\n return this._occlusionQuery.getQueryResult(query as number);\n };\n\n ThinWebGPUEngine.prototype.beginOcclusionQuery = function (algorithmType: number, query: OcclusionQuery): boolean {\n if (this.compatibilityMode) {\n if (this._occlusionQueryActive) {\n return false;\n }\n\n const renderPass = this._getCurrentRenderPass();\n if (renderPass && this._occlusionQuery.canBeginQuery(query as number)) {\n // Batched draws issued before the query must not be counted by it.\n this._flushRenderPassCommands();\n renderPass.beginOcclusionQuery(query as number);\n this._occlusionQueryActive = true;\n return true;\n }\n } else {\n this._bundleList.addItem(new WebGPURenderItemBeginOcclusionQuery(query as number));\n return true;\n }\n\n return false;\n };\n\n ThinWebGPUEngine.prototype.endOcclusionQuery = function (): ThinWebGPUEngine {\n if (this.compatibilityMode) {\n if (this._occlusionQueryActive) {\n // Batched draws issued while the query was open must be recorded inside it, otherwise the\n // query reports zero samples and the mesh is wrongly considered occluded.\n this._flushRenderPassCommands();\n this._currentRenderPass?.endOcclusionQuery();\n this._occlusionQueryActive = false;\n }\n } else {\n this._bundleList.addItem(new WebGPURenderItemEndOcclusionQuery());\n }\n return this;\n };\n}\n"]}
|
|
@@ -89,6 +89,13 @@ export class WebGPUBufferManager {
|
|
|
89
89
|
else {
|
|
90
90
|
dataLength = Math.min(dataLength, destArray.length);
|
|
91
91
|
}
|
|
92
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention -- the name of the global
|
|
93
|
+
const float16Array = globalThis.Float16Array;
|
|
94
|
+
if (float16Array) {
|
|
95
|
+
// the browser converts the values: the same as FromHalfFloat, except that a NaN may keep its sign and payload
|
|
96
|
+
destArray.set(new float16Array(arrayBuffer, 0, dataLength));
|
|
97
|
+
return destArray;
|
|
98
|
+
}
|
|
92
99
|
const srcData = new Uint16Array(arrayBuffer);
|
|
93
100
|
while (dataLength--) {
|
|
94
101
|
destArray[dataLength] = FromHalfFloat(srcData[dataLength]);
|
|
@@ -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: 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"]}
|
|
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// Float16Array (ES2025) where the browser has it: it is not in the TypeScript libraries the engine builds with\r\ntype Float16ArrayConstructor = new (buffer: ArrayBufferLike, byteOffset?: number, length?: number) => ArrayLike<number>;\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 // eslint-disable-next-line @typescript-eslint/naming-convention -- the name of the global\r\n const float16Array = (globalThis as { Float16Array?: Float16ArrayConstructor }).Float16Array;\r\n if (float16Array) {\r\n // the browser converts the values: the same as FromHalfFloat, except that a NaN may keep its sign and payload\r\n destArray.set(new float16Array(arrayBuffer, 0, dataLength));\r\n return destArray;\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"]}
|
|
@@ -9,24 +9,36 @@
|
|
|
9
9
|
*/
|
|
10
10
|
export class WebGPUCacheTextureView {
|
|
11
11
|
constructor() {
|
|
12
|
+
// a texture has few views, so they are found by comparing the descriptors' fields: a lookup allocates nothing
|
|
12
13
|
this._cache = new WeakMap();
|
|
13
14
|
}
|
|
14
15
|
getView(texture, descriptor) {
|
|
15
16
|
let viewsForTexture = this._cache.get(texture);
|
|
16
17
|
if (!viewsForTexture) {
|
|
17
|
-
viewsForTexture =
|
|
18
|
+
viewsForTexture = [];
|
|
18
19
|
this._cache.set(texture, viewsForTexture);
|
|
19
20
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
for (let i = 0; i < viewsForTexture.length; i++) {
|
|
22
|
+
const entry = viewsForTexture[i];
|
|
23
|
+
if (WebGPUCacheTextureView._SameView(entry.descriptor, descriptor)) {
|
|
24
|
+
return entry.view;
|
|
25
|
+
}
|
|
25
26
|
}
|
|
27
|
+
const view = texture.createView(descriptor);
|
|
28
|
+
// a copy: the callers reuse their descriptors for other views
|
|
29
|
+
viewsForTexture.push({ descriptor: { ...descriptor }, view });
|
|
26
30
|
return view;
|
|
27
31
|
}
|
|
28
|
-
static
|
|
29
|
-
return
|
|
32
|
+
static _SameView(a, b) {
|
|
33
|
+
return (a.format === b.format &&
|
|
34
|
+
a.dimension === b.dimension &&
|
|
35
|
+
a.baseMipLevel === b.baseMipLevel &&
|
|
36
|
+
a.mipLevelCount === b.mipLevelCount &&
|
|
37
|
+
a.baseArrayLayer === b.baseArrayLayer &&
|
|
38
|
+
a.arrayLayerCount === b.arrayLayerCount &&
|
|
39
|
+
a.aspect === b.aspect &&
|
|
40
|
+
a.usage === b.usage &&
|
|
41
|
+
a.swizzle === b.swizzle);
|
|
30
42
|
}
|
|
31
43
|
}
|
|
32
44
|
//# sourceMappingURL=webgpuCacheTextureView.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpuCacheTextureView.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuCacheTextureView.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAExC;;;;;;;GAOG;AACH,MAAM,OAAO,sBAAsB;IAAnC;
|
|
1
|
+
{"version":3,"file":"webgpuCacheTextureView.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuCacheTextureView.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAExC;;;;;;;GAOG;AACH,MAAM,OAAO,sBAAsB;IAAnC;QACI,8GAA8G;QACtG,WAAM,GAAG,IAAI,OAAO,EAAqF,CAAC;IAoCtH,CAAC;IAlCU,OAAO,CAAC,OAAmB,EAAE,UAAoC;QACpE,IAAI,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,eAAe,EAAE,CAAC;YACnB,eAAe,GAAG,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAC9C,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;YACjC,IAAI,sBAAsB,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC;gBACjE,OAAO,KAAK,CAAC,IAAI,CAAC;YACtB,CAAC;QACL,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC5C,8DAA8D;QAC9D,eAAe,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,EAAE,GAAG,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9D,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,MAAM,CAAC,SAAS,CAAC,CAA2B,EAAE,CAA2B;QAC7E,OAAO,CACH,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YACrB,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;YAC3B,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,YAAY;YACjC,CAAC,CAAC,aAAa,KAAK,CAAC,CAAC,aAAa;YACnC,CAAC,CAAC,cAAc,KAAK,CAAC,CAAC,cAAc;YACrC,CAAC,CAAC,eAAe,KAAK,CAAC,CAAC,eAAe;YACvC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YACrB,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;YACnB,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,CAC1B,CAAC;IACN,CAAC;CACJ","sourcesContent":["/* eslint-disable babylonjs/available */\n\n/**\n * Caches GPUTextureView objects so that render-pass attachments (color, MSAA resolve, depth/stencil)\n * don't recreate a fresh view every time a render target is bound/cleared.\n * Views are keyed on the live GPUTexture object via a WeakMap: once a texture is recreated (e.g. on resize)\n * the old texture becomes unreachable and its cached views are collected along with it, so no manual\n * invalidation is required.\n * @internal\n */\nexport class WebGPUCacheTextureView {\n // a texture has few views, so they are found by comparing the descriptors' fields: a lookup allocates nothing\n private _cache = new WeakMap<GPUTexture, Array<{ descriptor: GPUTextureViewDescriptor; view: GPUTextureView }>>();\n\n public getView(texture: GPUTexture, descriptor: GPUTextureViewDescriptor): GPUTextureView {\n let viewsForTexture = this._cache.get(texture);\n if (!viewsForTexture) {\n viewsForTexture = [];\n this._cache.set(texture, viewsForTexture);\n }\n\n for (let i = 0; i < viewsForTexture.length; i++) {\n const entry = viewsForTexture[i];\n if (WebGPUCacheTextureView._SameView(entry.descriptor, descriptor)) {\n return entry.view;\n }\n }\n\n const view = texture.createView(descriptor);\n // a copy: the callers reuse their descriptors for other views\n viewsForTexture.push({ descriptor: { ...descriptor }, view });\n\n return view;\n }\n\n private static _SameView(a: GPUTextureViewDescriptor, b: GPUTextureViewDescriptor): boolean {\n return (\n a.format === b.format &&\n a.dimension === b.dimension &&\n a.baseMipLevel === b.baseMipLevel &&\n a.mipLevelCount === b.mipLevelCount &&\n a.baseArrayLayer === b.baseArrayLayer &&\n a.arrayLayerCount === b.arrayLayerCount &&\n a.aspect === b.aspect &&\n a.usage === b.usage &&\n a.swizzle === b.swizzle\n );\n }\n}\n"]}
|
|
@@ -71,6 +71,8 @@ export declare class WebGPUDrawContext implements IDrawContext {
|
|
|
71
71
|
*/
|
|
72
72
|
constructor(bufferManager: WebGPUBufferManager, _dummyIndexBuffer: WebGPUDataBuffer);
|
|
73
73
|
reset(): void;
|
|
74
|
+
/** Invalidates cached vertex bindings without releasing draw resources. @internal */
|
|
75
|
+
_invalidateVertexBuffers(): void;
|
|
74
76
|
/**
|
|
75
77
|
* Associates a buffer to the draw context.
|
|
76
78
|
* @param name The name of the buffer.
|
|
@@ -85,6 +85,12 @@ export class WebGPUDrawContext {
|
|
|
85
85
|
this.bindGroups = undefined;
|
|
86
86
|
this._vertexPullingEnabled = false;
|
|
87
87
|
}
|
|
88
|
+
/** Invalidates cached vertex bindings without releasing draw resources. @internal */
|
|
89
|
+
_invalidateVertexBuffers() {
|
|
90
|
+
this.fastBundle = undefined;
|
|
91
|
+
// Refresh storage-buffer bindings on the next vertex-pulling draw.
|
|
92
|
+
this._vertexPullingEnabled = false;
|
|
93
|
+
}
|
|
88
94
|
/**
|
|
89
95
|
* Associates a buffer to the draw context.
|
|
90
96
|
* @param name The name of the buffer.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpuDrawContext.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuDrawContext.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,eAAe,MAAM,mBAAmB,CAAC;AAErD;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IA2C1B;;;;OAIG;IACI,OAAO,CAAC,uBAA+B;QAC1C,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,wBAAwB,KAAK,uBAAuB,CAAC;IACtF,CAAC;IAED;;;OAGG;IACI,YAAY,CAAC,uBAA+B;QAC/C,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,wBAAwB,GAAG,uBAAuB,CAAC;IAC5D,CAAC;IAED,IAAW,kBAAkB;QACzB,OAAO,IAAI,CAAC,mBAAmB,CAAC;IACpC,CAAC;IAED,IAAW,kBAAkB,CAAC,MAAe;QACzC,IAAI,CAAC,+BAA+B,GAAG,IAAI,CAAC;QAE5C,IAAI,IAAI,CAAC,mBAAmB,KAAK,MAAM,EAAE,CAAC;YACtC,OAAO;QACX,CAAC;QAED,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC;QAElC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC7D,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC3D,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;YACpC,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;QACvC,CAAC;aAAM,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5C,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CACzD,EAAE,EACF,eAAe,CAAC,WAAW,CAAC,OAAO,GAAG,eAAe,CAAC,WAAW,CAAC,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,OAAO,EAChH,SAAS,EACT,oBAAoB,CACvB,CAAC;YACF,IAAI,CAAC,iBAAiB,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAClC,CAAC;IACL,CAAC;IAED,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED,IAAW,aAAa,CAAC,GAAY;QACjC,IAAI,IAAI,CAAC,cAAc,KAAK,GAAG,EAAE,CAAC;YAC9B,OAAO;QACX,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;QAC1B,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC;QAEhC,MAAM,8BAA8B,GAAG,IAAI,CAAC,+BAA+B,CAAC;QAE5E,IAAI,CAAC,kBAAkB,GAAG,GAAG,CAAC;QAE9B,IAAI,CAAC,+BAA+B,GAAG,8BAA8B,CAAC;IAC1E,CAAC;IAED;;;;;OAKG;IACH,YACI,aAAkC,EAC1B,iBAAmC;QAAnC,sBAAiB,GAAjB,iBAAiB,CAAkB;QAxG/C;;;;WAIG;QACI,oCAA+B,GAAG,KAAK,CAAC;QAqG3C,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,EAAE,CAAC;QAC7C,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;QACjC,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IAEM,KAAK;QACR,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACI,SAAS,CAAC,IAAY,EAAE,MAAkC;QAC7D,IAAI,CAAC,QAAQ,KAAb,IAAI,CAAC,QAAQ,GAAK,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAC;QAEpE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;IAChC,CAAC;IAEM,eAAe,CAAC,kBAA0B,EAAE,aAAqB,EAAE,kBAA0B,EAAE,WAAW,GAAG,KAAK;QACrH,IAAI,CAAC,CAAC,WAAW,IAAI,aAAa,KAAK,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACxH,yDAAyD;YACzD,mHAAmH;YACnH,mEAAmE;YACnE,OAAO;QACX,CAAC;QACD,IAAI,CAAC,qBAAqB,GAAG,aAAa,CAAC;QAE3C,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC;QAC/C,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;QAC1C,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC;QAE/C,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED;;;;;;;OAOG;IACI,gBAAgB,CACnB,gBAAyB,EACzB,qBAA4C,EAC5C,aAAwD,EACxD,WAAiC,EACjC,qBAA2E;QAE3E,IAAI,IAAI,CAAC,qBAAqB,KAAK,gBAAgB,EAAE,CAAC;YAClD,OAAO;QACX,CAAC;QAED,IAAI,CAAC,qBAAqB,GAAG,gBAAgB,CAAC;QAC9C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,MAAM,WAAW,GAAG,qBAAqB,CAAC,uBAAuB,CAAC,WAAW,CAAC;QAE9E,IAAI,qBAAqB,EAAE,CAAC;YACxB,KAAK,MAAM,aAAa,IAAI,qBAAqB,EAAE,CAAC;gBAChD,MAAM,YAAY,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC;gBAC1D,IAAI,CAAC,YAAY,IAAI,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;oBAC7D,SAAS;gBACb,CAAC;gBAED,MAAM,MAAM,GAAG,YAAY,CAAC,eAA6C,CAAC;gBAE1E,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACpE,CAAC;QACL,CAAC;QAED,KAAK,MAAM,aAAa,IAAI,aAAa,EAAE,CAAC;YACxC,IAAI,qBAAqB,IAAI,aAAa,IAAI,qBAAqB,EAAE,CAAC;gBAClE,SAAS;YACb,CAAC;YAED,MAAM,YAAY,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;YAClD,IAAI,CAAC,YAAY,IAAI,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC7D,SAAS;YACb,CAAC;YAED,MAAM,MAAM,GAAG,YAAY,CAAC,eAA6C,CAAC;YAE1E,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,WAAgC,IAAI,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACxH,CAAC;IACL,CAAC;IAEM,OAAO;QACV,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC3D,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;YACpC,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;QACvC,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,SAAgB,CAAC;QAChC,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;IACrC,CAAC;IAED,gBAAgB;IACT,0BAA0B;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,4BAA4B,CAAC;QAClD,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO;QACX,CAAC;QACD,8EAA8E;QAC9E,gEAAgE;QAChE,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,EAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,4BAA4B,GAAG,SAAS,CAAC;IAClD,CAAC;;AAvPc,0BAAQ,GAAG,CAAC,AAAJ,CAAK","sourcesContent":["import { type VertexBuffer } from \"../../Buffers/buffer\";\r\nimport { type DataBuffer } from \"../../Buffers/dataBuffer\";\r\nimport { type WebGPUDataBuffer } from \"../../Meshes/WebGPU/webgpuDataBuffer\";\r\nimport { type Nullable } from \"../../types\";\r\nimport { type IDrawContext } from \"../IDrawContext\";\r\nimport { type WebGPUBufferManager } from \"./webgpuBufferManager\";\r\nimport { type WebGPUPipelineContext } from \"./webgpuPipelineContext\";\r\nimport { type UniformBuffer } from \"../../Materials/uniformBuffer\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\n\r\n/**\r\n * WebGPU implementation of the IDrawContext interface.\r\n * This class manages the draw context for WebGPU, including buffers and indirect draw data.\r\n */\r\nexport class WebGPUDrawContext implements IDrawContext {\r\n private static _Counter = 0;\r\n\r\n /**\r\n * Bundle used in fast mode (when compatibilityMode==false)\r\n */\r\n public fastBundle?: GPURenderBundle;\r\n /**\r\n * Cache of the bind groups. Will be reused for the next draw if isDirty==false (and materialContext.isDirty==false)\r\n */\r\n public bindGroups?: GPUBindGroup[];\r\n\r\n public uniqueId: number;\r\n\r\n /**\r\n * @internal\r\n * By default, indirect draws are enabled in NON compatibility mode only\r\n * To enable indirect draws in compatibility mode (done by the end user), enableIndirectDraw must be set to true\r\n */\r\n public _enableIndirectDrawInCompatMode = false;\r\n\r\n /**\r\n * Buffers (uniform / storage) used for the draw call\r\n */\r\n public buffers: { [name: string]: Nullable<WebGPUDataBuffer> };\r\n\r\n public indirectDrawBuffer?: GPUBuffer;\r\n\r\n private _materialContextUpdateId: number;\r\n private _bufferManager: WebGPUBufferManager;\r\n private _useInstancing: boolean;\r\n private _indirectDrawData?: Uint32Array;\r\n private _currentInstanceCount: number;\r\n private _isDirty: boolean;\r\n private _enableIndirectDraw: boolean;\r\n private _vertexPullingEnabled: boolean;\r\n\r\n /**\r\n * Uniform buffers in which this context owns a slot. Filled by the buffers themselves.\r\n * @internal\r\n */\r\n public _uniformBuffersWithOwnedSlot?: UniformBuffer[];\r\n\r\n /**\r\n * Checks if the draw context is dirty.\r\n * @param materialContextUpdateId The update ID of the material context associated with the draw context.\r\n * @returns True if the draw or material context is dirty, false otherwise.\r\n */\r\n public isDirty(materialContextUpdateId: number): boolean {\r\n return this._isDirty || this._materialContextUpdateId !== materialContextUpdateId;\r\n }\r\n\r\n /**\r\n * Resets the dirty state of the draw context.\r\n * @param materialContextUpdateId The update ID of the material context associated with the draw context.\r\n */\r\n public resetIsDirty(materialContextUpdateId: number): void {\r\n this._isDirty = false;\r\n this._materialContextUpdateId = materialContextUpdateId;\r\n }\r\n\r\n public get enableIndirectDraw() {\r\n return this._enableIndirectDraw;\r\n }\r\n\r\n public set enableIndirectDraw(enable: boolean) {\r\n this._enableIndirectDrawInCompatMode = true;\r\n\r\n if (this._enableIndirectDraw === enable) {\r\n return;\r\n }\r\n\r\n this._enableIndirectDraw = enable;\r\n\r\n if (!enable && !this._useInstancing && this.indirectDrawBuffer) {\r\n this._bufferManager.releaseBuffer(this.indirectDrawBuffer);\r\n this.indirectDrawBuffer = undefined;\r\n this._indirectDrawData = undefined;\r\n } else if (enable && !this.indirectDrawBuffer) {\r\n this.indirectDrawBuffer = this._bufferManager.createRawBuffer(\r\n 20,\r\n WebGPUConstants.BufferUsage.CopyDst | WebGPUConstants.BufferUsage.Indirect | WebGPUConstants.BufferUsage.Storage,\r\n undefined,\r\n \"IndirectDrawBuffer\"\r\n );\r\n this._indirectDrawData = new Uint32Array(5);\r\n this._indirectDrawData[3] = 0;\r\n this._indirectDrawData[4] = 0;\r\n }\r\n }\r\n\r\n public get useInstancing() {\r\n return this._useInstancing;\r\n }\r\n\r\n public set useInstancing(use: boolean) {\r\n if (this._useInstancing === use) {\r\n return;\r\n }\r\n\r\n this._useInstancing = use;\r\n this._currentInstanceCount = -1;\r\n\r\n const enableIndirectDrawInCompatMode = this._enableIndirectDrawInCompatMode;\r\n\r\n this.enableIndirectDraw = use;\r\n\r\n this._enableIndirectDrawInCompatMode = enableIndirectDrawInCompatMode;\r\n }\r\n\r\n /**\r\n * Creates a new WebGPUDrawContext.\r\n * @param bufferManager The buffer manager used to manage WebGPU buffers.\r\n * @param _dummyIndexBuffer A dummy index buffer to be bound as the \"indices\"\r\n * storage buffer when no index buffer is provided.\r\n */\r\n constructor(\r\n bufferManager: WebGPUBufferManager,\r\n private _dummyIndexBuffer: WebGPUDataBuffer\r\n ) {\r\n this._bufferManager = bufferManager;\r\n this.uniqueId = WebGPUDrawContext._Counter++;\r\n this._useInstancing = false;\r\n this._currentInstanceCount = 0;\r\n this._enableIndirectDraw = false;\r\n this._vertexPullingEnabled = false;\r\n this.reset();\r\n }\r\n\r\n public reset(): void {\r\n this._releaseUniformBufferSlots();\r\n this.buffers = {};\r\n this._isDirty = true;\r\n this._materialContextUpdateId = 0;\r\n this.fastBundle = undefined;\r\n this.bindGroups = undefined;\r\n this._vertexPullingEnabled = false;\r\n }\r\n\r\n /**\r\n * Associates a buffer to the draw context.\r\n * @param name The name of the buffer.\r\n * @param buffer The buffer to set.\r\n */\r\n public setBuffer(name: string, buffer: Nullable<WebGPUDataBuffer>): void {\r\n this._isDirty ||= buffer?.uniqueId !== this.buffers[name]?.uniqueId;\r\n\r\n this.buffers[name] = buffer;\r\n }\r\n\r\n public setIndirectData(indexOrVertexCount: number, instanceCount: number, firstIndexOrVertex: number, forceUpdate = false): void {\r\n if ((!forceUpdate && instanceCount === this._currentInstanceCount) || !this.indirectDrawBuffer || !this._indirectDrawData) {\r\n // The current buffer is already up to date so do nothing\r\n // Note that we only check for instanceCount and not indexOrVertexCount nor firstIndexOrVertex because those values\r\n // are supposed to not change during the lifetime of a draw context\r\n return;\r\n }\r\n this._currentInstanceCount = instanceCount;\r\n\r\n this._indirectDrawData[0] = indexOrVertexCount;\r\n this._indirectDrawData[1] = instanceCount;\r\n this._indirectDrawData[2] = firstIndexOrVertex;\r\n\r\n this._bufferManager.setRawData(this.indirectDrawBuffer, 0, this._indirectDrawData, 0, 20);\r\n }\r\n\r\n /**\r\n * Setup or disable vertex pulling as needed.\r\n * @param useVertexPulling Use vertex pulling or not\r\n * @param webgpuPipelineContext The WebGPU pipeline context\r\n * @param vertexBuffers The current vertex buffers\r\n * @param indexBuffer The current index buffer\r\n * @param overrideVertexBuffers The vertex buffers to override\r\n */\r\n public setVertexPulling(\r\n useVertexPulling: boolean,\r\n webgpuPipelineContext: WebGPUPipelineContext,\r\n vertexBuffers: { [key: string]: Nullable<VertexBuffer> },\r\n indexBuffer: Nullable<DataBuffer>,\r\n overrideVertexBuffers: Nullable<{ [kind: string]: Nullable<VertexBuffer> }>\r\n ): void {\r\n if (this._vertexPullingEnabled === useVertexPulling) {\r\n return;\r\n }\r\n\r\n this._vertexPullingEnabled = useVertexPulling;\r\n this._isDirty = true;\r\n\r\n const bufferNames = webgpuPipelineContext.shaderProcessingContext.bufferNames;\r\n\r\n if (overrideVertexBuffers) {\r\n for (const attributeName in overrideVertexBuffers) {\r\n const vertexBuffer = overrideVertexBuffers[attributeName];\r\n if (!vertexBuffer || bufferNames.indexOf(attributeName) === -1) {\r\n continue;\r\n }\r\n\r\n const buffer = vertexBuffer.effectiveBuffer as Nullable<WebGPUDataBuffer>;\r\n\r\n this.setBuffer(attributeName, useVertexPulling ? buffer : null);\r\n }\r\n }\r\n\r\n for (const attributeName in vertexBuffers) {\r\n if (overrideVertexBuffers && attributeName in overrideVertexBuffers) {\r\n continue;\r\n }\r\n\r\n const vertexBuffer = vertexBuffers[attributeName];\r\n if (!vertexBuffer || bufferNames.indexOf(attributeName) === -1) {\r\n continue;\r\n }\r\n\r\n const buffer = vertexBuffer.effectiveBuffer as Nullable<WebGPUDataBuffer>;\r\n\r\n this.setBuffer(attributeName, useVertexPulling ? buffer : null);\r\n }\r\n\r\n if (bufferNames.indexOf(\"indices\") !== -1) {\r\n this.setBuffer(\"indices\", !useVertexPulling ? null : ((indexBuffer as WebGPUDataBuffer) ?? this._dummyIndexBuffer));\r\n }\r\n }\r\n\r\n public dispose(): void {\r\n this._releaseUniformBufferSlots();\r\n if (this.indirectDrawBuffer) {\r\n this._bufferManager.releaseBuffer(this.indirectDrawBuffer);\r\n this.indirectDrawBuffer = undefined;\r\n this._indirectDrawData = undefined;\r\n }\r\n this.fastBundle = undefined;\r\n this.bindGroups = undefined;\r\n this.buffers = undefined as any;\r\n this._enableIndirectDraw = false;\r\n }\r\n\r\n /** @internal */\r\n public _releaseUniformBufferSlots(): void {\r\n const buffers = this._uniformBuffersWithOwnedSlot;\r\n if (!buffers) {\r\n return;\r\n }\r\n // _releaseOwnerSlot removes its reciprocal entry; pop first to avoid skipping\r\n // entries when several buffers were registered on this context.\r\n while (buffers.length) {\r\n buffers.pop()!._releaseOwnerSlot(this);\r\n }\r\n this._uniformBuffersWithOwnedSlot = undefined;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"webgpuDrawContext.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuDrawContext.ts"],"names":[],"mappings":"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","sourcesContent":["import { type VertexBuffer } from \"../../Buffers/buffer\";\r\nimport { type DataBuffer } from \"../../Buffers/dataBuffer\";\r\nimport { type WebGPUDataBuffer } from \"../../Meshes/WebGPU/webgpuDataBuffer\";\r\nimport { type Nullable } from \"../../types\";\r\nimport { type IDrawContext } from \"../IDrawContext\";\r\nimport { type WebGPUBufferManager } from \"./webgpuBufferManager\";\r\nimport { type WebGPUPipelineContext } from \"./webgpuPipelineContext\";\r\nimport { type UniformBuffer } from \"../../Materials/uniformBuffer\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\n\r\n/**\r\n * WebGPU implementation of the IDrawContext interface.\r\n * This class manages the draw context for WebGPU, including buffers and indirect draw data.\r\n */\r\nexport class WebGPUDrawContext implements IDrawContext {\r\n private static _Counter = 0;\r\n\r\n /**\r\n * Bundle used in fast mode (when compatibilityMode==false)\r\n */\r\n public fastBundle?: GPURenderBundle;\r\n /**\r\n * Cache of the bind groups. Will be reused for the next draw if isDirty==false (and materialContext.isDirty==false)\r\n */\r\n public bindGroups?: GPUBindGroup[];\r\n\r\n public uniqueId: number;\r\n\r\n /**\r\n * @internal\r\n * By default, indirect draws are enabled in NON compatibility mode only\r\n * To enable indirect draws in compatibility mode (done by the end user), enableIndirectDraw must be set to true\r\n */\r\n public _enableIndirectDrawInCompatMode = false;\r\n\r\n /**\r\n * Buffers (uniform / storage) used for the draw call\r\n */\r\n public buffers: { [name: string]: Nullable<WebGPUDataBuffer> };\r\n\r\n public indirectDrawBuffer?: GPUBuffer;\r\n\r\n private _materialContextUpdateId: number;\r\n private _bufferManager: WebGPUBufferManager;\r\n private _useInstancing: boolean;\r\n private _indirectDrawData?: Uint32Array;\r\n private _currentInstanceCount: number;\r\n private _isDirty: boolean;\r\n private _enableIndirectDraw: boolean;\r\n private _vertexPullingEnabled: boolean;\r\n\r\n /**\r\n * Uniform buffers in which this context owns a slot. Filled by the buffers themselves.\r\n * @internal\r\n */\r\n public _uniformBuffersWithOwnedSlot?: UniformBuffer[];\r\n\r\n /**\r\n * Checks if the draw context is dirty.\r\n * @param materialContextUpdateId The update ID of the material context associated with the draw context.\r\n * @returns True if the draw or material context is dirty, false otherwise.\r\n */\r\n public isDirty(materialContextUpdateId: number): boolean {\r\n return this._isDirty || this._materialContextUpdateId !== materialContextUpdateId;\r\n }\r\n\r\n /**\r\n * Resets the dirty state of the draw context.\r\n * @param materialContextUpdateId The update ID of the material context associated with the draw context.\r\n */\r\n public resetIsDirty(materialContextUpdateId: number): void {\r\n this._isDirty = false;\r\n this._materialContextUpdateId = materialContextUpdateId;\r\n }\r\n\r\n public get enableIndirectDraw() {\r\n return this._enableIndirectDraw;\r\n }\r\n\r\n public set enableIndirectDraw(enable: boolean) {\r\n this._enableIndirectDrawInCompatMode = true;\r\n\r\n if (this._enableIndirectDraw === enable) {\r\n return;\r\n }\r\n\r\n this._enableIndirectDraw = enable;\r\n\r\n if (!enable && !this._useInstancing && this.indirectDrawBuffer) {\r\n this._bufferManager.releaseBuffer(this.indirectDrawBuffer);\r\n this.indirectDrawBuffer = undefined;\r\n this._indirectDrawData = undefined;\r\n } else if (enable && !this.indirectDrawBuffer) {\r\n this.indirectDrawBuffer = this._bufferManager.createRawBuffer(\r\n 20,\r\n WebGPUConstants.BufferUsage.CopyDst | WebGPUConstants.BufferUsage.Indirect | WebGPUConstants.BufferUsage.Storage,\r\n undefined,\r\n \"IndirectDrawBuffer\"\r\n );\r\n this._indirectDrawData = new Uint32Array(5);\r\n this._indirectDrawData[3] = 0;\r\n this._indirectDrawData[4] = 0;\r\n }\r\n }\r\n\r\n public get useInstancing() {\r\n return this._useInstancing;\r\n }\r\n\r\n public set useInstancing(use: boolean) {\r\n if (this._useInstancing === use) {\r\n return;\r\n }\r\n\r\n this._useInstancing = use;\r\n this._currentInstanceCount = -1;\r\n\r\n const enableIndirectDrawInCompatMode = this._enableIndirectDrawInCompatMode;\r\n\r\n this.enableIndirectDraw = use;\r\n\r\n this._enableIndirectDrawInCompatMode = enableIndirectDrawInCompatMode;\r\n }\r\n\r\n /**\r\n * Creates a new WebGPUDrawContext.\r\n * @param bufferManager The buffer manager used to manage WebGPU buffers.\r\n * @param _dummyIndexBuffer A dummy index buffer to be bound as the \"indices\"\r\n * storage buffer when no index buffer is provided.\r\n */\r\n constructor(\r\n bufferManager: WebGPUBufferManager,\r\n private _dummyIndexBuffer: WebGPUDataBuffer\r\n ) {\r\n this._bufferManager = bufferManager;\r\n this.uniqueId = WebGPUDrawContext._Counter++;\r\n this._useInstancing = false;\r\n this._currentInstanceCount = 0;\r\n this._enableIndirectDraw = false;\r\n this._vertexPullingEnabled = false;\r\n this.reset();\r\n }\r\n\r\n public reset(): void {\r\n this._releaseUniformBufferSlots();\r\n this.buffers = {};\r\n this._isDirty = true;\r\n this._materialContextUpdateId = 0;\r\n this.fastBundle = undefined;\r\n this.bindGroups = undefined;\r\n this._vertexPullingEnabled = false;\r\n }\r\n\r\n /** Invalidates cached vertex bindings without releasing draw resources. @internal */\r\n public _invalidateVertexBuffers(): void {\r\n this.fastBundle = undefined;\r\n // Refresh storage-buffer bindings on the next vertex-pulling draw.\r\n this._vertexPullingEnabled = false;\r\n }\r\n\r\n /**\r\n * Associates a buffer to the draw context.\r\n * @param name The name of the buffer.\r\n * @param buffer The buffer to set.\r\n */\r\n public setBuffer(name: string, buffer: Nullable<WebGPUDataBuffer>): void {\r\n this._isDirty ||= buffer?.uniqueId !== this.buffers[name]?.uniqueId;\r\n\r\n this.buffers[name] = buffer;\r\n }\r\n\r\n public setIndirectData(indexOrVertexCount: number, instanceCount: number, firstIndexOrVertex: number, forceUpdate = false): void {\r\n if ((!forceUpdate && instanceCount === this._currentInstanceCount) || !this.indirectDrawBuffer || !this._indirectDrawData) {\r\n // The current buffer is already up to date so do nothing\r\n // Note that we only check for instanceCount and not indexOrVertexCount nor firstIndexOrVertex because those values\r\n // are supposed to not change during the lifetime of a draw context\r\n return;\r\n }\r\n this._currentInstanceCount = instanceCount;\r\n\r\n this._indirectDrawData[0] = indexOrVertexCount;\r\n this._indirectDrawData[1] = instanceCount;\r\n this._indirectDrawData[2] = firstIndexOrVertex;\r\n\r\n this._bufferManager.setRawData(this.indirectDrawBuffer, 0, this._indirectDrawData, 0, 20);\r\n }\r\n\r\n /**\r\n * Setup or disable vertex pulling as needed.\r\n * @param useVertexPulling Use vertex pulling or not\r\n * @param webgpuPipelineContext The WebGPU pipeline context\r\n * @param vertexBuffers The current vertex buffers\r\n * @param indexBuffer The current index buffer\r\n * @param overrideVertexBuffers The vertex buffers to override\r\n */\r\n public setVertexPulling(\r\n useVertexPulling: boolean,\r\n webgpuPipelineContext: WebGPUPipelineContext,\r\n vertexBuffers: { [key: string]: Nullable<VertexBuffer> },\r\n indexBuffer: Nullable<DataBuffer>,\r\n overrideVertexBuffers: Nullable<{ [kind: string]: Nullable<VertexBuffer> }>\r\n ): void {\r\n if (this._vertexPullingEnabled === useVertexPulling) {\r\n return;\r\n }\r\n\r\n this._vertexPullingEnabled = useVertexPulling;\r\n this._isDirty = true;\r\n\r\n const bufferNames = webgpuPipelineContext.shaderProcessingContext.bufferNames;\r\n\r\n if (overrideVertexBuffers) {\r\n for (const attributeName in overrideVertexBuffers) {\r\n const vertexBuffer = overrideVertexBuffers[attributeName];\r\n if (!vertexBuffer || bufferNames.indexOf(attributeName) === -1) {\r\n continue;\r\n }\r\n\r\n const buffer = vertexBuffer.effectiveBuffer as Nullable<WebGPUDataBuffer>;\r\n\r\n this.setBuffer(attributeName, useVertexPulling ? buffer : null);\r\n }\r\n }\r\n\r\n for (const attributeName in vertexBuffers) {\r\n if (overrideVertexBuffers && attributeName in overrideVertexBuffers) {\r\n continue;\r\n }\r\n\r\n const vertexBuffer = vertexBuffers[attributeName];\r\n if (!vertexBuffer || bufferNames.indexOf(attributeName) === -1) {\r\n continue;\r\n }\r\n\r\n const buffer = vertexBuffer.effectiveBuffer as Nullable<WebGPUDataBuffer>;\r\n\r\n this.setBuffer(attributeName, useVertexPulling ? buffer : null);\r\n }\r\n\r\n if (bufferNames.indexOf(\"indices\") !== -1) {\r\n this.setBuffer(\"indices\", !useVertexPulling ? null : ((indexBuffer as WebGPUDataBuffer) ?? this._dummyIndexBuffer));\r\n }\r\n }\r\n\r\n public dispose(): void {\r\n this._releaseUniformBufferSlots();\r\n if (this.indirectDrawBuffer) {\r\n this._bufferManager.releaseBuffer(this.indirectDrawBuffer);\r\n this.indirectDrawBuffer = undefined;\r\n this._indirectDrawData = undefined;\r\n }\r\n this.fastBundle = undefined;\r\n this.bindGroups = undefined;\r\n this.buffers = undefined as any;\r\n this._enableIndirectDraw = false;\r\n }\r\n\r\n /** @internal */\r\n public _releaseUniformBufferSlots(): void {\r\n const buffers = this._uniformBuffersWithOwnedSlot;\r\n if (!buffers) {\r\n return;\r\n }\r\n // _releaseOwnerSlot removes its reciprocal entry; pop first to avoid skipping\r\n // entries when several buffers were registered on this context.\r\n while (buffers.length) {\r\n buffers.pop()!._releaseOwnerSlot(this);\r\n }\r\n this._uniformBuffersWithOwnedSlot = undefined;\r\n }\r\n}\r\n"]}
|
|
@@ -14,8 +14,8 @@ export declare class WebGPUQuerySet {
|
|
|
14
14
|
get querySet(): GPUQuerySet;
|
|
15
15
|
constructor(engine: WebGPUEngine, count: number, type: QueryType, device: GPUDevice, bufferManager: WebGPUBufferManager, canUseMultipleBuffers?: boolean, label?: string);
|
|
16
16
|
private _getBuffer;
|
|
17
|
-
readValues(firstQuery?: number, queryCount?: number): Promise<BigUint64Array | null>;
|
|
18
|
-
readValue(firstQuery?: number): Promise<number | null>;
|
|
19
|
-
readTwoValuesAndSubtract(firstQuery?: number): Promise<number | null>;
|
|
17
|
+
readValues(firstQuery?: number, queryCount?: number, encoder?: GPUCommandEncoder): Promise<BigUint64Array | null>;
|
|
18
|
+
readValue(firstQuery?: number, encoder?: GPUCommandEncoder): Promise<number | null>;
|
|
19
|
+
readTwoValuesAndSubtract(firstQuery?: number, encoder?: GPUCommandEncoder): Promise<number | null>;
|
|
20
20
|
dispose(): void;
|
|
21
21
|
}
|
|
@@ -21,11 +21,11 @@ export class WebGPUQuerySet {
|
|
|
21
21
|
this._dstBuffers.push(this._bufferManager.createRawBuffer(8 * this._count, WebGPUConstants.BufferUsage.MapRead | WebGPUConstants.BufferUsage.CopyDst, undefined, "QueryBufferNoMultipleBuffers"));
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
|
-
_getBuffer(firstQuery, queryCount) {
|
|
24
|
+
_getBuffer(firstQuery, queryCount, encoder) {
|
|
25
25
|
if (!this._canUseMultipleBuffers && this._dstBuffers.length === 0) {
|
|
26
26
|
return null;
|
|
27
27
|
}
|
|
28
|
-
const encoderResult = this._device.createCommandEncoder();
|
|
28
|
+
const encoderResult = encoder ?? this._device.createCommandEncoder();
|
|
29
29
|
let buffer;
|
|
30
30
|
if (this._dstBuffers.length === 0) {
|
|
31
31
|
buffer = this._bufferManager.createRawBuffer(8 * this._count, WebGPUConstants.BufferUsage.MapRead | WebGPUConstants.BufferUsage.CopyDst, undefined, "QueryBufferAdditionalBuffer");
|
|
@@ -36,16 +36,22 @@ export class WebGPUQuerySet {
|
|
|
36
36
|
}
|
|
37
37
|
encoderResult.resolveQuerySet(this._querySet, firstQuery, queryCount, this._queryBuffer, 0);
|
|
38
38
|
encoderResult.copyBufferToBuffer(this._queryBuffer, 0, buffer, 0, 8 * queryCount);
|
|
39
|
-
|
|
39
|
+
if (!encoder) {
|
|
40
|
+
this._device.queue.submit([encoderResult.finish()]);
|
|
41
|
+
}
|
|
40
42
|
return buffer;
|
|
41
43
|
}
|
|
42
|
-
async readValues(firstQuery = 0, queryCount = 1) {
|
|
43
|
-
const buffer = this._getBuffer(firstQuery, queryCount);
|
|
44
|
+
async readValues(firstQuery = 0, queryCount = 1, encoder) {
|
|
45
|
+
const buffer = this._getBuffer(firstQuery, queryCount, encoder);
|
|
44
46
|
if (buffer === null) {
|
|
45
47
|
return null;
|
|
46
48
|
}
|
|
47
49
|
const engineId = this._engine.uniqueId;
|
|
48
50
|
try {
|
|
51
|
+
if (encoder) {
|
|
52
|
+
// resolved in that encoder after its queries: mapped once the engine submits it, a wait its readbacks share
|
|
53
|
+
await this._engine._whenSubmittedAsync();
|
|
54
|
+
}
|
|
49
55
|
await buffer.mapAsync(1 /* WebGPUConstants.MapMode.Read */);
|
|
50
56
|
const arrayBuf = new BigUint64Array(buffer.getMappedRange()).slice();
|
|
51
57
|
buffer.unmap();
|
|
@@ -60,13 +66,17 @@ export class WebGPUQuerySet {
|
|
|
60
66
|
throw err;
|
|
61
67
|
}
|
|
62
68
|
}
|
|
63
|
-
async readValue(firstQuery = 0) {
|
|
64
|
-
const buffer = this._getBuffer(firstQuery, 1);
|
|
69
|
+
async readValue(firstQuery = 0, encoder) {
|
|
70
|
+
const buffer = this._getBuffer(firstQuery, 1, encoder);
|
|
65
71
|
if (buffer === null) {
|
|
66
72
|
return null;
|
|
67
73
|
}
|
|
68
74
|
const engineId = this._engine.uniqueId;
|
|
69
75
|
try {
|
|
76
|
+
if (encoder) {
|
|
77
|
+
// resolved in that encoder after its queries: mapped once the engine submits it, a wait its readbacks share
|
|
78
|
+
await this._engine._whenSubmittedAsync();
|
|
79
|
+
}
|
|
70
80
|
await buffer.mapAsync(1 /* WebGPUConstants.MapMode.Read */);
|
|
71
81
|
const arrayBuf = new BigUint64Array(buffer.getMappedRange());
|
|
72
82
|
const value = Number(arrayBuf[0]);
|
|
@@ -82,13 +92,17 @@ export class WebGPUQuerySet {
|
|
|
82
92
|
throw err;
|
|
83
93
|
}
|
|
84
94
|
}
|
|
85
|
-
async readTwoValuesAndSubtract(firstQuery = 0) {
|
|
86
|
-
const buffer = this._getBuffer(firstQuery, 2);
|
|
95
|
+
async readTwoValuesAndSubtract(firstQuery = 0, encoder) {
|
|
96
|
+
const buffer = this._getBuffer(firstQuery, 2, encoder);
|
|
87
97
|
if (buffer === null) {
|
|
88
98
|
return null;
|
|
89
99
|
}
|
|
90
100
|
const engineId = this._engine.uniqueId;
|
|
91
101
|
try {
|
|
102
|
+
if (encoder) {
|
|
103
|
+
// resolved in that encoder after its queries: mapped once the engine submits it, a wait its readbacks share
|
|
104
|
+
await this._engine._whenSubmittedAsync();
|
|
105
|
+
}
|
|
92
106
|
await buffer.mapAsync(1 /* WebGPUConstants.MapMode.Read */);
|
|
93
107
|
const arrayBuf = new BigUint64Array(buffer.getMappedRange());
|
|
94
108
|
const value = Number(arrayBuf[1] - arrayBuf[0]);
|