super-three 0.179.0 → 0.184.0
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/LICENSE +1 -1
- package/README.md +3 -4
- package/build/three.cjs +14522 -12207
- package/build/three.core.js +12005 -10954
- package/build/three.core.min.js +2 -2
- package/build/three.module.js +2270 -1005
- package/build/three.module.min.js +2 -2
- package/build/three.tsl.js +63 -18
- package/build/three.tsl.min.js +2 -2
- package/build/three.webgpu.js +16573 -7890
- package/build/three.webgpu.min.js +2 -2
- package/build/three.webgpu.nodes.js +16533 -7888
- package/build/three.webgpu.nodes.min.js +2 -2
- package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
- package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
- package/examples/jsm/Addons.js +12 -4
- package/examples/jsm/animation/CCDIKSolver.js +8 -4
- package/examples/jsm/controls/ArcballControls.js +15 -12
- package/examples/jsm/controls/DragControls.js +9 -59
- package/examples/jsm/controls/FirstPersonControls.js +61 -57
- package/examples/jsm/controls/FlyControls.js +5 -1
- package/examples/jsm/controls/MapControls.js +55 -1
- package/examples/jsm/controls/OrbitControls.js +113 -10
- package/examples/jsm/controls/PointerLockControls.js +2 -10
- package/examples/jsm/controls/TrackballControls.js +9 -9
- package/examples/jsm/controls/TransformControls.js +35 -3
- package/examples/jsm/csm/CSM.js +2 -1
- package/examples/jsm/csm/CSMShadowNode.js +6 -2
- package/examples/jsm/effects/AnaglyphEffect.js +102 -7
- package/examples/jsm/effects/AsciiEffect.js +8 -8
- package/examples/jsm/environments/ColorEnvironment.js +59 -0
- package/examples/jsm/environments/RoomEnvironment.js +3 -0
- package/examples/jsm/exporters/DRACOExporter.js +2 -2
- package/examples/jsm/exporters/EXRExporter.js +2 -2
- package/examples/jsm/exporters/GLTFExporter.js +185 -34
- package/examples/jsm/exporters/KTX2Exporter.js +4 -2
- package/examples/jsm/exporters/PLYExporter.js +1 -1
- package/examples/jsm/exporters/USDZExporter.js +31 -5
- package/examples/jsm/geometries/DecalGeometry.js +3 -3
- package/examples/jsm/geometries/ParametricGeometry.js +1 -1
- package/examples/jsm/geometries/TeapotGeometry.js +2 -2
- package/examples/jsm/geometries/TextGeometry.js +21 -2
- package/examples/jsm/gpgpu/BitonicSort.js +715 -0
- package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
- package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
- package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
- package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
- package/examples/jsm/helpers/ViewHelper.js +110 -13
- package/examples/jsm/inspector/Extension.js +13 -0
- package/examples/jsm/inspector/Inspector.js +542 -0
- package/examples/jsm/inspector/RendererInspector.js +425 -0
- package/examples/jsm/inspector/extensions/extensions.json +6 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
- package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
- package/examples/jsm/inspector/tabs/Console.js +238 -0
- package/examples/jsm/inspector/tabs/Memory.js +128 -0
- package/examples/jsm/inspector/tabs/Parameters.js +380 -0
- package/examples/jsm/inspector/tabs/Performance.js +268 -0
- package/examples/jsm/inspector/tabs/Settings.js +264 -0
- package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
- package/examples/jsm/inspector/tabs/Viewer.js +268 -0
- package/examples/jsm/inspector/ui/Graph.js +95 -0
- package/examples/jsm/inspector/ui/Item.js +170 -0
- package/examples/jsm/inspector/ui/List.js +75 -0
- package/examples/jsm/inspector/ui/Profiler.js +2072 -0
- package/examples/jsm/inspector/ui/Style.js +1667 -0
- package/examples/jsm/inspector/ui/Tab.js +265 -0
- package/examples/jsm/inspector/ui/Values.js +476 -0
- package/examples/jsm/inspector/ui/utils.js +69 -0
- package/examples/jsm/interaction/InteractionManager.js +226 -0
- package/examples/jsm/interactive/HTMLMesh.js +6 -10
- package/examples/jsm/interactive/InteractiveGroup.js +1 -1
- package/examples/jsm/interactive/SelectionBox.js +30 -0
- package/examples/jsm/libs/ktx-parse.module.js +1 -1
- package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
- package/examples/jsm/lighting/DynamicLighting.js +82 -0
- package/examples/jsm/lighting/LightProbeGrid.js +651 -0
- package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
- package/examples/jsm/lines/Line2.js +3 -3
- package/examples/jsm/lines/LineGeometry.js +1 -1
- package/examples/jsm/lines/LineMaterial.js +7 -1
- package/examples/jsm/lines/LineSegments2.js +2 -2
- package/examples/jsm/lines/Wireframe.js +2 -2
- package/examples/jsm/lines/WireframeGeometry2.js +1 -1
- package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
- package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
- package/examples/jsm/loaders/3DMLoader.js +5 -4
- package/examples/jsm/loaders/3MFLoader.js +3 -3
- package/examples/jsm/loaders/AMFLoader.js +2 -2
- package/examples/jsm/loaders/ColladaLoader.js +27 -4029
- package/examples/jsm/loaders/DDSLoader.js +1 -1
- package/examples/jsm/loaders/DRACOLoader.js +73 -22
- package/examples/jsm/loaders/EXRLoader.js +692 -53
- package/examples/jsm/loaders/FBXLoader.js +237 -39
- package/examples/jsm/loaders/FontLoader.js +23 -5
- package/examples/jsm/loaders/GCodeLoader.js +34 -8
- package/examples/jsm/loaders/GLTFLoader.js +159 -185
- package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
- package/examples/jsm/loaders/HDRLoader.js +485 -0
- package/examples/jsm/loaders/KMZLoader.js +5 -5
- package/examples/jsm/loaders/KTX2Loader.js +162 -53
- package/examples/jsm/loaders/KTXLoader.js +2 -2
- package/examples/jsm/loaders/LDrawLoader.js +41 -50
- package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
- package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
- package/examples/jsm/loaders/LWOLoader.js +9 -41
- package/examples/jsm/loaders/MaterialXLoader.js +22 -5
- package/examples/jsm/loaders/NRRDLoader.js +2 -2
- package/examples/jsm/loaders/OBJLoader.js +1 -1
- package/examples/jsm/loaders/PCDLoader.js +4 -2
- package/examples/jsm/loaders/PDBLoader.js +1 -1
- package/examples/jsm/loaders/RGBELoader.js +7 -473
- package/examples/jsm/loaders/SVGLoader.js +4 -4
- package/examples/jsm/loaders/TDSLoader.js +0 -2
- package/examples/jsm/loaders/TGALoader.js +0 -2
- package/examples/jsm/loaders/TTFLoader.js +4 -4
- package/examples/jsm/loaders/USDLoader.js +100 -40
- package/examples/jsm/loaders/UltraHDRLoader.js +287 -162
- package/examples/jsm/loaders/VOXLoader.js +660 -117
- package/examples/jsm/loaders/VRMLLoader.js +79 -2
- package/examples/jsm/loaders/VTKLoader.js +42 -25
- package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
- package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
- package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
- package/examples/jsm/loaders/usd/USDAParser.js +450 -363
- package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
- package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
- package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
- package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
- package/examples/jsm/math/ColorSpaces.js +19 -1
- package/examples/jsm/math/ConvexHull.js +3 -3
- package/examples/jsm/math/ImprovedNoise.js +1 -1
- package/examples/jsm/math/Lut.js +2 -2
- package/examples/jsm/math/Octree.js +131 -1
- package/examples/jsm/math/SimplexNoise.js +1 -1
- package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
- package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
- package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
- package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
- package/examples/jsm/misc/RollerCoaster.js +42 -4
- package/examples/jsm/misc/TubePainter.js +383 -40
- package/examples/jsm/misc/Volume.js +1 -2
- package/examples/jsm/misc/VolumeSlice.js +0 -1
- package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
- package/examples/jsm/modifiers/TessellateModifier.js +1 -1
- package/examples/jsm/objects/LensflareMesh.js +1 -1
- package/examples/jsm/objects/Reflector.js +73 -25
- package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
- package/examples/jsm/objects/Sky.js +91 -7
- package/examples/jsm/objects/SkyMesh.js +151 -17
- package/examples/jsm/objects/Water.js +7 -6
- package/examples/jsm/objects/Water2.js +5 -3
- package/examples/jsm/objects/WaterMesh.js +11 -13
- package/examples/jsm/physics/AmmoPhysics.js +12 -7
- package/examples/jsm/physics/JoltPhysics.js +10 -6
- package/examples/jsm/physics/RapierPhysics.js +9 -5
- package/examples/jsm/postprocessing/EffectComposer.js +7 -5
- package/examples/jsm/postprocessing/GlitchPass.js +2 -2
- package/examples/jsm/postprocessing/OutlinePass.js +1 -1
- package/examples/jsm/postprocessing/OutputPass.js +9 -0
- package/examples/jsm/postprocessing/RenderPass.js +10 -0
- package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
- package/examples/jsm/postprocessing/SSRPass.js +37 -8
- package/examples/jsm/postprocessing/UnrealBloomPass.js +56 -24
- package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
- package/examples/jsm/renderers/CSS3DRenderer.js +8 -7
- package/examples/jsm/renderers/Projector.js +246 -28
- package/examples/jsm/renderers/SVGRenderer.js +175 -61
- package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
- package/examples/jsm/shaders/AfterimageShader.js +1 -1
- package/examples/jsm/shaders/BleachBypassShader.js +1 -1
- package/examples/jsm/shaders/BokehShader.js +1 -1
- package/examples/jsm/shaders/BokehShader2.js +1 -1
- package/examples/jsm/shaders/DotScreenShader.js +1 -1
- package/examples/jsm/shaders/FocusShader.js +1 -1
- package/examples/jsm/shaders/GTAOShader.js +21 -8
- package/examples/jsm/shaders/HalftoneShader.js +12 -1
- package/examples/jsm/shaders/KaleidoShader.js +1 -1
- package/examples/jsm/shaders/PoissonDenoiseShader.js +8 -4
- package/examples/jsm/shaders/SAOShader.js +17 -4
- package/examples/jsm/shaders/SSAOShader.js +11 -1
- package/examples/jsm/shaders/SSRShader.js +7 -6
- package/examples/jsm/shaders/SepiaShader.js +1 -1
- package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
- package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
- package/examples/jsm/shaders/UnpackDepthRGBAShader.js +3 -5
- package/examples/jsm/shaders/VignetteShader.js +1 -1
- package/examples/jsm/transpiler/AST.js +44 -0
- package/examples/jsm/transpiler/GLSLDecoder.js +85 -25
- package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
- package/examples/jsm/transpiler/TSLEncoder.js +52 -10
- package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
- package/examples/jsm/transpiler/WGSLEncoder.js +51 -0
- package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
- package/examples/jsm/tsl/display/AfterImageNode.js +36 -24
- package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
- package/examples/jsm/tsl/display/AnamorphicNode.js +40 -5
- package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
- package/examples/jsm/tsl/display/BloomNode.js +23 -9
- package/examples/jsm/tsl/display/CRT.js +150 -0
- package/examples/jsm/tsl/display/ChromaticAberrationNode.js +5 -37
- package/examples/jsm/tsl/display/DenoiseNode.js +3 -1
- package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
- package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
- package/examples/jsm/tsl/display/FSR1Node.js +477 -0
- package/examples/jsm/tsl/display/FXAANode.js +2 -2
- package/examples/jsm/tsl/display/GTAONode.js +59 -9
- package/examples/jsm/tsl/display/GaussianBlurNode.js +68 -35
- package/examples/jsm/tsl/display/GodraysNode.js +615 -0
- package/examples/jsm/tsl/display/LensflareNode.js +1 -1
- package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
- package/examples/jsm/tsl/display/OutlineNode.js +81 -20
- package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
- package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
- package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
- package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
- package/examples/jsm/tsl/display/SMAANode.js +2 -2
- package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
- package/examples/jsm/tsl/display/SSGINode.js +638 -0
- package/examples/jsm/tsl/display/SSRNode.js +186 -69
- package/examples/jsm/tsl/display/SSSNode.js +490 -0
- package/examples/jsm/tsl/display/Shape.js +29 -0
- package/examples/jsm/tsl/display/SharpenNode.js +283 -0
- package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
- package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
- package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
- package/examples/jsm/tsl/display/TAAUNode.js +835 -0
- package/examples/jsm/tsl/display/TRAANode.js +381 -75
- package/examples/jsm/tsl/display/TransitionNode.js +1 -1
- package/examples/jsm/tsl/display/boxBlur.js +65 -0
- package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
- package/examples/jsm/tsl/display/hashBlur.js +16 -18
- package/examples/jsm/tsl/display/radialBlur.js +68 -0
- package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
- package/examples/jsm/tsl/lighting/TiledLightsNode.js +21 -1
- package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
- package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
- package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
- package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
- package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
- package/examples/jsm/tsl/math/Bayer.js +53 -3
- package/examples/jsm/utils/BufferGeometryUtils.js +3 -4
- package/examples/jsm/utils/ColorUtils.js +76 -0
- package/examples/jsm/utils/LDrawUtils.js +1 -1
- package/examples/jsm/utils/ShadowMapViewer.js +24 -10
- package/examples/jsm/utils/ShadowMapViewerGPU.js +13 -6
- package/examples/jsm/utils/SkeletonUtils.js +14 -8
- package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
- package/examples/jsm/webxr/OculusHandModel.js +1 -1
- package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
- package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
- package/examples/jsm/webxr/XRHandModelFactory.js +4 -7
- package/package.json +27 -38
- package/src/Three.Core.js +7 -3
- package/src/Three.TSL.js +61 -16
- package/src/Three.WebGPU.Nodes.js +7 -0
- package/src/Three.WebGPU.js +11 -0
- package/src/Three.js +1 -0
- package/src/animation/AnimationAction.js +12 -2
- package/src/animation/AnimationClip.js +21 -5
- package/src/animation/AnimationMixer.js +9 -3
- package/src/animation/AnimationObjectGroup.js +2 -1
- package/src/animation/AnimationUtils.js +1 -12
- package/src/animation/KeyframeTrack.js +54 -14
- package/src/animation/PropertyBinding.js +12 -11
- package/src/animation/PropertyMixer.js +4 -4
- package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
- package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
- package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
- package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
- package/src/animation/tracks/StringKeyframeTrack.js +1 -1
- package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
- package/src/audio/Audio.js +11 -10
- package/src/audio/AudioContext.js +2 -2
- package/src/audio/AudioListener.js +5 -3
- package/src/audio/PositionalAudio.js +1 -1
- package/src/cameras/Camera.js +32 -2
- package/src/cameras/CubeCamera.js +20 -0
- package/src/cameras/OrthographicCamera.js +1 -1
- package/src/cameras/PerspectiveCamera.js +1 -1
- package/src/cameras/StereoCamera.js +2 -2
- package/src/constants.js +100 -7
- package/src/core/BufferAttribute.js +13 -1
- package/src/core/BufferGeometry.js +24 -12
- package/src/core/Clock.js +7 -0
- package/src/core/EventDispatcher.js +1 -1
- package/src/core/InterleavedBuffer.js +1 -1
- package/src/core/InterleavedBufferAttribute.js +3 -2
- package/src/core/Object3D.js +55 -6
- package/src/core/Raycaster.js +4 -3
- package/src/core/RenderTarget.js +14 -5
- package/src/extras/Controls.js +5 -4
- package/src/extras/DataUtils.js +2 -1
- package/src/extras/Earcut.js +6 -0
- package/src/extras/ImageUtils.js +2 -2
- package/src/extras/PMREMGenerator.js +259 -57
- package/src/extras/TextureUtils.js +6 -1
- package/src/extras/core/Curve.js +2 -1
- package/src/extras/core/Interpolations.js +7 -1
- package/src/extras/core/ShapePath.js +4 -4
- package/src/extras/curves/CatmullRomCurve3.js +3 -2
- package/src/extras/lib/earcut.js +8 -8
- package/src/geometries/BoxGeometry.js +1 -0
- package/src/geometries/CapsuleGeometry.js +1 -0
- package/src/geometries/CircleGeometry.js +1 -0
- package/src/geometries/ConeGeometry.js +1 -0
- package/src/geometries/CylinderGeometry.js +1 -0
- package/src/geometries/DodecahedronGeometry.js +1 -0
- package/src/geometries/ExtrudeGeometry.js +10 -8
- package/src/geometries/IcosahedronGeometry.js +1 -0
- package/src/geometries/LatheGeometry.js +1 -0
- package/src/geometries/OctahedronGeometry.js +1 -0
- package/src/geometries/PlaneGeometry.js +1 -0
- package/src/geometries/PolyhedronGeometry.js +1 -1
- package/src/geometries/RingGeometry.js +1 -0
- package/src/geometries/ShapeGeometry.js +1 -0
- package/src/geometries/SphereGeometry.js +1 -0
- package/src/geometries/TetrahedronGeometry.js +1 -0
- package/src/geometries/TorusGeometry.js +9 -3
- package/src/geometries/TorusKnotGeometry.js +1 -0
- package/src/geometries/TubeGeometry.js +1 -0
- package/src/helpers/CameraHelper.js +4 -1
- package/src/helpers/DirectionalLightHelper.js +4 -1
- package/src/helpers/HemisphereLightHelper.js +3 -0
- package/src/helpers/PointLightHelper.js +1 -25
- package/src/helpers/SpotLightHelper.js +3 -0
- package/src/lights/DirectionalLight.js +13 -0
- package/src/lights/HemisphereLight.js +10 -0
- package/src/lights/Light.js +1 -11
- package/src/lights/LightProbe.js +0 -15
- package/src/lights/LightShadow.js +15 -6
- package/src/lights/PointLight.js +15 -0
- package/src/lights/PointLightShadow.js +0 -86
- package/src/lights/SpotLight.js +22 -1
- package/src/lights/webgpu/IESSpotLight.js +2 -1
- package/src/lights/webgpu/ProjectorLight.js +1 -1
- package/src/loaders/AnimationLoader.js +2 -1
- package/src/loaders/AudioLoader.js +13 -2
- package/src/loaders/BufferGeometryLoader.js +2 -2
- package/src/loaders/Cache.js +30 -2
- package/src/loaders/DataTextureLoader.js +6 -4
- package/src/loaders/FileLoader.js +4 -4
- package/src/loaders/ImageBitmapLoader.js +17 -13
- package/src/loaders/ImageLoader.js +1 -1
- package/src/loaders/Loader.js +9 -3
- package/src/loaders/LoadingManager.js +25 -3
- package/src/loaders/MaterialLoader.js +6 -4
- package/src/loaders/ObjectLoader.js +57 -17
- package/src/loaders/TextureLoader.js +1 -1
- package/src/loaders/nodes/NodeLoader.js +5 -4
- package/src/loaders/nodes/NodeObjectLoader.js +18 -0
- package/src/materials/Material.js +18 -3
- package/src/materials/MeshBasicMaterial.js +1 -0
- package/src/materials/MeshDepthMaterial.js +1 -0
- package/src/materials/MeshDistanceMaterial.js +1 -1
- package/src/materials/MeshLambertMaterial.js +11 -1
- package/src/materials/MeshMatcapMaterial.js +22 -0
- package/src/materials/MeshNormalMaterial.js +1 -0
- package/src/materials/MeshPhongMaterial.js +11 -1
- package/src/materials/MeshPhysicalMaterial.js +2 -1
- package/src/materials/MeshStandardMaterial.js +8 -7
- package/src/materials/MeshToonMaterial.js +2 -1
- package/src/materials/PointsMaterial.js +1 -1
- package/src/materials/ShaderMaterial.js +22 -3
- package/src/materials/nodes/Line2NodeMaterial.js +36 -9
- package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
- package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
- package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
- package/src/materials/nodes/NodeMaterial.js +95 -35
- package/src/materials/nodes/PointsNodeMaterial.js +81 -28
- package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
- package/src/materials/nodes/manager/NodeMaterialObserver.js +194 -88
- package/src/math/Color.js +6 -5
- package/src/math/ColorManagement.js +9 -3
- package/src/math/Cylindrical.js +1 -1
- package/src/math/Euler.js +2 -1
- package/src/math/Line3.js +6 -5
- package/src/math/MathUtils.js +23 -21
- package/src/math/Matrix2.js +14 -10
- package/src/math/Matrix3.js +15 -11
- package/src/math/Matrix4.js +94 -81
- package/src/math/Plane.js +5 -4
- package/src/math/Quaternion.js +60 -84
- package/src/math/Sphere.js +1 -1
- package/src/math/Spherical.js +1 -1
- package/src/math/Triangle.js +1 -1
- package/src/math/Vector2.js +11 -7
- package/src/math/Vector3.js +15 -13
- package/src/math/Vector4.js +13 -9
- package/src/math/interpolants/BezierInterpolant.js +108 -0
- package/src/nodes/Nodes.js +86 -65
- package/src/nodes/TSL.js +11 -8
- package/src/nodes/accessors/Arrays.js +1 -1
- package/src/nodes/accessors/BatchNode.js +10 -10
- package/src/nodes/accessors/Bitangent.js +5 -5
- package/src/nodes/accessors/BufferAttributeNode.js +107 -15
- package/src/nodes/accessors/BufferNode.js +30 -3
- package/src/nodes/accessors/Camera.js +260 -13
- package/src/nodes/accessors/ClippingNode.js +10 -9
- package/src/nodes/accessors/CubeTextureNode.js +32 -6
- package/src/nodes/accessors/InstanceNode.js +164 -39
- package/src/nodes/accessors/Lights.js +10 -0
- package/src/nodes/accessors/MaterialNode.js +9 -1
- package/src/nodes/accessors/MaterialProperties.js +2 -5
- package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
- package/src/nodes/accessors/ModelNode.js +1 -1
- package/src/nodes/accessors/Normal.js +16 -15
- package/src/nodes/accessors/Object3DNode.js +2 -2
- package/src/nodes/accessors/Position.js +51 -3
- package/src/nodes/accessors/ReferenceBaseNode.js +7 -7
- package/src/nodes/accessors/ReferenceNode.js +11 -10
- package/src/nodes/accessors/RendererReferenceNode.js +1 -2
- package/src/nodes/accessors/SceneProperties.js +47 -0
- package/src/nodes/accessors/SkinningNode.js +27 -26
- package/src/nodes/accessors/StorageBufferNode.js +14 -24
- package/src/nodes/accessors/StorageTextureNode.js +62 -9
- package/src/nodes/accessors/Tangent.js +4 -14
- package/src/nodes/accessors/Texture3DNode.js +41 -31
- package/src/nodes/accessors/TextureNode.js +193 -63
- package/src/nodes/accessors/UniformArrayNode.js +6 -4
- package/src/nodes/accessors/UserDataNode.js +1 -2
- package/src/nodes/accessors/VertexColorNode.js +1 -2
- package/src/nodes/code/FunctionCallNode.js +25 -5
- package/src/nodes/code/FunctionNode.js +25 -3
- package/src/nodes/core/ArrayNode.js +22 -2
- package/src/nodes/core/AssignNode.js +6 -5
- package/src/nodes/core/AttributeNode.js +5 -4
- package/src/nodes/core/BypassNode.js +1 -1
- package/src/nodes/core/ContextNode.js +133 -15
- package/src/nodes/core/IndexNode.js +4 -3
- package/src/nodes/core/InputNode.js +3 -2
- package/src/nodes/core/InspectorNode.js +128 -0
- package/src/nodes/core/{CacheNode.js → IsolateNode.js} +41 -8
- package/src/nodes/core/MRTNode.js +48 -2
- package/src/nodes/core/Node.js +264 -46
- package/src/nodes/core/NodeBuilder.js +453 -87
- package/src/nodes/core/NodeError.js +28 -0
- package/src/nodes/core/NodeFrame.js +31 -23
- package/src/nodes/core/NodeFunction.js +2 -1
- package/src/nodes/core/NodeParser.js +2 -1
- package/src/nodes/core/NodeUniform.js +1 -1
- package/src/nodes/core/NodeUtils.js +25 -97
- package/src/nodes/core/OutputStructNode.js +12 -10
- package/src/nodes/core/ParameterNode.js +34 -3
- package/src/nodes/core/PropertyNode.js +26 -3
- package/src/nodes/core/StackNode.js +99 -23
- package/src/nodes/core/StackTrace.js +139 -0
- package/src/nodes/core/StructNode.js +22 -8
- package/src/nodes/core/StructTypeNode.js +13 -18
- package/src/nodes/core/SubBuildNode.js +4 -4
- package/src/nodes/core/UniformGroupNode.js +36 -6
- package/src/nodes/core/UniformNode.js +37 -13
- package/src/nodes/core/VarNode.js +96 -34
- package/src/nodes/core/VaryingNode.js +2 -18
- package/src/nodes/display/BlendModes.js +0 -63
- package/src/nodes/display/BumpMapNode.js +1 -1
- package/src/nodes/display/ColorAdjustment.js +18 -1
- package/src/nodes/display/ColorSpaceNode.js +3 -3
- package/src/nodes/display/FrontFacingNode.js +4 -8
- package/src/nodes/display/NormalMapNode.js +41 -5
- package/src/nodes/display/PassNode.js +175 -25
- package/src/nodes/display/RenderOutputNode.js +35 -9
- package/src/nodes/display/ScreenNode.js +47 -15
- package/src/nodes/display/ToneMappingNode.js +32 -5
- package/src/nodes/display/ToonOutlinePassNode.js +10 -2
- package/src/nodes/display/ViewportDepthNode.js +52 -4
- package/src/nodes/display/ViewportDepthTextureNode.js +14 -6
- package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
- package/src/nodes/display/ViewportTextureNode.js +72 -14
- package/src/nodes/fog/Fog.js +18 -34
- package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
- package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
- package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
- package/src/nodes/functions/BasicLightingModel.js +2 -1
- package/src/nodes/functions/PhysicalLightingModel.js +128 -46
- package/src/nodes/functions/VolumetricLightingModel.js +5 -5
- package/src/nodes/geometry/RangeNode.js +44 -6
- package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
- package/src/nodes/gpgpu/BarrierNode.js +9 -0
- package/src/nodes/gpgpu/ComputeBuiltinNode.js +4 -4
- package/src/nodes/gpgpu/ComputeNode.js +76 -38
- package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
- package/src/nodes/gpgpu/WorkgroupInfoNode.js +5 -4
- package/src/nodes/lighting/AnalyticLightNode.js +53 -0
- package/src/nodes/lighting/EnvironmentNode.js +34 -9
- package/src/nodes/lighting/LightsNode.js +10 -32
- package/src/nodes/lighting/PointShadowNode.js +167 -148
- package/src/nodes/lighting/ShadowFilterNode.js +55 -65
- package/src/nodes/lighting/ShadowNode.js +189 -44
- package/src/nodes/math/BitcastNode.js +156 -0
- package/src/nodes/math/BitcountNode.js +433 -0
- package/src/nodes/math/ConditionalNode.js +25 -8
- package/src/nodes/math/MathNode.js +98 -57
- package/src/nodes/math/OperatorNode.js +8 -5
- package/src/nodes/math/PackFloatNode.js +98 -0
- package/src/nodes/math/UnpackFloatNode.js +96 -0
- package/src/nodes/pmrem/PMREMNode.js +1 -1
- package/src/nodes/pmrem/PMREMUtils.js +111 -2
- package/src/nodes/shapes/Shapes.js +1 -1
- package/src/nodes/tsl/TSLBase.js +6 -3
- package/src/nodes/tsl/TSLCore.js +488 -166
- package/src/nodes/utils/ArrayElementNode.js +14 -1
- package/src/nodes/utils/ConvertNode.js +1 -1
- package/src/nodes/utils/DebugNode.js +14 -13
- package/src/nodes/utils/EventNode.js +67 -2
- package/src/nodes/utils/FlipNode.js +1 -1
- package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
- package/src/nodes/utils/JoinNode.js +7 -4
- package/src/nodes/utils/LoopNode.js +20 -24
- package/src/nodes/utils/MemberNode.js +60 -8
- package/src/nodes/utils/Packing.js +13 -1
- package/src/nodes/utils/PostProcessingUtils.js +60 -1
- package/src/nodes/utils/RTTNode.js +14 -4
- package/src/nodes/utils/ReflectorNode.js +61 -11
- package/src/nodes/utils/Remap.js +48 -0
- package/src/nodes/utils/RotateNode.js +1 -1
- package/src/nodes/utils/SampleNode.js +12 -2
- package/src/nodes/utils/SetNode.js +1 -1
- package/src/nodes/utils/SplitNode.js +12 -1
- package/src/nodes/utils/SpriteSheetUV.js +35 -0
- package/src/nodes/utils/Timer.js +0 -47
- package/src/nodes/utils/UVUtils.js +28 -0
- package/src/objects/BatchedMesh.js +46 -18
- package/src/objects/InstancedMesh.js +30 -3
- package/src/objects/LOD.js +1 -1
- package/src/objects/Line.js +3 -2
- package/src/objects/LineSegments.js +2 -1
- package/src/objects/Mesh.js +1 -1
- package/src/objects/Points.js +1 -1
- package/src/objects/Skeleton.js +12 -2
- package/src/objects/SkinnedMesh.js +29 -10
- package/src/objects/Sprite.js +4 -3
- package/src/renderers/WebGLRenderer.js +372 -179
- package/src/renderers/common/Animation.js +16 -4
- package/src/renderers/common/Attributes.js +16 -2
- package/src/renderers/common/Backend.js +137 -35
- package/src/renderers/common/Background.js +28 -14
- package/src/renderers/common/BindGroup.js +1 -16
- package/src/renderers/common/Binding.js +11 -0
- package/src/renderers/common/Bindings.js +83 -12
- package/src/renderers/common/BlendMode.js +143 -0
- package/src/renderers/common/Buffer.js +40 -0
- package/src/renderers/common/BundleGroup.js +1 -1
- package/src/renderers/common/CanvasTarget.js +341 -0
- package/src/renderers/common/ChainMap.js +30 -6
- package/src/renderers/common/ComputePipeline.js +1 -1
- package/src/renderers/common/CubeRenderTarget.js +51 -7
- package/src/renderers/common/DataMap.js +1 -1
- package/src/renderers/common/Geometries.js +55 -3
- package/src/renderers/common/Info.js +337 -6
- package/src/renderers/common/InspectorBase.js +151 -0
- package/src/renderers/common/Lighting.js +5 -21
- package/src/renderers/common/Pipelines.js +41 -8
- package/src/renderers/common/PostProcessing.js +9 -226
- package/src/renderers/common/QuadMesh.js +7 -1
- package/src/renderers/common/ReadbackBuffer.js +78 -0
- package/src/renderers/common/RenderBundle.js +3 -1
- package/src/renderers/common/RenderBundles.js +7 -3
- package/src/renderers/common/RenderContext.js +18 -2
- package/src/renderers/common/RenderContexts.js +33 -49
- package/src/renderers/common/RenderList.js +7 -3
- package/src/renderers/common/RenderLists.js +2 -1
- package/src/renderers/common/RenderObject.js +32 -6
- package/src/renderers/common/RenderObjectPipeline.js +40 -0
- package/src/renderers/common/RenderObjects.js +22 -6
- package/src/renderers/common/RenderPipeline.js +232 -17
- package/src/renderers/common/Renderer.js +927 -335
- package/src/renderers/common/RendererUtils.js +9 -0
- package/src/renderers/common/SampledTexture.js +9 -1
- package/src/renderers/common/Sampler.js +52 -14
- package/src/renderers/common/StorageBuffer.js +13 -1
- package/src/renderers/common/StorageTexture.js +9 -1
- package/src/renderers/common/Textures.js +208 -47
- package/src/renderers/common/TimestampQueryPool.js +70 -6
- package/src/renderers/common/Uniform.js +8 -0
- package/src/renderers/common/UniformsGroup.js +64 -2
- package/src/renderers/common/XRManager.js +79 -51
- package/src/renderers/common/extras/PMREMGenerator.js +176 -79
- package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
- package/src/renderers/common/nodes/NodeLibrary.js +9 -7
- package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +260 -95
- package/src/renderers/common/nodes/NodeSampler.js +13 -1
- package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
- package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
- package/src/renderers/shaders/DFGLUTData.js +49 -0
- package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
- package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
- package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -2
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
- package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
- package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
- package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
- package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
- package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +152 -59
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
- package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
- package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +221 -190
- package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
- package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk.js +5 -3
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +4 -1
- package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
- package/src/renderers/shaders/ShaderLib.js +7 -6
- package/src/renderers/shaders/UniformsLib.js +8 -5
- package/src/renderers/shaders/UniformsUtils.js +52 -9
- package/src/renderers/webgl/WebGLAnimation.js +2 -1
- package/src/renderers/webgl/WebGLBackground.js +15 -15
- package/src/renderers/webgl/WebGLBindingStates.js +99 -27
- package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
- package/src/renderers/webgl/WebGLCapabilities.js +11 -5
- package/src/renderers/webgl/WebGLEnvironments.js +228 -0
- package/src/renderers/webgl/WebGLExtensions.js +2 -25
- package/src/renderers/webgl/WebGLGeometries.js +10 -7
- package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
- package/src/renderers/webgl/WebGLInfo.js +3 -1
- package/src/renderers/webgl/WebGLLights.js +18 -1
- package/src/renderers/webgl/WebGLMaterials.js +24 -13
- package/src/renderers/webgl/WebGLObjects.js +3 -1
- package/src/renderers/webgl/WebGLOutput.js +270 -0
- package/src/renderers/webgl/WebGLProgram.js +63 -122
- package/src/renderers/webgl/WebGLPrograms.js +65 -52
- package/src/renderers/webgl/WebGLRenderLists.js +15 -0
- package/src/renderers/webgl/WebGLRenderStates.js +13 -2
- package/src/renderers/webgl/WebGLShadowMap.js +191 -26
- package/src/renderers/webgl/WebGLState.js +79 -40
- package/src/renderers/webgl/WebGLTextures.js +234 -68
- package/src/renderers/webgl/WebGLUniforms.js +40 -3
- package/src/renderers/webgl/WebGLUniformsGroups.js +24 -3
- package/src/renderers/webgl/WebGLUtils.js +8 -3
- package/src/renderers/webgl-fallback/WebGLBackend.js +438 -235
- package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
- package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +339 -84
- package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
- package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
- package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
- package/src/renderers/webgl-fallback/utils/WebGLState.js +229 -11
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +237 -72
- package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +56 -27
- package/src/renderers/webgl-fallback/utils/WebGLUtils.js +8 -3
- package/src/renderers/webgpu/WebGPUBackend.js +403 -253
- package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
- package/src/renderers/webgpu/WebGPURenderer.js +5 -3
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +491 -123
- package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +108 -34
- package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +360 -201
- package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
- package/src/renderers/webgpu/utils/WebGPUConstants.js +17 -2
- package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +111 -54
- package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +155 -205
- package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +407 -149
- package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +36 -13
- package/src/renderers/webgpu/utils/WebGPUUtils.js +55 -13
- package/src/renderers/webxr/WebXRController.js +12 -0
- package/src/renderers/webxr/WebXRManager.js +45 -29
- package/src/textures/CubeDepthTexture.js +76 -0
- package/src/textures/ExternalTexture.js +15 -4
- package/src/textures/HTMLTexture.js +74 -0
- package/src/textures/Source.js +5 -4
- package/src/textures/Texture.js +19 -7
- package/src/textures/VideoTexture.js +2 -3
- package/src/utils.js +344 -3
- package/examples/jsm/loaders/RGBMLoader.js +0 -1148
- package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
- package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
- package/examples/jsm/shaders/GodRaysShader.js +0 -333
- package/src/nodes/accessors/SceneNode.js +0 -144
- package/src/nodes/code/ScriptableNode.js +0 -726
- package/src/nodes/code/ScriptableValueNode.js +0 -253
- package/src/nodes/display/PosterizeNode.js +0 -65
- package/src/nodes/functions/BSDF/DFGApprox.js +0 -30
- package/src/nodes/utils/RemapNode.js +0 -125
- package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
- package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
- package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import 'https://greggman.github.io/webgpu-avoid-redundant-state-setting/webgpu-check-redundant-state-setting.js';
|
|
3
3
|
//*/
|
|
4
4
|
|
|
5
|
-
import { GPUFeatureName, GPULoadOp, GPUStoreOp, GPUIndexFormat, GPUTextureViewDimension } from './utils/WebGPUConstants.js';
|
|
5
|
+
import { GPUFeatureName, GPULoadOp, GPUStoreOp, GPUIndexFormat, GPUTextureViewDimension, GPUFeatureMap } from './utils/WebGPUConstants.js';
|
|
6
6
|
|
|
7
7
|
import WGSLNodeBuilder from './nodes/WGSLNodeBuilder.js';
|
|
8
8
|
import Backend from '../common/Backend.js';
|
|
@@ -10,12 +10,15 @@ import Backend from '../common/Backend.js';
|
|
|
10
10
|
import WebGPUUtils from './utils/WebGPUUtils.js';
|
|
11
11
|
import WebGPUAttributeUtils from './utils/WebGPUAttributeUtils.js';
|
|
12
12
|
import WebGPUBindingUtils from './utils/WebGPUBindingUtils.js';
|
|
13
|
+
import WebGPUCapabilities from './utils/WebGPUCapabilities.js';
|
|
13
14
|
import WebGPUPipelineUtils from './utils/WebGPUPipelineUtils.js';
|
|
14
15
|
import WebGPUTextureUtils from './utils/WebGPUTextureUtils.js';
|
|
15
16
|
|
|
16
|
-
import { WebGPUCoordinateSystem } from '../../constants.js';
|
|
17
|
+
import { WebGPUCoordinateSystem, TimestampQuery, REVISION, HalfFloatType, Compatibility } from '../../constants.js';
|
|
17
18
|
import WebGPUTimestampQueryPool from './utils/WebGPUTimestampQueryPool.js';
|
|
18
|
-
import {
|
|
19
|
+
import { error } from '../../utils.js';
|
|
20
|
+
|
|
21
|
+
const _clearValue = { r: 0, g: 0, b: 0, a: 1 };
|
|
19
22
|
|
|
20
23
|
/**
|
|
21
24
|
* A backend implementation targeting WebGPU.
|
|
@@ -30,8 +33,8 @@ class WebGPUBackend extends Backend {
|
|
|
30
33
|
*
|
|
31
34
|
* @typedef {Object} WebGPUBackend~Options
|
|
32
35
|
* @property {boolean} [logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.
|
|
36
|
+
* @property {boolean} [reversedDepthBuffer=false] - Whether reversed depth buffer is enabled or not.
|
|
33
37
|
* @property {boolean} [alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.
|
|
34
|
-
* @property {boolean} [compatibilityMode=false] - Whether the backend should be in compatibility mode or not.
|
|
35
38
|
* @property {boolean} [depth=true] - Whether the default framebuffer should have a depth buffer or not.
|
|
36
39
|
* @property {boolean} [stencil=false] - Whether the default framebuffer should have a stencil buffer or not.
|
|
37
40
|
* @property {boolean} [antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not.
|
|
@@ -64,16 +67,18 @@ class WebGPUBackend extends Backend {
|
|
|
64
67
|
|
|
65
68
|
// some parameters require default values other than "undefined"
|
|
66
69
|
this.parameters.alpha = ( parameters.alpha === undefined ) ? true : parameters.alpha;
|
|
67
|
-
this.parameters.compatibilityMode = ( parameters.compatibilityMode === undefined ) ? false : parameters.compatibilityMode;
|
|
68
70
|
|
|
69
71
|
this.parameters.requiredLimits = ( parameters.requiredLimits === undefined ) ? {} : parameters.requiredLimits;
|
|
70
72
|
|
|
71
73
|
/**
|
|
72
|
-
* Indicates whether the backend is in compatibility mode or not.
|
|
73
|
-
*
|
|
74
|
-
*
|
|
74
|
+
* Indicates whether the backend is in WebGPU compatibility mode or not.
|
|
75
|
+
* The backend must be initialized before the property can be evaluated.
|
|
76
|
+
*
|
|
77
|
+
* @type {?boolean}
|
|
78
|
+
* @readonly
|
|
79
|
+
* @default null
|
|
75
80
|
*/
|
|
76
|
-
this.compatibilityMode =
|
|
81
|
+
this.compatibilityMode = null;
|
|
77
82
|
|
|
78
83
|
/**
|
|
79
84
|
* A reference to the device.
|
|
@@ -83,22 +88,6 @@ class WebGPUBackend extends Backend {
|
|
|
83
88
|
*/
|
|
84
89
|
this.device = null;
|
|
85
90
|
|
|
86
|
-
/**
|
|
87
|
-
* A reference to the context.
|
|
88
|
-
*
|
|
89
|
-
* @type {?GPUCanvasContext}
|
|
90
|
-
* @default null
|
|
91
|
-
*/
|
|
92
|
-
this.context = null;
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* A reference to the color attachment of the default framebuffer.
|
|
96
|
-
*
|
|
97
|
-
* @type {?GPUTexture}
|
|
98
|
-
* @default null
|
|
99
|
-
*/
|
|
100
|
-
this.colorBuffer = null;
|
|
101
|
-
|
|
102
91
|
/**
|
|
103
92
|
* A reference to the default render pass descriptor.
|
|
104
93
|
*
|
|
@@ -130,6 +119,14 @@ class WebGPUBackend extends Backend {
|
|
|
130
119
|
*/
|
|
131
120
|
this.bindingUtils = new WebGPUBindingUtils( this );
|
|
132
121
|
|
|
122
|
+
/**
|
|
123
|
+
* A reference to a backend module holding device capability related
|
|
124
|
+
* utility functions.
|
|
125
|
+
*
|
|
126
|
+
* @type {WebGPUCapabilities}
|
|
127
|
+
*/
|
|
128
|
+
this.capabilities = new WebGPUCapabilities( this );
|
|
129
|
+
|
|
133
130
|
/**
|
|
134
131
|
* A reference to a backend module holding shader pipeline-related
|
|
135
132
|
* utility functions.
|
|
@@ -153,6 +150,19 @@ class WebGPUBackend extends Backend {
|
|
|
153
150
|
*/
|
|
154
151
|
this.occludedResolveCache = new Map();
|
|
155
152
|
|
|
153
|
+
// compatibility checks
|
|
154
|
+
|
|
155
|
+
const compatibilityTextureCompare = typeof navigator === 'undefined' ? true : /Android/.test( navigator.userAgent ) === false;
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* A map of compatibility checks.
|
|
159
|
+
*
|
|
160
|
+
* @type {Object}
|
|
161
|
+
*/
|
|
162
|
+
this._compatibility = {
|
|
163
|
+
[ Compatibility.TEXTURE_COMPARE ]: compatibilityTextureCompare
|
|
164
|
+
};
|
|
165
|
+
|
|
156
166
|
}
|
|
157
167
|
|
|
158
168
|
/**
|
|
@@ -178,7 +188,7 @@ class WebGPUBackend extends Backend {
|
|
|
178
188
|
|
|
179
189
|
const adapterOptions = {
|
|
180
190
|
powerPreference: parameters.powerPreference,
|
|
181
|
-
featureLevel:
|
|
191
|
+
featureLevel: 'compatibility'
|
|
182
192
|
};
|
|
183
193
|
|
|
184
194
|
const adapter = ( typeof navigator !== 'undefined' ) ? await navigator.gpu.requestAdapter( adapterOptions ) : null;
|
|
@@ -218,8 +228,18 @@ class WebGPUBackend extends Backend {
|
|
|
218
228
|
|
|
219
229
|
}
|
|
220
230
|
|
|
231
|
+
this.compatibilityMode = ! device.features.has( 'core-features-and-limits' );
|
|
232
|
+
|
|
233
|
+
if ( this.compatibilityMode ) {
|
|
234
|
+
|
|
235
|
+
renderer._samples = 0;
|
|
236
|
+
|
|
237
|
+
}
|
|
238
|
+
|
|
221
239
|
device.lost.then( ( info ) => {
|
|
222
240
|
|
|
241
|
+
if ( info.reason === 'destroyed' ) return;
|
|
242
|
+
|
|
223
243
|
const deviceLossInfo = {
|
|
224
244
|
api: 'WebGPU',
|
|
225
245
|
message: info.message || 'Unknown reason',
|
|
@@ -231,26 +251,66 @@ class WebGPUBackend extends Backend {
|
|
|
231
251
|
|
|
232
252
|
} );
|
|
233
253
|
|
|
234
|
-
const context = ( parameters.context !== undefined ) ? parameters.context : renderer.domElement.getContext( 'webgpu' );
|
|
235
|
-
|
|
236
254
|
this.device = device;
|
|
237
|
-
this.context = context;
|
|
238
|
-
|
|
239
|
-
const alphaMode = parameters.alpha ? 'premultiplied' : 'opaque';
|
|
240
255
|
|
|
241
256
|
this.trackTimestamp = this.trackTimestamp && this.hasFeature( GPUFeatureName.TimestampQuery );
|
|
242
257
|
|
|
243
|
-
this.context.configure( {
|
|
244
|
-
device: this.device,
|
|
245
|
-
format: this.utils.getPreferredCanvasFormat(),
|
|
246
|
-
usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
|
|
247
|
-
alphaMode: alphaMode
|
|
248
|
-
} );
|
|
249
|
-
|
|
250
258
|
this.updateSize();
|
|
251
259
|
|
|
252
260
|
}
|
|
253
261
|
|
|
262
|
+
/**
|
|
263
|
+
* A reference to the context.
|
|
264
|
+
*
|
|
265
|
+
* @type {?GPUCanvasContext}
|
|
266
|
+
* @default null
|
|
267
|
+
*/
|
|
268
|
+
get context() {
|
|
269
|
+
|
|
270
|
+
const canvasTarget = this.renderer.getCanvasTarget();
|
|
271
|
+
const canvasData = this.get( canvasTarget );
|
|
272
|
+
|
|
273
|
+
let context = canvasData.context;
|
|
274
|
+
|
|
275
|
+
if ( context === undefined ) {
|
|
276
|
+
|
|
277
|
+
const parameters = this.parameters;
|
|
278
|
+
|
|
279
|
+
if ( canvasTarget.isDefaultCanvasTarget === true && parameters.context !== undefined ) {
|
|
280
|
+
|
|
281
|
+
context = parameters.context;
|
|
282
|
+
|
|
283
|
+
} else {
|
|
284
|
+
|
|
285
|
+
context = canvasTarget.domElement.getContext( 'webgpu' );
|
|
286
|
+
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// OffscreenCanvas does not have setAttribute, see #22811
|
|
290
|
+
if ( 'setAttribute' in canvasTarget.domElement ) canvasTarget.domElement.setAttribute( 'data-engine', `three.js r${ REVISION } webgpu` );
|
|
291
|
+
|
|
292
|
+
const alphaMode = parameters.alpha ? 'premultiplied' : 'opaque';
|
|
293
|
+
|
|
294
|
+
const toneMappingMode = parameters.outputType === HalfFloatType ? 'extended' : 'standard';
|
|
295
|
+
|
|
296
|
+
context.configure( {
|
|
297
|
+
device: this.device,
|
|
298
|
+
format: this.utils.getPreferredCanvasFormat(),
|
|
299
|
+
usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
|
|
300
|
+
alphaMode: alphaMode,
|
|
301
|
+
toneMapping: {
|
|
302
|
+
mode: toneMappingMode
|
|
303
|
+
}
|
|
304
|
+
} );
|
|
305
|
+
|
|
306
|
+
canvasData.context = context;
|
|
307
|
+
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
return context;
|
|
311
|
+
|
|
312
|
+
}
|
|
313
|
+
|
|
254
314
|
/**
|
|
255
315
|
* The coordinate system of the backend.
|
|
256
316
|
*
|
|
@@ -265,15 +325,20 @@ class WebGPUBackend extends Backend {
|
|
|
265
325
|
|
|
266
326
|
/**
|
|
267
327
|
* This method performs a readback operation by moving buffer data from
|
|
268
|
-
* a storage buffer attribute from the GPU to the CPU.
|
|
328
|
+
* a storage buffer attribute from the GPU to the CPU. ReadbackBuffer can
|
|
329
|
+
* be used to retain and reuse handles to the intermediate buffers and prevent
|
|
330
|
+
* new allocation.
|
|
269
331
|
*
|
|
270
332
|
* @async
|
|
271
|
-
* @param {
|
|
272
|
-
* @
|
|
333
|
+
* @param {BufferAttribute} attribute - The storage buffer attribute to read frm.
|
|
334
|
+
* @param {number} count - The offset from which to start reading the
|
|
335
|
+
* @param {number} offset - The storage buffer attribute.
|
|
336
|
+
* @param {ReadbackBuffer|ArrayBuffer} target - The storage buffer attribute.
|
|
337
|
+
* @return {Promise<ArrayBuffer|ReadbackBuffer>} A promise that resolves with the buffer data when the data are ready.
|
|
273
338
|
*/
|
|
274
|
-
async getArrayBufferAsync( attribute ) {
|
|
339
|
+
async getArrayBufferAsync( attribute, target = null, offset = 0, count = - 1 ) {
|
|
275
340
|
|
|
276
|
-
return await this.attributeUtils.getArrayBufferAsync( attribute );
|
|
341
|
+
return await this.attributeUtils.getArrayBufferAsync( attribute, target, offset, count );
|
|
277
342
|
|
|
278
343
|
}
|
|
279
344
|
|
|
@@ -300,19 +365,22 @@ class WebGPUBackend extends Backend {
|
|
|
300
365
|
*/
|
|
301
366
|
_getDefaultRenderPassDescriptor() {
|
|
302
367
|
|
|
303
|
-
|
|
368
|
+
const renderer = this.renderer;
|
|
369
|
+
const canvasTarget = renderer.getCanvasTarget();
|
|
370
|
+
const canvasData = this.get( canvasTarget );
|
|
371
|
+
const samples = renderer.currentSamples;
|
|
304
372
|
|
|
305
|
-
|
|
373
|
+
let descriptor = canvasData.descriptor;
|
|
306
374
|
|
|
307
|
-
|
|
375
|
+
if ( descriptor === undefined || canvasData.samples !== samples ) {
|
|
308
376
|
|
|
309
377
|
descriptor = {
|
|
310
378
|
colorAttachments: [ {
|
|
311
379
|
view: null
|
|
312
|
-
} ]
|
|
380
|
+
} ]
|
|
313
381
|
};
|
|
314
382
|
|
|
315
|
-
if (
|
|
383
|
+
if ( renderer.depth === true || renderer.stencil === true ) {
|
|
316
384
|
|
|
317
385
|
descriptor.depthStencilAttachment = {
|
|
318
386
|
view: this.textureUtils.getDepthBuffer( renderer.depth, renderer.stencil ).createView()
|
|
@@ -322,9 +390,9 @@ class WebGPUBackend extends Backend {
|
|
|
322
390
|
|
|
323
391
|
const colorAttachment = descriptor.colorAttachments[ 0 ];
|
|
324
392
|
|
|
325
|
-
if (
|
|
393
|
+
if ( samples > 0 ) {
|
|
326
394
|
|
|
327
|
-
colorAttachment.view = this.
|
|
395
|
+
colorAttachment.view = this.textureUtils.getColorBuffer().createView();
|
|
328
396
|
|
|
329
397
|
} else {
|
|
330
398
|
|
|
@@ -332,13 +400,14 @@ class WebGPUBackend extends Backend {
|
|
|
332
400
|
|
|
333
401
|
}
|
|
334
402
|
|
|
335
|
-
|
|
403
|
+
canvasData.descriptor = descriptor;
|
|
404
|
+
canvasData.samples = samples;
|
|
336
405
|
|
|
337
406
|
}
|
|
338
407
|
|
|
339
408
|
const colorAttachment = descriptor.colorAttachments[ 0 ];
|
|
340
409
|
|
|
341
|
-
if (
|
|
410
|
+
if ( samples > 0 ) {
|
|
342
411
|
|
|
343
412
|
colorAttachment.resolveTarget = this.context.getCurrentTexture().createView();
|
|
344
413
|
|
|
@@ -384,9 +453,6 @@ class WebGPUBackend extends Backend {
|
|
|
384
453
|
if ( descriptors === undefined ||
|
|
385
454
|
renderTargetData.width !== renderTarget.width ||
|
|
386
455
|
renderTargetData.height !== renderTarget.height ||
|
|
387
|
-
renderTargetData.dimensions !== renderTarget.dimensions ||
|
|
388
|
-
renderTargetData.activeMipmapLevel !== renderContext.activeMipmapLevel ||
|
|
389
|
-
renderTargetData.activeCubeFace !== renderContext.activeCubeFace ||
|
|
390
456
|
renderTargetData.samples !== renderTarget.samples
|
|
391
457
|
) {
|
|
392
458
|
|
|
@@ -394,21 +460,6 @@ class WebGPUBackend extends Backend {
|
|
|
394
460
|
|
|
395
461
|
renderTargetData.descriptors = descriptors;
|
|
396
462
|
|
|
397
|
-
// dispose
|
|
398
|
-
|
|
399
|
-
const onDispose = () => {
|
|
400
|
-
|
|
401
|
-
renderTarget.removeEventListener( 'dispose', onDispose );
|
|
402
|
-
this.delete( renderTarget );
|
|
403
|
-
|
|
404
|
-
};
|
|
405
|
-
|
|
406
|
-
if ( renderTarget.hasEventListener( 'dispose', onDispose ) === false ) {
|
|
407
|
-
|
|
408
|
-
renderTarget.addEventListener( 'dispose', onDispose );
|
|
409
|
-
|
|
410
|
-
}
|
|
411
|
-
|
|
412
463
|
}
|
|
413
464
|
|
|
414
465
|
const cacheKey = renderContext.getCacheKey();
|
|
@@ -509,7 +560,7 @@ class WebGPUBackend extends Backend {
|
|
|
509
560
|
|
|
510
561
|
const depthTextureData = this.get( renderContext.depthTexture );
|
|
511
562
|
const options = {};
|
|
512
|
-
if ( renderContext.depthTexture.isArrayTexture ) {
|
|
563
|
+
if ( renderContext.depthTexture.isArrayTexture || renderContext.depthTexture.isCubeTexture ) {
|
|
513
564
|
|
|
514
565
|
options.dimension = GPUTextureViewDimension.TwoD;
|
|
515
566
|
options.arrayLayerCount = 1;
|
|
@@ -528,7 +579,6 @@ class WebGPUBackend extends Backend {
|
|
|
528
579
|
renderTargetData.samples = renderTarget.samples;
|
|
529
580
|
renderTargetData.activeMipmapLevel = renderContext.activeMipmapLevel;
|
|
530
581
|
renderTargetData.activeCubeFace = renderContext.activeCubeFace;
|
|
531
|
-
renderTargetData.dimensions = renderTarget.dimensions;
|
|
532
582
|
|
|
533
583
|
}
|
|
534
584
|
|
|
@@ -581,6 +631,8 @@ class WebGPUBackend extends Backend {
|
|
|
581
631
|
|
|
582
632
|
const renderContextData = this.get( renderContext );
|
|
583
633
|
|
|
634
|
+
//
|
|
635
|
+
|
|
584
636
|
const device = this.device;
|
|
585
637
|
const occlusionQueryCount = renderContext.occlusionQueryCount;
|
|
586
638
|
|
|
@@ -621,7 +673,7 @@ class WebGPUBackend extends Backend {
|
|
|
621
673
|
|
|
622
674
|
}
|
|
623
675
|
|
|
624
|
-
this.initTimestampQuery( renderContext, descriptor );
|
|
676
|
+
this.initTimestampQuery( TimestampQuery.RENDER, this.getTimestampUID( renderContext ), descriptor );
|
|
625
677
|
|
|
626
678
|
descriptor.occlusionQuerySet = occlusionQuerySet;
|
|
627
679
|
|
|
@@ -637,7 +689,21 @@ class WebGPUBackend extends Backend {
|
|
|
637
689
|
|
|
638
690
|
if ( renderContext.clearColor ) {
|
|
639
691
|
|
|
640
|
-
|
|
692
|
+
if ( i === 0 ) {
|
|
693
|
+
|
|
694
|
+
colorAttachment.clearValue = renderContext.clearColorValue;
|
|
695
|
+
|
|
696
|
+
} else {
|
|
697
|
+
|
|
698
|
+
_clearValue.r = 0;
|
|
699
|
+
_clearValue.g = 0;
|
|
700
|
+
_clearValue.b = 0;
|
|
701
|
+
_clearValue.a = 1;
|
|
702
|
+
|
|
703
|
+
colorAttachment.clearValue = _clearValue;
|
|
704
|
+
|
|
705
|
+
}
|
|
706
|
+
|
|
641
707
|
colorAttachment.loadOp = GPULoadOp.Clear;
|
|
642
708
|
|
|
643
709
|
} else {
|
|
@@ -766,8 +832,7 @@ class WebGPUBackend extends Backend {
|
|
|
766
832
|
|
|
767
833
|
if ( renderContext.scissor ) {
|
|
768
834
|
|
|
769
|
-
|
|
770
|
-
currentPass.setScissorRect( x, y, width, height );
|
|
835
|
+
this.updateScissor( renderContext );
|
|
771
836
|
|
|
772
837
|
}
|
|
773
838
|
|
|
@@ -1127,6 +1192,20 @@ class WebGPUBackend extends Backend {
|
|
|
1127
1192
|
|
|
1128
1193
|
}
|
|
1129
1194
|
|
|
1195
|
+
/**
|
|
1196
|
+
* Updates the scissor with the values from the given render context.
|
|
1197
|
+
*
|
|
1198
|
+
* @param {RenderContext} renderContext - The render context.
|
|
1199
|
+
*/
|
|
1200
|
+
updateScissor( renderContext ) {
|
|
1201
|
+
|
|
1202
|
+
const { currentPass } = this.get( renderContext );
|
|
1203
|
+
const { x, y, width, height } = renderContext.scissorValue;
|
|
1204
|
+
|
|
1205
|
+
currentPass.setScissorRect( x, y, width, height );
|
|
1206
|
+
|
|
1207
|
+
}
|
|
1208
|
+
|
|
1130
1209
|
/**
|
|
1131
1210
|
* Returns the clear color and alpha into a single
|
|
1132
1211
|
* color object.
|
|
@@ -1166,7 +1245,6 @@ class WebGPUBackend extends Backend {
|
|
|
1166
1245
|
|
|
1167
1246
|
let colorAttachments = [];
|
|
1168
1247
|
let depthStencilAttachment;
|
|
1169
|
-
let clearValue;
|
|
1170
1248
|
|
|
1171
1249
|
let supportsDepth;
|
|
1172
1250
|
let supportsStencil;
|
|
@@ -1174,7 +1252,11 @@ class WebGPUBackend extends Backend {
|
|
|
1174
1252
|
if ( color ) {
|
|
1175
1253
|
|
|
1176
1254
|
const clearColor = this.getClearColor();
|
|
1177
|
-
|
|
1255
|
+
|
|
1256
|
+
_clearValue.r = clearColor.r;
|
|
1257
|
+
_clearValue.g = clearColor.g;
|
|
1258
|
+
_clearValue.b = clearColor.b;
|
|
1259
|
+
_clearValue.a = clearColor.a;
|
|
1178
1260
|
|
|
1179
1261
|
}
|
|
1180
1262
|
|
|
@@ -1191,7 +1273,7 @@ class WebGPUBackend extends Backend {
|
|
|
1191
1273
|
|
|
1192
1274
|
const colorAttachment = colorAttachments[ 0 ];
|
|
1193
1275
|
|
|
1194
|
-
colorAttachment.clearValue =
|
|
1276
|
+
colorAttachment.clearValue = _clearValue;
|
|
1195
1277
|
colorAttachment.loadOp = GPULoadOp.Clear;
|
|
1196
1278
|
colorAttachment.storeOp = GPUStoreOp.Store;
|
|
1197
1279
|
|
|
@@ -1210,7 +1292,7 @@ class WebGPUBackend extends Backend {
|
|
|
1210
1292
|
|
|
1211
1293
|
const clearConfig = {
|
|
1212
1294
|
loadOp: color ? GPULoadOp.Clear : GPULoadOp.Load,
|
|
1213
|
-
clearValue: color ?
|
|
1295
|
+
clearValue: color ? _clearValue : undefined
|
|
1214
1296
|
};
|
|
1215
1297
|
|
|
1216
1298
|
if ( supportsDepth ) {
|
|
@@ -1298,11 +1380,13 @@ class WebGPUBackend extends Backend {
|
|
|
1298
1380
|
|
|
1299
1381
|
const groupGPU = this.get( computeGroup );
|
|
1300
1382
|
|
|
1383
|
+
//
|
|
1384
|
+
|
|
1301
1385
|
const descriptor = {
|
|
1302
1386
|
label: 'computeGroup_' + computeGroup.id
|
|
1303
1387
|
};
|
|
1304
1388
|
|
|
1305
|
-
this.initTimestampQuery( computeGroup, descriptor );
|
|
1389
|
+
this.initTimestampQuery( TimestampQuery.COMPUTE, this.getTimestampUID( computeGroup ), descriptor );
|
|
1306
1390
|
|
|
1307
1391
|
groupGPU.cmdEncoderGPU = this.device.createCommandEncoder( { label: 'computeGroup_' + computeGroup.id } );
|
|
1308
1392
|
|
|
@@ -1317,9 +1401,12 @@ class WebGPUBackend extends Backend {
|
|
|
1317
1401
|
* @param {Node} computeNode - The compute node.
|
|
1318
1402
|
* @param {Array<BindGroup>} bindings - The bindings.
|
|
1319
1403
|
* @param {ComputePipeline} pipeline - The compute pipeline.
|
|
1320
|
-
* @param {Array<number>|
|
|
1404
|
+
* @param {number|Array<number>|IndirectStorageBufferAttribute} [dispatchSize=null]
|
|
1405
|
+
* - A single number representing count, or
|
|
1406
|
+
* - An array [x, y, z] representing dispatch size, or
|
|
1407
|
+
* - A IndirectStorageBufferAttribute for indirect dispatch size.
|
|
1321
1408
|
*/
|
|
1322
|
-
compute( computeGroup, computeNode, bindings, pipeline,
|
|
1409
|
+
compute( computeGroup, computeNode, bindings, pipeline, dispatchSize = null ) {
|
|
1323
1410
|
|
|
1324
1411
|
const computeNodeData = this.get( computeNode );
|
|
1325
1412
|
const { passEncoderGPU } = this.get( computeGroup );
|
|
@@ -1341,19 +1428,29 @@ class WebGPUBackend extends Backend {
|
|
|
1341
1428
|
|
|
1342
1429
|
}
|
|
1343
1430
|
|
|
1344
|
-
|
|
1431
|
+
if ( dispatchSize === null ) {
|
|
1432
|
+
|
|
1433
|
+
dispatchSize = computeNode.dispatchSize || computeNode.count;
|
|
1434
|
+
|
|
1435
|
+
}
|
|
1436
|
+
|
|
1437
|
+
// When the dispatchSize is set with a StorageBuffer from the GPU.
|
|
1438
|
+
|
|
1439
|
+
if ( dispatchSize && dispatchSize.isIndirectStorageBufferAttribute ) {
|
|
1345
1440
|
|
|
1346
|
-
|
|
1441
|
+
const dispatchBuffer = this.get( dispatchSize ).buffer;
|
|
1347
1442
|
|
|
1348
|
-
|
|
1443
|
+
passEncoderGPU.dispatchWorkgroupsIndirect( dispatchBuffer, 0 );
|
|
1444
|
+
|
|
1445
|
+
return;
|
|
1349
1446
|
|
|
1350
1447
|
}
|
|
1351
1448
|
|
|
1352
|
-
if ( typeof
|
|
1449
|
+
if ( typeof dispatchSize === 'number' ) {
|
|
1353
1450
|
|
|
1354
1451
|
// If a single number is given, we calculate the dispatch size based on the workgroup size
|
|
1355
1452
|
|
|
1356
|
-
const count =
|
|
1453
|
+
const count = dispatchSize;
|
|
1357
1454
|
|
|
1358
1455
|
if ( computeNodeData.dispatchSize === undefined || computeNodeData.count !== count ) {
|
|
1359
1456
|
|
|
@@ -1390,10 +1487,6 @@ class WebGPUBackend extends Backend {
|
|
|
1390
1487
|
|
|
1391
1488
|
dispatchSize = computeNodeData.dispatchSize;
|
|
1392
1489
|
|
|
1393
|
-
} else {
|
|
1394
|
-
|
|
1395
|
-
dispatchSize = dispatchSizeOrCount;
|
|
1396
|
-
|
|
1397
1490
|
}
|
|
1398
1491
|
|
|
1399
1492
|
//
|
|
@@ -1423,192 +1516,200 @@ class WebGPUBackend extends Backend {
|
|
|
1423
1516
|
}
|
|
1424
1517
|
|
|
1425
1518
|
/**
|
|
1426
|
-
*
|
|
1427
|
-
* the CPU waits for the GPU to complete its operation (e.g. a compute task).
|
|
1428
|
-
*
|
|
1429
|
-
* @async
|
|
1430
|
-
* @return {Promise} A Promise that resolves when synchronization has been finished.
|
|
1431
|
-
*/
|
|
1432
|
-
async waitForGPU() {
|
|
1433
|
-
|
|
1434
|
-
await this.device.queue.onSubmittedWorkDone();
|
|
1435
|
-
|
|
1436
|
-
}
|
|
1437
|
-
|
|
1438
|
-
// render object
|
|
1439
|
-
|
|
1440
|
-
/**
|
|
1441
|
-
* Executes a draw command for the given render object.
|
|
1519
|
+
* Internal draw function that performs the draw with the given pass encoder.
|
|
1442
1520
|
*
|
|
1443
|
-
* @
|
|
1521
|
+
* @private
|
|
1522
|
+
* @param {RenderObject} renderObject - The render object.
|
|
1444
1523
|
* @param {Info} info - Holds a series of statistical information about the GPU memory and the rendering process.
|
|
1524
|
+
* @param {Object} renderContextData - The render context data object, holding current pass state and occlusion query tracking.
|
|
1525
|
+
* @param {GPURenderPipeline} pipelineGPU - The GPU render pipeline.
|
|
1526
|
+
* @param {Array<BindGroup>} bindings - The bind groups.
|
|
1527
|
+
* @param {Array<BufferAttribute>} vertexBuffers - The vertex buffers.
|
|
1528
|
+
* @param {{vertexCount: number, firstVertex: number, instanceCount: number, firstInstance: number}} drawParams - The draw parameters.
|
|
1529
|
+
* @param {GPURenderPassEncoder|GPURenderBundleEncoder} passEncoderGPU - The GPU pass encoder used for recording draw commands.
|
|
1530
|
+
* @param {Object} currentSets - Tracking object for currently set pipeline, attributes, bind groups, and index state.
|
|
1445
1531
|
*/
|
|
1446
|
-
|
|
1532
|
+
_draw( renderObject, info, renderContextData, pipelineGPU, bindings, vertexBuffers, drawParams, passEncoderGPU, currentSets ) {
|
|
1447
1533
|
|
|
1448
|
-
const { object, material, context
|
|
1449
|
-
const bindings = renderObject.getBindings();
|
|
1450
|
-
const renderContextData = this.get( context );
|
|
1451
|
-
const pipelineGPU = this.get( pipeline ).pipeline;
|
|
1534
|
+
const { object, material, context } = renderObject;
|
|
1452
1535
|
|
|
1453
1536
|
const index = renderObject.getIndex();
|
|
1454
1537
|
const hasIndex = ( index !== null );
|
|
1455
1538
|
|
|
1456
|
-
|
|
1457
|
-
const drawParams = renderObject.getDrawParameters();
|
|
1458
|
-
if ( drawParams === null ) return;
|
|
1459
|
-
|
|
1460
1539
|
// pipeline
|
|
1540
|
+
this.pipelineUtils.setPipeline( passEncoderGPU, pipelineGPU );
|
|
1541
|
+
currentSets.pipeline = pipelineGPU;
|
|
1461
1542
|
|
|
1462
|
-
|
|
1543
|
+
// bind groups
|
|
1544
|
+
const currentBindingGroups = currentSets.bindingGroups;
|
|
1545
|
+
for ( let i = 0, l = bindings.length; i < l; i ++ ) {
|
|
1463
1546
|
|
|
1464
|
-
|
|
1465
|
-
this.
|
|
1466
|
-
|
|
1547
|
+
const bindGroup = bindings[ i ];
|
|
1548
|
+
const bindingsData = this.get( bindGroup );
|
|
1549
|
+
if ( currentBindingGroups[ i ] !== bindGroup.id ) {
|
|
1467
1550
|
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
for ( let i = 0, l = bindings.length; i < l; i ++ ) {
|
|
1551
|
+
passEncoderGPU.setBindGroup( i, bindingsData.group );
|
|
1552
|
+
currentBindingGroups[ i ] = bindGroup.id;
|
|
1471
1553
|
|
|
1472
|
-
|
|
1473
|
-
const bindingsData = this.get( bindGroup );
|
|
1474
|
-
if ( currentBindingGroups[ bindGroup.index ] !== bindGroup.id ) {
|
|
1554
|
+
}
|
|
1475
1555
|
|
|
1476
|
-
|
|
1477
|
-
currentBindingGroups[ bindGroup.index ] = bindGroup.id;
|
|
1556
|
+
}
|
|
1478
1557
|
|
|
1479
|
-
|
|
1558
|
+
// attributes
|
|
1480
1559
|
|
|
1481
|
-
|
|
1560
|
+
// index
|
|
1482
1561
|
|
|
1483
|
-
|
|
1562
|
+
if ( hasIndex === true ) {
|
|
1484
1563
|
|
|
1485
|
-
|
|
1564
|
+
if ( currentSets.index !== index ) {
|
|
1486
1565
|
|
|
1487
|
-
|
|
1566
|
+
const buffer = this.get( index ).buffer;
|
|
1567
|
+
const indexFormat = ( index.array instanceof Uint16Array ) ? GPUIndexFormat.Uint16 : GPUIndexFormat.Uint32;
|
|
1488
1568
|
|
|
1489
|
-
|
|
1569
|
+
passEncoderGPU.setIndexBuffer( buffer, indexFormat );
|
|
1490
1570
|
|
|
1491
|
-
|
|
1492
|
-
const indexFormat = ( index.array instanceof Uint16Array ) ? GPUIndexFormat.Uint16 : GPUIndexFormat.Uint32;
|
|
1571
|
+
currentSets.index = index;
|
|
1493
1572
|
|
|
1494
|
-
|
|
1573
|
+
}
|
|
1495
1574
|
|
|
1496
|
-
|
|
1575
|
+
}
|
|
1497
1576
|
|
|
1498
|
-
|
|
1577
|
+
for ( let i = 0, l = vertexBuffers.length; i < l; i ++ ) {
|
|
1499
1578
|
|
|
1500
|
-
|
|
1501
|
-
// vertex buffers
|
|
1579
|
+
const vertexBuffer = vertexBuffers[ i ];
|
|
1502
1580
|
|
|
1503
|
-
|
|
1581
|
+
if ( currentSets.attributes[ i ] !== vertexBuffer ) {
|
|
1504
1582
|
|
|
1505
|
-
|
|
1583
|
+
const buffer = this.get( vertexBuffer ).buffer;
|
|
1584
|
+
passEncoderGPU.setVertexBuffer( i, buffer );
|
|
1506
1585
|
|
|
1507
|
-
|
|
1586
|
+
currentSets.attributes[ i ] = vertexBuffer;
|
|
1508
1587
|
|
|
1509
|
-
|
|
1588
|
+
}
|
|
1510
1589
|
|
|
1511
|
-
|
|
1512
|
-
|
|
1590
|
+
}
|
|
1591
|
+
// stencil
|
|
1513
1592
|
|
|
1514
|
-
|
|
1593
|
+
if ( context.stencil === true && material.stencilWrite === true && renderContextData.currentStencilRef !== material.stencilRef ) {
|
|
1515
1594
|
|
|
1516
|
-
|
|
1595
|
+
passEncoderGPU.setStencilReference( material.stencilRef );
|
|
1596
|
+
renderContextData.currentStencilRef = material.stencilRef;
|
|
1517
1597
|
|
|
1518
|
-
|
|
1519
|
-
// stencil
|
|
1598
|
+
}
|
|
1520
1599
|
|
|
1521
|
-
|
|
1600
|
+
if ( object.isBatchedMesh === true ) {
|
|
1522
1601
|
|
|
1523
|
-
|
|
1524
|
-
|
|
1602
|
+
const starts = object._multiDrawStarts;
|
|
1603
|
+
const counts = object._multiDrawCounts;
|
|
1604
|
+
const drawCount = object._multiDrawCount;
|
|
1525
1605
|
|
|
1526
|
-
|
|
1606
|
+
let bytesPerElement = ( hasIndex === true ) ? index.array.BYTES_PER_ELEMENT : 1;
|
|
1527
1607
|
|
|
1608
|
+
if ( material.wireframe ) {
|
|
1528
1609
|
|
|
1529
|
-
|
|
1610
|
+
bytesPerElement = object.geometry.attributes.position.count > 65535 ? 4 : 2;
|
|
1530
1611
|
|
|
1531
|
-
|
|
1532
|
-
const draw = ( passEncoderGPU, currentSets ) => {
|
|
1612
|
+
}
|
|
1533
1613
|
|
|
1534
|
-
|
|
1614
|
+
for ( let i = 0; i < drawCount; i ++ ) {
|
|
1535
1615
|
|
|
1536
|
-
|
|
1616
|
+
if ( hasIndex === true ) {
|
|
1537
1617
|
|
|
1538
|
-
|
|
1539
|
-
const counts = object._multiDrawCounts;
|
|
1540
|
-
const drawCount = object._multiDrawCount;
|
|
1541
|
-
const drawInstances = object._multiDrawInstances;
|
|
1618
|
+
passEncoderGPU.drawIndexed( counts[ i ], 1, starts[ i ] / bytesPerElement, 0, i );
|
|
1542
1619
|
|
|
1543
|
-
|
|
1620
|
+
} else {
|
|
1544
1621
|
|
|
1545
|
-
|
|
1546
|
-
warnOnce( 'THREE.WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' );
|
|
1622
|
+
passEncoderGPU.draw( counts[ i ], 1, starts[ i ], i );
|
|
1547
1623
|
|
|
1548
1624
|
}
|
|
1549
1625
|
|
|
1550
|
-
|
|
1626
|
+
info.update( object, counts[ i ], 1 );
|
|
1551
1627
|
|
|
1552
|
-
|
|
1553
|
-
const firstInstance = count > 1 ? 0 : i;
|
|
1628
|
+
}
|
|
1554
1629
|
|
|
1555
|
-
|
|
1630
|
+
} else if ( hasIndex === true ) {
|
|
1556
1631
|
|
|
1557
|
-
|
|
1632
|
+
const { vertexCount: indexCount, instanceCount, firstVertex: firstIndex } = drawParams;
|
|
1558
1633
|
|
|
1559
|
-
|
|
1634
|
+
const indirect = renderObject.getIndirect();
|
|
1560
1635
|
|
|
1561
|
-
|
|
1636
|
+
if ( indirect !== null ) {
|
|
1562
1637
|
|
|
1563
|
-
|
|
1638
|
+
const buffer = this.get( indirect ).buffer;
|
|
1639
|
+
const indirectOffset = renderObject.getIndirectOffset();
|
|
1640
|
+
const indirectOffsets = Array.isArray( indirectOffset ) ? indirectOffset : [ indirectOffset ];
|
|
1641
|
+
|
|
1642
|
+
for ( let i = 0; i < indirectOffsets.length; i ++ ) {
|
|
1564
1643
|
|
|
1565
|
-
|
|
1644
|
+
passEncoderGPU.drawIndexedIndirect( buffer, indirectOffsets[ i ] );
|
|
1566
1645
|
|
|
1567
1646
|
}
|
|
1568
1647
|
|
|
1569
|
-
} else
|
|
1648
|
+
} else {
|
|
1649
|
+
|
|
1650
|
+
passEncoderGPU.drawIndexed( indexCount, instanceCount, firstIndex, 0, 0 );
|
|
1570
1651
|
|
|
1571
|
-
|
|
1652
|
+
}
|
|
1653
|
+
|
|
1654
|
+
info.update( object, indexCount, instanceCount );
|
|
1572
1655
|
|
|
1573
|
-
|
|
1656
|
+
} else {
|
|
1574
1657
|
|
|
1575
|
-
|
|
1658
|
+
const { vertexCount, instanceCount, firstVertex } = drawParams;
|
|
1576
1659
|
|
|
1577
|
-
|
|
1660
|
+
const indirect = renderObject.getIndirect();
|
|
1578
1661
|
|
|
1579
|
-
|
|
1662
|
+
if ( indirect !== null ) {
|
|
1580
1663
|
|
|
1581
|
-
|
|
1664
|
+
const buffer = this.get( indirect ).buffer;
|
|
1665
|
+
const indirectOffset = renderObject.getIndirectOffset();
|
|
1666
|
+
const indirectOffsets = Array.isArray( indirectOffset ) ? indirectOffset : [ indirectOffset ];
|
|
1582
1667
|
|
|
1583
|
-
|
|
1668
|
+
for ( let i = 0; i < indirectOffsets.length; i ++ ) {
|
|
1669
|
+
|
|
1670
|
+
passEncoderGPU.drawIndirect( buffer, indirectOffsets[ i ] );
|
|
1584
1671
|
|
|
1585
1672
|
}
|
|
1586
1673
|
|
|
1587
|
-
info.update( object, indexCount, instanceCount );
|
|
1588
1674
|
|
|
1589
1675
|
} else {
|
|
1590
1676
|
|
|
1591
|
-
|
|
1677
|
+
passEncoderGPU.draw( vertexCount, instanceCount, firstVertex, 0 );
|
|
1592
1678
|
|
|
1593
|
-
|
|
1679
|
+
}
|
|
1594
1680
|
|
|
1595
|
-
|
|
1681
|
+
info.update( object, vertexCount, instanceCount );
|
|
1596
1682
|
|
|
1597
|
-
|
|
1683
|
+
}
|
|
1598
1684
|
|
|
1599
|
-
|
|
1685
|
+
}
|
|
1600
1686
|
|
|
1601
|
-
|
|
1687
|
+
// render object
|
|
1602
1688
|
|
|
1603
|
-
|
|
1689
|
+
/**
|
|
1690
|
+
* Executes a draw command for the given render object.
|
|
1691
|
+
*
|
|
1692
|
+
* @param {RenderObject} renderObject - The render object to draw.
|
|
1693
|
+
* @param {Info} info - Holds a series of statistical information about the GPU memory and the rendering process.
|
|
1694
|
+
*/
|
|
1695
|
+
draw( renderObject, info ) {
|
|
1604
1696
|
|
|
1605
|
-
|
|
1697
|
+
const { object, context, pipeline } = renderObject;
|
|
1698
|
+
const renderContextData = this.get( context );
|
|
1699
|
+
const pipelineData = this.get( pipeline );
|
|
1700
|
+
const pipelineGPU = pipelineData.pipeline;
|
|
1606
1701
|
|
|
1607
|
-
|
|
1702
|
+
// Skip if pipeline has error
|
|
1703
|
+
if ( pipelineData.error === true ) return;
|
|
1608
1704
|
|
|
1609
|
-
|
|
1705
|
+
const drawParams = renderObject.getDrawParameters();
|
|
1706
|
+
if ( drawParams === null ) return;
|
|
1610
1707
|
|
|
1611
|
-
|
|
1708
|
+
const bindings = renderObject.getBindings();
|
|
1709
|
+
|
|
1710
|
+
// vertex buffers
|
|
1711
|
+
|
|
1712
|
+
const vertexBuffers = renderObject.getVertexBuffers();
|
|
1612
1713
|
|
|
1613
1714
|
if ( renderObject.camera.isArrayCamera && renderObject.camera.cameras.length > 0 ) {
|
|
1614
1715
|
|
|
@@ -1627,7 +1728,9 @@ class WebGPUBackend extends Backend {
|
|
|
1627
1728
|
|
|
1628
1729
|
data[ 0 ] = i;
|
|
1629
1730
|
|
|
1630
|
-
const
|
|
1731
|
+
const { layoutGPU } = bindingsData.layout;
|
|
1732
|
+
|
|
1733
|
+
const bindGroupIndex = this.bindingUtils.createBindGroupIndex( data, layoutGPU );
|
|
1631
1734
|
|
|
1632
1735
|
indexesGPU.push( bindGroupIndex );
|
|
1633
1736
|
|
|
@@ -1647,8 +1750,6 @@ class WebGPUBackend extends Backend {
|
|
|
1647
1750
|
|
|
1648
1751
|
const vp = subCamera.viewport;
|
|
1649
1752
|
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
1753
|
let pass = renderContextData.currentPass;
|
|
1653
1754
|
let sets = renderContextData.currentSets;
|
|
1654
1755
|
if ( renderContextData.bundleEncoders ) {
|
|
@@ -1660,8 +1761,6 @@ class WebGPUBackend extends Backend {
|
|
|
1660
1761
|
|
|
1661
1762
|
}
|
|
1662
1763
|
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
1764
|
if ( vp ) {
|
|
1666
1765
|
|
|
1667
1766
|
pass.setViewport(
|
|
@@ -1675,17 +1774,16 @@ class WebGPUBackend extends Backend {
|
|
|
1675
1774
|
|
|
1676
1775
|
}
|
|
1677
1776
|
|
|
1678
|
-
|
|
1679
1777
|
// Set camera index binding for this layer
|
|
1680
1778
|
if ( cameraIndex && cameraData.indexesGPU ) {
|
|
1681
1779
|
|
|
1682
|
-
|
|
1683
|
-
|
|
1780
|
+
const indexPos = bindings.indexOf( cameraIndex );
|
|
1781
|
+
pass.setBindGroup( indexPos, cameraData.indexesGPU[ i ] );
|
|
1782
|
+
sets.bindingGroups[ indexPos ] = cameraIndex.id;
|
|
1684
1783
|
|
|
1685
1784
|
}
|
|
1686
1785
|
|
|
1687
|
-
|
|
1688
|
-
|
|
1786
|
+
this._draw( renderObject, info, renderContextData, pipelineGPU, bindings, vertexBuffers, drawParams, pass, sets );
|
|
1689
1787
|
|
|
1690
1788
|
}
|
|
1691
1789
|
|
|
@@ -1722,7 +1820,7 @@ class WebGPUBackend extends Backend {
|
|
|
1722
1820
|
|
|
1723
1821
|
}
|
|
1724
1822
|
|
|
1725
|
-
|
|
1823
|
+
this._draw( renderObject, info, renderContextData, pipelineGPU, bindings, vertexBuffers, drawParams, renderContextData.currentPass, renderContextData.currentSets );
|
|
1726
1824
|
|
|
1727
1825
|
}
|
|
1728
1826
|
|
|
@@ -1807,6 +1905,11 @@ class WebGPUBackend extends Backend {
|
|
|
1807
1905
|
const utils = this.utils;
|
|
1808
1906
|
const renderContext = renderObject.context;
|
|
1809
1907
|
|
|
1908
|
+
// meshes with negative scale have a different frontFace render pipeline
|
|
1909
|
+
// descriptor value so the following must be honored in the cache key
|
|
1910
|
+
|
|
1911
|
+
const frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );
|
|
1912
|
+
|
|
1810
1913
|
return [
|
|
1811
1914
|
material.transparent, material.blending, material.premultipliedAlpha,
|
|
1812
1915
|
material.blendSrc, material.blendDst, material.blendEquation,
|
|
@@ -1817,6 +1920,7 @@ class WebGPUBackend extends Backend {
|
|
|
1817
1920
|
material.stencilFail, material.stencilZFail, material.stencilZPass,
|
|
1818
1921
|
material.stencilFuncMask, material.stencilWriteMask,
|
|
1819
1922
|
material.side,
|
|
1923
|
+
frontFaceCW,
|
|
1820
1924
|
utils.getSampleCountRenderContext( renderContext ),
|
|
1821
1925
|
utils.getCurrentColorSpace( renderContext ), utils.getCurrentColorFormat( renderContext ), utils.getCurrentDepthStencilFormat( renderContext ),
|
|
1822
1926
|
utils.getPrimitiveTopology( object, material ),
|
|
@@ -1829,24 +1933,14 @@ class WebGPUBackend extends Backend {
|
|
|
1829
1933
|
// textures
|
|
1830
1934
|
|
|
1831
1935
|
/**
|
|
1832
|
-
*
|
|
1936
|
+
* Updates a GPU sampler for the given texture.
|
|
1833
1937
|
*
|
|
1834
|
-
* @param {Texture} texture - The texture to
|
|
1938
|
+
* @param {Texture} texture - The texture to update the sampler for.
|
|
1939
|
+
* @return {string} The current sampler key.
|
|
1835
1940
|
*/
|
|
1836
|
-
|
|
1941
|
+
updateSampler( texture ) {
|
|
1837
1942
|
|
|
1838
|
-
this.textureUtils.
|
|
1839
|
-
|
|
1840
|
-
}
|
|
1841
|
-
|
|
1842
|
-
/**
|
|
1843
|
-
* Destroys the GPU sampler for the given texture.
|
|
1844
|
-
*
|
|
1845
|
-
* @param {Texture} texture - The texture to destroy the sampler for.
|
|
1846
|
-
*/
|
|
1847
|
-
destroySampler( texture ) {
|
|
1848
|
-
|
|
1849
|
-
this.textureUtils.destroySampler( texture );
|
|
1943
|
+
return this.textureUtils.updateSampler( texture );
|
|
1850
1944
|
|
|
1851
1945
|
}
|
|
1852
1946
|
|
|
@@ -1855,10 +1949,11 @@ class WebGPUBackend extends Backend {
|
|
|
1855
1949
|
* as a placeholder until the actual texture is ready for usage.
|
|
1856
1950
|
*
|
|
1857
1951
|
* @param {Texture} texture - The texture to create a default texture for.
|
|
1952
|
+
* @return {boolean} Whether the sampler has been updated or not.
|
|
1858
1953
|
*/
|
|
1859
1954
|
createDefaultTexture( texture ) {
|
|
1860
1955
|
|
|
1861
|
-
this.textureUtils.createDefaultTexture( texture );
|
|
1956
|
+
return this.textureUtils.createDefaultTexture( texture );
|
|
1862
1957
|
|
|
1863
1958
|
}
|
|
1864
1959
|
|
|
@@ -1901,10 +1996,11 @@ class WebGPUBackend extends Backend {
|
|
|
1901
1996
|
* Destroys the GPU data for the given texture object.
|
|
1902
1997
|
*
|
|
1903
1998
|
* @param {Texture} texture - The texture.
|
|
1999
|
+
* @param {boolean} [isDefaultTexture=false] - Whether the texture uses a default GPU texture or not.
|
|
1904
2000
|
*/
|
|
1905
|
-
destroyTexture( texture ) {
|
|
2001
|
+
destroyTexture( texture, isDefaultTexture = false ) {
|
|
1906
2002
|
|
|
1907
|
-
this.textureUtils.destroyTexture( texture );
|
|
2003
|
+
this.textureUtils.destroyTexture( texture, isDefaultTexture );
|
|
1908
2004
|
|
|
1909
2005
|
}
|
|
1910
2006
|
|
|
@@ -1929,15 +2025,14 @@ class WebGPUBackend extends Backend {
|
|
|
1929
2025
|
/**
|
|
1930
2026
|
* Inits a time stamp query for the given render context.
|
|
1931
2027
|
*
|
|
1932
|
-
* @param {
|
|
2028
|
+
* @param {string} type - The type of the timestamp query (e.g. 'render', 'compute').
|
|
2029
|
+
* @param {number} uid - Unique id for the context (e.g. render context id).
|
|
1933
2030
|
* @param {Object} descriptor - The query descriptor.
|
|
1934
2031
|
*/
|
|
1935
|
-
initTimestampQuery(
|
|
2032
|
+
initTimestampQuery( type, uid, descriptor ) {
|
|
1936
2033
|
|
|
1937
2034
|
if ( ! this.trackTimestamp ) return;
|
|
1938
2035
|
|
|
1939
|
-
const type = renderContext.isComputeNode ? 'compute' : 'render';
|
|
1940
|
-
|
|
1941
2036
|
if ( ! this.timestampQueryPool[ type ] ) {
|
|
1942
2037
|
|
|
1943
2038
|
// TODO: Variable maxQueries?
|
|
@@ -1947,13 +2042,13 @@ class WebGPUBackend extends Backend {
|
|
|
1947
2042
|
|
|
1948
2043
|
const timestampQueryPool = this.timestampQueryPool[ type ];
|
|
1949
2044
|
|
|
1950
|
-
const baseOffset = timestampQueryPool.allocateQueriesForContext(
|
|
2045
|
+
const baseOffset = timestampQueryPool.allocateQueriesForContext( uid );
|
|
1951
2046
|
|
|
1952
2047
|
descriptor.timestampWrites = {
|
|
1953
2048
|
querySet: timestampQueryPool.querySet,
|
|
1954
2049
|
beginningOfPassWriteIndex: baseOffset,
|
|
1955
2050
|
endOfPassWriteIndex: baseOffset + 1,
|
|
1956
|
-
|
|
2051
|
+
};
|
|
1957
2052
|
|
|
1958
2053
|
}
|
|
1959
2054
|
|
|
@@ -2122,6 +2217,17 @@ class WebGPUBackend extends Backend {
|
|
|
2122
2217
|
|
|
2123
2218
|
}
|
|
2124
2219
|
|
|
2220
|
+
/**
|
|
2221
|
+
* Delete data associated with the current bind group.
|
|
2222
|
+
*
|
|
2223
|
+
* @param {BindGroup} bindGroup - The bind group.
|
|
2224
|
+
*/
|
|
2225
|
+
deleteBindGroupData( bindGroup ) {
|
|
2226
|
+
|
|
2227
|
+
this.bindingUtils.deleteBindGroupData( bindGroup );
|
|
2228
|
+
|
|
2229
|
+
}
|
|
2230
|
+
|
|
2125
2231
|
// attributes
|
|
2126
2232
|
|
|
2127
2233
|
/**
|
|
@@ -2205,32 +2311,22 @@ class WebGPUBackend extends Backend {
|
|
|
2205
2311
|
*/
|
|
2206
2312
|
updateSize() {
|
|
2207
2313
|
|
|
2208
|
-
this.
|
|
2209
|
-
this.defaultRenderPassdescriptor = null;
|
|
2314
|
+
this.delete( this.renderer.getCanvasTarget() );
|
|
2210
2315
|
|
|
2211
2316
|
}
|
|
2212
2317
|
|
|
2213
2318
|
// utils public
|
|
2214
2319
|
|
|
2215
2320
|
/**
|
|
2216
|
-
*
|
|
2217
|
-
*
|
|
2218
|
-
* @return {number} The maximum anisotropy texture filtering value.
|
|
2219
|
-
*/
|
|
2220
|
-
getMaxAnisotropy() {
|
|
2221
|
-
|
|
2222
|
-
return 16;
|
|
2223
|
-
|
|
2224
|
-
}
|
|
2225
|
-
|
|
2226
|
-
/**
|
|
2227
|
-
* Checks if the given feature is supported by the backend.
|
|
2321
|
+
* Checks if the given feature is supported by the backend.
|
|
2228
2322
|
*
|
|
2229
2323
|
* @param {string} name - The feature's name.
|
|
2230
2324
|
* @return {boolean} Whether the feature is supported or not.
|
|
2231
2325
|
*/
|
|
2232
2326
|
hasFeature( name ) {
|
|
2233
2327
|
|
|
2328
|
+
if ( GPUFeatureMap[ name ] !== undefined ) name = GPUFeatureMap[ name ];
|
|
2329
|
+
|
|
2234
2330
|
return this.device.features.has( name );
|
|
2235
2331
|
|
|
2236
2332
|
}
|
|
@@ -2369,7 +2465,7 @@ class WebGPUBackend extends Backend {
|
|
|
2369
2465
|
|
|
2370
2466
|
if ( sourceGPU.format !== destinationGPU.format ) {
|
|
2371
2467
|
|
|
2372
|
-
|
|
2468
|
+
error( 'WebGPUBackend: copyFramebufferToTexture: Source and destination formats do not match.', sourceGPU.format, destinationGPU.format );
|
|
2373
2469
|
|
|
2374
2470
|
return;
|
|
2375
2471
|
|
|
@@ -2403,6 +2499,15 @@ class WebGPUBackend extends Backend {
|
|
|
2403
2499
|
]
|
|
2404
2500
|
);
|
|
2405
2501
|
|
|
2502
|
+
// mipmaps must be genereated with the same encoder otherwise the copied texture data
|
|
2503
|
+
// might be out-of-sync, see #31768
|
|
2504
|
+
|
|
2505
|
+
if ( texture.generateMipmaps ) {
|
|
2506
|
+
|
|
2507
|
+
this.textureUtils.generateMipmaps( texture, encoder );
|
|
2508
|
+
|
|
2509
|
+
}
|
|
2510
|
+
|
|
2406
2511
|
if ( renderContextData.currentPass ) {
|
|
2407
2512
|
|
|
2408
2513
|
const { descriptor } = renderContextData;
|
|
@@ -2427,9 +2532,7 @@ class WebGPUBackend extends Backend {
|
|
|
2427
2532
|
|
|
2428
2533
|
if ( renderContext.scissor ) {
|
|
2429
2534
|
|
|
2430
|
-
|
|
2431
|
-
|
|
2432
|
-
renderContextData.currentPass.setScissorRect( x, y, width, height );
|
|
2535
|
+
this.updateScissor( renderContext );
|
|
2433
2536
|
|
|
2434
2537
|
}
|
|
2435
2538
|
|
|
@@ -2439,9 +2542,56 @@ class WebGPUBackend extends Backend {
|
|
|
2439
2542
|
|
|
2440
2543
|
}
|
|
2441
2544
|
|
|
2442
|
-
|
|
2545
|
+
}
|
|
2546
|
+
|
|
2547
|
+
/**
|
|
2548
|
+
* Checks if the given compatibility is supported by the backend.
|
|
2549
|
+
*
|
|
2550
|
+
* @param {string} name - The compatibility name.
|
|
2551
|
+
* @return {boolean} Whether the compatibility is supported or not.
|
|
2552
|
+
*/
|
|
2553
|
+
hasCompatibility( name ) {
|
|
2554
|
+
|
|
2555
|
+
if ( this._compatibility[ name ] !== undefined ) {
|
|
2556
|
+
|
|
2557
|
+
return this._compatibility[ name ];
|
|
2558
|
+
|
|
2559
|
+
}
|
|
2560
|
+
|
|
2561
|
+
return super.hasCompatibility( name );
|
|
2562
|
+
|
|
2563
|
+
}
|
|
2564
|
+
|
|
2565
|
+
dispose() {
|
|
2566
|
+
|
|
2567
|
+
this.bindingUtils.dispose();
|
|
2568
|
+
this.textureUtils.dispose();
|
|
2569
|
+
|
|
2570
|
+
if ( this.occludedResolveCache ) {
|
|
2571
|
+
|
|
2572
|
+
for ( const buffer of this.occludedResolveCache.values() ) {
|
|
2573
|
+
|
|
2574
|
+
buffer.destroy();
|
|
2575
|
+
|
|
2576
|
+
}
|
|
2577
|
+
|
|
2578
|
+
this.occludedResolveCache.clear();
|
|
2579
|
+
|
|
2580
|
+
}
|
|
2581
|
+
|
|
2582
|
+
if ( this.timestampQueryPool ) {
|
|
2583
|
+
|
|
2584
|
+
for ( const queryPool of Object.values( this.timestampQueryPool ) ) {
|
|
2585
|
+
|
|
2586
|
+
if ( queryPool !== null ) queryPool.dispose();
|
|
2587
|
+
|
|
2588
|
+
}
|
|
2589
|
+
|
|
2590
|
+
}
|
|
2591
|
+
|
|
2592
|
+
if ( this.parameters.device === undefined && this.device !== null ) {
|
|
2443
2593
|
|
|
2444
|
-
this.
|
|
2594
|
+
this.device.destroy();
|
|
2445
2595
|
|
|
2446
2596
|
}
|
|
2447
2597
|
|