@plastic-software/three 0.167.1 → 0.167.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/three.cjs +17 -8
- package/build/three.module.js +17 -8
- package/build/three.module.min.js +1 -1
- package/build/three.webgpu.js +746 -374
- package/build/three.webgpu.min.js +1 -1
- package/examples/jsm/controls/Controls.js +32 -0
- package/examples/jsm/controls/DragControls.js +260 -132
- package/examples/jsm/transpiler/TSLEncoder.js +8 -8
- package/package.json +1 -1
- package/src/loaders/ObjectLoader.js +3 -3
- package/src/nodes/Nodes.js +3 -2
- package/src/nodes/accessors/BatchNode.js +2 -2
- package/src/nodes/accessors/ClippingNode.js +8 -8
- package/src/nodes/accessors/MorphNode.js +4 -4
- package/src/nodes/accessors/TangentNode.js +2 -2
- package/src/nodes/accessors/Texture3DNode.js +8 -8
- package/src/nodes/accessors/UniformArrayNode.js +5 -3
- package/src/nodes/core/StackNode.js +22 -6
- package/src/nodes/display/AfterImageNode.js +3 -3
- package/src/nodes/display/AnamorphicNode.js +4 -4
- package/src/nodes/display/BleachBypassNode.js +2 -2
- package/src/nodes/display/BlendModeNode.js +8 -8
- package/src/nodes/display/BloomNode.js +9 -9
- package/src/nodes/display/BumpMapNode.js +3 -3
- package/src/nodes/display/ColorAdjustmentNode.js +4 -4
- package/src/nodes/display/ColorSpaceNode.js +3 -3
- package/src/nodes/display/DenoiseNode.js +8 -8
- package/src/nodes/display/DepthOfFieldNode.js +2 -2
- package/src/nodes/display/DotScreenNode.js +3 -3
- package/src/nodes/display/FXAANode.js +11 -11
- package/src/nodes/display/FilmNode.js +2 -2
- package/src/nodes/display/GTAONode.js +9 -9
- package/src/nodes/display/GaussianBlurNode.js +2 -2
- package/src/nodes/display/Lut3DNode.js +2 -2
- package/src/nodes/display/NormalMapNode.js +2 -2
- package/src/nodes/display/PassNode.js +71 -3
- package/src/nodes/display/PixelationPassNode.js +3 -3
- package/src/nodes/display/RGBShiftNode.js +2 -2
- package/src/nodes/display/SepiaNode.js +2 -2
- package/src/nodes/display/SobelOperatorNode.js +2 -2
- package/src/nodes/display/ToneMappingNode.js +13 -13
- package/src/nodes/display/TransitionNode.js +3 -3
- package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -2
- package/src/nodes/functions/BSDF/BRDF_Lambert.js +2 -2
- package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
- package/src/nodes/functions/BSDF/DFGApprox.js +2 -2
- package/src/nodes/functions/BSDF/D_GGX.js +2 -2
- package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +2 -2
- package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
- package/src/nodes/functions/BSDF/F_Schlick.js +2 -2
- package/src/nodes/functions/BSDF/LTC.js +6 -6
- package/src/nodes/functions/BSDF/Schlick_to_F0.js +2 -2
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +2 -2
- package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
- package/src/nodes/functions/PhongLightingModel.js +3 -3
- package/src/nodes/functions/PhysicalLightingModel.js +18 -18
- package/src/nodes/functions/ToonLightingModel.js +2 -2
- package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
- package/src/nodes/functions/material/getRoughness.js +2 -2
- package/src/nodes/lighting/AnalyticLightNode.js +5 -5
- package/src/nodes/lighting/BasicEnvironmentNode.js +2 -1
- package/src/nodes/lighting/LightProbeNode.js +80 -0
- package/src/nodes/lighting/LightUtils.js +3 -3
- package/src/nodes/materials/InstancedPointsNodeMaterial.js +3 -3
- package/src/nodes/materials/Line2NodeMaterial.js +17 -17
- package/src/nodes/materials/MeshPhysicalNodeMaterial.js +1 -1
- package/src/nodes/materials/VolumeNodeMaterial.js +5 -5
- package/src/nodes/materialx/lib/mx_hsv.js +12 -12
- package/src/nodes/materialx/lib/mx_noise.js +80 -80
- package/src/nodes/materialx/lib/mx_transform_color.js +2 -2
- package/src/nodes/math/CondNode.js +13 -2
- package/src/nodes/math/MathNode.js +2 -2
- package/src/nodes/math/TriNoise3D.js +6 -6
- package/src/nodes/pmrem/PMREMUtils.js +34 -34
- package/src/nodes/procedural/CheckerNode.js +2 -2
- package/src/nodes/shadernode/ShaderNode.js +11 -4
- package/src/nodes/utils/CubeMapNode.js +157 -0
- package/src/nodes/utils/LoopNode.js +10 -4
- package/src/nodes/utils/SpriteUtils.js +2 -2
- package/src/nodes/utils/UVUtils.js +3 -3
- package/src/nodes/utils/ViewportUtils.js +3 -3
- package/src/renderers/WebGLRenderer.js +8 -0
- package/src/renderers/common/RenderContext.js +24 -0
- package/src/renderers/common/RenderObject.js +1 -1
- package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +1 -1
- package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +0 -2
- package/src/renderers/shaders/ShaderLib/points.glsl.js +0 -2
- package/src/renderers/webgl/WebGLPrograms.js +2 -1
- package/src/renderers/webgl-fallback/WebGLBackend.js +31 -27
- package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +12 -8
- package/src/renderers/webgpu/WebGPUBackend.js +10 -14
- package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +30 -2
- package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -1
|
@@ -47,7 +47,6 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
|
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
function getParameters( material, lights, shadows, scene, object ) {
|
|
50
|
-
|
|
51
50
|
const fog = scene.fog;
|
|
52
51
|
const geometry = object.geometry;
|
|
53
52
|
const environment = material.isMeshStandardMaterial ? scene.environment : null;
|
|
@@ -513,6 +512,8 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
|
|
|
513
512
|
_programLayers.enable( 20 );
|
|
514
513
|
if ( parameters.batchingColor )
|
|
515
514
|
_programLayers.enable( 21 );
|
|
515
|
+
if ( parameters.batchingMatrix )
|
|
516
|
+
_programLayers.enable( 22 );
|
|
516
517
|
|
|
517
518
|
array.push( _programLayers.mask );
|
|
518
519
|
_programLayers.disableAll();
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import GLSLNodeBuilder from './nodes/GLSLNodeBuilder.js';
|
|
2
2
|
import Backend from '../common/Backend.js';
|
|
3
|
+
import { getCacheKey } from '../common/RenderContext.js';
|
|
3
4
|
|
|
4
5
|
import WebGLAttributeUtils from './utils/WebGLAttributeUtils.js';
|
|
5
6
|
import WebGLState from './utils/WebGLState.js';
|
|
@@ -255,12 +256,13 @@ class WebGLBackend extends Backend {
|
|
|
255
256
|
const renderTargetContextData = this.get( renderContext.renderTarget );
|
|
256
257
|
|
|
257
258
|
const { samples } = renderContext.renderTarget;
|
|
258
|
-
const fb = renderTargetContextData.framebuffer;
|
|
259
|
-
|
|
260
|
-
const mask = gl.COLOR_BUFFER_BIT;
|
|
261
259
|
|
|
262
260
|
if ( samples > 0 ) {
|
|
263
261
|
|
|
262
|
+
const fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];
|
|
263
|
+
|
|
264
|
+
const mask = gl.COLOR_BUFFER_BIT;
|
|
265
|
+
|
|
264
266
|
const msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;
|
|
265
267
|
|
|
266
268
|
const textures = renderContext.textures;
|
|
@@ -1236,38 +1238,38 @@ class WebGLBackend extends Backend {
|
|
|
1236
1238
|
|
|
1237
1239
|
}
|
|
1238
1240
|
|
|
1239
|
-
_setFramebuffer(
|
|
1241
|
+
_setFramebuffer( descriptor ) {
|
|
1240
1242
|
|
|
1241
1243
|
const { gl, state } = this;
|
|
1242
1244
|
|
|
1243
1245
|
let currentFrameBuffer = null;
|
|
1244
1246
|
|
|
1245
|
-
if (
|
|
1247
|
+
if ( descriptor.textures !== null ) {
|
|
1246
1248
|
|
|
1247
|
-
const renderTarget =
|
|
1249
|
+
const renderTarget = descriptor.renderTarget;
|
|
1248
1250
|
const renderTargetContextData = this.get( renderTarget );
|
|
1249
1251
|
const { samples, depthBuffer, stencilBuffer } = renderTarget;
|
|
1250
|
-
|
|
1252
|
+
|
|
1251
1253
|
const isCube = renderTarget.isWebGLCubeRenderTarget === true;
|
|
1252
1254
|
|
|
1253
1255
|
let msaaFb = renderTargetContextData.msaaFrameBuffer;
|
|
1254
1256
|
let depthRenderbuffer = renderTargetContextData.depthRenderbuffer;
|
|
1255
1257
|
|
|
1258
|
+
const cacheKey = getCacheKey( descriptor );
|
|
1259
|
+
|
|
1256
1260
|
let fb;
|
|
1257
1261
|
|
|
1258
1262
|
if ( isCube ) {
|
|
1259
1263
|
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
renderTargetContextData.cubeFramebuffers = [];
|
|
1263
|
-
|
|
1264
|
-
}
|
|
1264
|
+
renderTargetContextData.cubeFramebuffers || ( renderTargetContextData.cubeFramebuffers = {} );
|
|
1265
1265
|
|
|
1266
|
-
fb = renderTargetContextData.cubeFramebuffers[
|
|
1266
|
+
fb = renderTargetContextData.cubeFramebuffers[ cacheKey ];
|
|
1267
1267
|
|
|
1268
1268
|
} else {
|
|
1269
1269
|
|
|
1270
|
-
|
|
1270
|
+
renderTargetContextData.framebuffers || ( renderTargetContextData.framebuffers = {} );
|
|
1271
|
+
|
|
1272
|
+
fb = renderTargetContextData.framebuffers[ cacheKey ];
|
|
1271
1273
|
|
|
1272
1274
|
}
|
|
1273
1275
|
|
|
@@ -1277,22 +1279,27 @@ class WebGLBackend extends Backend {
|
|
|
1277
1279
|
|
|
1278
1280
|
state.bindFramebuffer( gl.FRAMEBUFFER, fb );
|
|
1279
1281
|
|
|
1280
|
-
const textures =
|
|
1282
|
+
const textures = descriptor.textures;
|
|
1281
1283
|
|
|
1282
1284
|
if ( isCube ) {
|
|
1283
1285
|
|
|
1284
|
-
renderTargetContextData.cubeFramebuffers[
|
|
1286
|
+
renderTargetContextData.cubeFramebuffers[ cacheKey ] = fb;
|
|
1287
|
+
|
|
1285
1288
|
const { textureGPU } = this.get( textures[ 0 ] );
|
|
1286
1289
|
|
|
1290
|
+
const cubeFace = this.renderer._activeCubeFace;
|
|
1291
|
+
|
|
1287
1292
|
gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureGPU, 0 );
|
|
1288
1293
|
|
|
1289
1294
|
} else {
|
|
1290
1295
|
|
|
1296
|
+
renderTargetContextData.framebuffers[ cacheKey ] = fb;
|
|
1297
|
+
|
|
1291
1298
|
for ( let i = 0; i < textures.length; i ++ ) {
|
|
1292
1299
|
|
|
1293
1300
|
const texture = textures[ i ];
|
|
1294
1301
|
const textureData = this.get( texture );
|
|
1295
|
-
textureData.renderTarget =
|
|
1302
|
+
textureData.renderTarget = descriptor.renderTarget;
|
|
1296
1303
|
|
|
1297
1304
|
const attachment = gl.COLOR_ATTACHMENT0 + i;
|
|
1298
1305
|
|
|
@@ -1300,15 +1307,13 @@ class WebGLBackend extends Backend {
|
|
|
1300
1307
|
|
|
1301
1308
|
}
|
|
1302
1309
|
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
state.drawBuffers( renderContext, fb );
|
|
1310
|
+
state.drawBuffers( descriptor, fb );
|
|
1306
1311
|
|
|
1307
1312
|
}
|
|
1308
1313
|
|
|
1309
|
-
if (
|
|
1314
|
+
if ( descriptor.depthTexture !== null ) {
|
|
1310
1315
|
|
|
1311
|
-
const textureData = this.get(
|
|
1316
|
+
const textureData = this.get( descriptor.depthTexture );
|
|
1312
1317
|
const depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;
|
|
1313
1318
|
|
|
1314
1319
|
gl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0 );
|
|
@@ -1329,11 +1334,10 @@ class WebGLBackend extends Backend {
|
|
|
1329
1334
|
|
|
1330
1335
|
const msaaRenderbuffers = [];
|
|
1331
1336
|
|
|
1332
|
-
const textures =
|
|
1337
|
+
const textures = descriptor.textures;
|
|
1333
1338
|
|
|
1334
1339
|
for ( let i = 0; i < textures.length; i ++ ) {
|
|
1335
1340
|
|
|
1336
|
-
|
|
1337
1341
|
msaaRenderbuffers[ i ] = gl.createRenderbuffer();
|
|
1338
1342
|
|
|
1339
1343
|
gl.bindRenderbuffer( gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
|
|
@@ -1347,10 +1351,10 @@ class WebGLBackend extends Backend {
|
|
|
1347
1351
|
|
|
1348
1352
|
}
|
|
1349
1353
|
|
|
1350
|
-
const texture =
|
|
1354
|
+
const texture = descriptor.textures[ i ];
|
|
1351
1355
|
const textureData = this.get( texture );
|
|
1352
1356
|
|
|
1353
|
-
gl.renderbufferStorageMultisample( gl.RENDERBUFFER, samples, textureData.glInternalFormat,
|
|
1357
|
+
gl.renderbufferStorageMultisample( gl.RENDERBUFFER, samples, textureData.glInternalFormat, descriptor.width, descriptor.height );
|
|
1354
1358
|
gl.framebufferRenderbuffer( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );
|
|
1355
1359
|
|
|
1356
1360
|
|
|
@@ -1362,7 +1366,7 @@ class WebGLBackend extends Backend {
|
|
|
1362
1366
|
if ( depthRenderbuffer === undefined ) {
|
|
1363
1367
|
|
|
1364
1368
|
depthRenderbuffer = gl.createRenderbuffer();
|
|
1365
|
-
this.textureUtils.setupRenderBufferStorage( depthRenderbuffer,
|
|
1369
|
+
this.textureUtils.setupRenderBufferStorage( depthRenderbuffer, descriptor );
|
|
1366
1370
|
|
|
1367
1371
|
renderTargetContextData.depthRenderbuffer = depthRenderbuffer;
|
|
1368
1372
|
|
|
@@ -527,7 +527,6 @@ class WebGLTextureUtils {
|
|
|
527
527
|
|
|
528
528
|
deallocateRenderBuffers( renderTarget ) {
|
|
529
529
|
|
|
530
|
-
|
|
531
530
|
const { gl, backend } = this;
|
|
532
531
|
|
|
533
532
|
// remove framebuffer reference
|
|
@@ -537,31 +536,36 @@ class WebGLTextureUtils {
|
|
|
537
536
|
|
|
538
537
|
renderContextData.renderBufferStorageSetup = undefined;
|
|
539
538
|
|
|
540
|
-
if ( renderContextData.
|
|
539
|
+
if ( renderContextData.framebuffers ) {
|
|
540
|
+
|
|
541
|
+
for ( const cacheKey in renderContextData.framebuffers ) {
|
|
542
|
+
|
|
543
|
+
gl.deleteFramebuffer( renderContextData.framebuffers[ cacheKey ] );
|
|
544
|
+
|
|
545
|
+
}
|
|
541
546
|
|
|
542
|
-
|
|
543
|
-
renderContextData.framebuffer = undefined;
|
|
547
|
+
delete renderContextData.framebuffers;
|
|
544
548
|
|
|
545
549
|
}
|
|
546
550
|
|
|
547
551
|
if ( renderContextData.depthRenderbuffer ) {
|
|
548
552
|
|
|
549
553
|
gl.deleteRenderbuffer( renderContextData.depthRenderbuffer );
|
|
550
|
-
renderContextData.depthRenderbuffer
|
|
554
|
+
delete renderContextData.depthRenderbuffer;
|
|
551
555
|
|
|
552
556
|
}
|
|
553
557
|
|
|
554
558
|
if ( renderContextData.stencilRenderbuffer ) {
|
|
555
559
|
|
|
556
560
|
gl.deleteRenderbuffer( renderContextData.stencilRenderbuffer );
|
|
557
|
-
renderContextData.stencilRenderbuffer
|
|
561
|
+
delete renderContextData.stencilRenderbuffer;
|
|
558
562
|
|
|
559
563
|
}
|
|
560
564
|
|
|
561
565
|
if ( renderContextData.msaaFrameBuffer ) {
|
|
562
566
|
|
|
563
567
|
gl.deleteFramebuffer( renderContextData.msaaFrameBuffer );
|
|
564
|
-
renderContextData.msaaFrameBuffer
|
|
568
|
+
delete renderContextData.msaaFrameBuffer;
|
|
565
569
|
|
|
566
570
|
}
|
|
567
571
|
|
|
@@ -573,7 +577,7 @@ class WebGLTextureUtils {
|
|
|
573
577
|
|
|
574
578
|
}
|
|
575
579
|
|
|
576
|
-
renderContextData.msaaRenderbuffers
|
|
580
|
+
delete renderContextData.msaaRenderbuffers;
|
|
577
581
|
|
|
578
582
|
}
|
|
579
583
|
|
|
@@ -193,22 +193,16 @@ class WebGPUBackend extends Backend {
|
|
|
193
193
|
|
|
194
194
|
let descriptors = renderTargetData.descriptors;
|
|
195
195
|
|
|
196
|
-
if ( descriptors === undefined
|
|
197
|
-
|
|
198
|
-
descriptors = [];
|
|
199
|
-
|
|
200
|
-
renderTargetData.descriptors = descriptors;
|
|
201
|
-
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
if ( renderTargetData.width !== renderTarget.width ||
|
|
196
|
+
if ( descriptors === undefined ||
|
|
197
|
+
renderTargetData.width !== renderTarget.width ||
|
|
205
198
|
renderTargetData.height !== renderTarget.height ||
|
|
206
199
|
renderTargetData.activeMipmapLevel !== renderTarget.activeMipmapLevel ||
|
|
207
|
-
renderTargetData.samples !== renderTarget.samples
|
|
208
|
-
descriptors.length !== renderTarget.textures.length
|
|
200
|
+
renderTargetData.samples !== renderTarget.samples
|
|
209
201
|
) {
|
|
210
202
|
|
|
211
|
-
descriptors
|
|
203
|
+
descriptors = {};
|
|
204
|
+
|
|
205
|
+
renderTargetData.descriptors = descriptors;
|
|
212
206
|
|
|
213
207
|
// dispose
|
|
214
208
|
|
|
@@ -224,7 +218,9 @@ class WebGPUBackend extends Backend {
|
|
|
224
218
|
|
|
225
219
|
}
|
|
226
220
|
|
|
227
|
-
|
|
221
|
+
const cacheKey = renderContext.getCacheKey();
|
|
222
|
+
|
|
223
|
+
let descriptor = descriptors[ cacheKey ];
|
|
228
224
|
|
|
229
225
|
if ( descriptor === undefined ) {
|
|
230
226
|
|
|
@@ -276,7 +272,7 @@ class WebGPUBackend extends Backend {
|
|
|
276
272
|
depthStencilAttachment
|
|
277
273
|
};
|
|
278
274
|
|
|
279
|
-
descriptors[
|
|
275
|
+
descriptors[ cacheKey ] = descriptor;
|
|
280
276
|
|
|
281
277
|
renderTargetData.width = renderTarget.width;
|
|
282
278
|
renderTargetData.height = renderTarget.height;
|
|
@@ -623,6 +623,22 @@ ${ flowData.code }
|
|
|
623
623
|
|
|
624
624
|
}
|
|
625
625
|
|
|
626
|
+
getSubgroupSize() {
|
|
627
|
+
|
|
628
|
+
this.enableSubGroups();
|
|
629
|
+
|
|
630
|
+
return this.getBuiltin( 'subgroup_size', 'subgroupSize', 'u32', 'attribute' );
|
|
631
|
+
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
getSubgroupIndex() {
|
|
635
|
+
|
|
636
|
+
this.enableSubGroups();
|
|
637
|
+
|
|
638
|
+
return this.getBuiltin( 'subgroup_invocation_id', 'subgroupIndex', 'u32', 'attribute' );
|
|
639
|
+
|
|
640
|
+
}
|
|
641
|
+
|
|
626
642
|
getDrawIndex() {
|
|
627
643
|
|
|
628
644
|
return null;
|
|
@@ -655,8 +671,8 @@ ${ flowData.code }
|
|
|
655
671
|
|
|
656
672
|
enableDirective( name, shaderStage = this.shaderStage ) {
|
|
657
673
|
|
|
658
|
-
const stage = this.directives[ shaderStage ] || ( this.directives[ shaderStage ] =
|
|
659
|
-
stage.
|
|
674
|
+
const stage = this.directives[ shaderStage ] || ( this.directives[ shaderStage ] = new Set() );
|
|
675
|
+
stage.add( name );
|
|
660
676
|
|
|
661
677
|
}
|
|
662
678
|
|
|
@@ -679,6 +695,18 @@ ${ flowData.code }
|
|
|
679
695
|
|
|
680
696
|
}
|
|
681
697
|
|
|
698
|
+
enableSubGroups() {
|
|
699
|
+
|
|
700
|
+
this.enableDirective( 'subgroups' );
|
|
701
|
+
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
enableSubgroupsF16() {
|
|
705
|
+
|
|
706
|
+
this.enableDirective( 'subgroups-f16' );
|
|
707
|
+
|
|
708
|
+
}
|
|
709
|
+
|
|
682
710
|
enableClipDistances() {
|
|
683
711
|
|
|
684
712
|
this.enableDirective( 'clip_distances' );
|
|
@@ -328,5 +328,6 @@ export const GPUFeatureName = {
|
|
|
328
328
|
BGRA8UNormStorage: 'bgra8unorm-storage',
|
|
329
329
|
Float32Filterable: 'float32-filterable',
|
|
330
330
|
ClipDistances: 'clip-distances',
|
|
331
|
-
DualSourceBlending: 'dual-source-blending'
|
|
331
|
+
DualSourceBlending: 'dual-source-blending',
|
|
332
|
+
Subgroups: 'subgroups'
|
|
332
333
|
};
|