@babylonjs/core 6.41.0 → 6.41.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Animations/animatable.js +1 -2
- package/Animations/animatable.js.map +1 -1
- package/Animations/animation.js +4 -6
- package/Animations/animation.js.map +1 -1
- package/Animations/animationGroup.js +3 -3
- package/Animations/animationGroup.js.map +1 -1
- package/Animations/runtimeAnimation.js +1 -1
- package/Animations/runtimeAnimation.js.map +1 -1
- package/Audio/audioEngine.js +3 -5
- package/Audio/audioEngine.js.map +1 -1
- package/Audio/audioSceneComponent.js +1 -2
- package/Audio/audioSceneComponent.js.map +1 -1
- package/Audio/sound.js +48 -74
- package/Audio/sound.js.map +1 -1
- package/Audio/soundTrack.js +6 -12
- package/Audio/soundTrack.js.map +1 -1
- package/BakedVertexAnimation/bakedVertexAnimationManager.js +1 -2
- package/BakedVertexAnimation/bakedVertexAnimationManager.js.map +1 -1
- package/Behaviors/Cameras/autoRotationBehavior.js +1 -1
- package/Behaviors/Cameras/autoRotationBehavior.js.map +1 -1
- package/Behaviors/Meshes/fadeInOutBehavior.js +2 -4
- package/Behaviors/Meshes/fadeInOutBehavior.js.map +1 -1
- package/Behaviors/Meshes/followBehavior.js +1 -2
- package/Behaviors/Meshes/followBehavior.js.map +1 -1
- package/Behaviors/Meshes/handConstraintBehavior.js +2 -2
- package/Behaviors/Meshes/handConstraintBehavior.js.map +1 -1
- package/Bones/bone.js +4 -6
- package/Bones/bone.js.map +1 -1
- package/Bones/skeleton.js +2 -3
- package/Bones/skeleton.js.map +1 -1
- package/Buffers/buffer.align.js +5 -8
- package/Buffers/buffer.align.js.map +1 -1
- package/Buffers/buffer.js +6 -8
- package/Buffers/buffer.js.map +1 -1
- package/Cameras/Inputs/BaseCameraPointersInput.js +3 -4
- package/Cameras/Inputs/BaseCameraPointersInput.js.map +1 -1
- package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js +3 -5
- package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js.map +1 -1
- package/Cameras/Inputs/flyCameraMouseInput.js +2 -2
- package/Cameras/Inputs/flyCameraMouseInput.js.map +1 -1
- package/Cameras/Inputs/freeCameraMouseInput.js +2 -2
- package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
- package/Cameras/arcRotateCamera.js +1 -2
- package/Cameras/arcRotateCamera.js.map +1 -1
- package/Cameras/camera.d.ts +5 -0
- package/Cameras/camera.js +18 -11
- package/Cameras/camera.js.map +1 -1
- package/Collisions/pickingInfo.js +1 -1
- package/Collisions/pickingInfo.js.map +1 -1
- package/Compute/computeEffect.js +5 -8
- package/Compute/computeEffect.js.map +1 -1
- package/Compute/computeShader.js +12 -9
- package/Compute/computeShader.js.map +1 -1
- package/Culling/Octrees/octreeSceneComponent.js +1 -2
- package/Culling/Octrees/octreeSceneComponent.js.map +1 -1
- package/Culling/boundingBox.js +2 -3
- package/Culling/boundingBox.js.map +1 -1
- package/Culling/ray.d.ts +6 -1
- package/Culling/ray.js +9 -4
- package/Culling/ray.js.map +1 -1
- package/Debug/debugLayer.js +4 -1
- package/Debug/debugLayer.js.map +1 -1
- package/Debug/directionalLightFrustumViewer.js +7 -9
- package/Debug/directionalLightFrustumViewer.js.map +1 -1
- package/Debug/physicsViewer.js +5 -7
- package/Debug/physicsViewer.js.map +1 -1
- package/Debug/rayHelper.js +1 -2
- package/Debug/rayHelper.js.map +1 -1
- package/Debug/skeletonViewer.js +26 -31
- package/Debug/skeletonViewer.js.map +1 -1
- package/Decorators/nodeDecorator.js +1 -1
- package/Decorators/nodeDecorator.js.map +1 -1
- package/DeviceInput/InputDevices/deviceSourceManager.js +3 -5
- package/DeviceInput/InputDevices/deviceSourceManager.js.map +1 -1
- package/DeviceInput/eventFactory.js +1 -1
- package/DeviceInput/eventFactory.js.map +1 -1
- package/DeviceInput/internalDeviceSourceManager.js +1 -2
- package/DeviceInput/internalDeviceSourceManager.js.map +1 -1
- package/DeviceInput/webDeviceInputSystem.js +9 -12
- package/DeviceInput/webDeviceInputSystem.js.map +1 -1
- package/Engines/Extensions/engine.cubeTexture.js +6 -1
- package/Engines/Extensions/engine.cubeTexture.js.map +1 -1
- package/Engines/Extensions/engine.multiRender.js +3 -4
- package/Engines/Extensions/engine.multiRender.js.map +1 -1
- package/Engines/Extensions/engine.rawTexture.js +4 -4
- package/Engines/Extensions/engine.rawTexture.js.map +1 -1
- package/Engines/Extensions/engine.readTexture.js +2 -3
- package/Engines/Extensions/engine.readTexture.js.map +1 -1
- package/Engines/Extensions/engine.renderTarget.js +9 -5
- package/Engines/Extensions/engine.renderTarget.js.map +1 -1
- package/Engines/Extensions/engine.renderTargetCube.js +9 -1
- package/Engines/Extensions/engine.renderTargetCube.js.map +1 -1
- package/Engines/Extensions/engine.views.js +1 -2
- package/Engines/Extensions/engine.views.js.map +1 -1
- package/Engines/Processors/shaderCodeNode.js +6 -7
- package/Engines/Processors/shaderCodeNode.js.map +1 -1
- package/Engines/Processors/shaderProcessor.js +6 -11
- package/Engines/Processors/shaderProcessor.js.map +1 -1
- package/Engines/WebGL/webGLHardwareTexture.js +1 -2
- package/Engines/WebGL/webGLHardwareTexture.js.map +1 -1
- package/Engines/WebGL/webGLRenderTargetWrapper.js +3 -5
- package/Engines/WebGL/webGLRenderTargetWrapper.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.cubeTexture.js +9 -2
- package/Engines/WebGPU/Extensions/engine.cubeTexture.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.dynamicTexture.js +1 -2
- package/Engines/WebGPU/Extensions/engine.dynamicTexture.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.multiRender.js +5 -6
- package/Engines/WebGPU/Extensions/engine.multiRender.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.query.js +2 -4
- package/Engines/WebGPU/Extensions/engine.query.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.rawTexture.js +4 -4
- package/Engines/WebGPU/Extensions/engine.rawTexture.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.renderTarget.js +11 -5
- package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.renderTargetCube.js +11 -3
- package/Engines/WebGPU/Extensions/engine.renderTargetCube.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.storageBuffer.js +2 -3
- package/Engines/WebGPU/Extensions/engine.storageBuffer.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.textureSampler.js +1 -2
- package/Engines/WebGPU/Extensions/engine.textureSampler.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.videoTexture.js +1 -2
- package/Engines/WebGPU/Extensions/engine.videoTexture.js.map +1 -1
- package/Engines/WebGPU/webgpuBufferManager.js +1 -1
- package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheBindGroups.js +6 -7
- package/Engines/WebGPU/webgpuCacheBindGroups.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheRenderPipeline.js +15 -20
- package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheSampler.js +10 -5
- package/Engines/WebGPU/webgpuCacheSampler.js.map +1 -1
- package/Engines/WebGPU/webgpuClearQuad.js +2 -3
- package/Engines/WebGPU/webgpuClearQuad.js.map +1 -1
- package/Engines/WebGPU/webgpuComputePipelineContext.js +1 -2
- package/Engines/WebGPU/webgpuComputePipelineContext.js.map +1 -1
- package/Engines/WebGPU/webgpuDepthCullingState.js +2 -2
- package/Engines/WebGPU/webgpuDepthCullingState.js.map +1 -1
- package/Engines/WebGPU/webgpuDrawContext.js +1 -2
- package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
- package/Engines/WebGPU/webgpuHardwareTexture.js +4 -6
- package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
- package/Engines/WebGPU/webgpuMaterialContext.js +2 -3
- package/Engines/WebGPU/webgpuMaterialContext.js.map +1 -1
- package/Engines/WebGPU/webgpuOcclusionQuery.js +3 -5
- package/Engines/WebGPU/webgpuOcclusionQuery.js.map +1 -1
- package/Engines/WebGPU/webgpuPipelineContext.js +2 -4
- package/Engines/WebGPU/webgpuPipelineContext.js.map +1 -1
- package/Engines/WebGPU/webgpuQuerySet.js +1 -1
- package/Engines/WebGPU/webgpuQuerySet.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessingContext.js +2 -4
- package/Engines/WebGPU/webgpuShaderProcessingContext.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js +2 -4
- package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +5 -4
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
- package/Engines/WebGPU/webgpuStencilStateComposer.js +1 -2
- package/Engines/WebGPU/webgpuStencilStateComposer.js.map +1 -1
- package/Engines/WebGPU/webgpuTextureManager.js +40 -43
- package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
- package/Engines/WebGPU/webgpuTimestampQuery.js +12 -7
- package/Engines/WebGPU/webgpuTimestampQuery.js.map +1 -1
- package/Engines/WebGPU/webgpuTintWASM.js +4 -1
- package/Engines/WebGPU/webgpuTintWASM.js.map +1 -1
- package/Engines/engine.js +4 -7
- package/Engines/engine.js.map +1 -1
- package/Engines/nativeEngine.js +16 -22
- package/Engines/nativeEngine.js.map +1 -1
- package/Engines/nullEngine.js +9 -1
- package/Engines/nullEngine.js.map +1 -1
- package/Engines/renderTargetWrapper.js +11 -16
- package/Engines/renderTargetWrapper.js.map +1 -1
- package/Engines/thinEngine.js +32 -44
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/webgpuEngine.js +77 -95
- package/Engines/webgpuEngine.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.js +2 -3
- package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.js +3 -6
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCounterBlock.js +1 -2
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCounterBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphMultiGateBlock.js +1 -2
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphMultiGateBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphWhileLoopBlock.js +2 -4
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphWhileLoopBlock.js.map +1 -1
- package/FlowGraph/flowGraph.js +1 -2
- package/FlowGraph/flowGraph.js.map +1 -1
- package/FlowGraph/flowGraphBlock.js +2 -4
- package/FlowGraph/flowGraphBlock.js.map +1 -1
- package/FlowGraph/flowGraphContext.js +1 -2
- package/FlowGraph/flowGraphContext.js.map +1 -1
- package/FlowGraph/flowGraphCoordinator.js +4 -7
- package/FlowGraph/flowGraphCoordinator.js.map +1 -1
- package/FlowGraph/flowGraphSignalConnection.js +1 -2
- package/FlowGraph/flowGraphSignalConnection.js.map +1 -1
- package/FlowGraph/serialization.js +2 -3
- package/FlowGraph/serialization.js.map +1 -1
- package/Gamepads/gamepadManager.js +1 -1
- package/Gamepads/gamepadManager.js.map +1 -1
- package/Gizmos/axisDragGizmo.js +2 -4
- package/Gizmos/axisDragGizmo.js.map +1 -1
- package/Gizmos/axisScaleGizmo.js +5 -8
- package/Gizmos/axisScaleGizmo.js.map +1 -1
- package/Gizmos/boundingBoxGizmo.js +1 -1
- package/Gizmos/boundingBoxGizmo.js.map +1 -1
- package/Gizmos/cameraGizmo.js +2 -3
- package/Gizmos/cameraGizmo.js.map +1 -1
- package/Gizmos/gizmo.js +4 -7
- package/Gizmos/gizmo.js.map +1 -1
- package/Gizmos/gizmoManager.js +3 -4
- package/Gizmos/gizmoManager.js.map +1 -1
- package/Gizmos/planeDragGizmo.js +2 -4
- package/Gizmos/planeDragGizmo.js.map +1 -1
- package/Gizmos/planeRotationGizmo.js +2 -4
- package/Gizmos/planeRotationGizmo.js.map +1 -1
- package/Helpers/environmentHelper.js +8 -2
- package/Helpers/environmentHelper.js.map +1 -1
- package/Helpers/videoDome.js +1 -2
- package/Helpers/videoDome.js.map +1 -1
- package/Inputs/scene.inputManager.js +8 -10
- package/Inputs/scene.inputManager.js.map +1 -1
- package/Layers/effectLayer.js +16 -10
- package/Layers/effectLayer.js.map +1 -1
- package/Layers/glowLayer.js +16 -6
- package/Layers/glowLayer.js.map +1 -1
- package/Layers/highlightLayer.js +12 -3
- package/Layers/highlightLayer.js.map +1 -1
- package/Layers/layer.js +1 -2
- package/Layers/layer.js.map +1 -1
- package/LensFlares/lensFlareSystem.js +1 -2
- package/LensFlares/lensFlareSystem.js.map +1 -1
- package/Lights/Shadows/cascadedShadowGenerator.js +21 -25
- package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
- package/Lights/Shadows/shadowGenerator.js +18 -21
- package/Lights/Shadows/shadowGenerator.js.map +1 -1
- package/Lights/light.js +2 -4
- package/Lights/light.js.map +1 -1
- package/Lights/shadowLight.js +1 -1
- package/Lights/shadowLight.js.map +1 -1
- package/Loading/Plugins/babylonFileLoader.js +1 -2
- package/Loading/Plugins/babylonFileLoader.js.map +1 -1
- package/Loading/sceneLoader.js +1 -1
- package/Loading/sceneLoader.js.map +1 -1
- package/Materials/GreasedLine/greasedLinePluginMaterial.js +26 -32
- package/Materials/GreasedLine/greasedLinePluginMaterial.js.map +1 -1
- package/Materials/GreasedLine/greasedLineSimpleMaterial.js +22 -27
- package/Materials/GreasedLine/greasedLineSimpleMaterial.js.map +1 -1
- package/Materials/Node/Blocks/Dual/clipPlanesBlock.js +6 -7
- package/Materials/Node/Blocks/Dual/clipPlanesBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/imageSourceBlock.js +1 -2
- package/Materials/Node/Blocks/Dual/imageSourceBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js +1 -2
- package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/sceneDepthBlock.js +1 -1
- package/Materials/Node/Blocks/Dual/sceneDepthBlock.js.map +1 -1
- package/Materials/Node/Blocks/Dual/textureBlock.js +10 -16
- package/Materials/Node/Blocks/Dual/textureBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/TBNBlock.js +2 -3
- package/Materials/Node/Blocks/Fragment/TBNBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +1 -2
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js +2 -4
- package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js.map +1 -1
- package/Materials/Node/Blocks/Input/inputBlock.js +1 -2
- package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/clearCoatBlock.js +24 -26
- package/Materials/Node/Blocks/PBR/clearCoatBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/iridescenceBlock.js +3 -3
- package/Materials/Node/Blocks/PBR/iridescenceBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +45 -49
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/reflectionBlock.js +1 -2
- package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/refractionBlock.js +1 -2
- package/Materials/Node/Blocks/PBR/refractionBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/sheenBlock.js +13 -13
- package/Materials/Node/Blocks/PBR/sheenBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/subSurfaceBlock.js +27 -28
- package/Materials/Node/Blocks/PBR/subSurfaceBlock.js.map +1 -1
- package/Materials/Node/Blocks/Teleport/teleportOutBlock.js +1 -2
- package/Materials/Node/Blocks/Teleport/teleportOutBlock.js.map +1 -1
- package/Materials/Node/Blocks/Vertex/instancesBlock.js +2 -2
- package/Materials/Node/Blocks/Vertex/instancesBlock.js.map +1 -1
- package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js +43 -33
- package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js.map +1 -1
- package/Materials/Node/Blocks/biPlanarBlock.js +1 -2
- package/Materials/Node/Blocks/biPlanarBlock.js.map +1 -1
- package/Materials/Node/Blocks/cloudBlock.js +2 -3
- package/Materials/Node/Blocks/cloudBlock.js.map +1 -1
- package/Materials/Node/Blocks/colorMergerBlock.js +4 -5
- package/Materials/Node/Blocks/colorMergerBlock.js.map +1 -1
- package/Materials/Node/Blocks/customBlock.js +4 -6
- package/Materials/Node/Blocks/customBlock.js.map +1 -1
- package/Materials/Node/Blocks/meshAttributeExistsBlock.js +2 -4
- package/Materials/Node/Blocks/meshAttributeExistsBlock.js.map +1 -1
- package/Materials/Node/Blocks/triPlanarBlock.js +14 -23
- package/Materials/Node/Blocks/triPlanarBlock.js.map +1 -1
- package/Materials/Node/Blocks/vectorMergerBlock.js +4 -5
- package/Materials/Node/Blocks/vectorMergerBlock.js.map +1 -1
- package/Materials/Node/nodeMaterial.js +16 -11
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/Node/nodeMaterialBlock.js +3 -4
- package/Materials/Node/nodeMaterialBlock.js.map +1 -1
- package/Materials/Node/nodeMaterialBuildState.js +1 -1
- package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.js +25 -28
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/PBR/pbrClearCoatConfiguration.js +6 -9
- package/Materials/PBR/pbrClearCoatConfiguration.js.map +1 -1
- package/Materials/PBR/pbrIridescenceConfiguration.js +4 -7
- package/Materials/PBR/pbrIridescenceConfiguration.js.map +1 -1
- package/Materials/PBR/pbrSheenConfiguration.js +4 -7
- package/Materials/PBR/pbrSheenConfiguration.js.map +1 -1
- package/Materials/Textures/Loaders/envTextureLoader.js +2 -2
- package/Materials/Textures/Loaders/envTextureLoader.js.map +1 -1
- package/Materials/Textures/Packer/packer.js +13 -14
- package/Materials/Textures/Packer/packer.js.map +1 -1
- package/Materials/Textures/Procedurals/noiseProceduralTexture.js +1 -2
- package/Materials/Textures/Procedurals/noiseProceduralTexture.js.map +1 -1
- package/Materials/Textures/Procedurals/proceduralTexture.js +19 -11
- package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
- package/Materials/Textures/baseTexture.js +2 -4
- package/Materials/Textures/baseTexture.js.map +1 -1
- package/Materials/Textures/cubeTexture.js +7 -13
- package/Materials/Textures/cubeTexture.js.map +1 -1
- package/Materials/Textures/dynamicTexture.js +1 -2
- package/Materials/Textures/dynamicTexture.js.map +1 -1
- package/Materials/Textures/hdrCubeTexture.js +2 -4
- package/Materials/Textures/hdrCubeTexture.js.map +1 -1
- package/Materials/Textures/htmlElementTexture.js +5 -3
- package/Materials/Textures/htmlElementTexture.js.map +1 -1
- package/Materials/Textures/internalTexture.js +3 -5
- package/Materials/Textures/internalTexture.js.map +1 -1
- package/Materials/Textures/mirrorTexture.js +3 -6
- package/Materials/Textures/mirrorTexture.js.map +1 -1
- package/Materials/Textures/multiRenderTarget.js +5 -8
- package/Materials/Textures/multiRenderTarget.js.map +1 -1
- package/Materials/Textures/rawTexture.js +1 -1
- package/Materials/Textures/rawTexture.js.map +1 -1
- package/Materials/Textures/renderTargetTexture.js +22 -34
- package/Materials/Textures/renderTargetTexture.js.map +1 -1
- package/Materials/Textures/texture.js +16 -21
- package/Materials/Textures/texture.js.map +1 -1
- package/Materials/Textures/thinRenderTargetTexture.js +2 -4
- package/Materials/Textures/thinRenderTargetTexture.js.map +1 -1
- package/Materials/Textures/thinTexture.js +1 -1
- package/Materials/Textures/thinTexture.js.map +1 -1
- package/Materials/Textures/videoTexture.js +12 -10
- package/Materials/Textures/videoTexture.js.map +1 -1
- package/Materials/clipPlaneMaterialHelper.js +18 -21
- package/Materials/clipPlaneMaterialHelper.js.map +1 -1
- package/Materials/drawWrapper.js +2 -4
- package/Materials/drawWrapper.js.map +1 -1
- package/Materials/effect.d.ts +4 -0
- package/Materials/effect.js +18 -18
- package/Materials/effect.js.map +1 -1
- package/Materials/effectRenderer.js +2 -3
- package/Materials/effectRenderer.js.map +1 -1
- package/Materials/material.decalMapConfiguration.js +3 -3
- package/Materials/material.decalMapConfiguration.js.map +1 -1
- package/Materials/material.detailMapConfiguration.js +1 -2
- package/Materials/material.detailMapConfiguration.js.map +1 -1
- package/Materials/material.js +7 -4
- package/Materials/material.js.map +1 -1
- package/Materials/materialDefines.js +5 -6
- package/Materials/materialDefines.js.map +1 -1
- package/Materials/materialHelper.d.ts +1 -1
- package/Materials/materialHelper.js +3 -4
- package/Materials/materialHelper.js.map +1 -1
- package/Materials/materialPluginManager.js +3 -5
- package/Materials/materialPluginManager.js.map +1 -1
- package/Materials/meshDebugPluginMaterial.js +13 -14
- package/Materials/meshDebugPluginMaterial.js.map +1 -1
- package/Materials/multiMaterial.js +1 -2
- package/Materials/multiMaterial.js.map +1 -1
- package/Materials/shaderMaterial.d.ts +1 -1
- package/Materials/shaderMaterial.js +64 -32
- package/Materials/shaderMaterial.js.map +1 -1
- package/Materials/shadowDepthWrapper.js +24 -23
- package/Materials/shadowDepthWrapper.js.map +1 -1
- package/Materials/standardMaterial.js +10 -12
- package/Materials/standardMaterial.js.map +1 -1
- package/Materials/uniformBuffer.js +1 -1
- package/Materials/uniformBuffer.js.map +1 -1
- package/Maths/math.vector.js +1 -2
- package/Maths/math.vector.js.map +1 -1
- package/Meshes/Builders/decalBuilder.js +26 -29
- package/Meshes/Builders/decalBuilder.js.map +1 -1
- package/Meshes/Builders/greasedLineBuilder.js +16 -16
- package/Meshes/Builders/greasedLineBuilder.js.map +1 -1
- package/Meshes/Builders/groundBuilder.d.ts +5 -1
- package/Meshes/Builders/groundBuilder.js +13 -2
- package/Meshes/Builders/groundBuilder.js.map +1 -1
- package/Meshes/Builders/textBuilder.js +2 -3
- package/Meshes/Builders/textBuilder.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +9 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +141 -12
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
- package/Meshes/GreasedLine/greasedLineBaseMesh.js +8 -11
- package/Meshes/GreasedLine/greasedLineBaseMesh.js.map +1 -1
- package/Meshes/GreasedLine/greasedLineMesh.js +3 -5
- package/Meshes/GreasedLine/greasedLineMesh.js.map +1 -1
- package/Meshes/GreasedLine/greasedLineRibbonMesh.js +13 -18
- package/Meshes/GreasedLine/greasedLineRibbonMesh.js.map +1 -1
- package/Meshes/Node/Blocks/Teleport/teleportOutBlock.js +1 -2
- package/Meshes/Node/Blocks/Teleport/teleportOutBlock.js.map +1 -1
- package/Meshes/Node/Blocks/geometryTrigonometryBlock.d.ts +18 -18
- package/Meshes/Node/Blocks/geometryTrigonometryBlock.js +18 -18
- package/Meshes/Node/Blocks/geometryTrigonometryBlock.js.map +1 -1
- package/Meshes/Node/nodeGeometry.js +6 -3
- package/Meshes/Node/nodeGeometry.js.map +1 -1
- package/Meshes/Node/nodeGeometryBlock.js +1 -1
- package/Meshes/Node/nodeGeometryBlock.js.map +1 -1
- package/Meshes/Node/nodeGeometryBlockConnectionPoint.js +1 -2
- package/Meshes/Node/nodeGeometryBlockConnectionPoint.js.map +1 -1
- package/Meshes/Node/nodeGeometryBuildState.js +1 -2
- package/Meshes/Node/nodeGeometryBuildState.js.map +1 -1
- package/Meshes/abstractMesh.js +6 -10
- package/Meshes/abstractMesh.js.map +1 -1
- package/Meshes/csg.js +1 -2
- package/Meshes/csg.js.map +1 -1
- package/Meshes/geometry.js +1 -1
- package/Meshes/geometry.js.map +1 -1
- package/Meshes/instancedMesh.js +5 -10
- package/Meshes/instancedMesh.js.map +1 -1
- package/Meshes/mesh.js +13 -22
- package/Meshes/mesh.js.map +1 -1
- package/Meshes/mesh.vertexData.js +3 -4
- package/Meshes/mesh.vertexData.js.map +1 -1
- package/Meshes/meshUVSpaceRenderer.js +18 -15
- package/Meshes/meshUVSpaceRenderer.js.map +1 -1
- package/Meshes/subMesh.js +8 -14
- package/Meshes/subMesh.js.map +1 -1
- package/Meshes/thinInstanceMesh.js +12 -18
- package/Meshes/thinInstanceMesh.js.map +1 -1
- package/Meshes/trailMesh.js +2 -3
- package/Meshes/trailMesh.js.map +1 -1
- package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js +1 -2
- package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js.map +1 -1
- package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.js +9 -14
- package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.js.map +1 -1
- package/Misc/PerformanceViewer/performanceViewerCollector.js +2 -3
- package/Misc/PerformanceViewer/performanceViewerCollector.js.map +1 -1
- package/Misc/arrayTools.js +1 -1
- package/Misc/arrayTools.js.map +1 -1
- package/Misc/basis.js +2 -3
- package/Misc/basis.js.map +1 -1
- package/Misc/dataStorage.js +1 -1
- package/Misc/dataStorage.js.map +1 -1
- package/Misc/deepCopier.js +1 -1
- package/Misc/deepCopier.js.map +1 -1
- package/Misc/environmentTextureTools.js +3 -4
- package/Misc/environmentTextureTools.js.map +1 -1
- package/Misc/equirectangularCapture.js +2 -3
- package/Misc/equirectangularCapture.js.map +1 -1
- package/Misc/fileTools.js +4 -4
- package/Misc/fileTools.js.map +1 -1
- package/Misc/greasedLineTools.js +3 -5
- package/Misc/greasedLineTools.js.map +1 -1
- package/Misc/logger.js +1 -2
- package/Misc/logger.js.map +1 -1
- package/Misc/minMaxReducer.js +2 -3
- package/Misc/minMaxReducer.js.map +1 -1
- package/Misc/pressureObserverWrapper.js +5 -8
- package/Misc/pressureObserverWrapper.js.map +1 -1
- package/Misc/sceneRecorder.js +1 -1
- package/Misc/sceneRecorder.js.map +1 -1
- package/Misc/screenshotTools.js +1 -1
- package/Misc/screenshotTools.js.map +1 -1
- package/Misc/textureTools.js +5 -5
- package/Misc/textureTools.js.map +1 -1
- package/Misc/timer.js +3 -5
- package/Misc/timer.js.map +1 -1
- package/Misc/tools.d.ts +3 -2
- package/Misc/tools.js +6 -5
- package/Misc/tools.js.map +1 -1
- package/Misc/trajectoryClassifier.js +3 -3
- package/Misc/trajectoryClassifier.js.map +1 -1
- package/Misc/videoRecorder.js +6 -4
- package/Misc/videoRecorder.js.map +1 -1
- package/Misc/virtualJoystick.js +4 -1
- package/Misc/virtualJoystick.js.map +1 -1
- package/Morph/morphTargetManager.js +1 -2
- package/Morph/morphTargetManager.js.map +1 -1
- package/Particles/EmitterTypes/meshParticleEmitter.js +1 -2
- package/Particles/EmitterTypes/meshParticleEmitter.js.map +1 -1
- package/Particles/baseParticleSystem.d.ts +4 -0
- package/Particles/baseParticleSystem.js +4 -0
- package/Particles/baseParticleSystem.js.map +1 -1
- package/Particles/computeShaderParticleSystem.js +3 -6
- package/Particles/computeShaderParticleSystem.js.map +1 -1
- package/Particles/gpuParticleSystem.d.ts +2 -2
- package/Particles/gpuParticleSystem.js +30 -20
- package/Particles/gpuParticleSystem.js.map +1 -1
- package/Particles/particleSystem.d.ts +3 -2
- package/Particles/particleSystem.js +33 -30
- package/Particles/particleSystem.js.map +1 -1
- package/Particles/particleSystemComponent.js +2 -3
- package/Particles/particleSystemComponent.js.map +1 -1
- package/Particles/pointsCloudSystem.js +5 -8
- package/Particles/pointsCloudSystem.js.map +1 -1
- package/Particles/solidParticleSystem.js +5 -7
- package/Particles/solidParticleSystem.js.map +1 -1
- package/Particles/webgl2ParticleSystem.js +1 -2
- package/Particles/webgl2ParticleSystem.js.map +1 -1
- package/Physics/castingResult.js +1 -1
- package/Physics/castingResult.js.map +1 -1
- package/Physics/joinedPhysicsEngineComponent.js +2 -2
- package/Physics/joinedPhysicsEngineComponent.js.map +1 -1
- package/Physics/physicsHelper.js +19 -21
- package/Physics/physicsHelper.js.map +1 -1
- package/Physics/v2/IPhysicsEnginePlugin.d.ts +20 -0
- package/Physics/v2/IPhysicsEnginePlugin.js.map +1 -1
- package/Physics/v2/Plugins/havokPlugin.js +48 -35
- package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
- package/Physics/v2/physicsAggregate.js +10 -12
- package/Physics/v2/physicsAggregate.js.map +1 -1
- package/Physics/v2/physicsBody.js +2 -4
- package/Physics/v2/physicsBody.js.map +1 -1
- package/Physics/v2/physicsShape.js +1 -2
- package/Physics/v2/physicsShape.js.map +1 -1
- package/Physics/v2/ragdoll.js +6 -8
- package/Physics/v2/ragdoll.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js +6 -8
- package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js +14 -22
- package/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.js.map +1 -1
- package/PostProcesses/colorCorrectionPostProcess.js +1 -1
- package/PostProcesses/colorCorrectionPostProcess.js.map +1 -1
- package/PostProcesses/postProcess.js +28 -34
- package/PostProcesses/postProcess.js.map +1 -1
- package/PostProcesses/postProcessManager.js +4 -6
- package/PostProcesses/postProcessManager.js.map +1 -1
- package/PostProcesses/screenSpaceReflectionPostProcess.js +2 -2
- package/PostProcesses/screenSpaceReflectionPostProcess.js.map +1 -1
- package/PostProcesses/volumetricLightScatteringPostProcess.js +4 -7
- package/PostProcesses/volumetricLightScatteringPostProcess.js.map +1 -1
- package/PostProcesses/vrMultiviewToSingleviewPostProcess.js +1 -1
- package/PostProcesses/vrMultiviewToSingleviewPostProcess.js.map +1 -1
- package/Probes/reflectionProbe.js +2 -4
- package/Probes/reflectionProbe.js.map +1 -1
- package/Rendering/GlobalIllumination/giRSMManager.js +22 -19
- package/Rendering/GlobalIllumination/giRSMManager.js.map +1 -1
- package/Rendering/boundingBoxRenderer.js +2 -3
- package/Rendering/boundingBoxRenderer.js.map +1 -1
- package/Rendering/depthPeelingRenderer.js +2 -4
- package/Rendering/depthPeelingRenderer.js.map +1 -1
- package/Rendering/depthPeelingSceneComponent.js +2 -4
- package/Rendering/depthPeelingSceneComponent.js.map +1 -1
- package/Rendering/depthRenderer.js +10 -13
- package/Rendering/depthRenderer.js.map +1 -1
- package/Rendering/edgesRenderer.js +8 -11
- package/Rendering/edgesRenderer.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderer.js +6 -11
- package/Rendering/fluidRenderer/fluidRenderer.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObject.js +3 -5
- package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js +2 -4
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js +30 -36
- package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingTextures.js +5 -7
- package/Rendering/fluidRenderer/fluidRenderingTextures.js.map +1 -1
- package/Rendering/geometryBufferRenderer.js +3 -2
- package/Rendering/geometryBufferRenderer.js.map +1 -1
- package/Rendering/outlineRenderer.js +5 -4
- package/Rendering/outlineRenderer.js.map +1 -1
- package/Rendering/prePassRenderer.js +3 -6
- package/Rendering/prePassRenderer.js.map +1 -1
- package/Rendering/reflectiveShadowMap.d.ts +1 -0
- package/Rendering/reflectiveShadowMap.js +5 -5
- package/Rendering/reflectiveShadowMap.js.map +1 -1
- package/Shaders/color.fragment.d.ts +2 -0
- package/Shaders/color.fragment.js +4 -0
- package/Shaders/color.fragment.js.map +1 -1
- package/Shaders/color.vertex.d.ts +2 -0
- package/Shaders/color.vertex.js +7 -0
- package/Shaders/color.vertex.js.map +1 -1
- package/Shaders/gpuRenderParticles.fragment.d.ts +2 -0
- package/Shaders/gpuRenderParticles.fragment.js +4 -0
- package/Shaders/gpuRenderParticles.fragment.js.map +1 -1
- package/Shaders/gpuRenderParticles.vertex.d.ts +2 -0
- package/Shaders/gpuRenderParticles.vertex.js +5 -1
- package/Shaders/gpuRenderParticles.vertex.js.map +1 -1
- package/Shaders/particles.fragment.d.ts +2 -0
- package/Shaders/particles.fragment.js +4 -0
- package/Shaders/particles.fragment.js.map +1 -1
- package/Shaders/particles.vertex.d.ts +2 -0
- package/Shaders/particles.vertex.js +5 -1
- package/Shaders/particles.vertex.js.map +1 -1
- package/Sprites/spriteManager.js +1 -2
- package/Sprites/spriteManager.js.map +1 -1
- package/Sprites/spriteRenderer.js +5 -7
- package/Sprites/spriteRenderer.js.map +1 -1
- package/States/stencilStateComposer.js +2 -4
- package/States/stencilStateComposer.js.map +1 -1
- package/XR/features/WebXRAbstractFeature.js +6 -2
- package/XR/features/WebXRAbstractFeature.js.map +1 -1
- package/XR/features/WebXRAnchorSystem.js +1 -2
- package/XR/features/WebXRAnchorSystem.js.map +1 -1
- package/XR/features/WebXRControllerMovement.js +6 -7
- package/XR/features/WebXRControllerMovement.js.map +1 -1
- package/XR/features/WebXRControllerPhysics.js +17 -10
- package/XR/features/WebXRControllerPhysics.js.map +1 -1
- package/XR/features/WebXRControllerPointerSelection.js +1 -2
- package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
- package/XR/features/WebXRControllerTeleportation.d.ts +1 -0
- package/XR/features/WebXRControllerTeleportation.js +6 -3
- package/XR/features/WebXRControllerTeleportation.js.map +1 -1
- package/XR/features/WebXRDepthSensing.js +3 -5
- package/XR/features/WebXRDepthSensing.js.map +1 -1
- package/XR/features/WebXRHandTracking.d.ts +1 -0
- package/XR/features/WebXRHandTracking.js +31 -28
- package/XR/features/WebXRHandTracking.js.map +1 -1
- package/XR/features/WebXRLayers.js +9 -11
- package/XR/features/WebXRLayers.js.map +1 -1
- package/XR/features/WebXRLightEstimation.js +3 -6
- package/XR/features/WebXRLightEstimation.js.map +1 -1
- package/XR/features/WebXRMeshDetector.js +2 -4
- package/XR/features/WebXRMeshDetector.js.map +1 -1
- package/XR/features/WebXRNearInteraction.js +21 -18
- package/XR/features/WebXRNearInteraction.js.map +1 -1
- package/XR/features/WebXRPlaneDetector.js +1 -2
- package/XR/features/WebXRPlaneDetector.js.map +1 -1
- package/XR/features/WebXRRawCameraAccess.js +2 -3
- package/XR/features/WebXRRawCameraAccess.js.map +1 -1
- package/XR/features/WebXRSpaceWarp.js +1 -1
- package/XR/features/WebXRSpaceWarp.js.map +1 -1
- package/XR/motionController/webXRAbstractMotionController.js +4 -1
- package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
- package/XR/native/nativeXRFrame.js +1 -2
- package/XR/native/nativeXRFrame.js.map +1 -1
- package/XR/webXRCamera.js +1 -2
- package/XR/webXRCamera.js.map +1 -1
- package/XR/webXRDefaultExperience.js +28 -6
- package/XR/webXRDefaultExperience.js.map +1 -1
- package/XR/webXRExperienceHelper.js +5 -7
- package/XR/webXRExperienceHelper.js.map +1 -1
- package/XR/webXRFeaturesManager.js +4 -1
- package/XR/webXRFeaturesManager.js.map +1 -1
- package/XR/webXRInput.js +6 -1
- package/XR/webXRInput.js.map +1 -1
- package/XR/webXRInputSource.js +1 -2
- package/XR/webXRInputSource.js.map +1 -1
- package/XR/webXRSessionManager.js +16 -29
- package/XR/webXRSessionManager.js.map +1 -1
- package/assetContainer.js +4 -1
- package/assetContainer.js.map +1 -1
- package/package.json +1 -1
- package/scene.js +18 -17
- package/scene.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpuTextureManager.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuTextureManager.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\n/* eslint-disable babylonjs/available */\r\n/* eslint-disable jsdoc/require-jsdoc */\r\n// License for the mipmap generation code:\r\n//\r\n// Copyright 2020 Brandon Jones\r\n//\r\n// Permission is hereby granted, free of charge, to any person obtaining a copy\r\n// of this software and associated documentation files (the \"Software\"), to deal\r\n// in the Software without restriction, including without limitation the rights\r\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n// copies of the Software, and to permit persons to whom the Software is\r\n// furnished to do so, subject to the following conditions:\r\n\r\n// The above copyright notice and this permission notice shall be included in\r\n// all copies or substantial portions of the Software.\r\n\r\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n// SOFTWARE.\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\nimport type { WebGPUBufferManager } from \"./webgpuBufferManager\";\r\nimport { Constants } from \"../constants\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { InternalTexture } from \"../../Materials/Textures/internalTexture\";\r\nimport { InternalTextureSource } from \"../../Materials/Textures/internalTexture\";\r\nimport type { HardwareTextureWrapper } from \"../../Materials/Textures/hardwareTextureWrapper\";\r\nimport type { BaseTexture } from \"../../Materials/Textures/baseTexture\";\r\nimport { WebGPUHardwareTexture } from \"./webgpuHardwareTexture\";\r\nimport type { WebGPUTintWASM } from \"./webgpuTintWASM\";\r\nimport type { ExternalTexture } from \"../../Materials/Textures/externalTexture\";\r\nimport type { WebGPUEngine } from \"../webgpuEngine\";\r\nimport { WebGPUTextureHelper } from \"./webgpuTextureHelper\";\r\n\r\n// TODO WEBGPU improve mipmap generation by using compute shaders\r\n\r\n// TODO WEBGPU use WGSL instead of GLSL\r\nconst mipmapVertexSource = `\r\n const vec2 pos[4] = vec2[4](vec2(-1.0f, 1.0f), vec2(1.0f, 1.0f), vec2(-1.0f, -1.0f), vec2(1.0f, -1.0f));\r\n const vec2 tex[4] = vec2[4](vec2(0.0f, 0.0f), vec2(1.0f, 0.0f), vec2(0.0f, 1.0f), vec2(1.0f, 1.0f));\r\n\r\n layout(location = 0) out vec2 vTex;\r\n\r\n void main() {\r\n vTex = tex[gl_VertexIndex];\r\n gl_Position = vec4(pos[gl_VertexIndex], 0.0, 1.0);\r\n }\r\n `;\r\n\r\nconst mipmapFragmentSource = `\r\n layout(set = 0, binding = 0) uniform sampler imgSampler;\r\n layout(set = 0, binding = 1) uniform texture2D img;\r\n\r\n layout(location = 0) in vec2 vTex;\r\n layout(location = 0) out vec4 outColor;\r\n\r\n void main() {\r\n outColor = texture(sampler2D(img, imgSampler), vTex);\r\n }\r\n `;\r\n\r\nconst invertYPreMultiplyAlphaVertexSource = `\r\n #extension GL_EXT_samplerless_texture_functions : enable\r\n\r\n const vec2 pos[4] = vec2[4](vec2(-1.0f, 1.0f), vec2(1.0f, 1.0f), vec2(-1.0f, -1.0f), vec2(1.0f, -1.0f));\r\n const vec2 tex[4] = vec2[4](vec2(0.0f, 0.0f), vec2(1.0f, 0.0f), vec2(0.0f, 1.0f), vec2(1.0f, 1.0f));\r\n\r\n layout(set = 0, binding = 0) uniform texture2D img;\r\n\r\n #ifdef INVERTY\r\n layout(location = 0) out flat ivec2 vTextureSize;\r\n #endif\r\n\r\n void main() {\r\n #ifdef INVERTY\r\n vTextureSize = textureSize(img, 0);\r\n #endif\r\n gl_Position = vec4(pos[gl_VertexIndex], 0.0, 1.0);\r\n }\r\n `;\r\n\r\nconst invertYPreMultiplyAlphaFragmentSource = `\r\n #extension GL_EXT_samplerless_texture_functions : enable\r\n\r\n layout(set = 0, binding = 0) uniform texture2D img;\r\n\r\n #ifdef INVERTY\r\n layout(location = 0) in flat ivec2 vTextureSize;\r\n #endif\r\n layout(location = 0) out vec4 outColor;\r\n\r\n void main() {\r\n #ifdef INVERTY\r\n vec4 color = texelFetch(img, ivec2(gl_FragCoord.x, vTextureSize.y - gl_FragCoord.y), 0);\r\n #else\r\n vec4 color = texelFetch(img, ivec2(gl_FragCoord.xy), 0);\r\n #endif\r\n #ifdef PREMULTIPLYALPHA\r\n color.rgb *= color.a;\r\n #endif\r\n outColor = color;\r\n }\r\n `;\r\n\r\nconst invertYPreMultiplyAlphaWithOfstVertexSource = invertYPreMultiplyAlphaVertexSource;\r\n\r\nconst invertYPreMultiplyAlphaWithOfstFragmentSource = `\r\n #extension GL_EXT_samplerless_texture_functions : enable\r\n\r\n layout(set = 0, binding = 0) uniform texture2D img;\r\n layout(set = 0, binding = 1) uniform Params {\r\n float ofstX;\r\n float ofstY;\r\n float width;\r\n float height;\r\n };\r\n\r\n #ifdef INVERTY\r\n layout(location = 0) in flat ivec2 vTextureSize;\r\n #endif\r\n layout(location = 0) out vec4 outColor;\r\n\r\n void main() {\r\n if (gl_FragCoord.x < ofstX || gl_FragCoord.x >= ofstX + width) {\r\n discard;\r\n }\r\n if (gl_FragCoord.y < ofstY || gl_FragCoord.y >= ofstY + height) {\r\n discard;\r\n }\r\n #ifdef INVERTY\r\n vec4 color = texelFetch(img, ivec2(gl_FragCoord.x, ofstY + height - (gl_FragCoord.y - ofstY)), 0);\r\n #else\r\n vec4 color = texelFetch(img, ivec2(gl_FragCoord.xy), 0);\r\n #endif\r\n #ifdef PREMULTIPLYALPHA\r\n color.rgb *= color.a;\r\n #endif\r\n outColor = color;\r\n }\r\n `;\r\n\r\nconst clearVertexSource = `\r\n const vec2 pos[4] = vec2[4](vec2(-1.0f, 1.0f), vec2(1.0f, 1.0f), vec2(-1.0f, -1.0f), vec2(1.0f, -1.0f));\r\n\r\n void main() {\r\n gl_Position = vec4(pos[gl_VertexIndex], 0.0, 1.0);\r\n }\r\n `;\r\n\r\nconst clearFragmentSource = `\r\n layout(set = 0, binding = 0) uniform Uniforms {\r\n uniform vec4 color;\r\n };\r\n\r\n layout(location = 0) out vec4 outColor;\r\n\r\n void main() {\r\n outColor = color;\r\n }\r\n `;\r\n\r\nconst copyVideoToTextureVertexSource = `\r\n struct VertexOutput {\r\n @builtin(position) Position : vec4<f32>,\r\n @location(0) fragUV : vec2<f32>\r\n }\r\n\r\n @vertex\r\n fn main(\r\n @builtin(vertex_index) VertexIndex : u32\r\n ) -> VertexOutput {\r\n var pos = array<vec2<f32>, 4>(\r\n vec2(-1.0, 1.0),\r\n vec2( 1.0, 1.0),\r\n vec2(-1.0, -1.0),\r\n vec2( 1.0, -1.0)\r\n );\r\n var tex = array<vec2<f32>, 4>(\r\n vec2(0.0, 0.0),\r\n vec2(1.0, 0.0),\r\n vec2(0.0, 1.0),\r\n vec2(1.0, 1.0)\r\n );\r\n\r\n var output: VertexOutput;\r\n\r\n output.Position = vec4<f32>(pos[VertexIndex], 0.0, 1.0);\r\n output.fragUV = tex[VertexIndex];\r\n\r\n return output;\r\n }\r\n `;\r\n\r\nconst copyVideoToTextureFragmentSource = `\r\n @group(0) @binding(0) var videoSampler: sampler;\r\n @group(0) @binding(1) var videoTexture: texture_external;\r\n\r\n @fragment\r\n fn main(\r\n @location(0) fragUV: vec2<f32>\r\n ) -> @location(0) vec4<f32> {\r\n return textureSampleBaseClampToEdge(videoTexture, videoSampler, fragUV);\r\n }\r\n `;\r\n\r\nconst copyVideoToTextureInvertYFragmentSource = `\r\n @group(0) @binding(0) var videoSampler: sampler;\r\n @group(0) @binding(1) var videoTexture: texture_external;\r\n\r\n @fragment\r\n fn main(\r\n @location(0) fragUV: vec2<f32>\r\n ) -> @location(0) vec4<f32> {\r\n return textureSampleBaseClampToEdge(videoTexture, videoSampler, vec2<f32>(fragUV.x, 1.0 - fragUV.y));\r\n }\r\n `;\r\n\r\nenum PipelineType {\r\n MipMap = 0,\r\n InvertYPremultiplyAlpha = 1,\r\n Clear = 2,\r\n InvertYPremultiplyAlphaWithOfst = 3,\r\n}\r\n\r\nenum VideoPipelineType {\r\n DontInvertY = 0,\r\n InvertY = 1,\r\n}\r\n\r\ninterface IPipelineParameters {\r\n invertY?: boolean;\r\n premultiplyAlpha?: boolean;\r\n}\r\n\r\nconst shadersForPipelineType = [\r\n { vertex: mipmapVertexSource, fragment: mipmapFragmentSource },\r\n { vertex: invertYPreMultiplyAlphaVertexSource, fragment: invertYPreMultiplyAlphaFragmentSource },\r\n { vertex: clearVertexSource, fragment: clearFragmentSource },\r\n { vertex: invertYPreMultiplyAlphaWithOfstVertexSource, fragment: invertYPreMultiplyAlphaWithOfstFragmentSource },\r\n];\r\n\r\n/**\r\n * Map a (renderable) texture format (GPUTextureFormat) to an index for fast lookup (in caches for eg)\r\n * The number of entries should not go over 64! Else, the code in WebGPUCacheRenderPipeline.setMRT should be updated\r\n */\r\nexport const renderableTextureFormatToIndex: { [name: string]: number } = {\r\n \"\": 0,\r\n r8unorm: 1,\r\n r8uint: 2,\r\n r8sint: 3,\r\n\r\n r16uint: 4,\r\n r16sint: 5,\r\n r16float: 6,\r\n rg8unorm: 7,\r\n rg8uint: 8,\r\n rg8sint: 9,\r\n\r\n r32uint: 10,\r\n r32sint: 11,\r\n r32float: 12,\r\n rg16uint: 13,\r\n rg16sint: 14,\r\n rg16float: 15,\r\n rgba8unorm: 16,\r\n \"rgba8unorm-srgb\": 17,\r\n rgba8uint: 18,\r\n rgba8sint: 19,\r\n bgra8unorm: 20,\r\n \"bgra8unorm-srgb\": 21,\r\n\r\n rgb10a2uint: 22,\r\n rgb10a2unorm: 23,\r\n /* rg11b10ufloat: this entry is dynamically added if the \"RG11B10UFloatRenderable\" extension is supported */\r\n\r\n rg32uint: 24,\r\n rg32sint: 25,\r\n rg32float: 26,\r\n rgba16uint: 27,\r\n rgba16sint: 28,\r\n rgba16float: 29,\r\n\r\n rgba32uint: 30,\r\n rgba32sint: 31,\r\n rgba32float: 32,\r\n\r\n stencil8: 33,\r\n depth16unorm: 34,\r\n depth24plus: 35,\r\n \"depth24plus-stencil8\": 36,\r\n depth32float: 37,\r\n\r\n \"depth32float-stencil8\": 38,\r\n};\r\n\r\n/** @internal */\r\nexport class WebGPUTextureManager {\r\n private _engine: WebGPUEngine;\r\n private _device: GPUDevice;\r\n private _glslang: any;\r\n private _tintWASM: Nullable<WebGPUTintWASM>;\r\n private _bufferManager: WebGPUBufferManager;\r\n private _mipmapSampler: GPUSampler;\r\n private _videoSampler: GPUSampler;\r\n private _ubCopyWithOfst: GPUBuffer;\r\n private _pipelines: { [format: string]: Array<[GPURenderPipeline, GPUBindGroupLayout]> } = {};\r\n private _compiledShaders: GPUShaderModule[][] = [];\r\n private _videoPipelines: { [format: string]: Array<[GPURenderPipeline, GPUBindGroupLayout]> } = {};\r\n private _videoCompiledShaders: GPUShaderModule[][] = [];\r\n private _deferredReleaseTextures: Array<[Nullable<HardwareTextureWrapper | GPUTexture>, Nullable<BaseTexture>]> = [];\r\n private _commandEncoderForCreation: GPUCommandEncoder;\r\n\r\n //------------------------------------------------------------------------------\r\n // Initialization / Helpers\r\n //------------------------------------------------------------------------------\r\n\r\n constructor(\r\n engine: WebGPUEngine,\r\n device: GPUDevice,\r\n glslang: any,\r\n tintWASM: Nullable<WebGPUTintWASM>,\r\n bufferManager: WebGPUBufferManager,\r\n enabledExtensions: GPUFeatureName[]\r\n ) {\r\n this._engine = engine;\r\n this._device = device;\r\n this._glslang = glslang;\r\n this._tintWASM = tintWASM;\r\n this._bufferManager = bufferManager;\r\n\r\n if (enabledExtensions.indexOf(WebGPUConstants.FeatureName.RG11B10UFloatRenderable) !== -1) {\r\n const keys = Object.keys(renderableTextureFormatToIndex);\r\n renderableTextureFormatToIndex[WebGPUConstants.TextureFormat.RG11B10UFloat] = renderableTextureFormatToIndex[keys[keys.length - 1]] + 1;\r\n }\r\n\r\n this._mipmapSampler = device.createSampler({ minFilter: WebGPUConstants.FilterMode.Linear });\r\n this._videoSampler = device.createSampler({ minFilter: WebGPUConstants.FilterMode.Linear });\r\n this._ubCopyWithOfst = this._bufferManager.createBuffer(\r\n 4 * 4,\r\n WebGPUConstants.BufferUsage.Uniform | WebGPUConstants.BufferUsage.CopyDst,\r\n \"UBCopyWithOffset\"\r\n ).underlyingResource;\r\n\r\n this._getPipeline(WebGPUConstants.TextureFormat.RGBA8Unorm);\r\n this._getVideoPipeline(WebGPUConstants.TextureFormat.RGBA8Unorm);\r\n }\r\n\r\n private _getPipeline(format: GPUTextureFormat, type: PipelineType = PipelineType.MipMap, params?: IPipelineParameters): [GPURenderPipeline, GPUBindGroupLayout] {\r\n const index =\r\n type === PipelineType.MipMap\r\n ? 1 << 0\r\n : type === PipelineType.InvertYPremultiplyAlpha\r\n ? ((params!.invertY ? 1 : 0) << 1) + ((params!.premultiplyAlpha ? 1 : 0) << 2)\r\n : type === PipelineType.Clear\r\n ? 1 << 3\r\n : type === PipelineType.InvertYPremultiplyAlphaWithOfst\r\n ? ((params!.invertY ? 1 : 0) << 4) + ((params!.premultiplyAlpha ? 1 : 0) << 5)\r\n : 0;\r\n\r\n if (!this._pipelines[format]) {\r\n this._pipelines[format] = [];\r\n }\r\n\r\n let pipelineAndBGL = this._pipelines[format][index];\r\n if (!pipelineAndBGL) {\r\n let defines = \"#version 450\\n\";\r\n if (type === PipelineType.InvertYPremultiplyAlpha || type === PipelineType.InvertYPremultiplyAlphaWithOfst) {\r\n if (params!.invertY) {\r\n defines += \"#define INVERTY\\n\";\r\n }\r\n if (params!.premultiplyAlpha) {\r\n defines += \"#define PREMULTIPLYALPHA\\n\";\r\n }\r\n }\r\n\r\n let modules = this._compiledShaders[index];\r\n if (!modules) {\r\n let vertexCode = this._glslang.compileGLSL(defines + shadersForPipelineType[type].vertex, \"vertex\");\r\n let fragmentCode = this._glslang.compileGLSL(defines + shadersForPipelineType[type].fragment, \"fragment\");\r\n\r\n if (this._tintWASM) {\r\n vertexCode = this._tintWASM.convertSpirV2WGSL(vertexCode);\r\n fragmentCode = this._tintWASM.convertSpirV2WGSL(fragmentCode);\r\n }\r\n\r\n const vertexModule = this._device.createShaderModule({\r\n code: vertexCode,\r\n });\r\n const fragmentModule = this._device.createShaderModule({\r\n code: fragmentCode,\r\n });\r\n modules = this._compiledShaders[index] = [vertexModule, fragmentModule];\r\n }\r\n\r\n const pipeline = this._device.createRenderPipeline({\r\n layout: WebGPUConstants.AutoLayoutMode.Auto,\r\n vertex: {\r\n module: modules[0],\r\n entryPoint: \"main\",\r\n },\r\n fragment: {\r\n module: modules[1],\r\n entryPoint: \"main\",\r\n targets: [\r\n {\r\n format,\r\n },\r\n ],\r\n },\r\n primitive: {\r\n topology: WebGPUConstants.PrimitiveTopology.TriangleStrip,\r\n stripIndexFormat: WebGPUConstants.IndexFormat.Uint16,\r\n },\r\n });\r\n\r\n pipelineAndBGL = this._pipelines[format][index] = [pipeline, pipeline.getBindGroupLayout(0)];\r\n }\r\n\r\n return pipelineAndBGL;\r\n }\r\n\r\n private _getVideoPipeline(format: GPUTextureFormat, type: VideoPipelineType = VideoPipelineType.DontInvertY): [GPURenderPipeline, GPUBindGroupLayout] {\r\n const index = type === VideoPipelineType.InvertY ? 1 << 0 : 0;\r\n\r\n if (!this._videoPipelines[format]) {\r\n this._videoPipelines[format] = [];\r\n }\r\n\r\n let pipelineAndBGL = this._videoPipelines[format][index];\r\n if (!pipelineAndBGL) {\r\n let modules = this._videoCompiledShaders[index];\r\n if (!modules) {\r\n const vertexModule = this._device.createShaderModule({\r\n code: copyVideoToTextureVertexSource,\r\n });\r\n const fragmentModule = this._device.createShaderModule({\r\n code: index === 0 ? copyVideoToTextureFragmentSource : copyVideoToTextureInvertYFragmentSource,\r\n });\r\n modules = this._videoCompiledShaders[index] = [vertexModule, fragmentModule];\r\n }\r\n\r\n const pipeline = this._device.createRenderPipeline({\r\n label: `BabylonWebGPUDevice${this._engine.uniqueId}_CopyVideoToTexture_${format}_${index === 0 ? \"DontInvertY\" : \"InvertY\"}`,\r\n layout: WebGPUConstants.AutoLayoutMode.Auto,\r\n vertex: {\r\n module: modules[0],\r\n entryPoint: \"main\",\r\n },\r\n fragment: {\r\n module: modules[1],\r\n entryPoint: \"main\",\r\n targets: [\r\n {\r\n format,\r\n },\r\n ],\r\n },\r\n primitive: {\r\n topology: WebGPUConstants.PrimitiveTopology.TriangleStrip,\r\n stripIndexFormat: WebGPUConstants.IndexFormat.Uint16,\r\n },\r\n });\r\n\r\n pipelineAndBGL = this._videoPipelines[format][index] = [pipeline, pipeline.getBindGroupLayout(0)];\r\n }\r\n\r\n return pipelineAndBGL;\r\n }\r\n\r\n public setCommandEncoder(encoder: GPUCommandEncoder): void {\r\n this._commandEncoderForCreation = encoder;\r\n }\r\n\r\n public copyVideoToTexture(video: ExternalTexture, texture: InternalTexture, format: GPUTextureFormat, invertY = false, commandEncoder?: GPUCommandEncoder): void {\r\n const useOwnCommandEncoder = commandEncoder === undefined;\r\n const [pipeline, bindGroupLayout] = this._getVideoPipeline(format, invertY ? VideoPipelineType.InvertY : VideoPipelineType.DontInvertY);\r\n\r\n if (useOwnCommandEncoder) {\r\n commandEncoder = this._device.createCommandEncoder({});\r\n }\r\n\r\n commandEncoder!.pushDebugGroup?.(`copy video to texture - invertY=${invertY}`);\r\n\r\n const webgpuHardwareTexture = texture._hardwareTexture as WebGPUHardwareTexture;\r\n\r\n const renderPassDescriptor: GPURenderPassDescriptor = {\r\n label: `BabylonWebGPUDevice${this._engine.uniqueId}_copyVideoToTexture_${format}_${invertY ? \"InvertY\" : \"DontInvertY\"}${texture.label ? \"_\" + texture.label : \"\"}`,\r\n colorAttachments: [\r\n {\r\n view: webgpuHardwareTexture.underlyingResource!.createView({\r\n format,\r\n dimension: WebGPUConstants.TextureViewDimension.E2d,\r\n mipLevelCount: 1,\r\n baseArrayLayer: 0,\r\n baseMipLevel: 0,\r\n arrayLayerCount: 1,\r\n aspect: WebGPUConstants.TextureAspect.All,\r\n }),\r\n loadOp: WebGPUConstants.LoadOp.Load,\r\n storeOp: WebGPUConstants.StoreOp.Store,\r\n },\r\n ],\r\n };\r\n const passEncoder = commandEncoder!.beginRenderPass(renderPassDescriptor);\r\n\r\n const descriptor: GPUBindGroupDescriptor = {\r\n layout: bindGroupLayout,\r\n entries: [\r\n {\r\n binding: 0,\r\n resource: this._videoSampler,\r\n },\r\n {\r\n binding: 1,\r\n resource: this._device.importExternalTexture({\r\n source: video.underlyingResource,\r\n }),\r\n },\r\n ],\r\n };\r\n\r\n const bindGroup = this._device.createBindGroup(descriptor);\r\n\r\n passEncoder.setPipeline(pipeline);\r\n passEncoder.setBindGroup(0, bindGroup);\r\n passEncoder.draw(4, 1, 0, 0);\r\n passEncoder.end();\r\n\r\n commandEncoder!.popDebugGroup?.();\r\n\r\n if (useOwnCommandEncoder) {\r\n this._device.queue.submit([commandEncoder!.finish()]);\r\n commandEncoder = null as any;\r\n }\r\n }\r\n\r\n public invertYPreMultiplyAlpha(\r\n gpuOrHdwTexture: GPUTexture | WebGPUHardwareTexture,\r\n width: number,\r\n height: number,\r\n format: GPUTextureFormat,\r\n invertY = false,\r\n premultiplyAlpha = false,\r\n faceIndex = 0,\r\n mipLevel = 0,\r\n layers = 1,\r\n ofstX = 0,\r\n ofstY = 0,\r\n rectWidth = 0,\r\n rectHeight = 0,\r\n commandEncoder?: GPUCommandEncoder,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n allowGPUOptimization?: boolean\r\n ): void {\r\n const useRect = rectWidth !== 0;\r\n const useOwnCommandEncoder = commandEncoder === undefined;\r\n const [pipeline, bindGroupLayout] = this._getPipeline(format, useRect ? PipelineType.InvertYPremultiplyAlphaWithOfst : PipelineType.InvertYPremultiplyAlpha, {\r\n invertY,\r\n premultiplyAlpha,\r\n });\r\n\r\n faceIndex = Math.max(faceIndex, 0);\r\n\r\n if (useOwnCommandEncoder) {\r\n commandEncoder = this._device.createCommandEncoder({});\r\n }\r\n\r\n commandEncoder!.pushDebugGroup?.(`internal process texture - invertY=${invertY} premultiplyAlpha=${premultiplyAlpha}`);\r\n\r\n let gpuTexture: Nullable<GPUTexture>;\r\n if (WebGPUTextureHelper.IsHardwareTexture(gpuOrHdwTexture)) {\r\n gpuTexture = gpuOrHdwTexture.underlyingResource;\r\n if (!(invertY && !premultiplyAlpha && layers === 1 && faceIndex === 0)) {\r\n // we optimize only for the most likely case (invertY=true, premultiplyAlpha=false, layers=1, faceIndex=0) to avoid dealing with big caches\r\n gpuOrHdwTexture = undefined as any;\r\n }\r\n } else {\r\n gpuTexture = gpuOrHdwTexture;\r\n gpuOrHdwTexture = undefined as any;\r\n }\r\n if (!gpuTexture) {\r\n return;\r\n }\r\n\r\n if (useRect) {\r\n this._bufferManager.setRawData(this._ubCopyWithOfst, 0, new Float32Array([ofstX, ofstY, rectWidth, rectHeight]), 0, 4 * 4);\r\n }\r\n\r\n const webgpuHardwareTexture = gpuOrHdwTexture as Nullable<WebGPUHardwareTexture>;\r\n\r\n const outputTexture =\r\n webgpuHardwareTexture?._copyInvertYTempTexture ??\r\n this.createTexture(\r\n { width, height, layers: 1 },\r\n false,\r\n false,\r\n false,\r\n false,\r\n false,\r\n format,\r\n 1,\r\n commandEncoder,\r\n WebGPUConstants.TextureUsage.CopySrc | WebGPUConstants.TextureUsage.RenderAttachment | WebGPUConstants.TextureUsage.TextureBinding,\r\n undefined,\r\n \"TempTextureForCopyWithInvertY\"\r\n );\r\n\r\n const renderPassDescriptor = webgpuHardwareTexture?._copyInvertYRenderPassDescr ?? {\r\n label: `BabylonWebGPUDevice${this._engine.uniqueId}_invertYPreMultiplyAlpha_${format}_${invertY ? \"InvertY\" : \"DontInvertY\"}_${\r\n premultiplyAlpha ? \"PremultiplyAlpha\" : \"DontPremultiplyAlpha\"\r\n }`,\r\n colorAttachments: [\r\n {\r\n view: outputTexture.createView({\r\n format,\r\n dimension: WebGPUConstants.TextureViewDimension.E2d,\r\n baseMipLevel: 0,\r\n mipLevelCount: 1,\r\n arrayLayerCount: 1,\r\n baseArrayLayer: 0,\r\n }),\r\n loadOp: WebGPUConstants.LoadOp.Load,\r\n storeOp: WebGPUConstants.StoreOp.Store,\r\n },\r\n ],\r\n };\r\n const passEncoder = commandEncoder!.beginRenderPass(renderPassDescriptor);\r\n\r\n let bindGroup = useRect ? webgpuHardwareTexture?._copyInvertYBindGroupWithOfst : webgpuHardwareTexture?._copyInvertYBindGroup;\r\n if (!bindGroup) {\r\n const descriptor: GPUBindGroupDescriptor = {\r\n layout: bindGroupLayout,\r\n entries: [\r\n {\r\n binding: 0,\r\n resource: gpuTexture.createView({\r\n format,\r\n dimension: WebGPUConstants.TextureViewDimension.E2d,\r\n baseMipLevel: mipLevel,\r\n mipLevelCount: 1,\r\n arrayLayerCount: layers,\r\n baseArrayLayer: faceIndex,\r\n }),\r\n },\r\n ],\r\n };\r\n if (useRect) {\r\n descriptor.entries.push({\r\n binding: 1,\r\n resource: {\r\n buffer: this._ubCopyWithOfst,\r\n },\r\n });\r\n }\r\n bindGroup = this._device.createBindGroup(descriptor);\r\n }\r\n\r\n passEncoder.setPipeline(pipeline);\r\n passEncoder.setBindGroup(0, bindGroup);\r\n passEncoder.draw(4, 1, 0, 0);\r\n passEncoder.end();\r\n\r\n commandEncoder!.copyTextureToTexture(\r\n {\r\n texture: outputTexture,\r\n },\r\n {\r\n texture: gpuTexture,\r\n mipLevel,\r\n origin: {\r\n x: 0,\r\n y: 0,\r\n z: faceIndex,\r\n },\r\n },\r\n {\r\n width,\r\n height,\r\n depthOrArrayLayers: 1,\r\n }\r\n );\r\n\r\n if (webgpuHardwareTexture) {\r\n webgpuHardwareTexture._copyInvertYTempTexture = outputTexture;\r\n webgpuHardwareTexture._copyInvertYRenderPassDescr = renderPassDescriptor;\r\n if (useRect) {\r\n webgpuHardwareTexture._copyInvertYBindGroupWithOfst = bindGroup;\r\n } else {\r\n webgpuHardwareTexture._copyInvertYBindGroup = bindGroup;\r\n }\r\n } else {\r\n this._deferredReleaseTextures.push([outputTexture, null]);\r\n }\r\n\r\n commandEncoder!.popDebugGroup?.();\r\n\r\n if (useOwnCommandEncoder) {\r\n this._device.queue.submit([commandEncoder!.finish()]);\r\n commandEncoder = null as any;\r\n }\r\n }\r\n\r\n public copyWithInvertY(srcTextureView: GPUTextureView, format: GPUTextureFormat, renderPassDescriptor: GPURenderPassDescriptor, commandEncoder?: GPUCommandEncoder): void {\r\n const useOwnCommandEncoder = commandEncoder === undefined;\r\n const [pipeline, bindGroupLayout] = this._getPipeline(format, PipelineType.InvertYPremultiplyAlpha, { invertY: true, premultiplyAlpha: false });\r\n\r\n if (useOwnCommandEncoder) {\r\n commandEncoder = this._device.createCommandEncoder({});\r\n }\r\n\r\n commandEncoder!.pushDebugGroup?.(`internal copy texture with invertY`);\r\n\r\n const passEncoder = commandEncoder!.beginRenderPass(renderPassDescriptor);\r\n\r\n const bindGroup = this._device.createBindGroup({\r\n layout: bindGroupLayout,\r\n entries: [\r\n {\r\n binding: 0,\r\n resource: srcTextureView,\r\n },\r\n ],\r\n });\r\n\r\n passEncoder.setPipeline(pipeline);\r\n passEncoder.setBindGroup(0, bindGroup);\r\n passEncoder.draw(4, 1, 0, 0);\r\n passEncoder.end();\r\n\r\n commandEncoder!.popDebugGroup?.();\r\n\r\n if (useOwnCommandEncoder) {\r\n this._device.queue.submit([commandEncoder!.finish()]);\r\n commandEncoder = null as any;\r\n }\r\n }\r\n\r\n //------------------------------------------------------------------------------\r\n // Creation\r\n //------------------------------------------------------------------------------\r\n\r\n public createTexture(\r\n imageBitmap: ImageBitmap | { width: number; height: number; layers: number },\r\n hasMipmaps = false,\r\n generateMipmaps = false,\r\n invertY = false,\r\n premultiplyAlpha = false,\r\n is3D = false,\r\n format: GPUTextureFormat = WebGPUConstants.TextureFormat.RGBA8Unorm,\r\n sampleCount = 1,\r\n commandEncoder?: GPUCommandEncoder,\r\n usage = -1,\r\n additionalUsages = 0,\r\n label?: string\r\n ): GPUTexture {\r\n sampleCount = WebGPUTextureHelper.GetSample(sampleCount);\r\n\r\n const layerCount = (imageBitmap as any).layers || 1;\r\n const textureSize = {\r\n width: imageBitmap.width,\r\n height: imageBitmap.height,\r\n depthOrArrayLayers: layerCount,\r\n };\r\n\r\n const renderAttachmentFlag = renderableTextureFormatToIndex[format] ? WebGPUConstants.TextureUsage.RenderAttachment : 0;\r\n const isCompressedFormat = WebGPUTextureHelper.IsCompressedFormat(format);\r\n const mipLevelCount = hasMipmaps ? WebGPUTextureHelper.ComputeNumMipmapLevels(imageBitmap.width, imageBitmap.height) : 1;\r\n const usages = usage >= 0 ? usage : WebGPUConstants.TextureUsage.CopySrc | WebGPUConstants.TextureUsage.CopyDst | WebGPUConstants.TextureUsage.TextureBinding;\r\n\r\n additionalUsages |= hasMipmaps && !isCompressedFormat ? WebGPUConstants.TextureUsage.CopySrc | renderAttachmentFlag : 0;\r\n\r\n if (!isCompressedFormat && !is3D) {\r\n // we don't know in advance if the texture will be updated with copyExternalImageToTexture (which requires to have those flags), so we need to force the flags all the times\r\n additionalUsages |= renderAttachmentFlag | WebGPUConstants.TextureUsage.CopyDst;\r\n }\r\n\r\n const gpuTexture = this._device.createTexture({\r\n label: `BabylonWebGPUDevice${this._engine.uniqueId}_Texture${is3D ? \"3D\" : \"2D\"}_${label ? label + \"_\" : \"\"}${textureSize.width}x${textureSize.height}x${\r\n textureSize.depthOrArrayLayers\r\n }_${hasMipmaps ? \"wmips\" : \"womips\"}_${format}_samples${sampleCount}`,\r\n size: textureSize,\r\n dimension: is3D ? WebGPUConstants.TextureDimension.E3d : WebGPUConstants.TextureDimension.E2d,\r\n format,\r\n usage: usages | additionalUsages,\r\n sampleCount,\r\n mipLevelCount,\r\n });\r\n\r\n if (WebGPUTextureHelper.IsImageBitmap(imageBitmap)) {\r\n this.updateTexture(imageBitmap, gpuTexture, imageBitmap.width, imageBitmap.height, layerCount, format, 0, 0, invertY, premultiplyAlpha, 0, 0);\r\n\r\n if (hasMipmaps && generateMipmaps) {\r\n this.generateMipmaps(gpuTexture, format, mipLevelCount, 0, commandEncoder);\r\n }\r\n }\r\n\r\n return gpuTexture;\r\n }\r\n\r\n public createCubeTexture(\r\n imageBitmaps: ImageBitmap[] | { width: number; height: number },\r\n hasMipmaps = false,\r\n generateMipmaps = false,\r\n invertY = false,\r\n premultiplyAlpha = false,\r\n format: GPUTextureFormat = WebGPUConstants.TextureFormat.RGBA8Unorm,\r\n sampleCount = 1,\r\n commandEncoder?: GPUCommandEncoder,\r\n usage = -1,\r\n additionalUsages = 0,\r\n label?: string\r\n ): GPUTexture {\r\n sampleCount = WebGPUTextureHelper.GetSample(sampleCount);\r\n\r\n const width = WebGPUTextureHelper.IsImageBitmapArray(imageBitmaps) ? imageBitmaps[0].width : imageBitmaps.width;\r\n const height = WebGPUTextureHelper.IsImageBitmapArray(imageBitmaps) ? imageBitmaps[0].height : imageBitmaps.height;\r\n\r\n const renderAttachmentFlag = renderableTextureFormatToIndex[format] ? WebGPUConstants.TextureUsage.RenderAttachment : 0;\r\n const isCompressedFormat = WebGPUTextureHelper.IsCompressedFormat(format);\r\n const mipLevelCount = hasMipmaps ? WebGPUTextureHelper.ComputeNumMipmapLevels(width, height) : 1;\r\n const usages = usage >= 0 ? usage : WebGPUConstants.TextureUsage.CopySrc | WebGPUConstants.TextureUsage.CopyDst | WebGPUConstants.TextureUsage.TextureBinding;\r\n\r\n additionalUsages |= hasMipmaps && !isCompressedFormat ? WebGPUConstants.TextureUsage.CopySrc | renderAttachmentFlag : 0;\r\n\r\n if (!isCompressedFormat) {\r\n // we don't know in advance if the texture will be updated with copyExternalImageToTexture (which requires to have those flags), so we need to force the flags all the times\r\n additionalUsages |= renderAttachmentFlag | WebGPUConstants.TextureUsage.CopyDst;\r\n }\r\n\r\n const gpuTexture = this._device.createTexture({\r\n label: `BabylonWebGPUDevice${this._engine.uniqueId}_TextureCube_${label ? label + \"_\" : \"\"}${width}x${height}x6_${\r\n hasMipmaps ? \"wmips\" : \"womips\"\r\n }_${format}_samples${sampleCount}`,\r\n size: {\r\n width,\r\n height,\r\n depthOrArrayLayers: 6,\r\n },\r\n dimension: WebGPUConstants.TextureDimension.E2d,\r\n format,\r\n usage: usages | additionalUsages,\r\n sampleCount,\r\n mipLevelCount,\r\n });\r\n\r\n if (WebGPUTextureHelper.IsImageBitmapArray(imageBitmaps)) {\r\n this.updateCubeTextures(imageBitmaps, gpuTexture, width, height, format, invertY, premultiplyAlpha, 0, 0);\r\n\r\n if (hasMipmaps && generateMipmaps) {\r\n this.generateCubeMipmaps(gpuTexture, format, mipLevelCount, commandEncoder);\r\n }\r\n }\r\n\r\n return gpuTexture;\r\n }\r\n\r\n public generateCubeMipmaps(gpuTexture: GPUTexture | WebGPUHardwareTexture, format: GPUTextureFormat, mipLevelCount: number, commandEncoder?: GPUCommandEncoder): void {\r\n const useOwnCommandEncoder = commandEncoder === undefined;\r\n\r\n if (useOwnCommandEncoder) {\r\n commandEncoder = this._device.createCommandEncoder({});\r\n }\r\n\r\n commandEncoder!.pushDebugGroup?.(`create cube mipmaps - ${mipLevelCount} levels`);\r\n\r\n for (let f = 0; f < 6; ++f) {\r\n this.generateMipmaps(gpuTexture, format, mipLevelCount, f, commandEncoder);\r\n }\r\n\r\n commandEncoder!.popDebugGroup?.();\r\n\r\n if (useOwnCommandEncoder) {\r\n this._device.queue.submit([commandEncoder!.finish()]);\r\n commandEncoder = null as any;\r\n }\r\n }\r\n\r\n public generateMipmaps(\r\n gpuOrHdwTexture: GPUTexture | WebGPUHardwareTexture,\r\n format: GPUTextureFormat,\r\n mipLevelCount: number,\r\n faceIndex = 0,\r\n commandEncoder?: GPUCommandEncoder\r\n ): void {\r\n const useOwnCommandEncoder = commandEncoder === undefined;\r\n const [pipeline, bindGroupLayout] = this._getPipeline(format);\r\n\r\n faceIndex = Math.max(faceIndex, 0);\r\n\r\n if (useOwnCommandEncoder) {\r\n commandEncoder = this._device.createCommandEncoder({});\r\n }\r\n\r\n commandEncoder!.pushDebugGroup?.(`create mipmaps for face #${faceIndex} - ${mipLevelCount} levels`);\r\n\r\n let gpuTexture: Nullable<GPUTexture>;\r\n if (WebGPUTextureHelper.IsHardwareTexture(gpuOrHdwTexture)) {\r\n gpuTexture = gpuOrHdwTexture.underlyingResource;\r\n gpuOrHdwTexture._mipmapGenRenderPassDescr = gpuOrHdwTexture._mipmapGenRenderPassDescr || [];\r\n gpuOrHdwTexture._mipmapGenBindGroup = gpuOrHdwTexture._mipmapGenBindGroup || [];\r\n } else {\r\n gpuTexture = gpuOrHdwTexture;\r\n gpuOrHdwTexture = undefined as any;\r\n }\r\n if (!gpuTexture) {\r\n return;\r\n }\r\n\r\n const webgpuHardwareTexture = gpuOrHdwTexture as Nullable<WebGPUHardwareTexture>;\r\n for (let i = 1; i < mipLevelCount; ++i) {\r\n const renderPassDescriptor = webgpuHardwareTexture?._mipmapGenRenderPassDescr[faceIndex]?.[i - 1] ?? {\r\n label: `BabylonWebGPUDevice${this._engine.uniqueId}_generateMipmaps_${format}_faceIndex${faceIndex}_level${i}`,\r\n colorAttachments: [\r\n {\r\n view: gpuTexture.createView({\r\n format,\r\n dimension: WebGPUConstants.TextureViewDimension.E2d,\r\n baseMipLevel: i,\r\n mipLevelCount: 1,\r\n arrayLayerCount: 1,\r\n baseArrayLayer: faceIndex,\r\n }),\r\n loadOp: WebGPUConstants.LoadOp.Load,\r\n storeOp: WebGPUConstants.StoreOp.Store,\r\n },\r\n ],\r\n };\r\n if (webgpuHardwareTexture) {\r\n webgpuHardwareTexture._mipmapGenRenderPassDescr[faceIndex] = webgpuHardwareTexture._mipmapGenRenderPassDescr[faceIndex] || [];\r\n webgpuHardwareTexture._mipmapGenRenderPassDescr[faceIndex][i - 1] = renderPassDescriptor;\r\n }\r\n const passEncoder = commandEncoder!.beginRenderPass(renderPassDescriptor);\r\n\r\n const bindGroup =\r\n webgpuHardwareTexture?._mipmapGenBindGroup[faceIndex]?.[i - 1] ??\r\n this._device.createBindGroup({\r\n layout: bindGroupLayout,\r\n entries: [\r\n {\r\n binding: 0,\r\n resource: this._mipmapSampler,\r\n },\r\n {\r\n binding: 1,\r\n resource: gpuTexture.createView({\r\n format,\r\n dimension: WebGPUConstants.TextureViewDimension.E2d,\r\n baseMipLevel: i - 1,\r\n mipLevelCount: 1,\r\n arrayLayerCount: 1,\r\n baseArrayLayer: faceIndex,\r\n }),\r\n },\r\n ],\r\n });\r\n if (webgpuHardwareTexture) {\r\n webgpuHardwareTexture._mipmapGenBindGroup[faceIndex] = webgpuHardwareTexture._mipmapGenBindGroup[faceIndex] || [];\r\n webgpuHardwareTexture._mipmapGenBindGroup[faceIndex][i - 1] = bindGroup;\r\n }\r\n\r\n passEncoder.setPipeline(pipeline);\r\n passEncoder.setBindGroup(0, bindGroup);\r\n passEncoder.draw(4, 1, 0, 0);\r\n passEncoder.end();\r\n }\r\n\r\n commandEncoder!.popDebugGroup?.();\r\n\r\n if (useOwnCommandEncoder) {\r\n this._device.queue.submit([commandEncoder!.finish()]);\r\n commandEncoder = null as any;\r\n }\r\n }\r\n\r\n public createGPUTextureForInternalTexture(texture: InternalTexture, width?: number, height?: number, depth?: number, creationFlags?: number): WebGPUHardwareTexture {\r\n if (!texture._hardwareTexture) {\r\n texture._hardwareTexture = new WebGPUHardwareTexture();\r\n }\r\n\r\n if (width === undefined) {\r\n width = texture.width;\r\n }\r\n if (height === undefined) {\r\n height = texture.height;\r\n }\r\n if (depth === undefined) {\r\n depth = texture.depth;\r\n }\r\n\r\n const gpuTextureWrapper = texture._hardwareTexture as WebGPUHardwareTexture;\r\n const isStorageTexture = ((creationFlags ?? 0) & Constants.TEXTURE_CREATIONFLAG_STORAGE) !== 0;\r\n\r\n gpuTextureWrapper.format = WebGPUTextureHelper.GetWebGPUTextureFormat(texture.type, texture.format, texture._useSRGBBuffer);\r\n\r\n gpuTextureWrapper.textureUsages =\r\n texture._source === InternalTextureSource.RenderTarget || texture.source === InternalTextureSource.MultiRenderTarget\r\n ? WebGPUConstants.TextureUsage.TextureBinding | WebGPUConstants.TextureUsage.CopySrc | WebGPUConstants.TextureUsage.RenderAttachment\r\n : texture._source === InternalTextureSource.DepthStencil\r\n ? WebGPUConstants.TextureUsage.TextureBinding | WebGPUConstants.TextureUsage.RenderAttachment\r\n : -1;\r\n\r\n gpuTextureWrapper.textureAdditionalUsages = isStorageTexture ? WebGPUConstants.TextureUsage.StorageBinding : 0;\r\n\r\n const hasMipMaps = texture.generateMipMaps;\r\n const layerCount = depth || 1;\r\n let mipmapCount;\r\n if (texture._maxLodLevel !== null) {\r\n mipmapCount = texture._maxLodLevel;\r\n } else {\r\n mipmapCount = hasMipMaps ? WebGPUTextureHelper.ComputeNumMipmapLevels(width!, height!) : 1;\r\n }\r\n\r\n if (texture.isCube) {\r\n const gpuTexture = this.createCubeTexture(\r\n { width, height },\r\n texture.generateMipMaps,\r\n texture.generateMipMaps,\r\n texture.invertY,\r\n false,\r\n gpuTextureWrapper.format,\r\n 1,\r\n this._commandEncoderForCreation,\r\n gpuTextureWrapper.textureUsages,\r\n gpuTextureWrapper.textureAdditionalUsages,\r\n texture.label\r\n );\r\n\r\n gpuTextureWrapper.set(gpuTexture);\r\n\r\n const arrayLayerCount = texture.is3D ? 1 : layerCount;\r\n const format = WebGPUTextureHelper.GetDepthFormatOnly(gpuTextureWrapper.format);\r\n const aspect = WebGPUTextureHelper.HasDepthAndStencilAspects(gpuTextureWrapper.format) ? WebGPUConstants.TextureAspect.DepthOnly : WebGPUConstants.TextureAspect.All;\r\n const dimension = texture.is2DArray ? WebGPUConstants.TextureViewDimension.CubeArray : WebGPUConstants.TextureViewDimension.Cube;\r\n\r\n gpuTextureWrapper.createView(\r\n {\r\n label: `BabylonWebGPUDevice${this._engine.uniqueId}_TextureViewCube${texture.is2DArray ? \"_Array\" + arrayLayerCount : \"\"}_${width}x${height}_${\r\n hasMipMaps ? \"wmips\" : \"womips\"\r\n }_${format}_${dimension}_${aspect}`,\r\n format,\r\n dimension,\r\n mipLevelCount: mipmapCount,\r\n baseArrayLayer: 0,\r\n baseMipLevel: 0,\r\n arrayLayerCount: 6,\r\n aspect,\r\n },\r\n isStorageTexture\r\n );\r\n } else {\r\n const gpuTexture = this.createTexture(\r\n { width, height, layers: layerCount },\r\n texture.generateMipMaps,\r\n texture.generateMipMaps,\r\n texture.invertY,\r\n false,\r\n texture.is3D,\r\n gpuTextureWrapper.format,\r\n 1,\r\n this._commandEncoderForCreation,\r\n gpuTextureWrapper.textureUsages,\r\n gpuTextureWrapper.textureAdditionalUsages,\r\n texture.label\r\n );\r\n\r\n gpuTextureWrapper.set(gpuTexture);\r\n\r\n const arrayLayerCount = texture.is3D ? 1 : layerCount;\r\n const format = WebGPUTextureHelper.GetDepthFormatOnly(gpuTextureWrapper.format);\r\n const aspect = WebGPUTextureHelper.HasDepthAndStencilAspects(gpuTextureWrapper.format) ? WebGPUConstants.TextureAspect.DepthOnly : WebGPUConstants.TextureAspect.All;\r\n const dimension = texture.is2DArray\r\n ? WebGPUConstants.TextureViewDimension.E2dArray\r\n : texture.is3D\r\n ? WebGPUConstants.TextureDimension.E3d\r\n : WebGPUConstants.TextureViewDimension.E2d;\r\n\r\n gpuTextureWrapper.createView(\r\n {\r\n label: `BabylonWebGPUDevice${this._engine.uniqueId}_TextureView${texture.is3D ? \"3D\" : \"2D\"}${\r\n texture.is2DArray ? \"_Array\" + arrayLayerCount : \"\"\r\n }_${width}x${height}_${hasMipMaps ? \"wmips\" : \"womips\"}_${format}_${dimension}_${aspect}`,\r\n format,\r\n dimension,\r\n mipLevelCount: mipmapCount,\r\n baseArrayLayer: 0,\r\n baseMipLevel: 0,\r\n arrayLayerCount,\r\n aspect,\r\n },\r\n isStorageTexture\r\n );\r\n }\r\n\r\n texture.width = texture.baseWidth = width;\r\n texture.height = texture.baseHeight = height;\r\n texture.depth = texture.baseDepth = depth;\r\n\r\n this.createMSAATexture(texture, texture.samples);\r\n\r\n return gpuTextureWrapper;\r\n }\r\n\r\n public createMSAATexture(texture: InternalTexture, samples: number, releaseExisting = true, index = -1): void {\r\n const gpuTextureWrapper = texture._hardwareTexture as Nullable<WebGPUHardwareTexture>;\r\n\r\n if (releaseExisting) {\r\n gpuTextureWrapper?.releaseMSAATexture();\r\n }\r\n\r\n if (!gpuTextureWrapper || (samples ?? 1) <= 1) {\r\n return;\r\n }\r\n\r\n const width = texture.width;\r\n const height = texture.height;\r\n\r\n const gpuMSAATexture = this.createTexture(\r\n { width, height, layers: 1 },\r\n false,\r\n false,\r\n false,\r\n false,\r\n false,\r\n gpuTextureWrapper.format,\r\n samples,\r\n this._commandEncoderForCreation,\r\n WebGPUConstants.TextureUsage.RenderAttachment,\r\n 0,\r\n texture.label ? \"MSAA\" + texture.label : undefined\r\n );\r\n gpuTextureWrapper.setMSAATexture(gpuMSAATexture, index);\r\n }\r\n\r\n //------------------------------------------------------------------------------\r\n // Update\r\n //------------------------------------------------------------------------------\r\n\r\n public updateCubeTextures(\r\n imageBitmaps: ImageBitmap[] | Uint8Array[],\r\n gpuTexture: GPUTexture,\r\n width: number,\r\n height: number,\r\n format: GPUTextureFormat,\r\n invertY = false,\r\n premultiplyAlpha = false,\r\n offsetX = 0,\r\n offsetY = 0\r\n ): void {\r\n const faces = [0, 3, 1, 4, 2, 5];\r\n\r\n for (let f = 0; f < faces.length; ++f) {\r\n const imageBitmap = imageBitmaps[faces[f]];\r\n\r\n this.updateTexture(imageBitmap, gpuTexture, width, height, 1, format, f, 0, invertY, premultiplyAlpha, offsetX, offsetY);\r\n }\r\n }\r\n\r\n // TODO WEBGPU handle data source not being in the same format than the destination texture?\r\n public updateTexture(\r\n imageBitmap: ImageBitmap | Uint8Array | ImageData | HTMLImageElement | HTMLVideoElement | VideoFrame | HTMLCanvasElement | OffscreenCanvas,\r\n texture: GPUTexture | InternalTexture,\r\n width: number,\r\n height: number,\r\n layers: number,\r\n format: GPUTextureFormat,\r\n faceIndex: number = 0,\r\n mipLevel: number = 0,\r\n invertY = false,\r\n premultiplyAlpha = false,\r\n offsetX = 0,\r\n offsetY = 0,\r\n allowGPUOptimization?: boolean\r\n ): void {\r\n const gpuTexture = WebGPUTextureHelper.IsInternalTexture(texture) ? (texture._hardwareTexture as WebGPUHardwareTexture).underlyingResource! : texture;\r\n const blockInformation = WebGPUTextureHelper.GetBlockInformationFromFormat(format);\r\n const gpuOrHdwTexture = WebGPUTextureHelper.IsInternalTexture(texture) ? (texture._hardwareTexture as WebGPUHardwareTexture) : texture;\r\n\r\n const textureCopyView: GPUImageCopyTextureTagged = {\r\n texture: gpuTexture,\r\n origin: {\r\n x: offsetX,\r\n y: offsetY,\r\n z: Math.max(faceIndex, 0),\r\n },\r\n mipLevel: mipLevel,\r\n premultipliedAlpha: premultiplyAlpha,\r\n };\r\n\r\n const textureExtent = {\r\n width: Math.ceil(width / blockInformation.width) * blockInformation.width,\r\n height: Math.ceil(height / blockInformation.height) * blockInformation.height,\r\n depthOrArrayLayers: layers || 1,\r\n };\r\n\r\n if ((imageBitmap as Uint8Array).byteLength !== undefined) {\r\n imageBitmap = imageBitmap as Uint8Array;\r\n\r\n const bytesPerRow = Math.ceil(width / blockInformation.width) * blockInformation.length;\r\n const aligned = Math.ceil(bytesPerRow / 256) * 256 === bytesPerRow;\r\n\r\n if (aligned) {\r\n const commandEncoder = this._device.createCommandEncoder({});\r\n\r\n const buffer = this._bufferManager.createRawBuffer(\r\n imageBitmap.byteLength,\r\n WebGPUConstants.BufferUsage.MapWrite | WebGPUConstants.BufferUsage.CopySrc,\r\n true,\r\n \"TempBufferForUpdateTexture\" + (gpuTexture ? \"_\" + gpuTexture.label : \"\")\r\n );\r\n\r\n const arrayBuffer = buffer.getMappedRange();\r\n\r\n new Uint8Array(arrayBuffer).set(imageBitmap);\r\n\r\n buffer.unmap();\r\n\r\n commandEncoder!.copyBufferToTexture(\r\n {\r\n buffer: buffer,\r\n offset: 0,\r\n bytesPerRow,\r\n rowsPerImage: height,\r\n },\r\n textureCopyView,\r\n textureExtent\r\n );\r\n\r\n this._device.queue.submit([commandEncoder!.finish()]);\r\n\r\n this._bufferManager.releaseBuffer(buffer);\r\n } else {\r\n this._device.queue.writeTexture(\r\n textureCopyView,\r\n imageBitmap,\r\n {\r\n offset: 0,\r\n bytesPerRow,\r\n rowsPerImage: height,\r\n },\r\n textureExtent\r\n );\r\n }\r\n\r\n if (invertY || premultiplyAlpha) {\r\n if (WebGPUTextureHelper.IsInternalTexture(texture)) {\r\n const dontUseRect = offsetX === 0 && offsetY === 0 && width === texture.width && height === texture.height;\r\n this.invertYPreMultiplyAlpha(\r\n gpuOrHdwTexture,\r\n texture.width,\r\n texture.height,\r\n format,\r\n invertY,\r\n premultiplyAlpha,\r\n faceIndex,\r\n mipLevel,\r\n layers || 1,\r\n offsetX,\r\n offsetY,\r\n dontUseRect ? 0 : width,\r\n dontUseRect ? 0 : height,\r\n undefined,\r\n allowGPUOptimization\r\n );\r\n } else {\r\n // we should never take this code path\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"updateTexture: Can't process the texture data because a GPUTexture was provided instead of an InternalTexture!\";\r\n }\r\n }\r\n } else {\r\n imageBitmap = imageBitmap as ImageBitmap | ImageData | HTMLImageElement | HTMLVideoElement | VideoFrame | HTMLCanvasElement | OffscreenCanvas;\r\n\r\n if (invertY) {\r\n textureCopyView.premultipliedAlpha = false; // we are going to handle premultiplyAlpha ourselves\r\n\r\n // we must preprocess the image\r\n if (WebGPUTextureHelper.IsInternalTexture(texture) && offsetX === 0 && offsetY === 0 && width === texture.width && height === texture.height) {\r\n // optimization when the source image is the same size than the destination texture and offsets X/Y == 0:\r\n // we simply copy the source to the destination and we apply the preprocessing on the destination\r\n this._device.queue.copyExternalImageToTexture({ source: imageBitmap }, textureCopyView, textureExtent);\r\n\r\n this.invertYPreMultiplyAlpha(\r\n gpuOrHdwTexture,\r\n width,\r\n height,\r\n format,\r\n invertY,\r\n premultiplyAlpha,\r\n faceIndex,\r\n mipLevel,\r\n layers || 1,\r\n 0,\r\n 0,\r\n 0,\r\n 0,\r\n undefined,\r\n allowGPUOptimization\r\n );\r\n } else {\r\n // we must apply the preprocessing on the source image before copying it into the destination texture\r\n const commandEncoder = this._device.createCommandEncoder({});\r\n\r\n // create a temp texture and copy the image to it\r\n const srcTexture = this.createTexture(\r\n { width, height, layers: 1 },\r\n false,\r\n false,\r\n false,\r\n false,\r\n false,\r\n format,\r\n 1,\r\n commandEncoder,\r\n WebGPUConstants.TextureUsage.CopySrc | WebGPUConstants.TextureUsage.TextureBinding,\r\n undefined,\r\n \"TempTextureForUpdateTexture\"\r\n );\r\n\r\n this._deferredReleaseTextures.push([srcTexture, null]);\r\n\r\n textureExtent.depthOrArrayLayers = 1;\r\n this._device.queue.copyExternalImageToTexture({ source: imageBitmap }, { texture: srcTexture }, textureExtent);\r\n textureExtent.depthOrArrayLayers = layers || 1;\r\n\r\n // apply the preprocessing to this temp texture\r\n this.invertYPreMultiplyAlpha(\r\n srcTexture,\r\n width,\r\n height,\r\n format,\r\n invertY,\r\n premultiplyAlpha,\r\n faceIndex,\r\n mipLevel,\r\n layers || 1,\r\n 0,\r\n 0,\r\n 0,\r\n 0,\r\n commandEncoder,\r\n allowGPUOptimization\r\n );\r\n\r\n // copy the temp texture to the destination texture\r\n commandEncoder.copyTextureToTexture({ texture: srcTexture }, textureCopyView, textureExtent);\r\n\r\n this._device.queue.submit([commandEncoder!.finish()]);\r\n }\r\n } else {\r\n // no preprocessing: direct copy to destination texture\r\n this._device.queue.copyExternalImageToTexture({ source: imageBitmap }, textureCopyView, textureExtent);\r\n }\r\n }\r\n }\r\n\r\n public readPixels(\r\n texture: GPUTexture,\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n format: GPUTextureFormat,\r\n faceIndex: number = 0,\r\n mipLevel: number = 0,\r\n buffer: Nullable<ArrayBufferView> = null,\r\n noDataConversion = false\r\n ): Promise<ArrayBufferView> {\r\n const blockInformation = WebGPUTextureHelper.GetBlockInformationFromFormat(format);\r\n\r\n const bytesPerRow = Math.ceil(width / blockInformation.width) * blockInformation.length;\r\n\r\n const bytesPerRowAligned = Math.ceil(bytesPerRow / 256) * 256;\r\n\r\n const size = bytesPerRowAligned * height;\r\n\r\n const gpuBuffer = this._bufferManager.createRawBuffer(\r\n size,\r\n WebGPUConstants.BufferUsage.MapRead | WebGPUConstants.BufferUsage.CopyDst,\r\n undefined,\r\n \"TempBufferForReadPixels\" + (texture.label ? \"_\" + texture.label : \"\")\r\n );\r\n\r\n const commandEncoder = this._device.createCommandEncoder({});\r\n\r\n commandEncoder.copyTextureToBuffer(\r\n {\r\n texture,\r\n mipLevel,\r\n origin: {\r\n x,\r\n y,\r\n z: Math.max(faceIndex, 0),\r\n },\r\n },\r\n {\r\n buffer: gpuBuffer,\r\n offset: 0,\r\n bytesPerRow: bytesPerRowAligned,\r\n },\r\n {\r\n width,\r\n height,\r\n depthOrArrayLayers: 1,\r\n }\r\n );\r\n\r\n this._device.queue.submit([commandEncoder!.finish()]);\r\n\r\n return this._bufferManager.readDataFromBuffer(\r\n gpuBuffer,\r\n size,\r\n width,\r\n height,\r\n bytesPerRow,\r\n bytesPerRowAligned,\r\n WebGPUTextureHelper.GetTextureTypeFromFormat(format),\r\n 0,\r\n buffer,\r\n true,\r\n noDataConversion\r\n );\r\n }\r\n\r\n //------------------------------------------------------------------------------\r\n // Dispose\r\n //------------------------------------------------------------------------------\r\n\r\n public releaseTexture(texture: InternalTexture | GPUTexture): void {\r\n if (WebGPUTextureHelper.IsInternalTexture(texture)) {\r\n const hardwareTexture = texture._hardwareTexture;\r\n const irradianceTexture = texture._irradianceTexture;\r\n\r\n // We can't destroy the objects just now because they could be used in the current frame - we delay the destroying after the end of the frame\r\n this._deferredReleaseTextures.push([hardwareTexture, irradianceTexture]);\r\n } else {\r\n this._deferredReleaseTextures.push([texture, null]);\r\n }\r\n }\r\n\r\n public destroyDeferredTextures(): void {\r\n for (let i = 0; i < this._deferredReleaseTextures.length; ++i) {\r\n const [hardwareTexture, irradianceTexture] = this._deferredReleaseTextures[i];\r\n\r\n if (hardwareTexture) {\r\n if (WebGPUTextureHelper.IsHardwareTexture(hardwareTexture)) {\r\n hardwareTexture.release();\r\n } else {\r\n hardwareTexture.destroy();\r\n }\r\n }\r\n irradianceTexture?.dispose();\r\n }\r\n\r\n this._deferredReleaseTextures.length = 0;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"webgpuTextureManager.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuTextureManager.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,wCAAwC;AACxC,wCAAwC;AACxC,0CAA0C;AAC1C,EAAE;AACF,+BAA+B;AAC/B,EAAE;AACF,+EAA+E;AAC/E,gFAAgF;AAChF,+EAA+E;AAC/E,4EAA4E;AAC5E,wEAAwE;AACxE,2DAA2D;AAE3D,6EAA6E;AAC7E,sDAAsD;AAEtD,6EAA6E;AAC7E,2EAA2E;AAC3E,8EAA8E;AAC9E,yEAAyE;AACzE,gFAAgF;AAChF,gFAAgF;AAChF,YAAY;AACZ,OAAO,KAAK,eAAe,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AAGjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,iEAAiE;AAEjE,uCAAuC;AACvC,MAAM,kBAAkB,GAAG;;;;;;;;;;KAUtB,CAAC;AAEN,MAAM,oBAAoB,GAAG;;;;;;;;;;KAUxB,CAAC;AAEN,MAAM,mCAAmC,GAAG;;;;;;;;;;;;;;;;;;KAkBvC,CAAC;AAEN,MAAM,qCAAqC,GAAG;;;;;;;;;;;;;;;;;;;;;KAqBzC,CAAC;AAEN,MAAM,2CAA2C,GAAG,mCAAmC,CAAC;AAExF,MAAM,6CAA6C,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAiCjD,CAAC;AAEN,MAAM,iBAAiB,GAAG;;;;;;KAMrB,CAAC;AAEN,MAAM,mBAAmB,GAAG;;;;;;;;;;KAUvB,CAAC;AAEN,MAAM,8BAA8B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA8BlC,CAAC;AAEN,MAAM,gCAAgC,GAAG;;;;;;;;;;KAUpC,CAAC;AAEN,MAAM,uCAAuC,GAAG;;;;;;;;;;KAU3C,CAAC;AAEN,IAAK,YAKJ;AALD,WAAK,YAAY;IACb,mDAAU,CAAA;IACV,qFAA2B,CAAA;IAC3B,iDAAS,CAAA;IACT,qGAAmC,CAAA;AACvC,CAAC,EALI,YAAY,KAAZ,YAAY,QAKhB;AAED,IAAK,iBAGJ;AAHD,WAAK,iBAAiB;IAClB,uEAAe,CAAA;IACf,+DAAW,CAAA;AACf,CAAC,EAHI,iBAAiB,KAAjB,iBAAiB,QAGrB;AAOD,MAAM,sBAAsB,GAAG;IAC3B,EAAE,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,oBAAoB,EAAE;IAC9D,EAAE,MAAM,EAAE,mCAAmC,EAAE,QAAQ,EAAE,qCAAqC,EAAE;IAChG,EAAE,MAAM,EAAE,iBAAiB,EAAE,QAAQ,EAAE,mBAAmB,EAAE;IAC5D,EAAE,MAAM,EAAE,2CAA2C,EAAE,QAAQ,EAAE,6CAA6C,EAAE;CACnH,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAA+B;IACtE,EAAE,EAAE,CAAC;IACL,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;IAET,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,CAAC;IACX,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IAEV,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,EAAE;IACZ,SAAS,EAAE,EAAE;IACb,UAAU,EAAE,EAAE;IACd,iBAAiB,EAAE,EAAE;IACrB,SAAS,EAAE,EAAE;IACb,SAAS,EAAE,EAAE;IACb,UAAU,EAAE,EAAE;IACd,iBAAiB,EAAE,EAAE;IAErB,WAAW,EAAE,EAAE;IACf,YAAY,EAAE,EAAE;IAChB,4GAA4G;IAE5G,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,EAAE;IACZ,SAAS,EAAE,EAAE;IACb,UAAU,EAAE,EAAE;IACd,UAAU,EAAE,EAAE;IACd,WAAW,EAAE,EAAE;IAEf,UAAU,EAAE,EAAE;IACd,UAAU,EAAE,EAAE;IACd,WAAW,EAAE,EAAE;IAEf,QAAQ,EAAE,EAAE;IACZ,YAAY,EAAE,EAAE;IAChB,WAAW,EAAE,EAAE;IACf,sBAAsB,EAAE,EAAE;IAC1B,YAAY,EAAE,EAAE;IAEhB,uBAAuB,EAAE,EAAE;CAC9B,CAAC;AAEF,gBAAgB;AAChB,MAAM,OAAO,oBAAoB;IAgB7B,gFAAgF;IAChF,mDAAmD;IACnD,gFAAgF;IAEhF,YACI,MAAoB,EACpB,MAAiB,EACjB,OAAY,EACZ,QAAkC,EAClC,aAAkC,EAClC,iBAAmC;QAjB/B,eAAU,GAAyE,EAAE,CAAC;QACtF,qBAAgB,GAAwB,EAAE,CAAC;QAC3C,oBAAe,GAAyE,EAAE,CAAC;QAC3F,0BAAqB,GAAwB,EAAE,CAAC;QAChD,6BAAwB,GAAkF,EAAE,CAAC;QAejH,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QAEpC,IAAI,iBAAiB,CAAC,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,EAAE;YACvF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;YACzD,8BAA8B,CAAC,eAAe,CAAC,aAAa,CAAC,aAAa,CAAC,GAAG,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SAC3I;QAED,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,eAAe,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7F,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,eAAe,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5F,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CACnD,CAAC,GAAG,CAAC,EACL,eAAe,CAAC,WAAW,CAAC,OAAO,GAAG,eAAe,CAAC,WAAW,CAAC,OAAO,EACzE,kBAAkB,CACrB,CAAC,kBAAkB,CAAC;QAErB,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAC5D,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACrE,CAAC;IAEO,YAAY,CAAC,MAAwB,EAAE,OAAqB,YAAY,CAAC,MAAM,EAAE,MAA4B;QACjH,MAAM,KAAK,GACP,IAAI,KAAK,YAAY,CAAC,MAAM;YACxB,CAAC,CAAC,CAAC,IAAI,CAAC;YACR,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,uBAAuB;gBAC7C,CAAC,CAAC,CAAC,CAAC,MAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,MAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC9E,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,KAAK;oBAC3B,CAAC,CAAC,CAAC,IAAI,CAAC;oBACR,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,+BAA+B;wBACrD,CAAC,CAAC,CAAC,CAAC,MAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,MAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;wBAC9E,CAAC,CAAC,CAAC,CAAC;QAElB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;YAC1B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;SAChC;QAED,IAAI,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC,cAAc,EAAE;YACjB,IAAI,OAAO,GAAG,gBAAgB,CAAC;YAC/B,IAAI,IAAI,KAAK,YAAY,CAAC,uBAAuB,IAAI,IAAI,KAAK,YAAY,CAAC,+BAA+B,EAAE;gBACxG,IAAI,MAAO,CAAC,OAAO,EAAE;oBACjB,OAAO,IAAI,mBAAmB,CAAC;iBAClC;gBACD,IAAI,MAAO,CAAC,gBAAgB,EAAE;oBAC1B,OAAO,IAAI,4BAA4B,CAAC;iBAC3C;aACJ;YAED,IAAI,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC3C,IAAI,CAAC,OAAO,EAAE;gBACV,IAAI,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACpG,IAAI,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBAE1G,IAAI,IAAI,CAAC,SAAS,EAAE;oBAChB,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;oBAC1D,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;iBACjE;gBAED,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;oBACjD,IAAI,EAAE,UAAU;iBACnB,CAAC,CAAC;gBACH,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;oBACnD,IAAI,EAAE,YAAY;iBACrB,CAAC,CAAC;gBACH,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;aAC3E;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC;gBAC/C,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC,IAAI;gBAC3C,MAAM,EAAE;oBACJ,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;oBAClB,UAAU,EAAE,MAAM;iBACrB;gBACD,QAAQ,EAAE;oBACN,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;oBAClB,UAAU,EAAE,MAAM;oBAClB,OAAO,EAAE;wBACL;4BACI,MAAM;yBACT;qBACJ;iBACJ;gBACD,SAAS,EAAE;oBACP,QAAQ,EAAE,eAAe,CAAC,iBAAiB,CAAC,aAAa;oBACzD,gBAAgB,EAAE,eAAe,CAAC,WAAW,CAAC,MAAM;iBACvD;aACJ,CAAC,CAAC;YAEH,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;SAChG;QAED,OAAO,cAAc,CAAC;IAC1B,CAAC;IAEO,iBAAiB,CAAC,MAAwB,EAAE,OAA0B,iBAAiB,CAAC,WAAW;QACvG,MAAM,KAAK,GAAG,IAAI,KAAK,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9D,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE;YAC/B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;SACrC;QAED,IAAI,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;QACzD,IAAI,CAAC,cAAc,EAAE;YACjB,IAAI,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAChD,IAAI,CAAC,OAAO,EAAE;gBACV,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;oBACjD,IAAI,EAAE,8BAA8B;iBACvC,CAAC,CAAC;gBACH,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;oBACnD,IAAI,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,uCAAuC;iBACjG,CAAC,CAAC;gBACH,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;aAChF;YAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC;gBAC/C,KAAK,EAAE,sBAAsB,IAAI,CAAC,OAAO,CAAC,QAAQ,uBAAuB,MAAM,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAAE;gBAC5H,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC,IAAI;gBAC3C,MAAM,EAAE;oBACJ,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;oBAClB,UAAU,EAAE,MAAM;iBACrB;gBACD,QAAQ,EAAE;oBACN,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;oBAClB,UAAU,EAAE,MAAM;oBAClB,OAAO,EAAE;wBACL;4BACI,MAAM;yBACT;qBACJ;iBACJ;gBACD,SAAS,EAAE;oBACP,QAAQ,EAAE,eAAe,CAAC,iBAAiB,CAAC,aAAa;oBACzD,gBAAgB,EAAE,eAAe,CAAC,WAAW,CAAC,MAAM;iBACvD;aACJ,CAAC,CAAC;YAEH,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;SACrG;QAED,OAAO,cAAc,CAAC;IAC1B,CAAC;IAEM,iBAAiB,CAAC,OAA0B;QAC/C,IAAI,CAAC,0BAA0B,GAAG,OAAO,CAAC;IAC9C,CAAC;IAEM,kBAAkB,CAAC,KAAsB,EAAE,OAAwB,EAAE,MAAwB,EAAE,OAAO,GAAG,KAAK,EAAE,cAAkC;QACrJ,MAAM,oBAAoB,GAAG,cAAc,KAAK,SAAS,CAAC;QAC1D,MAAM,CAAC,QAAQ,EAAE,eAAe,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAExI,IAAI,oBAAoB,EAAE;YACtB,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;SAC1D;QAED,cAAe,CAAC,cAAc,EAAE,CAAC,mCAAmC,OAAO,EAAE,CAAC,CAAC;QAE/E,MAAM,qBAAqB,GAAG,OAAO,CAAC,gBAAyC,CAAC;QAEhF,MAAM,oBAAoB,GAA4B;YAClD,KAAK,EAAE,sBAAsB,IAAI,CAAC,OAAO,CAAC,QAAQ,uBAAuB,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YACnK,gBAAgB,EAAE;gBACd;oBACI,IAAI,EAAE,qBAAqB,CAAC,kBAAmB,CAAC,UAAU,CAAC;wBACvD,MAAM;wBACN,SAAS,EAAE,eAAe,CAAC,oBAAoB,CAAC,GAAG;wBACnD,aAAa,EAAE,CAAC;wBAChB,cAAc,EAAE,CAAC;wBACjB,YAAY,EAAE,CAAC;wBACf,eAAe,EAAE,CAAC;wBAClB,MAAM,EAAE,eAAe,CAAC,aAAa,CAAC,GAAG;qBAC5C,CAAC;oBACF,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,IAAI;oBACnC,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,KAAK;iBACzC;aACJ;SACJ,CAAC;QACF,MAAM,WAAW,GAAG,cAAe,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC;QAE1E,MAAM,UAAU,GAA2B;YACvC,MAAM,EAAE,eAAe;YACvB,OAAO,EAAE;gBACL;oBACI,OAAO,EAAE,CAAC;oBACV,QAAQ,EAAE,IAAI,CAAC,aAAa;iBAC/B;gBACD;oBACI,OAAO,EAAE,CAAC;oBACV,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC;wBACzC,MAAM,EAAE,KAAK,CAAC,kBAAkB;qBACnC,CAAC;iBACL;aACJ;SACJ,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAE3D,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAClC,WAAW,CAAC,YAAY,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACvC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7B,WAAW,CAAC,GAAG,EAAE,CAAC;QAElB,cAAe,CAAC,aAAa,EAAE,EAAE,CAAC;QAElC,IAAI,oBAAoB,EAAE;YACtB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,cAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACtD,cAAc,GAAG,IAAW,CAAC;SAChC;IACL,CAAC;IAEM,uBAAuB,CAC1B,eAAmD,EACnD,KAAa,EACb,MAAc,EACd,MAAwB,EACxB,OAAO,GAAG,KAAK,EACf,gBAAgB,GAAG,KAAK,EACxB,SAAS,GAAG,CAAC,EACb,QAAQ,GAAG,CAAC,EACZ,MAAM,GAAG,CAAC,EACV,KAAK,GAAG,CAAC,EACT,KAAK,GAAG,CAAC,EACT,SAAS,GAAG,CAAC,EACb,UAAU,GAAG,CAAC,EACd,cAAkC;IAClC,6DAA6D;IAC7D,oBAA8B;QAE9B,MAAM,OAAO,GAAG,SAAS,KAAK,CAAC,CAAC;QAChC,MAAM,oBAAoB,GAAG,cAAc,KAAK,SAAS,CAAC;QAC1D,MAAM,CAAC,QAAQ,EAAE,eAAe,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,+BAA+B,CAAC,CAAC,CAAC,YAAY,CAAC,uBAAuB,EAAE;YACzJ,OAAO;YACP,gBAAgB;SACnB,CAAC,CAAC;QAEH,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAEnC,IAAI,oBAAoB,EAAE;YACtB,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;SAC1D;QAED,cAAe,CAAC,cAAc,EAAE,CAAC,sCAAsC,OAAO,qBAAqB,gBAAgB,EAAE,CAAC,CAAC;QAEvH,IAAI,UAAgC,CAAC;QACrC,IAAI,mBAAmB,CAAC,iBAAiB,CAAC,eAAe,CAAC,EAAE;YACxD,UAAU,GAAG,eAAe,CAAC,kBAAkB,CAAC;YAChD,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,gBAAgB,IAAI,MAAM,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE;gBACpE,2IAA2I;gBAC3I,eAAe,GAAG,SAAgB,CAAC;aACtC;SACJ;aAAM;YACH,UAAU,GAAG,eAAe,CAAC;YAC7B,eAAe,GAAG,SAAgB,CAAC;SACtC;QACD,IAAI,CAAC,UAAU,EAAE;YACb,OAAO;SACV;QAED,IAAI,OAAO,EAAE;YACT,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,EAAE,IAAI,YAAY,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;SAC9H;QAED,MAAM,qBAAqB,GAAG,eAAkD,CAAC;QAEjF,MAAM,aAAa,GACf,qBAAqB,EAAE,uBAAuB;YAC9C,IAAI,CAAC,aAAa,CACd,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,EAC5B,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,MAAM,EACN,CAAC,EACD,cAAc,EACd,eAAe,CAAC,YAAY,CAAC,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,gBAAgB,GAAG,eAAe,CAAC,YAAY,CAAC,cAAc,EAClI,SAAS,EACT,+BAA+B,CAClC,CAAC;QAEN,MAAM,oBAAoB,GAAG,qBAAqB,EAAE,2BAA2B,IAAI;YAC/E,KAAK,EAAE,sBAAsB,IAAI,CAAC,OAAO,CAAC,QAAQ,4BAA4B,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,IACvH,gBAAgB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,sBAC5C,EAAE;YACF,gBAAgB,EAAE;gBACd;oBACI,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC;wBAC3B,MAAM;wBACN,SAAS,EAAE,eAAe,CAAC,oBAAoB,CAAC,GAAG;wBACnD,YAAY,EAAE,CAAC;wBACf,aAAa,EAAE,CAAC;wBAChB,eAAe,EAAE,CAAC;wBAClB,cAAc,EAAE,CAAC;qBACpB,CAAC;oBACF,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,IAAI;oBACnC,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,KAAK;iBACzC;aACJ;SACJ,CAAC;QACF,MAAM,WAAW,GAAG,cAAe,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC;QAE1E,IAAI,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,qBAAqB,EAAE,6BAA6B,CAAC,CAAC,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;QAC9H,IAAI,CAAC,SAAS,EAAE;YACZ,MAAM,UAAU,GAA2B;gBACvC,MAAM,EAAE,eAAe;gBACvB,OAAO,EAAE;oBACL;wBACI,OAAO,EAAE,CAAC;wBACV,QAAQ,EAAE,UAAU,CAAC,UAAU,CAAC;4BAC5B,MAAM;4BACN,SAAS,EAAE,eAAe,CAAC,oBAAoB,CAAC,GAAG;4BACnD,YAAY,EAAE,QAAQ;4BACtB,aAAa,EAAE,CAAC;4BAChB,eAAe,EAAE,MAAM;4BACvB,cAAc,EAAE,SAAS;yBAC5B,CAAC;qBACL;iBACJ;aACJ,CAAC;YACF,IAAI,OAAO,EAAE;gBACT,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;oBACpB,OAAO,EAAE,CAAC;oBACV,QAAQ,EAAE;wBACN,MAAM,EAAE,IAAI,CAAC,eAAe;qBAC/B;iBACJ,CAAC,CAAC;aACN;YACD,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;SACxD;QAED,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAClC,WAAW,CAAC,YAAY,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACvC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7B,WAAW,CAAC,GAAG,EAAE,CAAC;QAElB,cAAe,CAAC,oBAAoB,CAChC;YACI,OAAO,EAAE,aAAa;SACzB,EACD;YACI,OAAO,EAAE,UAAU;YACnB,QAAQ;YACR,MAAM,EAAE;gBACJ,CAAC,EAAE,CAAC;gBACJ,CAAC,EAAE,CAAC;gBACJ,CAAC,EAAE,SAAS;aACf;SACJ,EACD;YACI,KAAK;YACL,MAAM;YACN,kBAAkB,EAAE,CAAC;SACxB,CACJ,CAAC;QAEF,IAAI,qBAAqB,EAAE;YACvB,qBAAqB,CAAC,uBAAuB,GAAG,aAAa,CAAC;YAC9D,qBAAqB,CAAC,2BAA2B,GAAG,oBAAoB,CAAC;YACzE,IAAI,OAAO,EAAE;gBACT,qBAAqB,CAAC,6BAA6B,GAAG,SAAS,CAAC;aACnE;iBAAM;gBACH,qBAAqB,CAAC,qBAAqB,GAAG,SAAS,CAAC;aAC3D;SACJ;aAAM;YACH,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;SAC7D;QAED,cAAe,CAAC,aAAa,EAAE,EAAE,CAAC;QAElC,IAAI,oBAAoB,EAAE;YACtB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,cAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACtD,cAAc,GAAG,IAAW,CAAC;SAChC;IACL,CAAC;IAEM,eAAe,CAAC,cAA8B,EAAE,MAAwB,EAAE,oBAA6C,EAAE,cAAkC;QAC9J,MAAM,oBAAoB,GAAG,cAAc,KAAK,SAAS,CAAC;QAC1D,MAAM,CAAC,QAAQ,EAAE,eAAe,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,uBAAuB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC;QAEhJ,IAAI,oBAAoB,EAAE;YACtB,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;SAC1D;QAED,cAAe,CAAC,cAAc,EAAE,CAAC,oCAAoC,CAAC,CAAC;QAEvE,MAAM,WAAW,GAAG,cAAe,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC;QAE1E,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;YAC3C,MAAM,EAAE,eAAe;YACvB,OAAO,EAAE;gBACL;oBACI,OAAO,EAAE,CAAC;oBACV,QAAQ,EAAE,cAAc;iBAC3B;aACJ;SACJ,CAAC,CAAC;QAEH,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAClC,WAAW,CAAC,YAAY,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACvC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7B,WAAW,CAAC,GAAG,EAAE,CAAC;QAElB,cAAe,CAAC,aAAa,EAAE,EAAE,CAAC;QAElC,IAAI,oBAAoB,EAAE;YACtB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,cAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACtD,cAAc,GAAG,IAAW,CAAC;SAChC;IACL,CAAC;IAED,gFAAgF;IAChF,yCAAyC;IACzC,gFAAgF;IAEzE,aAAa,CAChB,WAA4E,EAC5E,UAAU,GAAG,KAAK,EAClB,eAAe,GAAG,KAAK,EACvB,OAAO,GAAG,KAAK,EACf,gBAAgB,GAAG,KAAK,EACxB,IAAI,GAAG,KAAK,EACZ,SAA2B,eAAe,CAAC,aAAa,CAAC,UAAU,EACnE,WAAW,GAAG,CAAC,EACf,cAAkC,EAClC,KAAK,GAAG,CAAC,CAAC,EACV,gBAAgB,GAAG,CAAC,EACpB,KAAc;QAEd,WAAW,GAAG,mBAAmB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAEzD,MAAM,UAAU,GAAI,WAAmB,CAAC,MAAM,IAAI,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG;YAChB,KAAK,EAAE,WAAW,CAAC,KAAK;YACxB,MAAM,EAAE,WAAW,CAAC,MAAM;YAC1B,kBAAkB,EAAE,UAAU;SACjC,CAAC;QAEF,MAAM,oBAAoB,GAAG,8BAA8B,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;QACxH,MAAM,kBAAkB,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC1E,MAAM,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzH,MAAM,MAAM,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,cAAc,CAAC;QAE9J,gBAAgB,IAAI,UAAU,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,OAAO,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;QAExH,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,EAAE;YAC9B,4KAA4K;YAC5K,gBAAgB,IAAI,oBAAoB,GAAG,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC;SACnF;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;YAC1C,KAAK,EAAE,sBAAsB,IAAI,CAAC,OAAO,CAAC,QAAQ,WAAW,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,KAAK,IAAI,WAAW,CAAC,MAAM,IACjJ,WAAW,CAAC,kBAChB,IAAI,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,IAAI,MAAM,WAAW,WAAW,EAAE;YACrE,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,gBAAgB,CAAC,GAAG;YAC7F,MAAM;YACN,KAAK,EAAE,MAAM,GAAG,gBAAgB;YAChC,WAAW;YACX,aAAa;SAChB,CAAC,CAAC;QAEH,IAAI,mBAAmB,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE;YAChD,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAE9I,IAAI,UAAU,IAAI,eAAe,EAAE;gBAC/B,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC;aAC9E;SACJ;QAED,OAAO,UAAU,CAAC;IACtB,CAAC;IAEM,iBAAiB,CACpB,YAA+D,EAC/D,UAAU,GAAG,KAAK,EAClB,eAAe,GAAG,KAAK,EACvB,OAAO,GAAG,KAAK,EACf,gBAAgB,GAAG,KAAK,EACxB,SAA2B,eAAe,CAAC,aAAa,CAAC,UAAU,EACnE,WAAW,GAAG,CAAC,EACf,cAAkC,EAClC,KAAK,GAAG,CAAC,CAAC,EACV,gBAAgB,GAAG,CAAC,EACpB,KAAc;QAEd,WAAW,GAAG,mBAAmB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAEzD,MAAM,KAAK,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC;QAChH,MAAM,MAAM,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC;QAEnH,MAAM,oBAAoB,GAAG,8BAA8B,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;QACxH,MAAM,kBAAkB,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC1E,MAAM,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjG,MAAM,MAAM,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,cAAc,CAAC;QAE9J,gBAAgB,IAAI,UAAU,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,OAAO,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;QAExH,IAAI,CAAC,kBAAkB,EAAE;YACrB,4KAA4K;YAC5K,gBAAgB,IAAI,oBAAoB,GAAG,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC;SACnF;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;YAC1C,KAAK,EAAE,sBAAsB,IAAI,CAAC,OAAO,CAAC,QAAQ,gBAAgB,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,MAAM,MACxG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAC3B,IAAI,MAAM,WAAW,WAAW,EAAE;YAClC,IAAI,EAAE;gBACF,KAAK;gBACL,MAAM;gBACN,kBAAkB,EAAE,CAAC;aACxB;YACD,SAAS,EAAE,eAAe,CAAC,gBAAgB,CAAC,GAAG;YAC/C,MAAM;YACN,KAAK,EAAE,MAAM,GAAG,gBAAgB;YAChC,WAAW;YACX,aAAa;SAChB,CAAC,CAAC;QAEH,IAAI,mBAAmB,CAAC,kBAAkB,CAAC,YAAY,CAAC,EAAE;YACtD,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAE1G,IAAI,UAAU,IAAI,eAAe,EAAE;gBAC/B,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;aAC/E;SACJ;QAED,OAAO,UAAU,CAAC;IACtB,CAAC;IAEM,mBAAmB,CAAC,UAA8C,EAAE,MAAwB,EAAE,aAAqB,EAAE,cAAkC;QAC1J,MAAM,oBAAoB,GAAG,cAAc,KAAK,SAAS,CAAC;QAE1D,IAAI,oBAAoB,EAAE;YACtB,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;SAC1D;QAED,cAAe,CAAC,cAAc,EAAE,CAAC,yBAAyB,aAAa,SAAS,CAAC,CAAC;QAElF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE;YACxB,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC;SAC9E;QAED,cAAe,CAAC,aAAa,EAAE,EAAE,CAAC;QAElC,IAAI,oBAAoB,EAAE;YACtB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,cAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACtD,cAAc,GAAG,IAAW,CAAC;SAChC;IACL,CAAC;IAEM,eAAe,CAClB,eAAmD,EACnD,MAAwB,EACxB,aAAqB,EACrB,SAAS,GAAG,CAAC,EACb,cAAkC;QAElC,MAAM,oBAAoB,GAAG,cAAc,KAAK,SAAS,CAAC;QAC1D,MAAM,CAAC,QAAQ,EAAE,eAAe,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAE9D,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAEnC,IAAI,oBAAoB,EAAE;YACtB,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;SAC1D;QAED,cAAe,CAAC,cAAc,EAAE,CAAC,4BAA4B,SAAS,MAAM,aAAa,SAAS,CAAC,CAAC;QAEpG,IAAI,UAAgC,CAAC;QACrC,IAAI,mBAAmB,CAAC,iBAAiB,CAAC,eAAe,CAAC,EAAE;YACxD,UAAU,GAAG,eAAe,CAAC,kBAAkB,CAAC;YAChD,eAAe,CAAC,yBAAyB,GAAG,eAAe,CAAC,yBAAyB,IAAI,EAAE,CAAC;YAC5F,eAAe,CAAC,mBAAmB,GAAG,eAAe,CAAC,mBAAmB,IAAI,EAAE,CAAC;SACnF;aAAM;YACH,UAAU,GAAG,eAAe,CAAC;YAC7B,eAAe,GAAG,SAAgB,CAAC;SACtC;QACD,IAAI,CAAC,UAAU,EAAE;YACb,OAAO;SACV;QAED,MAAM,qBAAqB,GAAG,eAAkD,CAAC;QACjF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,EAAE,CAAC,EAAE;YACpC,MAAM,oBAAoB,GAAG,qBAAqB,EAAE,yBAAyB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI;gBACjG,KAAK,EAAE,sBAAsB,IAAI,CAAC,OAAO,CAAC,QAAQ,oBAAoB,MAAM,aAAa,SAAS,SAAS,CAAC,EAAE;gBAC9G,gBAAgB,EAAE;oBACd;wBACI,IAAI,EAAE,UAAU,CAAC,UAAU,CAAC;4BACxB,MAAM;4BACN,SAAS,EAAE,eAAe,CAAC,oBAAoB,CAAC,GAAG;4BACnD,YAAY,EAAE,CAAC;4BACf,aAAa,EAAE,CAAC;4BAChB,eAAe,EAAE,CAAC;4BAClB,cAAc,EAAE,SAAS;yBAC5B,CAAC;wBACF,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,IAAI;wBACnC,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,KAAK;qBACzC;iBACJ;aACJ,CAAC;YACF,IAAI,qBAAqB,EAAE;gBACvB,qBAAqB,CAAC,yBAAyB,CAAC,SAAS,CAAC,GAAG,qBAAqB,CAAC,yBAAyB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBAC9H,qBAAqB,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,oBAAoB,CAAC;aAC5F;YACD,MAAM,WAAW,GAAG,cAAe,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC;YAE1E,MAAM,SAAS,GACX,qBAAqB,EAAE,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC9D,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;oBACzB,MAAM,EAAE,eAAe;oBACvB,OAAO,EAAE;wBACL;4BACI,OAAO,EAAE,CAAC;4BACV,QAAQ,EAAE,IAAI,CAAC,cAAc;yBAChC;wBACD;4BACI,OAAO,EAAE,CAAC;4BACV,QAAQ,EAAE,UAAU,CAAC,UAAU,CAAC;gCAC5B,MAAM;gCACN,SAAS,EAAE,eAAe,CAAC,oBAAoB,CAAC,GAAG;gCACnD,YAAY,EAAE,CAAC,GAAG,CAAC;gCACnB,aAAa,EAAE,CAAC;gCAChB,eAAe,EAAE,CAAC;gCAClB,cAAc,EAAE,SAAS;6BAC5B,CAAC;yBACL;qBACJ;iBACJ,CAAC,CAAC;YACP,IAAI,qBAAqB,EAAE;gBACvB,qBAAqB,CAAC,mBAAmB,CAAC,SAAS,CAAC,GAAG,qBAAqB,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBAClH,qBAAqB,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;aAC3E;YAED,WAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAClC,WAAW,CAAC,YAAY,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACvC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7B,WAAW,CAAC,GAAG,EAAE,CAAC;SACrB;QAED,cAAe,CAAC,aAAa,EAAE,EAAE,CAAC;QAElC,IAAI,oBAAoB,EAAE;YACtB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,cAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACtD,cAAc,GAAG,IAAW,CAAC;SAChC;IACL,CAAC;IAEM,kCAAkC,CAAC,OAAwB,EAAE,KAAc,EAAE,MAAe,EAAE,KAAc,EAAE,aAAsB;QACvI,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;YAC3B,OAAO,CAAC,gBAAgB,GAAG,IAAI,qBAAqB,EAAE,CAAC;SAC1D;QAED,IAAI,KAAK,KAAK,SAAS,EAAE;YACrB,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;SACzB;QACD,IAAI,MAAM,KAAK,SAAS,EAAE;YACtB,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;SAC3B;QACD,IAAI,KAAK,KAAK,SAAS,EAAE;YACrB,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;SACzB;QAED,MAAM,iBAAiB,GAAG,OAAO,CAAC,gBAAyC,CAAC;QAC5E,MAAM,gBAAgB,GAAG,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC;QAE/F,iBAAiB,CAAC,MAAM,GAAG,mBAAmB,CAAC,sBAAsB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;QAE5H,iBAAiB,CAAC,aAAa;YAC3B,OAAO,CAAC,OAAO,KAAK,qBAAqB,CAAC,YAAY,IAAI,OAAO,CAAC,MAAM,KAAK,qBAAqB,CAAC,iBAAiB;gBAChH,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,cAAc,GAAG,eAAe,CAAC,YAAY,CAAC,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,gBAAgB;gBACpI,CAAC,CAAC,OAAO,CAAC,OAAO,KAAK,qBAAqB,CAAC,YAAY;oBACtD,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,cAAc,GAAG,eAAe,CAAC,YAAY,CAAC,gBAAgB;oBAC7F,CAAC,CAAC,CAAC,CAAC,CAAC;QAEf,iBAAiB,CAAC,uBAAuB,GAAG,gBAAgB,CAAC,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/G,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC;QAC3C,MAAM,UAAU,GAAG,KAAK,IAAI,CAAC,CAAC;QAC9B,IAAI,WAAW,CAAC;QAChB,IAAI,OAAO,CAAC,YAAY,KAAK,IAAI,EAAE;YAC/B,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;SACtC;aAAM;YACH,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,KAAM,EAAE,MAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC9F;QAED,IAAI,OAAO,CAAC,MAAM,EAAE;YAChB,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CACrC,EAAE,KAAK,EAAE,MAAM,EAAE,EACjB,OAAO,CAAC,eAAe,EACvB,OAAO,CAAC,eAAe,EACvB,OAAO,CAAC,OAAO,EACf,KAAK,EACL,iBAAiB,CAAC,MAAM,EACxB,CAAC,EACD,IAAI,CAAC,0BAA0B,EAC/B,iBAAiB,CAAC,aAAa,EAC/B,iBAAiB,CAAC,uBAAuB,EACzC,OAAO,CAAC,KAAK,CAChB,CAAC;YAEF,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAElC,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;YACtD,MAAM,MAAM,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAChF,MAAM,MAAM,GAAG,mBAAmB,CAAC,yBAAyB,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC,GAAG,CAAC;YACrK,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,oBAAoB,CAAC,IAAI,CAAC;YAEjI,iBAAiB,CAAC,UAAU,CACxB;gBACI,KAAK,EAAE,sBAAsB,IAAI,CAAC,OAAO,CAAC,QAAQ,mBAAmB,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,IAAI,MAAM,IACvI,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAC3B,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM,EAAE;gBACnC,MAAM;gBACN,SAAS;gBACT,aAAa,EAAE,WAAW;gBAC1B,cAAc,EAAE,CAAC;gBACjB,YAAY,EAAE,CAAC;gBACf,eAAe,EAAE,CAAC;gBAClB,MAAM;aACT,EACD,gBAAgB,CACnB,CAAC;SACL;aAAM;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CACjC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,EACrC,OAAO,CAAC,eAAe,EACvB,OAAO,CAAC,eAAe,EACvB,OAAO,CAAC,OAAO,EACf,KAAK,EACL,OAAO,CAAC,IAAI,EACZ,iBAAiB,CAAC,MAAM,EACxB,CAAC,EACD,IAAI,CAAC,0BAA0B,EAC/B,iBAAiB,CAAC,aAAa,EAC/B,iBAAiB,CAAC,uBAAuB,EACzC,OAAO,CAAC,KAAK,CAChB,CAAC;YAEF,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAElC,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;YACtD,MAAM,MAAM,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAChF,MAAM,MAAM,GAAG,mBAAmB,CAAC,yBAAyB,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC,GAAG,CAAC;YACrK,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS;gBAC/B,CAAC,CAAC,eAAe,CAAC,oBAAoB,CAAC,QAAQ;gBAC/C,CAAC,CAAC,OAAO,CAAC,IAAI;oBACZ,CAAC,CAAC,eAAe,CAAC,gBAAgB,CAAC,GAAG;oBACtC,CAAC,CAAC,eAAe,CAAC,oBAAoB,CAAC,GAAG,CAAC;YAEjD,iBAAiB,CAAC,UAAU,CACxB;gBACI,KAAK,EAAE,sBAAsB,IAAI,CAAC,OAAO,CAAC,QAAQ,eAAe,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GACvF,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,EACrD,IAAI,KAAK,IAAI,MAAM,IAAI,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM,EAAE;gBACzF,MAAM;gBACN,SAAS;gBACT,aAAa,EAAE,WAAW;gBAC1B,cAAc,EAAE,CAAC;gBACjB,YAAY,EAAE,CAAC;gBACf,eAAe;gBACf,MAAM;aACT,EACD,gBAAgB,CACnB,CAAC;SACL;QAED,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;QAC1C,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC;QAC7C,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;QAE1C,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAEjD,OAAO,iBAAiB,CAAC;IAC7B,CAAC;IAEM,iBAAiB,CAAC,OAAwB,EAAE,OAAe,EAAE,eAAe,GAAG,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC;QAClG,MAAM,iBAAiB,GAAG,OAAO,CAAC,gBAAmD,CAAC;QAEtF,IAAI,eAAe,EAAE;YACjB,iBAAiB,EAAE,kBAAkB,EAAE,CAAC;SAC3C;QAED,IAAI,CAAC,iBAAiB,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE;YAC3C,OAAO;SACV;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAE9B,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CACrC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,EAC5B,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,iBAAiB,CAAC,MAAM,EACxB,OAAO,EACP,IAAI,CAAC,0BAA0B,EAC/B,eAAe,CAAC,YAAY,CAAC,gBAAgB,EAC7C,CAAC,EACD,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CACrD,CAAC;QACF,iBAAiB,CAAC,cAAc,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC;IAED,gFAAgF;IAChF,0CAA0C;IAC1C,gFAAgF;IAEzE,kBAAkB,CACrB,YAA0C,EAC1C,UAAsB,EACtB,KAAa,EACb,MAAc,EACd,MAAwB,EACxB,OAAO,GAAG,KAAK,EACf,gBAAgB,GAAG,KAAK,EACxB,OAAO,GAAG,CAAC,EACX,OAAO,GAAG,CAAC;QAEX,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;YACnC,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAE3C,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;SAC5H;IACL,CAAC;IAED,4FAA4F;IACrF,aAAa,CAChB,WAA0I,EAC1I,OAAqC,EACrC,KAAa,EACb,MAAc,EACd,MAAc,EACd,MAAwB,EACxB,YAAoB,CAAC,EACrB,WAAmB,CAAC,EACpB,OAAO,GAAG,KAAK,EACf,gBAAgB,GAAG,KAAK,EACxB,OAAO,GAAG,CAAC,EACX,OAAO,GAAG,CAAC,EACX,oBAA8B;QAE9B,MAAM,UAAU,GAAG,mBAAmB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE,OAAO,CAAC,gBAA0C,CAAC,kBAAmB,CAAC,CAAC,CAAC,OAAO,CAAC;QACtJ,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,6BAA6B,CAAC,MAAM,CAAC,CAAC;QACnF,MAAM,eAAe,GAAG,mBAAmB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE,OAAO,CAAC,gBAA0C,CAAC,CAAC,CAAC,OAAO,CAAC;QAEvI,MAAM,eAAe,GAA8B;YAC/C,OAAO,EAAE,UAAU;YACnB,MAAM,EAAE;gBACJ,CAAC,EAAE,OAAO;gBACV,CAAC,EAAE,OAAO;gBACV,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;aAC5B;YACD,QAAQ,EAAE,QAAQ;YAClB,kBAAkB,EAAE,gBAAgB;SACvC,CAAC;QAEF,MAAM,aAAa,GAAG;YAClB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,KAAK;YACzE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAAC,MAAM;YAC7E,kBAAkB,EAAE,MAAM,IAAI,CAAC;SAClC,CAAC;QAEF,IAAK,WAA0B,CAAC,UAAU,KAAK,SAAS,EAAE;YACtD,WAAW,GAAG,WAAyB,CAAC;YAExC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC;YACxF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,GAAG,GAAG,KAAK,WAAW,CAAC;YAEnE,IAAI,OAAO,EAAE;gBACT,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;gBAE7D,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAC9C,WAAW,CAAC,UAAU,EACtB,eAAe,CAAC,WAAW,CAAC,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,OAAO,EAC1E,IAAI,EACJ,4BAA4B,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAC5E,CAAC;gBAEF,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;gBAE5C,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBAE7C,MAAM,CAAC,KAAK,EAAE,CAAC;gBAEf,cAAe,CAAC,mBAAmB,CAC/B;oBACI,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE,CAAC;oBACT,WAAW;oBACX,YAAY,EAAE,MAAM;iBACvB,EACD,eAAe,EACf,aAAa,CAChB,CAAC;gBAEF,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,cAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBAEtD,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;aAC7C;iBAAM;gBACH,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAC3B,eAAe,EACf,WAAW,EACX;oBACI,MAAM,EAAE,CAAC;oBACT,WAAW;oBACX,YAAY,EAAE,MAAM;iBACvB,EACD,aAAa,CAChB,CAAC;aACL;YAED,IAAI,OAAO,IAAI,gBAAgB,EAAE;gBAC7B,IAAI,mBAAmB,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE;oBAChD,MAAM,WAAW,GAAG,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,KAAK,OAAO,CAAC,KAAK,IAAI,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC;oBAC3G,IAAI,CAAC,uBAAuB,CACxB,eAAe,EACf,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,MAAM,EACd,MAAM,EACN,OAAO,EACP,gBAAgB,EAChB,SAAS,EACT,QAAQ,EACR,MAAM,IAAI,CAAC,EACX,OAAO,EACP,OAAO,EACP,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EACvB,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EACxB,SAAS,EACT,oBAAoB,CACvB,CAAC;iBACL;qBAAM;oBACH,sCAAsC;oBACtC,4CAA4C;oBAC5C,MAAM,gHAAgH,CAAC;iBAC1H;aACJ;SACJ;aAAM;YACH,WAAW,GAAG,WAA+H,CAAC;YAE9I,IAAI,OAAO,EAAE;gBACT,eAAe,CAAC,kBAAkB,GAAG,KAAK,CAAC,CAAC,oDAAoD;gBAEhG,+BAA+B;gBAC/B,IAAI,mBAAmB,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,KAAK,OAAO,CAAC,KAAK,IAAI,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE;oBAC1I,yGAAyG;oBACzG,iGAAiG;oBACjG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;oBAEvG,IAAI,CAAC,uBAAuB,CACxB,eAAe,EACf,KAAK,EACL,MAAM,EACN,MAAM,EACN,OAAO,EACP,gBAAgB,EAChB,SAAS,EACT,QAAQ,EACR,MAAM,IAAI,CAAC,EACX,CAAC,EACD,CAAC,EACD,CAAC,EACD,CAAC,EACD,SAAS,EACT,oBAAoB,CACvB,CAAC;iBACL;qBAAM;oBACH,qGAAqG;oBACrG,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;oBAE7D,iDAAiD;oBACjD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CACjC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,EAC5B,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,MAAM,EACN,CAAC,EACD,cAAc,EACd,eAAe,CAAC,YAAY,CAAC,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,cAAc,EAClF,SAAS,EACT,6BAA6B,CAChC,CAAC;oBAEF,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;oBAEvD,aAAa,CAAC,kBAAkB,GAAG,CAAC,CAAC;oBACrC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,aAAa,CAAC,CAAC;oBAC/G,aAAa,CAAC,kBAAkB,GAAG,MAAM,IAAI,CAAC,CAAC;oBAE/C,+CAA+C;oBAC/C,IAAI,CAAC,uBAAuB,CACxB,UAAU,EACV,KAAK,EACL,MAAM,EACN,MAAM,EACN,OAAO,EACP,gBAAgB,EAChB,SAAS,EACT,QAAQ,EACR,MAAM,IAAI,CAAC,EACX,CAAC,EACD,CAAC,EACD,CAAC,EACD,CAAC,EACD,cAAc,EACd,oBAAoB,CACvB,CAAC;oBAEF,mDAAmD;oBACnD,cAAc,CAAC,oBAAoB,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;oBAE7F,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,cAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;iBACzD;aACJ;iBAAM;gBACH,uDAAuD;gBACvD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;aAC1G;SACJ;IACL,CAAC;IAEM,UAAU,CACb,OAAmB,EACnB,CAAS,EACT,CAAS,EACT,KAAa,EACb,MAAc,EACd,MAAwB,EACxB,YAAoB,CAAC,EACrB,WAAmB,CAAC,EACpB,SAAoC,IAAI,EACxC,gBAAgB,GAAG,KAAK;QAExB,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,6BAA6B,CAAC,MAAM,CAAC,CAAC;QAEnF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC;QAExF,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAE9D,MAAM,IAAI,GAAG,kBAAkB,GAAG,MAAM,CAAC;QAEzC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CACjD,IAAI,EACJ,eAAe,CAAC,WAAW,CAAC,OAAO,GAAG,eAAe,CAAC,WAAW,CAAC,OAAO,EACzE,SAAS,EACT,yBAAyB,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CACzE,CAAC;QAEF,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAE7D,cAAc,CAAC,mBAAmB,CAC9B;YACI,OAAO;YACP,QAAQ;YACR,MAAM,EAAE;gBACJ,CAAC;gBACD,CAAC;gBACD,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;aAC5B;SACJ,EACD;YACI,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,CAAC;YACT,WAAW,EAAE,kBAAkB;SAClC,EACD;YACI,KAAK;YACL,MAAM;YACN,kBAAkB,EAAE,CAAC;SACxB,CACJ,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,cAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAEtD,OAAO,IAAI,CAAC,cAAc,CAAC,kBAAkB,CACzC,SAAS,EACT,IAAI,EACJ,KAAK,EACL,MAAM,EACN,WAAW,EACX,kBAAkB,EAClB,mBAAmB,CAAC,wBAAwB,CAAC,MAAM,CAAC,EACpD,CAAC,EACD,MAAM,EACN,IAAI,EACJ,gBAAgB,CACnB,CAAC;IACN,CAAC;IAED,gFAAgF;IAChF,uCAAuC;IACvC,gFAAgF;IAEzE,cAAc,CAAC,OAAqC;QACvD,IAAI,mBAAmB,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE;YAChD,MAAM,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;YACjD,MAAM,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;YAErD,6IAA6I;YAC7I,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC,CAAC;SAC5E;aAAM;YACH,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;SACvD;IACL,CAAC;IAEM,uBAAuB;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,wBAAwB,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;YAC3D,MAAM,CAAC,eAAe,EAAE,iBAAiB,CAAC,GAAG,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;YAE9E,IAAI,eAAe,EAAE;gBACjB,IAAI,mBAAmB,CAAC,iBAAiB,CAAC,eAAe,CAAC,EAAE;oBACxD,eAAe,CAAC,OAAO,EAAE,CAAC;iBAC7B;qBAAM;oBACH,eAAe,CAAC,OAAO,EAAE,CAAC;iBAC7B;aACJ;YACD,iBAAiB,EAAE,OAAO,EAAE,CAAC;SAChC;QAED,IAAI,CAAC,wBAAwB,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7C,CAAC;CACJ","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\n/* eslint-disable babylonjs/available */\r\n/* eslint-disable jsdoc/require-jsdoc */\r\n// License for the mipmap generation code:\r\n//\r\n// Copyright 2020 Brandon Jones\r\n//\r\n// Permission is hereby granted, free of charge, to any person obtaining a copy\r\n// of this software and associated documentation files (the \"Software\"), to deal\r\n// in the Software without restriction, including without limitation the rights\r\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n// copies of the Software, and to permit persons to whom the Software is\r\n// furnished to do so, subject to the following conditions:\r\n\r\n// The above copyright notice and this permission notice shall be included in\r\n// all copies or substantial portions of the Software.\r\n\r\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n// SOFTWARE.\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\nimport type { WebGPUBufferManager } from \"./webgpuBufferManager\";\r\nimport { Constants } from \"../constants\";\r\nimport type { Nullable } from \"../../types\";\r\nimport type { InternalTexture } from \"../../Materials/Textures/internalTexture\";\r\nimport { InternalTextureSource } from \"../../Materials/Textures/internalTexture\";\r\nimport type { HardwareTextureWrapper } from \"../../Materials/Textures/hardwareTextureWrapper\";\r\nimport type { BaseTexture } from \"../../Materials/Textures/baseTexture\";\r\nimport { WebGPUHardwareTexture } from \"./webgpuHardwareTexture\";\r\nimport type { WebGPUTintWASM } from \"./webgpuTintWASM\";\r\nimport type { ExternalTexture } from \"../../Materials/Textures/externalTexture\";\r\nimport type { WebGPUEngine } from \"../webgpuEngine\";\r\nimport { WebGPUTextureHelper } from \"./webgpuTextureHelper\";\r\n\r\n// TODO WEBGPU improve mipmap generation by using compute shaders\r\n\r\n// TODO WEBGPU use WGSL instead of GLSL\r\nconst mipmapVertexSource = `\r\n const vec2 pos[4] = vec2[4](vec2(-1.0f, 1.0f), vec2(1.0f, 1.0f), vec2(-1.0f, -1.0f), vec2(1.0f, -1.0f));\r\n const vec2 tex[4] = vec2[4](vec2(0.0f, 0.0f), vec2(1.0f, 0.0f), vec2(0.0f, 1.0f), vec2(1.0f, 1.0f));\r\n\r\n layout(location = 0) out vec2 vTex;\r\n\r\n void main() {\r\n vTex = tex[gl_VertexIndex];\r\n gl_Position = vec4(pos[gl_VertexIndex], 0.0, 1.0);\r\n }\r\n `;\r\n\r\nconst mipmapFragmentSource = `\r\n layout(set = 0, binding = 0) uniform sampler imgSampler;\r\n layout(set = 0, binding = 1) uniform texture2D img;\r\n\r\n layout(location = 0) in vec2 vTex;\r\n layout(location = 0) out vec4 outColor;\r\n\r\n void main() {\r\n outColor = texture(sampler2D(img, imgSampler), vTex);\r\n }\r\n `;\r\n\r\nconst invertYPreMultiplyAlphaVertexSource = `\r\n #extension GL_EXT_samplerless_texture_functions : enable\r\n\r\n const vec2 pos[4] = vec2[4](vec2(-1.0f, 1.0f), vec2(1.0f, 1.0f), vec2(-1.0f, -1.0f), vec2(1.0f, -1.0f));\r\n const vec2 tex[4] = vec2[4](vec2(0.0f, 0.0f), vec2(1.0f, 0.0f), vec2(0.0f, 1.0f), vec2(1.0f, 1.0f));\r\n\r\n layout(set = 0, binding = 0) uniform texture2D img;\r\n\r\n #ifdef INVERTY\r\n layout(location = 0) out flat ivec2 vTextureSize;\r\n #endif\r\n\r\n void main() {\r\n #ifdef INVERTY\r\n vTextureSize = textureSize(img, 0);\r\n #endif\r\n gl_Position = vec4(pos[gl_VertexIndex], 0.0, 1.0);\r\n }\r\n `;\r\n\r\nconst invertYPreMultiplyAlphaFragmentSource = `\r\n #extension GL_EXT_samplerless_texture_functions : enable\r\n\r\n layout(set = 0, binding = 0) uniform texture2D img;\r\n\r\n #ifdef INVERTY\r\n layout(location = 0) in flat ivec2 vTextureSize;\r\n #endif\r\n layout(location = 0) out vec4 outColor;\r\n\r\n void main() {\r\n #ifdef INVERTY\r\n vec4 color = texelFetch(img, ivec2(gl_FragCoord.x, vTextureSize.y - gl_FragCoord.y), 0);\r\n #else\r\n vec4 color = texelFetch(img, ivec2(gl_FragCoord.xy), 0);\r\n #endif\r\n #ifdef PREMULTIPLYALPHA\r\n color.rgb *= color.a;\r\n #endif\r\n outColor = color;\r\n }\r\n `;\r\n\r\nconst invertYPreMultiplyAlphaWithOfstVertexSource = invertYPreMultiplyAlphaVertexSource;\r\n\r\nconst invertYPreMultiplyAlphaWithOfstFragmentSource = `\r\n #extension GL_EXT_samplerless_texture_functions : enable\r\n\r\n layout(set = 0, binding = 0) uniform texture2D img;\r\n layout(set = 0, binding = 1) uniform Params {\r\n float ofstX;\r\n float ofstY;\r\n float width;\r\n float height;\r\n };\r\n\r\n #ifdef INVERTY\r\n layout(location = 0) in flat ivec2 vTextureSize;\r\n #endif\r\n layout(location = 0) out vec4 outColor;\r\n\r\n void main() {\r\n if (gl_FragCoord.x < ofstX || gl_FragCoord.x >= ofstX + width) {\r\n discard;\r\n }\r\n if (gl_FragCoord.y < ofstY || gl_FragCoord.y >= ofstY + height) {\r\n discard;\r\n }\r\n #ifdef INVERTY\r\n vec4 color = texelFetch(img, ivec2(gl_FragCoord.x, ofstY + height - (gl_FragCoord.y - ofstY)), 0);\r\n #else\r\n vec4 color = texelFetch(img, ivec2(gl_FragCoord.xy), 0);\r\n #endif\r\n #ifdef PREMULTIPLYALPHA\r\n color.rgb *= color.a;\r\n #endif\r\n outColor = color;\r\n }\r\n `;\r\n\r\nconst clearVertexSource = `\r\n const vec2 pos[4] = vec2[4](vec2(-1.0f, 1.0f), vec2(1.0f, 1.0f), vec2(-1.0f, -1.0f), vec2(1.0f, -1.0f));\r\n\r\n void main() {\r\n gl_Position = vec4(pos[gl_VertexIndex], 0.0, 1.0);\r\n }\r\n `;\r\n\r\nconst clearFragmentSource = `\r\n layout(set = 0, binding = 0) uniform Uniforms {\r\n uniform vec4 color;\r\n };\r\n\r\n layout(location = 0) out vec4 outColor;\r\n\r\n void main() {\r\n outColor = color;\r\n }\r\n `;\r\n\r\nconst copyVideoToTextureVertexSource = `\r\n struct VertexOutput {\r\n @builtin(position) Position : vec4<f32>,\r\n @location(0) fragUV : vec2<f32>\r\n }\r\n\r\n @vertex\r\n fn main(\r\n @builtin(vertex_index) VertexIndex : u32\r\n ) -> VertexOutput {\r\n var pos = array<vec2<f32>, 4>(\r\n vec2(-1.0, 1.0),\r\n vec2( 1.0, 1.0),\r\n vec2(-1.0, -1.0),\r\n vec2( 1.0, -1.0)\r\n );\r\n var tex = array<vec2<f32>, 4>(\r\n vec2(0.0, 0.0),\r\n vec2(1.0, 0.0),\r\n vec2(0.0, 1.0),\r\n vec2(1.0, 1.0)\r\n );\r\n\r\n var output: VertexOutput;\r\n\r\n output.Position = vec4<f32>(pos[VertexIndex], 0.0, 1.0);\r\n output.fragUV = tex[VertexIndex];\r\n\r\n return output;\r\n }\r\n `;\r\n\r\nconst copyVideoToTextureFragmentSource = `\r\n @group(0) @binding(0) var videoSampler: sampler;\r\n @group(0) @binding(1) var videoTexture: texture_external;\r\n\r\n @fragment\r\n fn main(\r\n @location(0) fragUV: vec2<f32>\r\n ) -> @location(0) vec4<f32> {\r\n return textureSampleBaseClampToEdge(videoTexture, videoSampler, fragUV);\r\n }\r\n `;\r\n\r\nconst copyVideoToTextureInvertYFragmentSource = `\r\n @group(0) @binding(0) var videoSampler: sampler;\r\n @group(0) @binding(1) var videoTexture: texture_external;\r\n\r\n @fragment\r\n fn main(\r\n @location(0) fragUV: vec2<f32>\r\n ) -> @location(0) vec4<f32> {\r\n return textureSampleBaseClampToEdge(videoTexture, videoSampler, vec2<f32>(fragUV.x, 1.0 - fragUV.y));\r\n }\r\n `;\r\n\r\nenum PipelineType {\r\n MipMap = 0,\r\n InvertYPremultiplyAlpha = 1,\r\n Clear = 2,\r\n InvertYPremultiplyAlphaWithOfst = 3,\r\n}\r\n\r\nenum VideoPipelineType {\r\n DontInvertY = 0,\r\n InvertY = 1,\r\n}\r\n\r\ninterface IPipelineParameters {\r\n invertY?: boolean;\r\n premultiplyAlpha?: boolean;\r\n}\r\n\r\nconst shadersForPipelineType = [\r\n { vertex: mipmapVertexSource, fragment: mipmapFragmentSource },\r\n { vertex: invertYPreMultiplyAlphaVertexSource, fragment: invertYPreMultiplyAlphaFragmentSource },\r\n { vertex: clearVertexSource, fragment: clearFragmentSource },\r\n { vertex: invertYPreMultiplyAlphaWithOfstVertexSource, fragment: invertYPreMultiplyAlphaWithOfstFragmentSource },\r\n];\r\n\r\n/**\r\n * Map a (renderable) texture format (GPUTextureFormat) to an index for fast lookup (in caches for eg)\r\n * The number of entries should not go over 64! Else, the code in WebGPUCacheRenderPipeline.setMRT should be updated\r\n */\r\nexport const renderableTextureFormatToIndex: { [name: string]: number } = {\r\n \"\": 0,\r\n r8unorm: 1,\r\n r8uint: 2,\r\n r8sint: 3,\r\n\r\n r16uint: 4,\r\n r16sint: 5,\r\n r16float: 6,\r\n rg8unorm: 7,\r\n rg8uint: 8,\r\n rg8sint: 9,\r\n\r\n r32uint: 10,\r\n r32sint: 11,\r\n r32float: 12,\r\n rg16uint: 13,\r\n rg16sint: 14,\r\n rg16float: 15,\r\n rgba8unorm: 16,\r\n \"rgba8unorm-srgb\": 17,\r\n rgba8uint: 18,\r\n rgba8sint: 19,\r\n bgra8unorm: 20,\r\n \"bgra8unorm-srgb\": 21,\r\n\r\n rgb10a2uint: 22,\r\n rgb10a2unorm: 23,\r\n /* rg11b10ufloat: this entry is dynamically added if the \"RG11B10UFloatRenderable\" extension is supported */\r\n\r\n rg32uint: 24,\r\n rg32sint: 25,\r\n rg32float: 26,\r\n rgba16uint: 27,\r\n rgba16sint: 28,\r\n rgba16float: 29,\r\n\r\n rgba32uint: 30,\r\n rgba32sint: 31,\r\n rgba32float: 32,\r\n\r\n stencil8: 33,\r\n depth16unorm: 34,\r\n depth24plus: 35,\r\n \"depth24plus-stencil8\": 36,\r\n depth32float: 37,\r\n\r\n \"depth32float-stencil8\": 38,\r\n};\r\n\r\n/** @internal */\r\nexport class WebGPUTextureManager {\r\n private _engine: WebGPUEngine;\r\n private _device: GPUDevice;\r\n private _glslang: any;\r\n private _tintWASM: Nullable<WebGPUTintWASM>;\r\n private _bufferManager: WebGPUBufferManager;\r\n private _mipmapSampler: GPUSampler;\r\n private _videoSampler: GPUSampler;\r\n private _ubCopyWithOfst: GPUBuffer;\r\n private _pipelines: { [format: string]: Array<[GPURenderPipeline, GPUBindGroupLayout]> } = {};\r\n private _compiledShaders: GPUShaderModule[][] = [];\r\n private _videoPipelines: { [format: string]: Array<[GPURenderPipeline, GPUBindGroupLayout]> } = {};\r\n private _videoCompiledShaders: GPUShaderModule[][] = [];\r\n private _deferredReleaseTextures: Array<[Nullable<HardwareTextureWrapper | GPUTexture>, Nullable<BaseTexture>]> = [];\r\n private _commandEncoderForCreation: GPUCommandEncoder;\r\n\r\n //------------------------------------------------------------------------------\r\n // Initialization / Helpers\r\n //------------------------------------------------------------------------------\r\n\r\n constructor(\r\n engine: WebGPUEngine,\r\n device: GPUDevice,\r\n glslang: any,\r\n tintWASM: Nullable<WebGPUTintWASM>,\r\n bufferManager: WebGPUBufferManager,\r\n enabledExtensions: GPUFeatureName[]\r\n ) {\r\n this._engine = engine;\r\n this._device = device;\r\n this._glslang = glslang;\r\n this._tintWASM = tintWASM;\r\n this._bufferManager = bufferManager;\r\n\r\n if (enabledExtensions.indexOf(WebGPUConstants.FeatureName.RG11B10UFloatRenderable) !== -1) {\r\n const keys = Object.keys(renderableTextureFormatToIndex);\r\n renderableTextureFormatToIndex[WebGPUConstants.TextureFormat.RG11B10UFloat] = renderableTextureFormatToIndex[keys[keys.length - 1]] + 1;\r\n }\r\n\r\n this._mipmapSampler = device.createSampler({ minFilter: WebGPUConstants.FilterMode.Linear });\r\n this._videoSampler = device.createSampler({ minFilter: WebGPUConstants.FilterMode.Linear });\r\n this._ubCopyWithOfst = this._bufferManager.createBuffer(\r\n 4 * 4,\r\n WebGPUConstants.BufferUsage.Uniform | WebGPUConstants.BufferUsage.CopyDst,\r\n \"UBCopyWithOffset\"\r\n ).underlyingResource;\r\n\r\n this._getPipeline(WebGPUConstants.TextureFormat.RGBA8Unorm);\r\n this._getVideoPipeline(WebGPUConstants.TextureFormat.RGBA8Unorm);\r\n }\r\n\r\n private _getPipeline(format: GPUTextureFormat, type: PipelineType = PipelineType.MipMap, params?: IPipelineParameters): [GPURenderPipeline, GPUBindGroupLayout] {\r\n const index =\r\n type === PipelineType.MipMap\r\n ? 1 << 0\r\n : type === PipelineType.InvertYPremultiplyAlpha\r\n ? ((params!.invertY ? 1 : 0) << 1) + ((params!.premultiplyAlpha ? 1 : 0) << 2)\r\n : type === PipelineType.Clear\r\n ? 1 << 3\r\n : type === PipelineType.InvertYPremultiplyAlphaWithOfst\r\n ? ((params!.invertY ? 1 : 0) << 4) + ((params!.premultiplyAlpha ? 1 : 0) << 5)\r\n : 0;\r\n\r\n if (!this._pipelines[format]) {\r\n this._pipelines[format] = [];\r\n }\r\n\r\n let pipelineAndBGL = this._pipelines[format][index];\r\n if (!pipelineAndBGL) {\r\n let defines = \"#version 450\\n\";\r\n if (type === PipelineType.InvertYPremultiplyAlpha || type === PipelineType.InvertYPremultiplyAlphaWithOfst) {\r\n if (params!.invertY) {\r\n defines += \"#define INVERTY\\n\";\r\n }\r\n if (params!.premultiplyAlpha) {\r\n defines += \"#define PREMULTIPLYALPHA\\n\";\r\n }\r\n }\r\n\r\n let modules = this._compiledShaders[index];\r\n if (!modules) {\r\n let vertexCode = this._glslang.compileGLSL(defines + shadersForPipelineType[type].vertex, \"vertex\");\r\n let fragmentCode = this._glslang.compileGLSL(defines + shadersForPipelineType[type].fragment, \"fragment\");\r\n\r\n if (this._tintWASM) {\r\n vertexCode = this._tintWASM.convertSpirV2WGSL(vertexCode);\r\n fragmentCode = this._tintWASM.convertSpirV2WGSL(fragmentCode);\r\n }\r\n\r\n const vertexModule = this._device.createShaderModule({\r\n code: vertexCode,\r\n });\r\n const fragmentModule = this._device.createShaderModule({\r\n code: fragmentCode,\r\n });\r\n modules = this._compiledShaders[index] = [vertexModule, fragmentModule];\r\n }\r\n\r\n const pipeline = this._device.createRenderPipeline({\r\n layout: WebGPUConstants.AutoLayoutMode.Auto,\r\n vertex: {\r\n module: modules[0],\r\n entryPoint: \"main\",\r\n },\r\n fragment: {\r\n module: modules[1],\r\n entryPoint: \"main\",\r\n targets: [\r\n {\r\n format,\r\n },\r\n ],\r\n },\r\n primitive: {\r\n topology: WebGPUConstants.PrimitiveTopology.TriangleStrip,\r\n stripIndexFormat: WebGPUConstants.IndexFormat.Uint16,\r\n },\r\n });\r\n\r\n pipelineAndBGL = this._pipelines[format][index] = [pipeline, pipeline.getBindGroupLayout(0)];\r\n }\r\n\r\n return pipelineAndBGL;\r\n }\r\n\r\n private _getVideoPipeline(format: GPUTextureFormat, type: VideoPipelineType = VideoPipelineType.DontInvertY): [GPURenderPipeline, GPUBindGroupLayout] {\r\n const index = type === VideoPipelineType.InvertY ? 1 << 0 : 0;\r\n\r\n if (!this._videoPipelines[format]) {\r\n this._videoPipelines[format] = [];\r\n }\r\n\r\n let pipelineAndBGL = this._videoPipelines[format][index];\r\n if (!pipelineAndBGL) {\r\n let modules = this._videoCompiledShaders[index];\r\n if (!modules) {\r\n const vertexModule = this._device.createShaderModule({\r\n code: copyVideoToTextureVertexSource,\r\n });\r\n const fragmentModule = this._device.createShaderModule({\r\n code: index === 0 ? copyVideoToTextureFragmentSource : copyVideoToTextureInvertYFragmentSource,\r\n });\r\n modules = this._videoCompiledShaders[index] = [vertexModule, fragmentModule];\r\n }\r\n\r\n const pipeline = this._device.createRenderPipeline({\r\n label: `BabylonWebGPUDevice${this._engine.uniqueId}_CopyVideoToTexture_${format}_${index === 0 ? \"DontInvertY\" : \"InvertY\"}`,\r\n layout: WebGPUConstants.AutoLayoutMode.Auto,\r\n vertex: {\r\n module: modules[0],\r\n entryPoint: \"main\",\r\n },\r\n fragment: {\r\n module: modules[1],\r\n entryPoint: \"main\",\r\n targets: [\r\n {\r\n format,\r\n },\r\n ],\r\n },\r\n primitive: {\r\n topology: WebGPUConstants.PrimitiveTopology.TriangleStrip,\r\n stripIndexFormat: WebGPUConstants.IndexFormat.Uint16,\r\n },\r\n });\r\n\r\n pipelineAndBGL = this._videoPipelines[format][index] = [pipeline, pipeline.getBindGroupLayout(0)];\r\n }\r\n\r\n return pipelineAndBGL;\r\n }\r\n\r\n public setCommandEncoder(encoder: GPUCommandEncoder): void {\r\n this._commandEncoderForCreation = encoder;\r\n }\r\n\r\n public copyVideoToTexture(video: ExternalTexture, texture: InternalTexture, format: GPUTextureFormat, invertY = false, commandEncoder?: GPUCommandEncoder): void {\r\n const useOwnCommandEncoder = commandEncoder === undefined;\r\n const [pipeline, bindGroupLayout] = this._getVideoPipeline(format, invertY ? VideoPipelineType.InvertY : VideoPipelineType.DontInvertY);\r\n\r\n if (useOwnCommandEncoder) {\r\n commandEncoder = this._device.createCommandEncoder({});\r\n }\r\n\r\n commandEncoder!.pushDebugGroup?.(`copy video to texture - invertY=${invertY}`);\r\n\r\n const webgpuHardwareTexture = texture._hardwareTexture as WebGPUHardwareTexture;\r\n\r\n const renderPassDescriptor: GPURenderPassDescriptor = {\r\n label: `BabylonWebGPUDevice${this._engine.uniqueId}_copyVideoToTexture_${format}_${invertY ? \"InvertY\" : \"DontInvertY\"}${texture.label ? \"_\" + texture.label : \"\"}`,\r\n colorAttachments: [\r\n {\r\n view: webgpuHardwareTexture.underlyingResource!.createView({\r\n format,\r\n dimension: WebGPUConstants.TextureViewDimension.E2d,\r\n mipLevelCount: 1,\r\n baseArrayLayer: 0,\r\n baseMipLevel: 0,\r\n arrayLayerCount: 1,\r\n aspect: WebGPUConstants.TextureAspect.All,\r\n }),\r\n loadOp: WebGPUConstants.LoadOp.Load,\r\n storeOp: WebGPUConstants.StoreOp.Store,\r\n },\r\n ],\r\n };\r\n const passEncoder = commandEncoder!.beginRenderPass(renderPassDescriptor);\r\n\r\n const descriptor: GPUBindGroupDescriptor = {\r\n layout: bindGroupLayout,\r\n entries: [\r\n {\r\n binding: 0,\r\n resource: this._videoSampler,\r\n },\r\n {\r\n binding: 1,\r\n resource: this._device.importExternalTexture({\r\n source: video.underlyingResource,\r\n }),\r\n },\r\n ],\r\n };\r\n\r\n const bindGroup = this._device.createBindGroup(descriptor);\r\n\r\n passEncoder.setPipeline(pipeline);\r\n passEncoder.setBindGroup(0, bindGroup);\r\n passEncoder.draw(4, 1, 0, 0);\r\n passEncoder.end();\r\n\r\n commandEncoder!.popDebugGroup?.();\r\n\r\n if (useOwnCommandEncoder) {\r\n this._device.queue.submit([commandEncoder!.finish()]);\r\n commandEncoder = null as any;\r\n }\r\n }\r\n\r\n public invertYPreMultiplyAlpha(\r\n gpuOrHdwTexture: GPUTexture | WebGPUHardwareTexture,\r\n width: number,\r\n height: number,\r\n format: GPUTextureFormat,\r\n invertY = false,\r\n premultiplyAlpha = false,\r\n faceIndex = 0,\r\n mipLevel = 0,\r\n layers = 1,\r\n ofstX = 0,\r\n ofstY = 0,\r\n rectWidth = 0,\r\n rectHeight = 0,\r\n commandEncoder?: GPUCommandEncoder,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n allowGPUOptimization?: boolean\r\n ): void {\r\n const useRect = rectWidth !== 0;\r\n const useOwnCommandEncoder = commandEncoder === undefined;\r\n const [pipeline, bindGroupLayout] = this._getPipeline(format, useRect ? PipelineType.InvertYPremultiplyAlphaWithOfst : PipelineType.InvertYPremultiplyAlpha, {\r\n invertY,\r\n premultiplyAlpha,\r\n });\r\n\r\n faceIndex = Math.max(faceIndex, 0);\r\n\r\n if (useOwnCommandEncoder) {\r\n commandEncoder = this._device.createCommandEncoder({});\r\n }\r\n\r\n commandEncoder!.pushDebugGroup?.(`internal process texture - invertY=${invertY} premultiplyAlpha=${premultiplyAlpha}`);\r\n\r\n let gpuTexture: Nullable<GPUTexture>;\r\n if (WebGPUTextureHelper.IsHardwareTexture(gpuOrHdwTexture)) {\r\n gpuTexture = gpuOrHdwTexture.underlyingResource;\r\n if (!(invertY && !premultiplyAlpha && layers === 1 && faceIndex === 0)) {\r\n // we optimize only for the most likely case (invertY=true, premultiplyAlpha=false, layers=1, faceIndex=0) to avoid dealing with big caches\r\n gpuOrHdwTexture = undefined as any;\r\n }\r\n } else {\r\n gpuTexture = gpuOrHdwTexture;\r\n gpuOrHdwTexture = undefined as any;\r\n }\r\n if (!gpuTexture) {\r\n return;\r\n }\r\n\r\n if (useRect) {\r\n this._bufferManager.setRawData(this._ubCopyWithOfst, 0, new Float32Array([ofstX, ofstY, rectWidth, rectHeight]), 0, 4 * 4);\r\n }\r\n\r\n const webgpuHardwareTexture = gpuOrHdwTexture as Nullable<WebGPUHardwareTexture>;\r\n\r\n const outputTexture =\r\n webgpuHardwareTexture?._copyInvertYTempTexture ??\r\n this.createTexture(\r\n { width, height, layers: 1 },\r\n false,\r\n false,\r\n false,\r\n false,\r\n false,\r\n format,\r\n 1,\r\n commandEncoder,\r\n WebGPUConstants.TextureUsage.CopySrc | WebGPUConstants.TextureUsage.RenderAttachment | WebGPUConstants.TextureUsage.TextureBinding,\r\n undefined,\r\n \"TempTextureForCopyWithInvertY\"\r\n );\r\n\r\n const renderPassDescriptor = webgpuHardwareTexture?._copyInvertYRenderPassDescr ?? {\r\n label: `BabylonWebGPUDevice${this._engine.uniqueId}_invertYPreMultiplyAlpha_${format}_${invertY ? \"InvertY\" : \"DontInvertY\"}_${\r\n premultiplyAlpha ? \"PremultiplyAlpha\" : \"DontPremultiplyAlpha\"\r\n }`,\r\n colorAttachments: [\r\n {\r\n view: outputTexture.createView({\r\n format,\r\n dimension: WebGPUConstants.TextureViewDimension.E2d,\r\n baseMipLevel: 0,\r\n mipLevelCount: 1,\r\n arrayLayerCount: 1,\r\n baseArrayLayer: 0,\r\n }),\r\n loadOp: WebGPUConstants.LoadOp.Load,\r\n storeOp: WebGPUConstants.StoreOp.Store,\r\n },\r\n ],\r\n };\r\n const passEncoder = commandEncoder!.beginRenderPass(renderPassDescriptor);\r\n\r\n let bindGroup = useRect ? webgpuHardwareTexture?._copyInvertYBindGroupWithOfst : webgpuHardwareTexture?._copyInvertYBindGroup;\r\n if (!bindGroup) {\r\n const descriptor: GPUBindGroupDescriptor = {\r\n layout: bindGroupLayout,\r\n entries: [\r\n {\r\n binding: 0,\r\n resource: gpuTexture.createView({\r\n format,\r\n dimension: WebGPUConstants.TextureViewDimension.E2d,\r\n baseMipLevel: mipLevel,\r\n mipLevelCount: 1,\r\n arrayLayerCount: layers,\r\n baseArrayLayer: faceIndex,\r\n }),\r\n },\r\n ],\r\n };\r\n if (useRect) {\r\n descriptor.entries.push({\r\n binding: 1,\r\n resource: {\r\n buffer: this._ubCopyWithOfst,\r\n },\r\n });\r\n }\r\n bindGroup = this._device.createBindGroup(descriptor);\r\n }\r\n\r\n passEncoder.setPipeline(pipeline);\r\n passEncoder.setBindGroup(0, bindGroup);\r\n passEncoder.draw(4, 1, 0, 0);\r\n passEncoder.end();\r\n\r\n commandEncoder!.copyTextureToTexture(\r\n {\r\n texture: outputTexture,\r\n },\r\n {\r\n texture: gpuTexture,\r\n mipLevel,\r\n origin: {\r\n x: 0,\r\n y: 0,\r\n z: faceIndex,\r\n },\r\n },\r\n {\r\n width,\r\n height,\r\n depthOrArrayLayers: 1,\r\n }\r\n );\r\n\r\n if (webgpuHardwareTexture) {\r\n webgpuHardwareTexture._copyInvertYTempTexture = outputTexture;\r\n webgpuHardwareTexture._copyInvertYRenderPassDescr = renderPassDescriptor;\r\n if (useRect) {\r\n webgpuHardwareTexture._copyInvertYBindGroupWithOfst = bindGroup;\r\n } else {\r\n webgpuHardwareTexture._copyInvertYBindGroup = bindGroup;\r\n }\r\n } else {\r\n this._deferredReleaseTextures.push([outputTexture, null]);\r\n }\r\n\r\n commandEncoder!.popDebugGroup?.();\r\n\r\n if (useOwnCommandEncoder) {\r\n this._device.queue.submit([commandEncoder!.finish()]);\r\n commandEncoder = null as any;\r\n }\r\n }\r\n\r\n public copyWithInvertY(srcTextureView: GPUTextureView, format: GPUTextureFormat, renderPassDescriptor: GPURenderPassDescriptor, commandEncoder?: GPUCommandEncoder): void {\r\n const useOwnCommandEncoder = commandEncoder === undefined;\r\n const [pipeline, bindGroupLayout] = this._getPipeline(format, PipelineType.InvertYPremultiplyAlpha, { invertY: true, premultiplyAlpha: false });\r\n\r\n if (useOwnCommandEncoder) {\r\n commandEncoder = this._device.createCommandEncoder({});\r\n }\r\n\r\n commandEncoder!.pushDebugGroup?.(`internal copy texture with invertY`);\r\n\r\n const passEncoder = commandEncoder!.beginRenderPass(renderPassDescriptor);\r\n\r\n const bindGroup = this._device.createBindGroup({\r\n layout: bindGroupLayout,\r\n entries: [\r\n {\r\n binding: 0,\r\n resource: srcTextureView,\r\n },\r\n ],\r\n });\r\n\r\n passEncoder.setPipeline(pipeline);\r\n passEncoder.setBindGroup(0, bindGroup);\r\n passEncoder.draw(4, 1, 0, 0);\r\n passEncoder.end();\r\n\r\n commandEncoder!.popDebugGroup?.();\r\n\r\n if (useOwnCommandEncoder) {\r\n this._device.queue.submit([commandEncoder!.finish()]);\r\n commandEncoder = null as any;\r\n }\r\n }\r\n\r\n //------------------------------------------------------------------------------\r\n // Creation\r\n //------------------------------------------------------------------------------\r\n\r\n public createTexture(\r\n imageBitmap: ImageBitmap | { width: number; height: number; layers: number },\r\n hasMipmaps = false,\r\n generateMipmaps = false,\r\n invertY = false,\r\n premultiplyAlpha = false,\r\n is3D = false,\r\n format: GPUTextureFormat = WebGPUConstants.TextureFormat.RGBA8Unorm,\r\n sampleCount = 1,\r\n commandEncoder?: GPUCommandEncoder,\r\n usage = -1,\r\n additionalUsages = 0,\r\n label?: string\r\n ): GPUTexture {\r\n sampleCount = WebGPUTextureHelper.GetSample(sampleCount);\r\n\r\n const layerCount = (imageBitmap as any).layers || 1;\r\n const textureSize = {\r\n width: imageBitmap.width,\r\n height: imageBitmap.height,\r\n depthOrArrayLayers: layerCount,\r\n };\r\n\r\n const renderAttachmentFlag = renderableTextureFormatToIndex[format] ? WebGPUConstants.TextureUsage.RenderAttachment : 0;\r\n const isCompressedFormat = WebGPUTextureHelper.IsCompressedFormat(format);\r\n const mipLevelCount = hasMipmaps ? WebGPUTextureHelper.ComputeNumMipmapLevels(imageBitmap.width, imageBitmap.height) : 1;\r\n const usages = usage >= 0 ? usage : WebGPUConstants.TextureUsage.CopySrc | WebGPUConstants.TextureUsage.CopyDst | WebGPUConstants.TextureUsage.TextureBinding;\r\n\r\n additionalUsages |= hasMipmaps && !isCompressedFormat ? WebGPUConstants.TextureUsage.CopySrc | renderAttachmentFlag : 0;\r\n\r\n if (!isCompressedFormat && !is3D) {\r\n // we don't know in advance if the texture will be updated with copyExternalImageToTexture (which requires to have those flags), so we need to force the flags all the times\r\n additionalUsages |= renderAttachmentFlag | WebGPUConstants.TextureUsage.CopyDst;\r\n }\r\n\r\n const gpuTexture = this._device.createTexture({\r\n label: `BabylonWebGPUDevice${this._engine.uniqueId}_Texture${is3D ? \"3D\" : \"2D\"}_${label ? label + \"_\" : \"\"}${textureSize.width}x${textureSize.height}x${\r\n textureSize.depthOrArrayLayers\r\n }_${hasMipmaps ? \"wmips\" : \"womips\"}_${format}_samples${sampleCount}`,\r\n size: textureSize,\r\n dimension: is3D ? WebGPUConstants.TextureDimension.E3d : WebGPUConstants.TextureDimension.E2d,\r\n format,\r\n usage: usages | additionalUsages,\r\n sampleCount,\r\n mipLevelCount,\r\n });\r\n\r\n if (WebGPUTextureHelper.IsImageBitmap(imageBitmap)) {\r\n this.updateTexture(imageBitmap, gpuTexture, imageBitmap.width, imageBitmap.height, layerCount, format, 0, 0, invertY, premultiplyAlpha, 0, 0);\r\n\r\n if (hasMipmaps && generateMipmaps) {\r\n this.generateMipmaps(gpuTexture, format, mipLevelCount, 0, commandEncoder);\r\n }\r\n }\r\n\r\n return gpuTexture;\r\n }\r\n\r\n public createCubeTexture(\r\n imageBitmaps: ImageBitmap[] | { width: number; height: number },\r\n hasMipmaps = false,\r\n generateMipmaps = false,\r\n invertY = false,\r\n premultiplyAlpha = false,\r\n format: GPUTextureFormat = WebGPUConstants.TextureFormat.RGBA8Unorm,\r\n sampleCount = 1,\r\n commandEncoder?: GPUCommandEncoder,\r\n usage = -1,\r\n additionalUsages = 0,\r\n label?: string\r\n ): GPUTexture {\r\n sampleCount = WebGPUTextureHelper.GetSample(sampleCount);\r\n\r\n const width = WebGPUTextureHelper.IsImageBitmapArray(imageBitmaps) ? imageBitmaps[0].width : imageBitmaps.width;\r\n const height = WebGPUTextureHelper.IsImageBitmapArray(imageBitmaps) ? imageBitmaps[0].height : imageBitmaps.height;\r\n\r\n const renderAttachmentFlag = renderableTextureFormatToIndex[format] ? WebGPUConstants.TextureUsage.RenderAttachment : 0;\r\n const isCompressedFormat = WebGPUTextureHelper.IsCompressedFormat(format);\r\n const mipLevelCount = hasMipmaps ? WebGPUTextureHelper.ComputeNumMipmapLevels(width, height) : 1;\r\n const usages = usage >= 0 ? usage : WebGPUConstants.TextureUsage.CopySrc | WebGPUConstants.TextureUsage.CopyDst | WebGPUConstants.TextureUsage.TextureBinding;\r\n\r\n additionalUsages |= hasMipmaps && !isCompressedFormat ? WebGPUConstants.TextureUsage.CopySrc | renderAttachmentFlag : 0;\r\n\r\n if (!isCompressedFormat) {\r\n // we don't know in advance if the texture will be updated with copyExternalImageToTexture (which requires to have those flags), so we need to force the flags all the times\r\n additionalUsages |= renderAttachmentFlag | WebGPUConstants.TextureUsage.CopyDst;\r\n }\r\n\r\n const gpuTexture = this._device.createTexture({\r\n label: `BabylonWebGPUDevice${this._engine.uniqueId}_TextureCube_${label ? label + \"_\" : \"\"}${width}x${height}x6_${\r\n hasMipmaps ? \"wmips\" : \"womips\"\r\n }_${format}_samples${sampleCount}`,\r\n size: {\r\n width,\r\n height,\r\n depthOrArrayLayers: 6,\r\n },\r\n dimension: WebGPUConstants.TextureDimension.E2d,\r\n format,\r\n usage: usages | additionalUsages,\r\n sampleCount,\r\n mipLevelCount,\r\n });\r\n\r\n if (WebGPUTextureHelper.IsImageBitmapArray(imageBitmaps)) {\r\n this.updateCubeTextures(imageBitmaps, gpuTexture, width, height, format, invertY, premultiplyAlpha, 0, 0);\r\n\r\n if (hasMipmaps && generateMipmaps) {\r\n this.generateCubeMipmaps(gpuTexture, format, mipLevelCount, commandEncoder);\r\n }\r\n }\r\n\r\n return gpuTexture;\r\n }\r\n\r\n public generateCubeMipmaps(gpuTexture: GPUTexture | WebGPUHardwareTexture, format: GPUTextureFormat, mipLevelCount: number, commandEncoder?: GPUCommandEncoder): void {\r\n const useOwnCommandEncoder = commandEncoder === undefined;\r\n\r\n if (useOwnCommandEncoder) {\r\n commandEncoder = this._device.createCommandEncoder({});\r\n }\r\n\r\n commandEncoder!.pushDebugGroup?.(`create cube mipmaps - ${mipLevelCount} levels`);\r\n\r\n for (let f = 0; f < 6; ++f) {\r\n this.generateMipmaps(gpuTexture, format, mipLevelCount, f, commandEncoder);\r\n }\r\n\r\n commandEncoder!.popDebugGroup?.();\r\n\r\n if (useOwnCommandEncoder) {\r\n this._device.queue.submit([commandEncoder!.finish()]);\r\n commandEncoder = null as any;\r\n }\r\n }\r\n\r\n public generateMipmaps(\r\n gpuOrHdwTexture: GPUTexture | WebGPUHardwareTexture,\r\n format: GPUTextureFormat,\r\n mipLevelCount: number,\r\n faceIndex = 0,\r\n commandEncoder?: GPUCommandEncoder\r\n ): void {\r\n const useOwnCommandEncoder = commandEncoder === undefined;\r\n const [pipeline, bindGroupLayout] = this._getPipeline(format);\r\n\r\n faceIndex = Math.max(faceIndex, 0);\r\n\r\n if (useOwnCommandEncoder) {\r\n commandEncoder = this._device.createCommandEncoder({});\r\n }\r\n\r\n commandEncoder!.pushDebugGroup?.(`create mipmaps for face #${faceIndex} - ${mipLevelCount} levels`);\r\n\r\n let gpuTexture: Nullable<GPUTexture>;\r\n if (WebGPUTextureHelper.IsHardwareTexture(gpuOrHdwTexture)) {\r\n gpuTexture = gpuOrHdwTexture.underlyingResource;\r\n gpuOrHdwTexture._mipmapGenRenderPassDescr = gpuOrHdwTexture._mipmapGenRenderPassDescr || [];\r\n gpuOrHdwTexture._mipmapGenBindGroup = gpuOrHdwTexture._mipmapGenBindGroup || [];\r\n } else {\r\n gpuTexture = gpuOrHdwTexture;\r\n gpuOrHdwTexture = undefined as any;\r\n }\r\n if (!gpuTexture) {\r\n return;\r\n }\r\n\r\n const webgpuHardwareTexture = gpuOrHdwTexture as Nullable<WebGPUHardwareTexture>;\r\n for (let i = 1; i < mipLevelCount; ++i) {\r\n const renderPassDescriptor = webgpuHardwareTexture?._mipmapGenRenderPassDescr[faceIndex]?.[i - 1] ?? {\r\n label: `BabylonWebGPUDevice${this._engine.uniqueId}_generateMipmaps_${format}_faceIndex${faceIndex}_level${i}`,\r\n colorAttachments: [\r\n {\r\n view: gpuTexture.createView({\r\n format,\r\n dimension: WebGPUConstants.TextureViewDimension.E2d,\r\n baseMipLevel: i,\r\n mipLevelCount: 1,\r\n arrayLayerCount: 1,\r\n baseArrayLayer: faceIndex,\r\n }),\r\n loadOp: WebGPUConstants.LoadOp.Load,\r\n storeOp: WebGPUConstants.StoreOp.Store,\r\n },\r\n ],\r\n };\r\n if (webgpuHardwareTexture) {\r\n webgpuHardwareTexture._mipmapGenRenderPassDescr[faceIndex] = webgpuHardwareTexture._mipmapGenRenderPassDescr[faceIndex] || [];\r\n webgpuHardwareTexture._mipmapGenRenderPassDescr[faceIndex][i - 1] = renderPassDescriptor;\r\n }\r\n const passEncoder = commandEncoder!.beginRenderPass(renderPassDescriptor);\r\n\r\n const bindGroup =\r\n webgpuHardwareTexture?._mipmapGenBindGroup[faceIndex]?.[i - 1] ??\r\n this._device.createBindGroup({\r\n layout: bindGroupLayout,\r\n entries: [\r\n {\r\n binding: 0,\r\n resource: this._mipmapSampler,\r\n },\r\n {\r\n binding: 1,\r\n resource: gpuTexture.createView({\r\n format,\r\n dimension: WebGPUConstants.TextureViewDimension.E2d,\r\n baseMipLevel: i - 1,\r\n mipLevelCount: 1,\r\n arrayLayerCount: 1,\r\n baseArrayLayer: faceIndex,\r\n }),\r\n },\r\n ],\r\n });\r\n if (webgpuHardwareTexture) {\r\n webgpuHardwareTexture._mipmapGenBindGroup[faceIndex] = webgpuHardwareTexture._mipmapGenBindGroup[faceIndex] || [];\r\n webgpuHardwareTexture._mipmapGenBindGroup[faceIndex][i - 1] = bindGroup;\r\n }\r\n\r\n passEncoder.setPipeline(pipeline);\r\n passEncoder.setBindGroup(0, bindGroup);\r\n passEncoder.draw(4, 1, 0, 0);\r\n passEncoder.end();\r\n }\r\n\r\n commandEncoder!.popDebugGroup?.();\r\n\r\n if (useOwnCommandEncoder) {\r\n this._device.queue.submit([commandEncoder!.finish()]);\r\n commandEncoder = null as any;\r\n }\r\n }\r\n\r\n public createGPUTextureForInternalTexture(texture: InternalTexture, width?: number, height?: number, depth?: number, creationFlags?: number): WebGPUHardwareTexture {\r\n if (!texture._hardwareTexture) {\r\n texture._hardwareTexture = new WebGPUHardwareTexture();\r\n }\r\n\r\n if (width === undefined) {\r\n width = texture.width;\r\n }\r\n if (height === undefined) {\r\n height = texture.height;\r\n }\r\n if (depth === undefined) {\r\n depth = texture.depth;\r\n }\r\n\r\n const gpuTextureWrapper = texture._hardwareTexture as WebGPUHardwareTexture;\r\n const isStorageTexture = ((creationFlags ?? 0) & Constants.TEXTURE_CREATIONFLAG_STORAGE) !== 0;\r\n\r\n gpuTextureWrapper.format = WebGPUTextureHelper.GetWebGPUTextureFormat(texture.type, texture.format, texture._useSRGBBuffer);\r\n\r\n gpuTextureWrapper.textureUsages =\r\n texture._source === InternalTextureSource.RenderTarget || texture.source === InternalTextureSource.MultiRenderTarget\r\n ? WebGPUConstants.TextureUsage.TextureBinding | WebGPUConstants.TextureUsage.CopySrc | WebGPUConstants.TextureUsage.RenderAttachment\r\n : texture._source === InternalTextureSource.DepthStencil\r\n ? WebGPUConstants.TextureUsage.TextureBinding | WebGPUConstants.TextureUsage.RenderAttachment\r\n : -1;\r\n\r\n gpuTextureWrapper.textureAdditionalUsages = isStorageTexture ? WebGPUConstants.TextureUsage.StorageBinding : 0;\r\n\r\n const hasMipMaps = texture.generateMipMaps;\r\n const layerCount = depth || 1;\r\n let mipmapCount;\r\n if (texture._maxLodLevel !== null) {\r\n mipmapCount = texture._maxLodLevel;\r\n } else {\r\n mipmapCount = hasMipMaps ? WebGPUTextureHelper.ComputeNumMipmapLevels(width!, height!) : 1;\r\n }\r\n\r\n if (texture.isCube) {\r\n const gpuTexture = this.createCubeTexture(\r\n { width, height },\r\n texture.generateMipMaps,\r\n texture.generateMipMaps,\r\n texture.invertY,\r\n false,\r\n gpuTextureWrapper.format,\r\n 1,\r\n this._commandEncoderForCreation,\r\n gpuTextureWrapper.textureUsages,\r\n gpuTextureWrapper.textureAdditionalUsages,\r\n texture.label\r\n );\r\n\r\n gpuTextureWrapper.set(gpuTexture);\r\n\r\n const arrayLayerCount = texture.is3D ? 1 : layerCount;\r\n const format = WebGPUTextureHelper.GetDepthFormatOnly(gpuTextureWrapper.format);\r\n const aspect = WebGPUTextureHelper.HasDepthAndStencilAspects(gpuTextureWrapper.format) ? WebGPUConstants.TextureAspect.DepthOnly : WebGPUConstants.TextureAspect.All;\r\n const dimension = texture.is2DArray ? WebGPUConstants.TextureViewDimension.CubeArray : WebGPUConstants.TextureViewDimension.Cube;\r\n\r\n gpuTextureWrapper.createView(\r\n {\r\n label: `BabylonWebGPUDevice${this._engine.uniqueId}_TextureViewCube${texture.is2DArray ? \"_Array\" + arrayLayerCount : \"\"}_${width}x${height}_${\r\n hasMipMaps ? \"wmips\" : \"womips\"\r\n }_${format}_${dimension}_${aspect}`,\r\n format,\r\n dimension,\r\n mipLevelCount: mipmapCount,\r\n baseArrayLayer: 0,\r\n baseMipLevel: 0,\r\n arrayLayerCount: 6,\r\n aspect,\r\n },\r\n isStorageTexture\r\n );\r\n } else {\r\n const gpuTexture = this.createTexture(\r\n { width, height, layers: layerCount },\r\n texture.generateMipMaps,\r\n texture.generateMipMaps,\r\n texture.invertY,\r\n false,\r\n texture.is3D,\r\n gpuTextureWrapper.format,\r\n 1,\r\n this._commandEncoderForCreation,\r\n gpuTextureWrapper.textureUsages,\r\n gpuTextureWrapper.textureAdditionalUsages,\r\n texture.label\r\n );\r\n\r\n gpuTextureWrapper.set(gpuTexture);\r\n\r\n const arrayLayerCount = texture.is3D ? 1 : layerCount;\r\n const format = WebGPUTextureHelper.GetDepthFormatOnly(gpuTextureWrapper.format);\r\n const aspect = WebGPUTextureHelper.HasDepthAndStencilAspects(gpuTextureWrapper.format) ? WebGPUConstants.TextureAspect.DepthOnly : WebGPUConstants.TextureAspect.All;\r\n const dimension = texture.is2DArray\r\n ? WebGPUConstants.TextureViewDimension.E2dArray\r\n : texture.is3D\r\n ? WebGPUConstants.TextureDimension.E3d\r\n : WebGPUConstants.TextureViewDimension.E2d;\r\n\r\n gpuTextureWrapper.createView(\r\n {\r\n label: `BabylonWebGPUDevice${this._engine.uniqueId}_TextureView${texture.is3D ? \"3D\" : \"2D\"}${\r\n texture.is2DArray ? \"_Array\" + arrayLayerCount : \"\"\r\n }_${width}x${height}_${hasMipMaps ? \"wmips\" : \"womips\"}_${format}_${dimension}_${aspect}`,\r\n format,\r\n dimension,\r\n mipLevelCount: mipmapCount,\r\n baseArrayLayer: 0,\r\n baseMipLevel: 0,\r\n arrayLayerCount,\r\n aspect,\r\n },\r\n isStorageTexture\r\n );\r\n }\r\n\r\n texture.width = texture.baseWidth = width;\r\n texture.height = texture.baseHeight = height;\r\n texture.depth = texture.baseDepth = depth;\r\n\r\n this.createMSAATexture(texture, texture.samples);\r\n\r\n return gpuTextureWrapper;\r\n }\r\n\r\n public createMSAATexture(texture: InternalTexture, samples: number, releaseExisting = true, index = -1): void {\r\n const gpuTextureWrapper = texture._hardwareTexture as Nullable<WebGPUHardwareTexture>;\r\n\r\n if (releaseExisting) {\r\n gpuTextureWrapper?.releaseMSAATexture();\r\n }\r\n\r\n if (!gpuTextureWrapper || (samples ?? 1) <= 1) {\r\n return;\r\n }\r\n\r\n const width = texture.width;\r\n const height = texture.height;\r\n\r\n const gpuMSAATexture = this.createTexture(\r\n { width, height, layers: 1 },\r\n false,\r\n false,\r\n false,\r\n false,\r\n false,\r\n gpuTextureWrapper.format,\r\n samples,\r\n this._commandEncoderForCreation,\r\n WebGPUConstants.TextureUsage.RenderAttachment,\r\n 0,\r\n texture.label ? \"MSAA\" + texture.label : undefined\r\n );\r\n gpuTextureWrapper.setMSAATexture(gpuMSAATexture, index);\r\n }\r\n\r\n //------------------------------------------------------------------------------\r\n // Update\r\n //------------------------------------------------------------------------------\r\n\r\n public updateCubeTextures(\r\n imageBitmaps: ImageBitmap[] | Uint8Array[],\r\n gpuTexture: GPUTexture,\r\n width: number,\r\n height: number,\r\n format: GPUTextureFormat,\r\n invertY = false,\r\n premultiplyAlpha = false,\r\n offsetX = 0,\r\n offsetY = 0\r\n ): void {\r\n const faces = [0, 3, 1, 4, 2, 5];\r\n\r\n for (let f = 0; f < faces.length; ++f) {\r\n const imageBitmap = imageBitmaps[faces[f]];\r\n\r\n this.updateTexture(imageBitmap, gpuTexture, width, height, 1, format, f, 0, invertY, premultiplyAlpha, offsetX, offsetY);\r\n }\r\n }\r\n\r\n // TODO WEBGPU handle data source not being in the same format than the destination texture?\r\n public updateTexture(\r\n imageBitmap: ImageBitmap | Uint8Array | ImageData | HTMLImageElement | HTMLVideoElement | VideoFrame | HTMLCanvasElement | OffscreenCanvas,\r\n texture: GPUTexture | InternalTexture,\r\n width: number,\r\n height: number,\r\n layers: number,\r\n format: GPUTextureFormat,\r\n faceIndex: number = 0,\r\n mipLevel: number = 0,\r\n invertY = false,\r\n premultiplyAlpha = false,\r\n offsetX = 0,\r\n offsetY = 0,\r\n allowGPUOptimization?: boolean\r\n ): void {\r\n const gpuTexture = WebGPUTextureHelper.IsInternalTexture(texture) ? (texture._hardwareTexture as WebGPUHardwareTexture).underlyingResource! : texture;\r\n const blockInformation = WebGPUTextureHelper.GetBlockInformationFromFormat(format);\r\n const gpuOrHdwTexture = WebGPUTextureHelper.IsInternalTexture(texture) ? (texture._hardwareTexture as WebGPUHardwareTexture) : texture;\r\n\r\n const textureCopyView: GPUImageCopyTextureTagged = {\r\n texture: gpuTexture,\r\n origin: {\r\n x: offsetX,\r\n y: offsetY,\r\n z: Math.max(faceIndex, 0),\r\n },\r\n mipLevel: mipLevel,\r\n premultipliedAlpha: premultiplyAlpha,\r\n };\r\n\r\n const textureExtent = {\r\n width: Math.ceil(width / blockInformation.width) * blockInformation.width,\r\n height: Math.ceil(height / blockInformation.height) * blockInformation.height,\r\n depthOrArrayLayers: layers || 1,\r\n };\r\n\r\n if ((imageBitmap as Uint8Array).byteLength !== undefined) {\r\n imageBitmap = imageBitmap as Uint8Array;\r\n\r\n const bytesPerRow = Math.ceil(width / blockInformation.width) * blockInformation.length;\r\n const aligned = Math.ceil(bytesPerRow / 256) * 256 === bytesPerRow;\r\n\r\n if (aligned) {\r\n const commandEncoder = this._device.createCommandEncoder({});\r\n\r\n const buffer = this._bufferManager.createRawBuffer(\r\n imageBitmap.byteLength,\r\n WebGPUConstants.BufferUsage.MapWrite | WebGPUConstants.BufferUsage.CopySrc,\r\n true,\r\n \"TempBufferForUpdateTexture\" + (gpuTexture ? \"_\" + gpuTexture.label : \"\")\r\n );\r\n\r\n const arrayBuffer = buffer.getMappedRange();\r\n\r\n new Uint8Array(arrayBuffer).set(imageBitmap);\r\n\r\n buffer.unmap();\r\n\r\n commandEncoder!.copyBufferToTexture(\r\n {\r\n buffer: buffer,\r\n offset: 0,\r\n bytesPerRow,\r\n rowsPerImage: height,\r\n },\r\n textureCopyView,\r\n textureExtent\r\n );\r\n\r\n this._device.queue.submit([commandEncoder!.finish()]);\r\n\r\n this._bufferManager.releaseBuffer(buffer);\r\n } else {\r\n this._device.queue.writeTexture(\r\n textureCopyView,\r\n imageBitmap,\r\n {\r\n offset: 0,\r\n bytesPerRow,\r\n rowsPerImage: height,\r\n },\r\n textureExtent\r\n );\r\n }\r\n\r\n if (invertY || premultiplyAlpha) {\r\n if (WebGPUTextureHelper.IsInternalTexture(texture)) {\r\n const dontUseRect = offsetX === 0 && offsetY === 0 && width === texture.width && height === texture.height;\r\n this.invertYPreMultiplyAlpha(\r\n gpuOrHdwTexture,\r\n texture.width,\r\n texture.height,\r\n format,\r\n invertY,\r\n premultiplyAlpha,\r\n faceIndex,\r\n mipLevel,\r\n layers || 1,\r\n offsetX,\r\n offsetY,\r\n dontUseRect ? 0 : width,\r\n dontUseRect ? 0 : height,\r\n undefined,\r\n allowGPUOptimization\r\n );\r\n } else {\r\n // we should never take this code path\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"updateTexture: Can't process the texture data because a GPUTexture was provided instead of an InternalTexture!\";\r\n }\r\n }\r\n } else {\r\n imageBitmap = imageBitmap as ImageBitmap | ImageData | HTMLImageElement | HTMLVideoElement | VideoFrame | HTMLCanvasElement | OffscreenCanvas;\r\n\r\n if (invertY) {\r\n textureCopyView.premultipliedAlpha = false; // we are going to handle premultiplyAlpha ourselves\r\n\r\n // we must preprocess the image\r\n if (WebGPUTextureHelper.IsInternalTexture(texture) && offsetX === 0 && offsetY === 0 && width === texture.width && height === texture.height) {\r\n // optimization when the source image is the same size than the destination texture and offsets X/Y == 0:\r\n // we simply copy the source to the destination and we apply the preprocessing on the destination\r\n this._device.queue.copyExternalImageToTexture({ source: imageBitmap }, textureCopyView, textureExtent);\r\n\r\n this.invertYPreMultiplyAlpha(\r\n gpuOrHdwTexture,\r\n width,\r\n height,\r\n format,\r\n invertY,\r\n premultiplyAlpha,\r\n faceIndex,\r\n mipLevel,\r\n layers || 1,\r\n 0,\r\n 0,\r\n 0,\r\n 0,\r\n undefined,\r\n allowGPUOptimization\r\n );\r\n } else {\r\n // we must apply the preprocessing on the source image before copying it into the destination texture\r\n const commandEncoder = this._device.createCommandEncoder({});\r\n\r\n // create a temp texture and copy the image to it\r\n const srcTexture = this.createTexture(\r\n { width, height, layers: 1 },\r\n false,\r\n false,\r\n false,\r\n false,\r\n false,\r\n format,\r\n 1,\r\n commandEncoder,\r\n WebGPUConstants.TextureUsage.CopySrc | WebGPUConstants.TextureUsage.TextureBinding,\r\n undefined,\r\n \"TempTextureForUpdateTexture\"\r\n );\r\n\r\n this._deferredReleaseTextures.push([srcTexture, null]);\r\n\r\n textureExtent.depthOrArrayLayers = 1;\r\n this._device.queue.copyExternalImageToTexture({ source: imageBitmap }, { texture: srcTexture }, textureExtent);\r\n textureExtent.depthOrArrayLayers = layers || 1;\r\n\r\n // apply the preprocessing to this temp texture\r\n this.invertYPreMultiplyAlpha(\r\n srcTexture,\r\n width,\r\n height,\r\n format,\r\n invertY,\r\n premultiplyAlpha,\r\n faceIndex,\r\n mipLevel,\r\n layers || 1,\r\n 0,\r\n 0,\r\n 0,\r\n 0,\r\n commandEncoder,\r\n allowGPUOptimization\r\n );\r\n\r\n // copy the temp texture to the destination texture\r\n commandEncoder.copyTextureToTexture({ texture: srcTexture }, textureCopyView, textureExtent);\r\n\r\n this._device.queue.submit([commandEncoder!.finish()]);\r\n }\r\n } else {\r\n // no preprocessing: direct copy to destination texture\r\n this._device.queue.copyExternalImageToTexture({ source: imageBitmap }, textureCopyView, textureExtent);\r\n }\r\n }\r\n }\r\n\r\n public readPixels(\r\n texture: GPUTexture,\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n format: GPUTextureFormat,\r\n faceIndex: number = 0,\r\n mipLevel: number = 0,\r\n buffer: Nullable<ArrayBufferView> = null,\r\n noDataConversion = false\r\n ): Promise<ArrayBufferView> {\r\n const blockInformation = WebGPUTextureHelper.GetBlockInformationFromFormat(format);\r\n\r\n const bytesPerRow = Math.ceil(width / blockInformation.width) * blockInformation.length;\r\n\r\n const bytesPerRowAligned = Math.ceil(bytesPerRow / 256) * 256;\r\n\r\n const size = bytesPerRowAligned * height;\r\n\r\n const gpuBuffer = this._bufferManager.createRawBuffer(\r\n size,\r\n WebGPUConstants.BufferUsage.MapRead | WebGPUConstants.BufferUsage.CopyDst,\r\n undefined,\r\n \"TempBufferForReadPixels\" + (texture.label ? \"_\" + texture.label : \"\")\r\n );\r\n\r\n const commandEncoder = this._device.createCommandEncoder({});\r\n\r\n commandEncoder.copyTextureToBuffer(\r\n {\r\n texture,\r\n mipLevel,\r\n origin: {\r\n x,\r\n y,\r\n z: Math.max(faceIndex, 0),\r\n },\r\n },\r\n {\r\n buffer: gpuBuffer,\r\n offset: 0,\r\n bytesPerRow: bytesPerRowAligned,\r\n },\r\n {\r\n width,\r\n height,\r\n depthOrArrayLayers: 1,\r\n }\r\n );\r\n\r\n this._device.queue.submit([commandEncoder!.finish()]);\r\n\r\n return this._bufferManager.readDataFromBuffer(\r\n gpuBuffer,\r\n size,\r\n width,\r\n height,\r\n bytesPerRow,\r\n bytesPerRowAligned,\r\n WebGPUTextureHelper.GetTextureTypeFromFormat(format),\r\n 0,\r\n buffer,\r\n true,\r\n noDataConversion\r\n );\r\n }\r\n\r\n //------------------------------------------------------------------------------\r\n // Dispose\r\n //------------------------------------------------------------------------------\r\n\r\n public releaseTexture(texture: InternalTexture | GPUTexture): void {\r\n if (WebGPUTextureHelper.IsInternalTexture(texture)) {\r\n const hardwareTexture = texture._hardwareTexture;\r\n const irradianceTexture = texture._irradianceTexture;\r\n\r\n // We can't destroy the objects just now because they could be used in the current frame - we delay the destroying after the end of the frame\r\n this._deferredReleaseTextures.push([hardwareTexture, irradianceTexture]);\r\n } else {\r\n this._deferredReleaseTextures.push([texture, null]);\r\n }\r\n }\r\n\r\n public destroyDeferredTextures(): void {\r\n for (let i = 0; i < this._deferredReleaseTextures.length; ++i) {\r\n const [hardwareTexture, irradianceTexture] = this._deferredReleaseTextures[i];\r\n\r\n if (hardwareTexture) {\r\n if (WebGPUTextureHelper.IsHardwareTexture(hardwareTexture)) {\r\n hardwareTexture.release();\r\n } else {\r\n hardwareTexture.destroy();\r\n }\r\n }\r\n irradianceTexture?.dispose();\r\n }\r\n\r\n this._deferredReleaseTextures.length = 0;\r\n }\r\n}\r\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as WebGPUConstants from "./webgpuConstants.js";
|
|
2
2
|
import { PerfCounter } from "../../Misc/perfCounter.js";
|
|
3
3
|
import { WebGPUQuerySet } from "./webgpuQuerySet.js";
|
|
4
|
+
import { Logger } from "../../Misc/logger.js";
|
|
4
5
|
/** @internal */
|
|
5
6
|
export class WebGPUTimestampQuery {
|
|
6
7
|
get gpuFrameTimeCounter() {
|
|
@@ -24,7 +25,14 @@ export class WebGPUTimestampQuery {
|
|
|
24
25
|
this._enabled = value;
|
|
25
26
|
this._measureDurationState = 0;
|
|
26
27
|
if (value) {
|
|
27
|
-
|
|
28
|
+
try {
|
|
29
|
+
this._measureDuration = new WebGPUDurationMeasure(this._engine, this._device, this._bufferManager, 2000, "QuerySet_TimestampQuery");
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
this._enabled = false;
|
|
33
|
+
Logger.Error("Could not create a WebGPUDurationMeasure!\nError: " + e.message + "\nMake sure timestamp query is supported and enabled in your browser.");
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
28
36
|
}
|
|
29
37
|
else {
|
|
30
38
|
this._measureDuration.dispose();
|
|
@@ -66,8 +74,7 @@ export class WebGPUTimestampQuery {
|
|
|
66
74
|
});
|
|
67
75
|
}
|
|
68
76
|
dispose() {
|
|
69
|
-
|
|
70
|
-
(_a = this._measureDuration) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
77
|
+
this._measureDuration?.dispose();
|
|
71
78
|
}
|
|
72
79
|
}
|
|
73
80
|
/** @internal */
|
|
@@ -77,12 +84,10 @@ export class WebGPUDurationMeasure {
|
|
|
77
84
|
this._querySet = new WebGPUQuerySet(engine, count, WebGPUConstants.QueryType.Timestamp, device, bufferManager, true, querySetLabel);
|
|
78
85
|
}
|
|
79
86
|
start(encoder) {
|
|
80
|
-
|
|
81
|
-
(_a = encoder.writeTimestamp) === null || _a === void 0 ? void 0 : _a.call(encoder, this._querySet.querySet, 0);
|
|
87
|
+
encoder.writeTimestamp?.(this._querySet.querySet, 0);
|
|
82
88
|
}
|
|
83
89
|
async stop(encoder) {
|
|
84
|
-
|
|
85
|
-
(_a = encoder.writeTimestamp) === null || _a === void 0 ? void 0 : _a.call(encoder, this._querySet.querySet, 1);
|
|
90
|
+
encoder.writeTimestamp?.(this._querySet.querySet, 1);
|
|
86
91
|
return encoder.writeTimestamp ? this._querySet.readTwoValuesAndSubtract(0) : 0;
|
|
87
92
|
}
|
|
88
93
|
startPass(descriptor, index) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpuTimestampQuery.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuTimestampQuery.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,eAAe,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"webgpuTimestampQuery.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuTimestampQuery.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable babylonjs/available */\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { WebGPUBufferManager } from \"./webgpuBufferManager\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\nimport { PerfCounter } from \"../../Misc/perfCounter\";\r\nimport { WebGPUQuerySet } from \"./webgpuQuerySet\";\r\nimport type { WebGPUEngine } from \"../webgpuEngine\";\r\nimport type { WebGPUPerfCounter } from \"./webgpuPerfCounter\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\n/** @internal */\r\nexport class WebGPUTimestampQuery {\r\n private _engine: WebGPUEngine;\r\n private _device: GPUDevice;\r\n private _bufferManager: WebGPUBufferManager;\r\n\r\n private _enabled = false;\r\n private _gpuFrameTimeCounter: PerfCounter = new PerfCounter();\r\n private _measureDuration: WebGPUDurationMeasure;\r\n private _measureDurationState = 0;\r\n\r\n public get gpuFrameTimeCounter() {\r\n return this._gpuFrameTimeCounter;\r\n }\r\n\r\n constructor(engine: WebGPUEngine, device: GPUDevice, bufferManager: WebGPUBufferManager) {\r\n this._engine = engine;\r\n this._device = device;\r\n this._bufferManager = bufferManager;\r\n }\r\n\r\n public get enable(): boolean {\r\n return this._enabled;\r\n }\r\n\r\n public set enable(value: boolean) {\r\n if (this._enabled === value) {\r\n return;\r\n }\r\n\r\n this._enabled = value;\r\n this._measureDurationState = 0;\r\n if (value) {\r\n try {\r\n this._measureDuration = new WebGPUDurationMeasure(this._engine, this._device, this._bufferManager, 2000, \"QuerySet_TimestampQuery\");\r\n } catch (e) {\r\n this._enabled = false;\r\n Logger.Error(\"Could not create a WebGPUDurationMeasure!\\nError: \" + e.message + \"\\nMake sure timestamp query is supported and enabled in your browser.\");\r\n return;\r\n }\r\n } else {\r\n this._measureDuration.dispose();\r\n }\r\n }\r\n\r\n public startFrame(commandEncoder: GPUCommandEncoder): void {\r\n if (this._enabled && this._measureDurationState === 0) {\r\n this._measureDuration.start(commandEncoder);\r\n this._measureDurationState = 1;\r\n }\r\n }\r\n\r\n public endFrame(commandEncoder: GPUCommandEncoder): void {\r\n if (this._measureDurationState === 1) {\r\n this._measureDurationState = 2;\r\n this._measureDuration.stop(commandEncoder).then((duration) => {\r\n if (duration !== null && duration >= 0) {\r\n this._gpuFrameTimeCounter.fetchNewFrame();\r\n this._gpuFrameTimeCounter.addCount(duration, true);\r\n }\r\n this._measureDurationState = 0;\r\n });\r\n }\r\n }\r\n\r\n public startPass(descriptor: GPURenderPassDescriptor | GPUComputePassDescriptor, index: number): void {\r\n if (this._enabled) {\r\n this._measureDuration.startPass(descriptor, index);\r\n } else {\r\n descriptor.timestampWrites = undefined;\r\n }\r\n }\r\n\r\n public endPass(index: number, gpuPerfCounter?: WebGPUPerfCounter): void {\r\n if (!this._enabled || !gpuPerfCounter) {\r\n return;\r\n }\r\n\r\n const currentFrameId = this._engine.frameId;\r\n\r\n this._measureDuration.stopPass(index).then((duration_) => {\r\n gpuPerfCounter._addDuration(currentFrameId, duration_ !== null && duration_ > 0 ? duration_ : 0);\r\n });\r\n }\r\n\r\n public dispose() {\r\n this._measureDuration?.dispose();\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class WebGPUDurationMeasure {\r\n private _querySet: WebGPUQuerySet;\r\n private _count: number;\r\n\r\n constructor(engine: WebGPUEngine, device: GPUDevice, bufferManager: WebGPUBufferManager, count = 2, querySetLabel?: string) {\r\n this._count = count;\r\n this._querySet = new WebGPUQuerySet(engine, count, WebGPUConstants.QueryType.Timestamp, device, bufferManager, true, querySetLabel);\r\n }\r\n\r\n public start(encoder: GPUCommandEncoder): void {\r\n encoder.writeTimestamp?.(this._querySet.querySet, 0);\r\n }\r\n\r\n public async stop(encoder: GPUCommandEncoder): Promise<number | null> {\r\n encoder.writeTimestamp?.(this._querySet.querySet, 1);\r\n\r\n return encoder.writeTimestamp ? this._querySet.readTwoValuesAndSubtract(0) : 0;\r\n }\r\n\r\n public startPass(descriptor: GPURenderPassDescriptor | GPUComputePassDescriptor, index: number): void {\r\n if (index + 3 > this._count) {\r\n throw new Error(\"WebGPUDurationMeasure: index out of range (\" + index + \")\");\r\n }\r\n\r\n descriptor.timestampWrites = {\r\n querySet: this._querySet.querySet,\r\n beginningOfPassWriteIndex: index + 2,\r\n endOfPassWriteIndex: index + 3,\r\n };\r\n }\r\n\r\n public async stopPass(index: number): Promise<number | null> {\r\n return this._querySet.readTwoValuesAndSubtract(index + 2);\r\n }\r\n\r\n public dispose() {\r\n this._querySet.dispose();\r\n }\r\n}\r\n"]}
|
|
@@ -7,7 +7,10 @@ export class WebGPUTintWASM {
|
|
|
7
7
|
return;
|
|
8
8
|
}
|
|
9
9
|
twgslOptions = twgslOptions || {};
|
|
10
|
-
twgslOptions =
|
|
10
|
+
twgslOptions = {
|
|
11
|
+
...WebGPUTintWASM._TWgslDefaultOptions,
|
|
12
|
+
...twgslOptions,
|
|
13
|
+
};
|
|
11
14
|
if (twgslOptions.twgsl) {
|
|
12
15
|
WebGPUTintWASM._Twgsl = twgslOptions.twgsl;
|
|
13
16
|
return Promise.resolve();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpuTintWASM.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuTintWASM.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,6BAAyB;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAoBzC,gBAAgB;AAChB,MAAM,OAAO,cAAc;IAahB,KAAK,CAAC,SAAS,CAAC,YAA2B;QAC9C,IAAI,cAAc,CAAC,MAAM,EAAE;YACvB,OAAO;SACV;QAED,YAAY,GAAG,YAAY,IAAI,EAAE,CAAC;QAClC,YAAY,
|
|
1
|
+
{"version":3,"file":"webgpuTintWASM.js","sourceRoot":"","sources":["../../../../../dev/core/src/Engines/WebGPU/webgpuTintWASM.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,6BAAyB;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAoBzC,gBAAgB;AAChB,MAAM,OAAO,cAAc;IAahB,KAAK,CAAC,SAAS,CAAC,YAA2B;QAC9C,IAAI,cAAc,CAAC,MAAM,EAAE;YACvB,OAAO;SACV;QAED,YAAY,GAAG,YAAY,IAAI,EAAE,CAAC;QAClC,YAAY,GAAG;YACX,GAAG,cAAc,CAAC,oBAAoB;YACtC,GAAG,YAAY;SAClB,CAAC;QAEF,IAAI,YAAY,CAAC,KAAK,EAAE;YACpB,cAAc,CAAC,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC;YAC3C,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;SAC5B;QAED,IAAI,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,QAAQ,EAAE;YAC9C,MAAM,KAAK,CAAC,sBAAsB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;SAC3D;QAED,IAAK,IAAY,CAAC,KAAK,EAAE;YACrB,cAAc,CAAC,MAAM,GAAG,MAAO,IAAY,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,YAAa,CAAC,QAAS,CAAC,CAAC,CAAC;YACtG,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;SAC5B;QAED,OAAO,OAAO,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;IACrD,CAAC;IAEM,iBAAiB,CAAC,IAAiB,EAAE,yBAAyB,GAAG,KAAK;QACzE,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,cAAc,CAAC,yBAAyB,IAAI,yBAAyB,CAAC,CAAC;QACnI,IAAI,cAAc,CAAC,kBAAkB,EAAE;YACnC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAClB,MAAM,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;SACjE;QACD,OAAO,cAAc,CAAC,yBAAyB,IAAI,yBAAyB,CAAC,CAAC,CAAC,2CAA2C,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/I,CAAC;;AA/CD,yBAAyB;AACD,mCAAoB,GAAiB;IACzD,MAAM,EAAE,GAAG,KAAK,CAAC,cAAc,iBAAiB;IAChD,QAAQ,EAAE,GAAG,KAAK,CAAC,cAAc,mBAAmB;CACvD,CAAC;AAEY,iCAAkB,GAAG,KAAK,CAAC;AAE3B,wCAAyB,GAAG,KAAK,CAAC;AAEjC,qBAAM,GAAQ,IAAI,CAAC","sourcesContent":["import { Logger } from \"core/Misc/logger\";\r\nimport { Tools } from \"../../Misc/tools\";\r\n\r\n/**\r\n * Options to load the associated Twgsl library\r\n */\r\nexport interface TwgslOptions {\r\n /**\r\n * Defines an existing instance of Twgsl (useful in modules who do not access the global instance).\r\n */\r\n twgsl?: any;\r\n /**\r\n * Defines the URL of the twgsl JS File.\r\n */\r\n jsPath?: string;\r\n /**\r\n * Defines the URL of the twgsl WASM File.\r\n */\r\n wasmPath?: string;\r\n}\r\n\r\n/** @internal */\r\nexport class WebGPUTintWASM {\r\n // Default twgsl options.\r\n private static readonly _TWgslDefaultOptions: TwgslOptions = {\r\n jsPath: `${Tools._DefaultCdnUrl}/twgsl/twgsl.js`,\r\n wasmPath: `${Tools._DefaultCdnUrl}/twgsl/twgsl.wasm`,\r\n };\r\n\r\n public static ShowWGSLShaderCode = false;\r\n\r\n public static DisableUniformityAnalysis = false;\r\n\r\n private static _Twgsl: any = null;\r\n\r\n public async initTwgsl(twgslOptions?: TwgslOptions): Promise<void> {\r\n if (WebGPUTintWASM._Twgsl) {\r\n return;\r\n }\r\n\r\n twgslOptions = twgslOptions || {};\r\n twgslOptions = {\r\n ...WebGPUTintWASM._TWgslDefaultOptions,\r\n ...twgslOptions,\r\n };\r\n\r\n if (twgslOptions.twgsl) {\r\n WebGPUTintWASM._Twgsl = twgslOptions.twgsl;\r\n return Promise.resolve();\r\n }\r\n\r\n if (twgslOptions.jsPath && twgslOptions.wasmPath) {\r\n await Tools.LoadBabylonScriptAsync(twgslOptions.jsPath);\r\n }\r\n\r\n if ((self as any).twgsl) {\r\n WebGPUTintWASM._Twgsl = await (self as any).twgsl(Tools.GetBabylonScriptURL(twgslOptions!.wasmPath!));\r\n return Promise.resolve();\r\n }\r\n\r\n return Promise.reject(\"twgsl is not available.\");\r\n }\r\n\r\n public convertSpirV2WGSL(code: Uint32Array, disableUniformityAnalysis = false): string {\r\n const ccode = WebGPUTintWASM._Twgsl.convertSpirV2WGSL(code, WebGPUTintWASM.DisableUniformityAnalysis || disableUniformityAnalysis);\r\n if (WebGPUTintWASM.ShowWGSLShaderCode) {\r\n Logger.Log(ccode);\r\n Logger.Log(\"***********************************************\");\r\n }\r\n return WebGPUTintWASM.DisableUniformityAnalysis || disableUniformityAnalysis ? \"diagnostic(off, derivative_uniformity);\\n\" + ccode : ccode;\r\n }\r\n}\r\n"]}
|