super-three 0.160.1 → 0.162.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/build/three.cjs +867 -499
- package/build/three.module.js +867 -496
- package/build/three.module.min.js +1 -1
- package/examples/jsm/Addons.js +5 -1
- package/examples/jsm/capabilities/WebGPU.js +13 -9
- package/examples/jsm/controls/DragControls.js +91 -30
- package/examples/jsm/controls/OrbitControls.js +130 -15
- package/examples/jsm/controls/TransformControls.js +6 -6
- package/examples/jsm/curves/NURBSUtils.js +59 -4
- package/examples/jsm/curves/NURBSVolume.js +62 -0
- package/examples/jsm/exporters/GLTFExporter.js +11 -1
- package/examples/jsm/exporters/USDZExporter.js +8 -7
- package/examples/jsm/helpers/TextureHelper.js +3 -3
- package/examples/jsm/interactive/InteractiveGroup.js +15 -25
- package/examples/jsm/libs/rhino3dm/rhino3dm.js +1 -8723
- package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +1 -8734
- package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
- package/examples/jsm/libs/tween.module.js +32 -14
- package/examples/jsm/loaders/3DMLoader.js +57 -64
- package/examples/jsm/loaders/DDSLoader.js +1 -0
- package/examples/jsm/loaders/KTX2Loader.js +20 -5
- package/examples/jsm/loaders/LUT3dlLoader.js +78 -46
- package/examples/jsm/loaders/LUTCubeLoader.js +81 -67
- package/examples/jsm/loaders/LUTImageLoader.js +3 -2
- package/examples/jsm/loaders/MaterialXLoader.js +115 -16
- package/examples/jsm/loaders/SVGLoader.js +4 -3
- package/examples/jsm/loaders/VOXLoader.js +9 -2
- package/examples/jsm/loaders/VRMLLoader.js +7 -3
- package/examples/jsm/materials/MeshPostProcessingMaterial.js +144 -0
- package/examples/jsm/misc/ProgressiveLightMap.js +1 -0
- package/examples/jsm/misc/Timer.js +13 -4
- package/examples/jsm/nodes/Nodes.js +24 -11
- package/examples/jsm/nodes/accessors/AccessorsUtils.js +10 -0
- package/examples/jsm/nodes/accessors/BufferAttributeNode.js +5 -3
- package/examples/jsm/nodes/accessors/CameraNode.js +9 -4
- package/examples/jsm/nodes/accessors/ClippingNode.js +144 -0
- package/examples/jsm/nodes/accessors/CubeTextureNode.js +12 -1
- package/examples/jsm/nodes/accessors/MaterialNode.js +2 -2
- package/examples/jsm/nodes/accessors/MaterialReferenceNode.js +2 -12
- package/examples/jsm/nodes/accessors/MorphNode.js +8 -8
- package/examples/jsm/nodes/accessors/ReferenceNode.js +87 -29
- package/examples/jsm/nodes/accessors/SkinningNode.js +31 -10
- package/examples/jsm/nodes/accessors/StorageBufferNode.js +45 -0
- package/examples/jsm/nodes/accessors/TangentNode.js +8 -2
- package/examples/jsm/nodes/accessors/TextureNode.js +1 -1
- package/examples/jsm/nodes/accessors/TextureStoreNode.js +56 -3
- package/examples/jsm/nodes/accessors/UniformsNode.js +140 -0
- package/examples/jsm/nodes/accessors/VertexColorNode.js +70 -0
- package/examples/jsm/nodes/code/CodeNode.js +6 -0
- package/examples/jsm/nodes/core/AssignNode.js +68 -12
- package/examples/jsm/nodes/core/AttributeNode.js +1 -1
- package/examples/jsm/nodes/core/Node.js +14 -4
- package/examples/jsm/nodes/core/NodeBuilder.js +26 -27
- package/examples/jsm/nodes/core/NodeFrame.js +18 -10
- package/examples/jsm/nodes/core/TempNode.js +1 -1
- package/examples/jsm/nodes/core/constants.js +1 -0
- package/examples/jsm/nodes/display/AfterImageNode.js +148 -0
- package/examples/jsm/nodes/display/AnamorphicNode.js +148 -0
- package/examples/jsm/nodes/display/BlendModeNode.js +30 -1
- package/examples/jsm/nodes/display/ColorAdjustmentNode.js +3 -0
- package/examples/jsm/nodes/display/GaussianBlurNode.js +33 -13
- package/examples/jsm/nodes/display/NormalMapNode.js +3 -5
- package/examples/jsm/nodes/display/PassNode.js +3 -2
- package/examples/jsm/nodes/display/ToneMappingNode.js +46 -3
- package/examples/jsm/nodes/display/ViewportDepthTextureNode.js +1 -4
- package/examples/jsm/nodes/display/ViewportNode.js +0 -2
- package/examples/jsm/nodes/display/ViewportSharedTextureNode.js +4 -4
- package/examples/jsm/nodes/fog/FogNode.js +2 -1
- package/examples/jsm/nodes/lighting/AmbientLightNode.js +1 -1
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +13 -5
- package/examples/jsm/nodes/lighting/LightingContextNode.js +1 -1
- package/examples/jsm/nodes/lighting/LightsNode.js +1 -1
- package/examples/jsm/nodes/materials/Line2NodeMaterial.js +18 -30
- package/examples/jsm/nodes/materials/Materials.js +1 -0
- package/examples/jsm/nodes/materials/MeshSSSNodeMaterial.js +84 -0
- package/examples/jsm/nodes/materials/NodeMaterial.js +43 -10
- package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +1 -7
- package/examples/jsm/nodes/math/CondNode.js +42 -7
- package/examples/jsm/nodes/math/MathNode.js +32 -2
- package/examples/jsm/nodes/math/MathUtils.js +15 -0
- package/examples/jsm/nodes/math/OperatorNode.js +13 -5
- package/examples/jsm/nodes/math/TriNoise3D.js +71 -0
- package/examples/jsm/nodes/shadernode/ShaderNode.js +10 -1
- package/examples/jsm/nodes/utils/JoinNode.js +2 -2
- package/examples/jsm/nodes/utils/LoopNode.js +5 -3
- package/examples/jsm/nodes/utils/ReflectorNode.js +227 -0
- package/examples/jsm/nodes/utils/RotateNode.js +68 -0
- package/examples/jsm/nodes/utils/RotateUVNode.js +1 -9
- package/examples/jsm/nodes/utils/SplitNode.js +4 -4
- package/examples/jsm/nodes/utils/StorageArrayElementNode.js +91 -0
- package/examples/jsm/objects/GroundedSkybox.js +50 -0
- package/examples/jsm/objects/QuadMesh.js +8 -2
- package/examples/jsm/objects/Water2.js +8 -8
- package/examples/jsm/postprocessing/GTAOPass.js +11 -1
- package/examples/jsm/postprocessing/OutputPass.js +2 -0
- package/examples/jsm/renderers/common/Backend.js +14 -0
- package/examples/jsm/renderers/common/Background.js +2 -2
- package/examples/jsm/renderers/common/Bindings.js +1 -1
- package/examples/jsm/renderers/common/ClippingContext.js +165 -0
- package/examples/jsm/renderers/common/DataMap.js +1 -1
- package/examples/jsm/renderers/common/Info.js +25 -1
- package/examples/jsm/renderers/common/Pipelines.js +8 -8
- package/examples/jsm/renderers/common/PostProcessing.js +2 -2
- package/examples/jsm/renderers/common/ProgrammableStage.js +3 -1
- package/examples/jsm/renderers/common/RenderContext.js +2 -0
- package/examples/jsm/renderers/common/RenderContexts.js +2 -13
- package/examples/jsm/renderers/common/RenderObject.js +46 -1
- package/examples/jsm/renderers/common/RenderObjects.js +3 -1
- package/examples/jsm/renderers/common/Renderer.js +290 -17
- package/examples/jsm/renderers/common/StorageBufferAttribute.js +17 -0
- package/examples/jsm/renderers/common/StorageInstancedBufferAttribute.js +17 -0
- package/examples/jsm/renderers/common/Textures.js +28 -18
- package/examples/jsm/renderers/common/UniformsGroup.js +6 -4
- package/examples/jsm/renderers/common/nodes/NodeBuilderState.js +2 -1
- package/examples/jsm/renderers/common/nodes/NodeStorageBuffer.js +23 -0
- package/examples/jsm/renderers/common/nodes/NodeUniformBuffer.js +23 -0
- package/examples/jsm/renderers/common/nodes/Nodes.js +5 -2
- package/examples/jsm/renderers/webgl/WebGLBackend.js +653 -272
- package/examples/jsm/renderers/webgl/nodes/GLSLNodeBuilder.js +171 -39
- package/examples/jsm/renderers/webgl/utils/WebGLAttributeUtils.js +95 -8
- package/examples/jsm/renderers/webgl/utils/WebGLConstants.js +11 -0
- package/examples/jsm/renderers/webgl/utils/WebGLState.js +197 -0
- package/examples/jsm/renderers/webgl/utils/WebGLTextureUtils.js +424 -11
- package/examples/jsm/renderers/webgl/utils/WebGLUtils.js +3 -2
- package/examples/jsm/renderers/webgl-legacy/nodes/GLSL1NodeBuilder.js +1 -21
- package/examples/jsm/renderers/webgl-legacy/nodes/WebGLNodeBuilder.js +2 -2
- package/examples/jsm/renderers/webgpu/WebGPUBackend.js +300 -112
- package/examples/jsm/renderers/webgpu/WebGPURenderer.js +7 -2
- package/examples/jsm/renderers/webgpu/nodes/WGSLNodeBuilder.js +71 -79
- package/examples/jsm/renderers/webgpu/utils/WebGPUAttributeUtils.js +15 -1
- package/examples/jsm/renderers/webgpu/utils/WebGPUPipelineUtils.js +38 -4
- package/examples/jsm/renderers/webgpu/utils/WebGPUTextureUtils.js +87 -14
- package/examples/jsm/shaders/OutputShader.js +4 -0
- package/examples/jsm/transpiler/AST.js +1 -1
- package/examples/jsm/transpiler/GLSLDecoder.js +1 -1
- package/examples/jsm/transpiler/ShaderToyDecoder.js +1 -1
- package/examples/jsm/transpiler/TSLEncoder.js +1 -1
- package/examples/jsm/utils/BufferGeometryUtils.js +23 -27
- package/examples/jsm/utils/SkeletonUtils.js +14 -3
- package/examples/jsm/utils/SortUtils.js +2 -0
- package/examples/jsm/webxr/ARButton.js +12 -2
- package/examples/jsm/webxr/VRButton.js +25 -7
- package/examples/jsm/webxr/XRButton.js +12 -3
- package/examples/jsm/webxr/XRControllerModelFactory.js +14 -1
- package/examples/jsm/webxr/XRHandMeshModel.js +3 -1
- package/package.json +5 -4
- package/src/Three.Legacy.js +20 -0
- package/src/Three.js +0 -1
- package/src/audio/Audio.js +1 -3
- package/src/cameras/PerspectiveCamera.js +35 -0
- package/src/constants.js +2 -6
- package/src/core/BufferAttribute.js +2 -12
- package/src/core/BufferGeometry.js +23 -29
- package/src/core/InterleavedBuffer.js +2 -1
- package/src/core/InterleavedBufferAttribute.js +20 -0
- package/src/core/Object3D.js +11 -0
- package/src/core/Raycaster.js +18 -4
- package/src/core/RenderTarget.js +44 -21
- package/src/extras/PMREMGenerator.js +2 -0
- package/src/extras/curves/EllipseCurve.js +2 -2
- package/src/helpers/SpotLightHelper.js +18 -1
- package/src/loaders/DataTextureLoader.js +0 -4
- package/src/loaders/MaterialLoader.js +1 -0
- package/src/loaders/ObjectLoader.js +2 -1
- package/src/materials/Material.js +2 -1
- package/src/materials/MeshBasicMaterial.js +3 -0
- package/src/materials/MeshLambertMaterial.js +3 -0
- package/src/materials/MeshPhongMaterial.js +3 -0
- package/src/materials/MeshStandardMaterial.js +3 -0
- package/src/materials/ShaderMaterial.js +2 -1
- package/src/math/Quaternion.js +13 -12
- package/src/math/Triangle.js +0 -30
- package/src/math/Vector3.js +7 -7
- package/src/objects/BatchedMesh.js +6 -7
- package/src/objects/InstancedMesh.js +53 -0
- package/src/objects/Mesh.js +0 -1
- package/src/objects/SkinnedMesh.js +0 -8
- package/src/renderers/WebGLCubeRenderTarget.js +1 -10
- package/src/renderers/WebGLRenderer.js +20 -23
- package/src/renderers/shaders/ShaderChunk/alphatest_fragment.glsl.js +9 -0
- package/src/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl.js +56 -11
- package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -0
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +14 -0
- package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +11 -2
- package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +38 -7
- package/src/renderers/shaders/ShaderChunk.js +2 -0
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +3 -2
- package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -2
- package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +3 -2
- package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +2 -2
- package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +2 -2
- package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +4 -1
- package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/points.glsl.js +2 -1
- package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -0
- package/src/renderers/shaders/ShaderLib/sprite.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib.js +2 -1
- package/src/renderers/shaders/UniformsLib.js +1 -0
- package/src/renderers/webgl/WebGLAttributes.js +2 -2
- package/src/renderers/webgl/WebGLBackground.js +18 -0
- package/src/renderers/webgl/WebGLCubeMaps.js +1 -1
- package/src/renderers/webgl/WebGLMaterials.js +24 -1
- package/src/renderers/webgl/WebGLMorphtargets.js +15 -8
- package/src/renderers/webgl/WebGLProgram.js +42 -4
- package/src/renderers/webgl/WebGLPrograms.js +38 -27
- package/src/renderers/webgl/WebGLState.js +11 -21
- package/src/renderers/webgl/WebGLTextures.js +170 -66
- package/src/renderers/webxr/WebXRDepthSensing.js +105 -0
- package/src/renderers/webxr/WebXRManager.js +46 -0
- package/src/scenes/Scene.js +8 -0
- package/src/textures/Source.js +1 -0
- package/src/textures/Texture.js +1 -29
- package/build/three.js +0 -54519
- package/build/three.min.js +0 -7
- package/examples/jsm/nodes/core/ArrayUniformNode.js +0 -26
- package/examples/jsm/objects/GroundProjectedSkybox.js +0 -172
- package/src/renderers/WebGLMultipleRenderTargets.js +0 -82
|
@@ -2,28 +2,19 @@
|
|
|
2
2
|
import 'https://greggman.github.io/webgpu-avoid-redundant-state-setting/webgpu-check-redundant-state-setting.js';
|
|
3
3
|
//*/
|
|
4
4
|
|
|
5
|
+
import { WebGPUCoordinateSystem } from 'three';
|
|
6
|
+
|
|
5
7
|
import { GPUFeatureName, GPUTextureFormat, GPULoadOp, GPUStoreOp, GPUIndexFormat, GPUTextureViewDimension } from './utils/WebGPUConstants.js';
|
|
6
8
|
|
|
7
9
|
import WGSLNodeBuilder from './nodes/WGSLNodeBuilder.js';
|
|
8
10
|
import Backend from '../common/Backend.js';
|
|
9
11
|
|
|
10
|
-
import { DepthFormat, WebGPUCoordinateSystem } from 'three';
|
|
11
|
-
|
|
12
12
|
import WebGPUUtils from './utils/WebGPUUtils.js';
|
|
13
13
|
import WebGPUAttributeUtils from './utils/WebGPUAttributeUtils.js';
|
|
14
14
|
import WebGPUBindingUtils from './utils/WebGPUBindingUtils.js';
|
|
15
15
|
import WebGPUPipelineUtils from './utils/WebGPUPipelineUtils.js';
|
|
16
16
|
import WebGPUTextureUtils from './utils/WebGPUTextureUtils.js';
|
|
17
|
-
|
|
18
|
-
// statics
|
|
19
|
-
|
|
20
|
-
let _staticAdapter = null;
|
|
21
|
-
|
|
22
|
-
if ( navigator.gpu !== undefined ) {
|
|
23
|
-
|
|
24
|
-
_staticAdapter = await navigator.gpu.requestAdapter();
|
|
25
|
-
|
|
26
|
-
}
|
|
17
|
+
import WebGPU from '../../capabilities/WebGPU.js';
|
|
27
18
|
|
|
28
19
|
//
|
|
29
20
|
|
|
@@ -36,6 +27,7 @@ class WebGPUBackend extends Backend {
|
|
|
36
27
|
this.isWebGPUBackend = true;
|
|
37
28
|
|
|
38
29
|
// some parameters require default values other than "undefined"
|
|
30
|
+
this.parameters.alpha = ( parameters.alpha === undefined ) ? true : parameters.alpha;
|
|
39
31
|
|
|
40
32
|
this.parameters.antialias = ( parameters.antialias === true );
|
|
41
33
|
|
|
@@ -51,10 +43,13 @@ class WebGPUBackend extends Backend {
|
|
|
51
43
|
|
|
52
44
|
this.parameters.requiredLimits = ( parameters.requiredLimits === undefined ) ? {} : parameters.requiredLimits;
|
|
53
45
|
|
|
46
|
+
this.trackTimestamp = ( parameters.trackTimestamp === true );
|
|
47
|
+
|
|
54
48
|
this.adapter = null;
|
|
55
49
|
this.device = null;
|
|
56
50
|
this.context = null;
|
|
57
51
|
this.colorBuffer = null;
|
|
52
|
+
this.defaultRenderPassdescriptor = null;
|
|
58
53
|
|
|
59
54
|
this.utils = new WebGPUUtils( this );
|
|
60
55
|
this.attributeUtils = new WebGPUAttributeUtils( this );
|
|
@@ -114,11 +109,13 @@ class WebGPUBackend extends Backend {
|
|
|
114
109
|
this.device = device;
|
|
115
110
|
this.context = context;
|
|
116
111
|
|
|
112
|
+
const alphaMode = parameters.alpha ? 'premultiplied' : 'opaque';
|
|
113
|
+
|
|
117
114
|
this.context.configure( {
|
|
118
115
|
device: this.device,
|
|
119
116
|
format: GPUTextureFormat.BGRA8Unorm,
|
|
120
117
|
usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
|
|
121
|
-
alphaMode:
|
|
118
|
+
alphaMode: alphaMode
|
|
122
119
|
} );
|
|
123
120
|
|
|
124
121
|
this.updateSize();
|
|
@@ -137,60 +134,94 @@ class WebGPUBackend extends Backend {
|
|
|
137
134
|
|
|
138
135
|
}
|
|
139
136
|
|
|
140
|
-
|
|
137
|
+
getContext() {
|
|
141
138
|
|
|
142
|
-
|
|
139
|
+
return this.context;
|
|
143
140
|
|
|
144
|
-
|
|
145
|
-
const occlusionQueryCount = renderContext.occlusionQueryCount;
|
|
141
|
+
}
|
|
146
142
|
|
|
147
|
-
|
|
143
|
+
_getDefaultRenderPassDescriptor() {
|
|
148
144
|
|
|
149
|
-
|
|
145
|
+
let descriptor = this.defaultRenderPassdescriptor;
|
|
150
146
|
|
|
151
|
-
|
|
152
|
-
if ( renderContextData.currentOcclusionQueryBuffer ) renderContextData.currentOcclusionQueryBuffer.destroy();
|
|
147
|
+
const antialias = this.parameters.antialias;
|
|
153
148
|
|
|
154
|
-
|
|
155
|
-
// can be changed by another render pass before the buffer.mapAsyc() completes.
|
|
156
|
-
renderContextData.currentOcclusionQuerySet = renderContextData.occlusionQuerySet;
|
|
157
|
-
renderContextData.currentOcclusionQueryBuffer = renderContextData.occlusionQueryBuffer;
|
|
158
|
-
renderContextData.currentOcclusionQueryObjects = renderContextData.occlusionQueryObjects;
|
|
149
|
+
if ( descriptor === null ) {
|
|
159
150
|
|
|
160
|
-
|
|
151
|
+
const renderer = this.renderer;
|
|
161
152
|
|
|
162
|
-
|
|
153
|
+
descriptor = {
|
|
154
|
+
colorAttachments: [ {
|
|
155
|
+
view: null
|
|
156
|
+
} ],
|
|
157
|
+
depthStencilAttachment: {
|
|
158
|
+
view: this.textureUtils.getDepthBuffer( renderer.depth, renderer.stencil ).createView()
|
|
159
|
+
}
|
|
160
|
+
};
|
|
163
161
|
|
|
164
|
-
|
|
165
|
-
renderContextData.occlusionQueryIndex = 0;
|
|
166
|
-
renderContextData.occlusionQueryObjects = new Array( occlusionQueryCount );
|
|
162
|
+
const colorAttachment = descriptor.colorAttachments[ 0 ];
|
|
167
163
|
|
|
168
|
-
|
|
164
|
+
if ( antialias === true ) {
|
|
169
165
|
|
|
170
|
-
|
|
166
|
+
colorAttachment.view = this.colorBuffer.createView();
|
|
171
167
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
}
|
|
168
|
+
} else {
|
|
169
|
+
|
|
170
|
+
colorAttachment.resolveTarget = undefined;
|
|
171
|
+
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
this.defaultRenderPassdescriptor = descriptor;
|
|
175
|
+
|
|
176
|
+
}
|
|
181
177
|
|
|
182
178
|
const colorAttachment = descriptor.colorAttachments[ 0 ];
|
|
183
|
-
const depthStencilAttachment = descriptor.depthStencilAttachment;
|
|
184
179
|
|
|
185
|
-
|
|
180
|
+
if ( antialias === true ) {
|
|
186
181
|
|
|
187
|
-
|
|
182
|
+
colorAttachment.resolveTarget = this.context.getCurrentTexture().createView();
|
|
188
183
|
|
|
189
|
-
|
|
184
|
+
} else {
|
|
190
185
|
|
|
191
|
-
|
|
186
|
+
colorAttachment.view = this.context.getCurrentTexture().createView();
|
|
192
187
|
|
|
193
|
-
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
return descriptor;
|
|
191
|
+
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
_getRenderPassDescriptor( renderContext ) {
|
|
195
|
+
|
|
196
|
+
const renderTarget = renderContext.renderTarget;
|
|
197
|
+
const renderTargetData = this.get( renderTarget );
|
|
198
|
+
|
|
199
|
+
let descriptors = renderTargetData.descriptors;
|
|
200
|
+
|
|
201
|
+
if ( descriptors === undefined ) {
|
|
202
|
+
|
|
203
|
+
descriptors = [];
|
|
204
|
+
|
|
205
|
+
renderTargetData.descriptors = descriptors;
|
|
206
|
+
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if ( renderTargetData.width !== renderTarget.width ||
|
|
210
|
+
renderTargetData.height !== renderTarget.height ||
|
|
211
|
+
renderTargetData.activeMipmapLevel !== renderTarget.activeMipmapLevel ||
|
|
212
|
+
renderTargetData.samples !== renderTarget.samples
|
|
213
|
+
) {
|
|
214
|
+
|
|
215
|
+
descriptors.length = 0;
|
|
216
|
+
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
let descriptor = descriptors[ renderContext.activeCubeFace ];
|
|
220
|
+
|
|
221
|
+
if ( descriptor === undefined ) {
|
|
222
|
+
|
|
223
|
+
const textures = renderContext.textures;
|
|
224
|
+
const colorAttachments = [];
|
|
194
225
|
|
|
195
226
|
for ( let i = 0; i < textures.length; i ++ ) {
|
|
196
227
|
|
|
@@ -228,32 +259,78 @@ class WebGPUBackend extends Backend {
|
|
|
228
259
|
|
|
229
260
|
const depthTextureData = this.get( renderContext.depthTexture );
|
|
230
261
|
|
|
231
|
-
depthStencilAttachment
|
|
262
|
+
const depthStencilAttachment = {
|
|
263
|
+
view: depthTextureData.texture.createView(),
|
|
264
|
+
};
|
|
232
265
|
|
|
233
|
-
|
|
266
|
+
descriptor = {
|
|
267
|
+
colorAttachments,
|
|
268
|
+
depthStencilAttachment
|
|
269
|
+
};
|
|
234
270
|
|
|
235
|
-
|
|
271
|
+
descriptors[ renderContext.activeCubeFace ] = descriptor;
|
|
236
272
|
|
|
237
|
-
|
|
273
|
+
renderTargetData.width = renderTarget.width;
|
|
274
|
+
renderTargetData.height = renderTarget.height;
|
|
275
|
+
renderTargetData.samples = renderTarget.samples;
|
|
276
|
+
renderTargetData.activeMipmapLevel = renderTarget.activeMipmapLevel;
|
|
238
277
|
|
|
239
|
-
}
|
|
278
|
+
}
|
|
240
279
|
|
|
241
|
-
|
|
280
|
+
return descriptor;
|
|
242
281
|
|
|
243
|
-
|
|
244
|
-
colorAttachment.resolveTarget = this.context.getCurrentTexture().createView();
|
|
282
|
+
}
|
|
245
283
|
|
|
246
|
-
|
|
284
|
+
beginRender( renderContext ) {
|
|
247
285
|
|
|
248
|
-
|
|
249
|
-
colorAttachment.resolveTarget = undefined;
|
|
286
|
+
const renderContextData = this.get( renderContext );
|
|
250
287
|
|
|
251
|
-
|
|
288
|
+
const device = this.device;
|
|
289
|
+
const occlusionQueryCount = renderContext.occlusionQueryCount;
|
|
290
|
+
|
|
291
|
+
let occlusionQuerySet;
|
|
252
292
|
|
|
253
|
-
|
|
293
|
+
if ( occlusionQueryCount > 0 ) {
|
|
294
|
+
|
|
295
|
+
if ( renderContextData.currentOcclusionQuerySet ) renderContextData.currentOcclusionQuerySet.destroy();
|
|
296
|
+
if ( renderContextData.currentOcclusionQueryBuffer ) renderContextData.currentOcclusionQueryBuffer.destroy();
|
|
297
|
+
|
|
298
|
+
// Get a reference to the array of objects with queries. The renderContextData property
|
|
299
|
+
// can be changed by another render pass before the buffer.mapAsyc() completes.
|
|
300
|
+
renderContextData.currentOcclusionQuerySet = renderContextData.occlusionQuerySet;
|
|
301
|
+
renderContextData.currentOcclusionQueryBuffer = renderContextData.occlusionQueryBuffer;
|
|
302
|
+
renderContextData.currentOcclusionQueryObjects = renderContextData.occlusionQueryObjects;
|
|
303
|
+
|
|
304
|
+
//
|
|
305
|
+
|
|
306
|
+
occlusionQuerySet = device.createQuerySet( { type: 'occlusion', count: occlusionQueryCount } );
|
|
307
|
+
|
|
308
|
+
renderContextData.occlusionQuerySet = occlusionQuerySet;
|
|
309
|
+
renderContextData.occlusionQueryIndex = 0;
|
|
310
|
+
renderContextData.occlusionQueryObjects = new Array( occlusionQueryCount );
|
|
311
|
+
|
|
312
|
+
renderContextData.lastOcclusionObject = null;
|
|
254
313
|
|
|
255
314
|
}
|
|
256
315
|
|
|
316
|
+
let descriptor;
|
|
317
|
+
|
|
318
|
+
if ( renderContext.textures === null ) {
|
|
319
|
+
|
|
320
|
+
descriptor = this._getDefaultRenderPassDescriptor();
|
|
321
|
+
|
|
322
|
+
} else {
|
|
323
|
+
|
|
324
|
+
descriptor = this._getRenderPassDescriptor( renderContext );
|
|
325
|
+
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
this.initTimestampQuery( renderContext, descriptor );
|
|
329
|
+
|
|
330
|
+
descriptor.occlusionQuerySet = occlusionQuerySet;
|
|
331
|
+
|
|
332
|
+
const depthStencilAttachment = descriptor.depthStencilAttachment;
|
|
333
|
+
|
|
257
334
|
if ( renderContext.textures !== null ) {
|
|
258
335
|
|
|
259
336
|
const colorAttachments = descriptor.colorAttachments;
|
|
@@ -277,9 +354,10 @@ class WebGPUBackend extends Backend {
|
|
|
277
354
|
|
|
278
355
|
}
|
|
279
356
|
|
|
280
|
-
|
|
281
357
|
} else {
|
|
282
358
|
|
|
359
|
+
const colorAttachment = descriptor.colorAttachments[ 0 ];
|
|
360
|
+
|
|
283
361
|
if ( renderContext.clearColor ) {
|
|
284
362
|
|
|
285
363
|
colorAttachment.clearValue = renderContext.clearColorValue;
|
|
@@ -416,8 +494,11 @@ class WebGPUBackend extends Backend {
|
|
|
416
494
|
|
|
417
495
|
}
|
|
418
496
|
|
|
497
|
+
this.prepareTimestampBuffer( renderContext, renderContextData.encoder );
|
|
498
|
+
|
|
419
499
|
this.device.queue.submit( [ renderContextData.encoder.finish() ] );
|
|
420
500
|
|
|
501
|
+
|
|
421
502
|
//
|
|
422
503
|
|
|
423
504
|
if ( renderContext.textures !== null ) {
|
|
@@ -468,7 +549,7 @@ class WebGPUBackend extends Backend {
|
|
|
468
549
|
const buffer = currentOcclusionQueryBuffer.getMappedRange();
|
|
469
550
|
const results = new BigUint64Array( buffer );
|
|
470
551
|
|
|
471
|
-
for ( let i = 0; i < currentOcclusionQueryObjects.length; i++ ) {
|
|
552
|
+
for ( let i = 0; i < currentOcclusionQueryObjects.length; i ++ ) {
|
|
472
553
|
|
|
473
554
|
if ( results[ i ] !== 0n ) {
|
|
474
555
|
|
|
@@ -489,7 +570,7 @@ class WebGPUBackend extends Backend {
|
|
|
489
570
|
updateViewport( renderContext ) {
|
|
490
571
|
|
|
491
572
|
const { currentPass } = this.get( renderContext );
|
|
492
|
-
|
|
573
|
+
const { x, y, width, height, minDepth, maxDepth } = renderContext.viewportValue;
|
|
493
574
|
|
|
494
575
|
currentPass.setViewport( x, renderContext.height - height - y, width, height, minDepth, maxDepth );
|
|
495
576
|
|
|
@@ -500,7 +581,7 @@ class WebGPUBackend extends Backend {
|
|
|
500
581
|
const device = this.device;
|
|
501
582
|
const renderer = this.renderer;
|
|
502
583
|
|
|
503
|
-
|
|
584
|
+
let colorAttachments = [];
|
|
504
585
|
|
|
505
586
|
let depthStencilAttachment;
|
|
506
587
|
let clearValue;
|
|
@@ -521,39 +602,23 @@ class WebGPUBackend extends Backend {
|
|
|
521
602
|
supportsDepth = renderer.depth;
|
|
522
603
|
supportsStencil = renderer.stencil;
|
|
523
604
|
|
|
524
|
-
|
|
525
|
-
stencil = stencil && supportsStencil;
|
|
605
|
+
const descriptor = this._getDefaultRenderPassDescriptor();
|
|
526
606
|
|
|
527
607
|
if ( color ) {
|
|
528
608
|
|
|
529
|
-
|
|
609
|
+
colorAttachments = descriptor.colorAttachments;
|
|
530
610
|
|
|
531
|
-
const colorAttachment =
|
|
532
|
-
|
|
533
|
-
if ( antialias === true ) {
|
|
534
|
-
|
|
535
|
-
colorAttachment.view = this.colorBuffer.createView();
|
|
536
|
-
colorAttachment.resolveTarget = this.context.getCurrentTexture().createView();
|
|
537
|
-
|
|
538
|
-
} else {
|
|
539
|
-
|
|
540
|
-
colorAttachment.view = this.context.getCurrentTexture().createView();
|
|
541
|
-
|
|
542
|
-
}
|
|
611
|
+
const colorAttachment = colorAttachments[ 0 ];
|
|
543
612
|
|
|
544
613
|
colorAttachment.clearValue = clearValue;
|
|
545
614
|
colorAttachment.loadOp = GPULoadOp.Clear;
|
|
546
615
|
colorAttachment.storeOp = GPUStoreOp.Store;
|
|
547
616
|
|
|
548
|
-
colorAttachments.push( colorAttachment );
|
|
549
|
-
|
|
550
617
|
}
|
|
551
618
|
|
|
552
|
-
if (
|
|
619
|
+
if ( supportsDepth || supportsStencil ) {
|
|
553
620
|
|
|
554
|
-
depthStencilAttachment =
|
|
555
|
-
view: this.textureUtils.getDepthBuffer( renderer.depth, renderer.stencil ).createView()
|
|
556
|
-
};
|
|
621
|
+
depthStencilAttachment = descriptor.depthStencilAttachment;
|
|
557
622
|
|
|
558
623
|
}
|
|
559
624
|
|
|
@@ -562,9 +627,6 @@ class WebGPUBackend extends Backend {
|
|
|
562
627
|
supportsDepth = renderTargetData.depth;
|
|
563
628
|
supportsStencil = renderTargetData.stencil;
|
|
564
629
|
|
|
565
|
-
depth = depth && supportsDepth;
|
|
566
|
-
stencil = stencil && supportsStencil;
|
|
567
|
-
|
|
568
630
|
if ( color ) {
|
|
569
631
|
|
|
570
632
|
for ( const texture of renderTargetData.textures ) {
|
|
@@ -598,7 +660,7 @@ class WebGPUBackend extends Backend {
|
|
|
598
660
|
|
|
599
661
|
}
|
|
600
662
|
|
|
601
|
-
if (
|
|
663
|
+
if ( supportsDepth || supportsStencil ) {
|
|
602
664
|
|
|
603
665
|
const depthTextureData = this.get( renderTargetData.depthTexture );
|
|
604
666
|
|
|
@@ -612,7 +674,7 @@ class WebGPUBackend extends Backend {
|
|
|
612
674
|
|
|
613
675
|
//
|
|
614
676
|
|
|
615
|
-
if (
|
|
677
|
+
if ( supportsDepth ) {
|
|
616
678
|
|
|
617
679
|
if ( depth ) {
|
|
618
680
|
|
|
@@ -627,7 +689,11 @@ class WebGPUBackend extends Backend {
|
|
|
627
689
|
|
|
628
690
|
}
|
|
629
691
|
|
|
630
|
-
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
//
|
|
695
|
+
|
|
696
|
+
if ( supportsStencil ) {
|
|
631
697
|
|
|
632
698
|
if ( stencil ) {
|
|
633
699
|
|
|
@@ -664,8 +730,14 @@ class WebGPUBackend extends Backend {
|
|
|
664
730
|
|
|
665
731
|
const groupGPU = this.get( computeGroup );
|
|
666
732
|
|
|
667
|
-
|
|
668
|
-
|
|
733
|
+
|
|
734
|
+
const descriptor = {};
|
|
735
|
+
|
|
736
|
+
this.initTimestampQuery( computeGroup, descriptor );
|
|
737
|
+
|
|
738
|
+
groupGPU.cmdEncoderGPU = this.device.createCommandEncoder();
|
|
739
|
+
|
|
740
|
+
groupGPU.passEncoderGPU = groupGPU.cmdEncoderGPU.beginComputePass( descriptor );
|
|
669
741
|
|
|
670
742
|
}
|
|
671
743
|
|
|
@@ -692,6 +764,9 @@ class WebGPUBackend extends Backend {
|
|
|
692
764
|
const groupData = this.get( computeGroup );
|
|
693
765
|
|
|
694
766
|
groupData.passEncoderGPU.end();
|
|
767
|
+
|
|
768
|
+
this.prepareTimestampBuffer( computeGroup, groupData.cmdEncoderGPU );
|
|
769
|
+
|
|
695
770
|
this.device.queue.submit( [ groupData.cmdEncoderGPU.finish() ] );
|
|
696
771
|
|
|
697
772
|
}
|
|
@@ -768,7 +843,7 @@ class WebGPUBackend extends Backend {
|
|
|
768
843
|
|
|
769
844
|
// occlusion queries - handle multiple consecutive draw calls for an object
|
|
770
845
|
|
|
771
|
-
if ( contextData.occlusionQuerySet !== undefined
|
|
846
|
+
if ( contextData.occlusionQuerySet !== undefined ) {
|
|
772
847
|
|
|
773
848
|
const lastObject = contextData.lastOcclusionObject;
|
|
774
849
|
|
|
@@ -852,7 +927,8 @@ class WebGPUBackend extends Backend {
|
|
|
852
927
|
data.side !== material.side || data.alphaToCoverage !== material.alphaToCoverage ||
|
|
853
928
|
data.sampleCount !== sampleCount || data.colorSpace !== colorSpace ||
|
|
854
929
|
data.colorFormat !== colorFormat || data.depthStencilFormat !== depthStencilFormat ||
|
|
855
|
-
data.primitiveTopology !== primitiveTopology
|
|
930
|
+
data.primitiveTopology !== primitiveTopology ||
|
|
931
|
+
data.clippingContextVersion !== renderObject.clippingContextVersion
|
|
856
932
|
) {
|
|
857
933
|
|
|
858
934
|
data.material = material; data.materialVersion = material.version;
|
|
@@ -870,6 +946,7 @@ class WebGPUBackend extends Backend {
|
|
|
870
946
|
data.colorFormat = colorFormat;
|
|
871
947
|
data.depthStencilFormat = depthStencilFormat;
|
|
872
948
|
data.primitiveTopology = primitiveTopology;
|
|
949
|
+
data.clippingContextVersion = renderObject.clippingContextVersion;
|
|
873
950
|
|
|
874
951
|
needsUpdate = true;
|
|
875
952
|
|
|
@@ -898,7 +975,8 @@ class WebGPUBackend extends Backend {
|
|
|
898
975
|
material.side,
|
|
899
976
|
utils.getSampleCount( renderContext ),
|
|
900
977
|
utils.getCurrentColorSpace( renderContext ), utils.getCurrentColorFormat( renderContext ), utils.getCurrentDepthStencilFormat( renderContext ),
|
|
901
|
-
utils.getPrimitiveTopology( object, material )
|
|
978
|
+
utils.getPrimitiveTopology( object, material ),
|
|
979
|
+
renderObject.clippingContextVersion
|
|
902
980
|
].join();
|
|
903
981
|
|
|
904
982
|
}
|
|
@@ -953,6 +1031,87 @@ class WebGPUBackend extends Backend {
|
|
|
953
1031
|
|
|
954
1032
|
}
|
|
955
1033
|
|
|
1034
|
+
|
|
1035
|
+
initTimestampQuery( renderContext, descriptor ) {
|
|
1036
|
+
|
|
1037
|
+
if ( ! this.hasFeature( GPUFeatureName.TimestampQuery ) || ! this.trackTimestamp ) return;
|
|
1038
|
+
|
|
1039
|
+
const renderContextData = this.get( renderContext );
|
|
1040
|
+
|
|
1041
|
+
if ( ! renderContextData.timeStampQuerySet ) {
|
|
1042
|
+
|
|
1043
|
+
// Create a GPUQuerySet which holds 2 timestamp query results: one for the
|
|
1044
|
+
// beginning and one for the end of compute pass execution.
|
|
1045
|
+
const timeStampQuerySet = this.device.createQuerySet( { type: 'timestamp', count: 2 } );
|
|
1046
|
+
|
|
1047
|
+
const timestampWrites = {
|
|
1048
|
+
querySet: timeStampQuerySet,
|
|
1049
|
+
beginningOfPassWriteIndex: 0, // Write timestamp in index 0 when pass begins.
|
|
1050
|
+
endOfPassWriteIndex: 1, // Write timestamp in index 1 when pass ends.
|
|
1051
|
+
};
|
|
1052
|
+
Object.assign( descriptor, {
|
|
1053
|
+
timestampWrites,
|
|
1054
|
+
} );
|
|
1055
|
+
renderContextData.timeStampQuerySet = timeStampQuerySet;
|
|
1056
|
+
|
|
1057
|
+
}
|
|
1058
|
+
|
|
1059
|
+
}
|
|
1060
|
+
|
|
1061
|
+
// timestamp utils
|
|
1062
|
+
|
|
1063
|
+
prepareTimestampBuffer( renderContext, encoder ) {
|
|
1064
|
+
|
|
1065
|
+
if ( ! this.hasFeature( GPUFeatureName.TimestampQuery ) || ! this.trackTimestamp ) return;
|
|
1066
|
+
|
|
1067
|
+
const renderContextData = this.get( renderContext );
|
|
1068
|
+
|
|
1069
|
+
const size = 2 * BigInt64Array.BYTES_PER_ELEMENT;
|
|
1070
|
+
const resolveBuffer = this.device.createBuffer( {
|
|
1071
|
+
size,
|
|
1072
|
+
usage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC,
|
|
1073
|
+
} );
|
|
1074
|
+
|
|
1075
|
+
const resultBuffer = this.device.createBuffer( {
|
|
1076
|
+
size,
|
|
1077
|
+
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
|
|
1078
|
+
} );
|
|
1079
|
+
|
|
1080
|
+
encoder.resolveQuerySet( renderContextData.timeStampQuerySet, 0, 2, resolveBuffer, 0 );
|
|
1081
|
+
encoder.copyBufferToBuffer( resolveBuffer, 0, resultBuffer, 0, size );
|
|
1082
|
+
|
|
1083
|
+
renderContextData.currentTimestampQueryBuffer = resultBuffer;
|
|
1084
|
+
|
|
1085
|
+
}
|
|
1086
|
+
|
|
1087
|
+
async resolveTimestampAsync( renderContext, type = 'render' ) {
|
|
1088
|
+
|
|
1089
|
+
if ( ! this.hasFeature( GPUFeatureName.TimestampQuery ) || ! this.trackTimestamp ) return;
|
|
1090
|
+
|
|
1091
|
+
const renderContextData = this.get( renderContext );
|
|
1092
|
+
|
|
1093
|
+
// handle timestamp query results
|
|
1094
|
+
|
|
1095
|
+
const { currentTimestampQueryBuffer } = renderContextData;
|
|
1096
|
+
|
|
1097
|
+
if ( currentTimestampQueryBuffer ) {
|
|
1098
|
+
|
|
1099
|
+
renderContextData.currentTimestampQueryBuffer = null;
|
|
1100
|
+
|
|
1101
|
+
await currentTimestampQueryBuffer.mapAsync( GPUMapMode.READ );
|
|
1102
|
+
|
|
1103
|
+
const times = new BigUint64Array( currentTimestampQueryBuffer.getMappedRange() );
|
|
1104
|
+
|
|
1105
|
+
const duration = Number( times[ 1 ] - times[ 0 ] ) / 1000000;
|
|
1106
|
+
// console.log( `Compute ${type} duration: ${Number( times[ 1 ] - times[ 0 ] ) / 1000000}ms` );
|
|
1107
|
+
this.renderer.info.updateTimestamp( type, duration );
|
|
1108
|
+
|
|
1109
|
+
currentTimestampQueryBuffer.unmap();
|
|
1110
|
+
|
|
1111
|
+
}
|
|
1112
|
+
|
|
1113
|
+
}
|
|
1114
|
+
|
|
956
1115
|
// node builder
|
|
957
1116
|
|
|
958
1117
|
createNodeBuilder( object, renderer, scene = null ) {
|
|
@@ -982,9 +1141,9 @@ class WebGPUBackend extends Backend {
|
|
|
982
1141
|
|
|
983
1142
|
// pipelines
|
|
984
1143
|
|
|
985
|
-
createRenderPipeline( renderObject ) {
|
|
1144
|
+
createRenderPipeline( renderObject, promises ) {
|
|
986
1145
|
|
|
987
|
-
this.pipelineUtils.createRenderPipeline( renderObject );
|
|
1146
|
+
this.pipelineUtils.createRenderPipeline( renderObject, promises );
|
|
988
1147
|
|
|
989
1148
|
}
|
|
990
1149
|
|
|
@@ -1051,7 +1210,8 @@ class WebGPUBackend extends Backend {
|
|
|
1051
1210
|
updateSize() {
|
|
1052
1211
|
|
|
1053
1212
|
this.colorBuffer = this.textureUtils.getColorBuffer();
|
|
1054
|
-
|
|
1213
|
+
this.defaultRenderPassdescriptor = null;
|
|
1214
|
+
|
|
1055
1215
|
}
|
|
1056
1216
|
|
|
1057
1217
|
// utils public
|
|
@@ -1062,23 +1222,27 @@ class WebGPUBackend extends Backend {
|
|
|
1062
1222
|
|
|
1063
1223
|
}
|
|
1064
1224
|
|
|
1065
|
-
|
|
1225
|
+
async hasFeatureAsync( name ) {
|
|
1066
1226
|
|
|
1067
|
-
const adapter = this.adapter ||
|
|
1227
|
+
const adapter = this.adapter || await WebGPU.getStaticAdapter();
|
|
1068
1228
|
|
|
1069
1229
|
//
|
|
1070
1230
|
|
|
1071
|
-
|
|
1231
|
+
return adapter.features.has( name );
|
|
1072
1232
|
|
|
1073
|
-
|
|
1233
|
+
}
|
|
1074
1234
|
|
|
1075
|
-
|
|
1235
|
+
hasFeature( name ) {
|
|
1076
1236
|
|
|
1077
|
-
|
|
1237
|
+
if ( ! this.adapter ) {
|
|
1078
1238
|
|
|
1079
|
-
|
|
1239
|
+
console.warn( 'WebGPUBackend: WebGPU adapter has not been initialized yet. Please use detectSupportAsync instead' );
|
|
1080
1240
|
|
|
1081
|
-
|
|
1241
|
+
return false;
|
|
1242
|
+
|
|
1243
|
+
}
|
|
1244
|
+
|
|
1245
|
+
return this.adapter.features.has( name );
|
|
1082
1246
|
|
|
1083
1247
|
}
|
|
1084
1248
|
|
|
@@ -1090,18 +1254,42 @@ class WebGPUBackend extends Backend {
|
|
|
1090
1254
|
|
|
1091
1255
|
let sourceGPU = null;
|
|
1092
1256
|
|
|
1093
|
-
if (
|
|
1257
|
+
if ( renderContext.renderTarget ) {
|
|
1258
|
+
|
|
1259
|
+
if ( texture.isDepthTexture ) {
|
|
1260
|
+
|
|
1261
|
+
sourceGPU = this.get( renderContext.depthTexture ).texture;
|
|
1262
|
+
|
|
1263
|
+
} else {
|
|
1264
|
+
|
|
1265
|
+
sourceGPU = this.get( renderContext.textures[ 0 ] ).texture;
|
|
1094
1266
|
|
|
1095
|
-
|
|
1267
|
+
}
|
|
1268
|
+
|
|
1269
|
+
} else {
|
|
1096
1270
|
|
|
1097
|
-
|
|
1271
|
+
if ( texture.isDepthTexture ) {
|
|
1098
1272
|
|
|
1099
|
-
|
|
1273
|
+
sourceGPU = this.textureUtils.getDepthBuffer( renderContext.depth, renderContext.stencil );
|
|
1274
|
+
|
|
1275
|
+
} else {
|
|
1276
|
+
|
|
1277
|
+
sourceGPU = this.context.getCurrentTexture();
|
|
1278
|
+
|
|
1279
|
+
}
|
|
1100
1280
|
|
|
1101
1281
|
}
|
|
1102
1282
|
|
|
1103
1283
|
const destinationGPU = this.get( texture ).texture;
|
|
1104
1284
|
|
|
1285
|
+
if ( sourceGPU.format !== destinationGPU.format ) {
|
|
1286
|
+
|
|
1287
|
+
console.error( 'WebGPUBackend: copyFramebufferToTexture: Source and destination formats do not match.', sourceGPU.format, destinationGPU.format );
|
|
1288
|
+
|
|
1289
|
+
return;
|
|
1290
|
+
|
|
1291
|
+
}
|
|
1292
|
+
|
|
1105
1293
|
renderContextData.currentPass.end();
|
|
1106
1294
|
|
|
1107
1295
|
encoder.copyTextureToTexture(
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import WebGPU from '../../capabilities/WebGPU.js';
|
|
2
|
+
|
|
1
3
|
import Renderer from '../common/Renderer.js';
|
|
2
4
|
import WebGLBackend from '../webgl/WebGLBackend.js';
|
|
3
5
|
import WebGPUBackend from './WebGPUBackend.js';
|
|
4
|
-
import WebGPU from '../../capabilities/WebGPU.js';
|
|
5
6
|
/*
|
|
6
7
|
const debugHandler = {
|
|
7
8
|
|
|
@@ -22,7 +23,11 @@ class WebGPURenderer extends Renderer {
|
|
|
22
23
|
|
|
23
24
|
let BackendClass;
|
|
24
25
|
|
|
25
|
-
if (
|
|
26
|
+
if ( parameters.forceWebGL ) {
|
|
27
|
+
|
|
28
|
+
BackendClass = WebGLBackend;
|
|
29
|
+
|
|
30
|
+
} else if ( WebGPU.isAvailable() ) {
|
|
26
31
|
|
|
27
32
|
BackendClass = WebGPUBackend;
|
|
28
33
|
|