Skip to content

Commit 3dbe4ce

Browse files
Add missing tests for adapter capability guarantees (#3107)
1 parent 2ef3f32 commit 3dbe4ce

11 files changed

+100
-0
lines changed

src/webgpu/api/validation/capability_checks/features/texture_formats.spec.ts

+16
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ Tests for capability checking for features enabling optional texture formats.
33
`;
44

55
import { makeTestGroup } from '../../../../../common/framework/test_group.js';
6+
import { getGPU } from '../../../../../common/util/navigator_gpu.js';
67
import { assert } from '../../../../../common/util/util.js';
78
import { kAllTextureFormats, kTextureFormatInfo } from '../../../../format_info.js';
89
import { kAllCanvasTypes, createCanvas } from '../../../../util/create_elements.js';
@@ -437,3 +438,18 @@ g.test('render_bundle_encoder_descriptor_depth_stencil_format')
437438
});
438439
});
439440
});
441+
442+
g.test('check_capability_guarantees')
443+
.desc(
444+
`check "texture-compression-bc" is supported or both "texture-compression-etc2" and "texture-compression-astc" are supported.`
445+
)
446+
.fn(async t => {
447+
const adapter = await getGPU(t.rec).requestAdapter();
448+
assert(adapter !== null);
449+
450+
const features = adapter.features;
451+
t.expect(
452+
features.has('texture-compression-bc') ||
453+
(features.has('texture-compression-etc2') && features.has('texture-compression-astc'))
454+
);
455+
});

src/webgpu/api/validation/capability_checks/limits/maxBindGroups.spec.ts

+8
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,11 @@ g.test('setBindGroup,at_over')
8585
}
8686
);
8787
});
88+
89+
g.test('validate,maxBindGroupsPlusVertexBuffers')
90+
.desc(`Test that ${limit} <= maxBindGroupsPlusVertexBuffers`)
91+
.fn(t => {
92+
const { adapter, defaultLimit, adapterLimit } = t;
93+
t.expect(defaultLimit <= t.getDefaultLimit('maxBindGroupsPlusVertexBuffers'));
94+
t.expect(adapterLimit <= adapter.limits.maxBindGroupsPlusVertexBuffers);
95+
});

src/webgpu/api/validation/capability_checks/limits/maxComputeWorkgroupSizeX.spec.ts

+8
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,11 @@ g.test('createComputePipeline,at_over')
1010
const { limitTest, testValueName, async } = t.params;
1111
await t.testMaxComputeWorkgroupSize(limitTest, testValueName, async, 'X');
1212
});
13+
14+
g.test('validate,maxComputeInvocationsPerWorkgroup')
15+
.desc(`Test that ${limit} <= maxComputeInvocationsPerWorkgroup`)
16+
.fn(t => {
17+
const { adapter, defaultLimit, adapterLimit } = t;
18+
t.expect(defaultLimit <= t.getDefaultLimit('maxComputeInvocationsPerWorkgroup'));
19+
t.expect(adapterLimit <= adapter.limits.maxComputeInvocationsPerWorkgroup);
20+
});

src/webgpu/api/validation/capability_checks/limits/maxComputeWorkgroupSizeY.spec.ts

+8
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,11 @@ g.test('createComputePipeline,at_over')
1010
const { limitTest, testValueName, async } = t.params;
1111
await t.testMaxComputeWorkgroupSize(limitTest, testValueName, async, 'Y');
1212
});
13+
14+
g.test('validate,maxComputeInvocationsPerWorkgroup')
15+
.desc(`Test that ${limit} <= maxComputeInvocationsPerWorkgroup`)
16+
.fn(t => {
17+
const { adapter, defaultLimit, adapterLimit } = t;
18+
t.expect(defaultLimit <= t.getDefaultLimit('maxComputeInvocationsPerWorkgroup'));
19+
t.expect(adapterLimit <= adapter.limits.maxComputeInvocationsPerWorkgroup);
20+
});

src/webgpu/api/validation/capability_checks/limits/maxComputeWorkgroupSizeZ.spec.ts

+8
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,11 @@ g.test('createComputePipeline,at_over')
1010
const { limitTest, testValueName, async } = t.params;
1111
await t.testMaxComputeWorkgroupSize(limitTest, testValueName, async, 'Z');
1212
});
13+
14+
g.test('validate,maxComputeInvocationsPerWorkgroup')
15+
.desc(`Test that ${limit} <= maxComputeInvocationsPerWorkgroup`)
16+
.fn(t => {
17+
const { adapter, defaultLimit, adapterLimit } = t;
18+
t.expect(defaultLimit <= t.getDefaultLimit('maxComputeInvocationsPerWorkgroup'));
19+
t.expect(adapterLimit <= adapter.limits.maxComputeInvocationsPerWorkgroup);
20+
});

src/webgpu/api/validation/capability_checks/limits/maxComputeWorkgroupsPerDimension.spec.ts

+18
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,21 @@ g.test('dispatchWorkgroups,at_over')
7777
}
7878
);
7979
});
80+
81+
g.test('validate')
82+
.desc(
83+
`Test that ${limit} <= maxComputeWorkgroupSizeX x maxComputeWorkgroupSizeY x maxComputeWorkgroupSizeZ`
84+
)
85+
.fn(t => {
86+
const { adapter, defaultLimit, adapterLimit } = t;
87+
const defaultMaxComputeWorkgroupSizeProduct =
88+
t.getDefaultLimit('maxComputeWorkgroupSizeX') *
89+
t.getDefaultLimit('maxComputeWorkgroupSizeY') *
90+
t.getDefaultLimit('maxComputeWorkgroupSizeZ');
91+
const maxComputeWorkgroupSizeProduct =
92+
adapter.limits.maxComputeWorkgroupSizeX *
93+
adapter.limits.maxComputeWorkgroupSizeY *
94+
adapter.limits.maxComputeWorkgroupSizeZ;
95+
t.expect(defaultLimit <= defaultMaxComputeWorkgroupSizeProduct);
96+
t.expect(adapterLimit <= maxComputeWorkgroupSizeProduct);
97+
});

src/webgpu/api/validation/capability_checks/limits/maxStorageBufferBindingSize.spec.ts

+8
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,14 @@ g.test('createBindGroup,at_over')
144144
);
145145
});
146146

147+
g.test('validate')
148+
.desc(`Test that ${limit} is a multiple of 4 bytes`)
149+
.fn(t => {
150+
const { defaultLimit, adapterLimit } = t;
151+
t.expect(defaultLimit % 4 === 0);
152+
t.expect(adapterLimit % 4 === 0);
153+
});
154+
147155
g.test('validate,maxBufferSize')
148156
.desc(`Test that ${limit} <= maxBufferSize`)
149157
.fn(t => {

src/webgpu/api/validation/capability_checks/limits/maxVertexBufferArrayStride.spec.ts

+8
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,11 @@ g.test('createRenderPipeline,at_over')
111111
}
112112
);
113113
});
114+
115+
g.test('validate')
116+
.desc(`Test that ${limit} is a multiple of 4 bytes`)
117+
.fn(t => {
118+
const { defaultLimit, adapterLimit } = t;
119+
t.expect(defaultLimit % 4 === 0);
120+
t.expect(adapterLimit % 4 === 0);
121+
});

src/webgpu/api/validation/capability_checks/limits/maxVertexBuffers.spec.ts

+8
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,11 @@ g.test('setVertexBuffer,at_over')
9090
}
9191
);
9292
});
93+
94+
g.test('validate,maxBindGroupsPlusVertexBuffers')
95+
.desc(`Test that ${limit} <= maxBindGroupsPlusVertexBuffers`)
96+
.fn(t => {
97+
const { adapter, defaultLimit, adapterLimit } = t;
98+
t.expect(defaultLimit <= t.getDefaultLimit('maxBindGroupsPlusVertexBuffers'));
99+
t.expect(adapterLimit <= adapter.limits.maxBindGroupsPlusVertexBuffers);
100+
});

src/webgpu/capability_info.ts

+1
Original file line numberDiff line numberDiff line change
@@ -667,6 +667,7 @@ const [
667667
'maxTextureArrayLayers': [ , 256, 256, ],
668668

669669
'maxBindGroups': [ , 4, 4, ],
670+
'maxBindGroupsPlusVertexBuffers': [ , 24, 24, ],
670671
'maxBindingsPerBindGroup': [ , 1000, 1000, ],
671672
'maxDynamicUniformBuffersPerPipelineLayout': [ , 8, 8, ],
672673
'maxDynamicStorageBuffersPerPipelineLayout': [ , 4, 4, ],

src/webgpu/listing_meta.json

+9
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@
267267
"webgpu:api,validation,capability_checks,features,query_types:writeTimestamp:*": { "subcaseMS": 1.200 },
268268
"webgpu:api,validation,capability_checks,features,texture_formats:canvas_configuration:*": { "subcaseMS": 4.339 },
269269
"webgpu:api,validation,capability_checks,features,texture_formats:canvas_configuration_view_formats:*": { "subcaseMS": 4.522 },
270+
"webgpu:api,validation,capability_checks,features,texture_formats:check_capability_guarantees:*": { "subcaseMS": 55.901 },
270271
"webgpu:api,validation,capability_checks,features,texture_formats:depth_stencil_state:*": { "subcaseMS": 15.701 },
271272
"webgpu:api,validation,capability_checks,features,texture_formats:render_bundle_encoder_descriptor_depth_stencil_format:*": { "subcaseMS": 0.800 },
272273
"webgpu:api,validation,capability_checks,features,texture_formats:texture_descriptor:*": { "subcaseMS": 3.830 },
@@ -275,6 +276,7 @@
275276
"webgpu:api,validation,capability_checks,limits,maxBindGroups:createPipeline,at_over:*": { "subcaseMS": 10.990 },
276277
"webgpu:api,validation,capability_checks,limits,maxBindGroups:createPipelineLayout,at_over:*": { "subcaseMS": 9.310 },
277278
"webgpu:api,validation,capability_checks,limits,maxBindGroups:setBindGroup,at_over:*": { "subcaseMS": 9.984 },
279+
"webgpu:api,validation,capability_checks,limits,maxBindGroups:validate,maxBindGroupsPlusVertexBuffers:*": { "subcaseMS": 11.200 },
278280
"webgpu:api,validation,capability_checks,limits,maxBindingsPerBindGroup:createBindGroupLayout,at_over:*": { "subcaseMS": 12.441 },
279281
"webgpu:api,validation,capability_checks,limits,maxBindingsPerBindGroup:createPipeline,at_over:*": { "subcaseMS": 11.179 },
280282
"webgpu:api,validation,capability_checks,limits,maxBindingsPerBindGroup:validate:*": { "subcaseMS": 12.401 },
@@ -289,10 +291,14 @@
289291
"webgpu:api,validation,capability_checks,limits,maxColorAttachments:validate,maxColorAttachmentBytesPerSample:*": { "subcaseMS": 1.101 },
290292
"webgpu:api,validation,capability_checks,limits,maxComputeInvocationsPerWorkgroup:createComputePipeline,at_over:*": { "subcaseMS": 13.735 },
291293
"webgpu:api,validation,capability_checks,limits,maxComputeWorkgroupSizeX:createComputePipeline,at_over:*": { "subcaseMS": 14.465 },
294+
"webgpu:api,validation,capability_checks,limits,maxComputeWorkgroupSizeX:validate,maxComputeInvocationsPerWorkgroup:*": { "subcaseMS": 2.701 },
292295
"webgpu:api,validation,capability_checks,limits,maxComputeWorkgroupSizeY:createComputePipeline,at_over:*": { "subcaseMS": 14.131 },
296+
"webgpu:api,validation,capability_checks,limits,maxComputeWorkgroupSizeY:validate,maxComputeInvocationsPerWorkgroup:*": { "subcaseMS": 2.700 },
293297
"webgpu:api,validation,capability_checks,limits,maxComputeWorkgroupSizeZ:createComputePipeline,at_over:*": { "subcaseMS": 14.920 },
298+
"webgpu:api,validation,capability_checks,limits,maxComputeWorkgroupSizeZ:validate,maxComputeInvocationsPerWorkgroup:*": { "subcaseMS": 2.601 },
294299
"webgpu:api,validation,capability_checks,limits,maxComputeWorkgroupStorageSize:createComputePipeline,at_over:*": { "subcaseMS": 12.009 },
295300
"webgpu:api,validation,capability_checks,limits,maxComputeWorkgroupsPerDimension:dispatchWorkgroups,at_over:*": { "subcaseMS": 13.310 },
301+
"webgpu:api,validation,capability_checks,limits,maxComputeWorkgroupsPerDimension:validate:*": { "subcaseMS": 138.900 },
296302
"webgpu:api,validation,capability_checks,limits,maxDynamicStorageBuffersPerPipelineLayout:createBindGroupLayout,at_over:*": { "subcaseMS": 15.680 },
297303
"webgpu:api,validation,capability_checks,limits,maxDynamicUniformBuffersPerPipelineLayout:createBindGroupLayout,at_over:*": { "subcaseMS": 10.268 },
298304
"webgpu:api,validation,capability_checks,limits,maxInterStageShaderComponents:createRenderPipeline,at_over:*": { "subcaseMS": 12.916 },
@@ -305,6 +311,7 @@
305311
"webgpu:api,validation,capability_checks,limits,maxSamplersPerShaderStage:createPipelineLayout,at_over:*": { "subcaseMS": 10.427 },
306312
"webgpu:api,validation,capability_checks,limits,maxStorageBufferBindingSize:createBindGroup,at_over:*": { "subcaseMS": 51.810 },
307313
"webgpu:api,validation,capability_checks,limits,maxStorageBufferBindingSize:validate,maxBufferSize:*": { "subcaseMS": 0.900 },
314+
"webgpu:api,validation,capability_checks,limits,maxStorageBufferBindingSize:validate:*": { "subcaseMS": 132.400 },
308315
"webgpu:api,validation,capability_checks,limits,maxStorageBuffersPerShaderStage:createBindGroupLayout,at_over:*": { "subcaseMS": 4.565 },
309316
"webgpu:api,validation,capability_checks,limits,maxStorageBuffersPerShaderStage:createPipeline,at_over:*": { "subcaseMS": 7.884 },
310317
"webgpu:api,validation,capability_checks,limits,maxStorageBuffersPerShaderStage:createPipelineLayout,at_over:*": { "subcaseMS": 5.007 },
@@ -324,8 +331,10 @@
324331
"webgpu:api,validation,capability_checks,limits,maxUniformBuffersPerShaderStage:createPipelineLayout,at_over:*": { "subcaseMS": 6.109 },
325332
"webgpu:api,validation,capability_checks,limits,maxVertexAttributes:createRenderPipeline,at_over:*": { "subcaseMS": 9.090 },
326333
"webgpu:api,validation,capability_checks,limits,maxVertexBufferArrayStride:createRenderPipeline,at_over:*": { "subcaseMS": 10.060 },
334+
"webgpu:api,validation,capability_checks,limits,maxVertexBufferArrayStride:validate:*": { "subcaseMS": 139.500 },
327335
"webgpu:api,validation,capability_checks,limits,maxVertexBuffers:createRenderPipeline,at_over:*": { "subcaseMS": 8.903 },
328336
"webgpu:api,validation,capability_checks,limits,maxVertexBuffers:setVertexBuffer,at_over:*": { "subcaseMS": 7.695 },
337+
"webgpu:api,validation,capability_checks,limits,maxVertexBuffers:validate,maxBindGroupsPlusVertexBuffers:*": { "subcaseMS": 153.900 },
329338
"webgpu:api,validation,capability_checks,limits,minStorageBufferOffsetAlignment:createBindGroup,at_over:*": { "subcaseMS": 9.650 },
330339
"webgpu:api,validation,capability_checks,limits,minStorageBufferOffsetAlignment:setBindGroup,at_over:*": { "subcaseMS": 8.931 },
331340
"webgpu:api,validation,capability_checks,limits,minStorageBufferOffsetAlignment:validate,greaterThanOrEqualTo32:*": { "subcaseMS": 31.801 },

0 commit comments

Comments
 (0)