summaryrefslogtreecommitdiffstats
path: root/dom/webgpu/tests/cts/checkout/src/webgpu/api/validation/capability_checks/limits/maxBindingsPerBindGroup.spec.ts
diff options
context:
space:
mode:
Diffstat (limited to 'dom/webgpu/tests/cts/checkout/src/webgpu/api/validation/capability_checks/limits/maxBindingsPerBindGroup.spec.ts')
-rw-r--r--dom/webgpu/tests/cts/checkout/src/webgpu/api/validation/capability_checks/limits/maxBindingsPerBindGroup.spec.ts75
1 files changed, 75 insertions, 0 deletions
diff --git a/dom/webgpu/tests/cts/checkout/src/webgpu/api/validation/capability_checks/limits/maxBindingsPerBindGroup.spec.ts b/dom/webgpu/tests/cts/checkout/src/webgpu/api/validation/capability_checks/limits/maxBindingsPerBindGroup.spec.ts
new file mode 100644
index 0000000000..b2d9a156c1
--- /dev/null
+++ b/dom/webgpu/tests/cts/checkout/src/webgpu/api/validation/capability_checks/limits/maxBindingsPerBindGroup.spec.ts
@@ -0,0 +1,75 @@
+import {
+ kCreatePipelineTypes,
+ kMaximumLimitBaseParams,
+ makeLimitTestGroup,
+} from './limit_utils.js';
+
+const limit = 'maxBindingsPerBindGroup';
+export const { g, description } = makeLimitTestGroup(limit);
+
+g.test('createBindGroupLayout,at_over')
+ .desc(`Test using createBindGroupLayout at and over ${limit} limit`)
+ .params(kMaximumLimitBaseParams)
+ .fn(async t => {
+ const { limitTest, testValueName } = t.params;
+ await t.testDeviceWithRequestedMaximumLimits(
+ limitTest,
+ testValueName,
+ async ({ device, testValue, shouldError }) => {
+ await t.expectValidationError(() => {
+ device.createBindGroupLayout({
+ entries: [
+ {
+ binding: testValue - 1,
+ visibility: GPUShaderStage.VERTEX,
+ buffer: {},
+ },
+ ],
+ });
+ }, shouldError);
+ }
+ );
+ });
+
+g.test('createPipeline,at_over')
+ .desc(
+ `Test using createRenderPipeline(Async) and createComputePipeline(Async) at and over ${limit} limit`
+ )
+ .params(
+ kMaximumLimitBaseParams
+ .combine('createPipelineType', kCreatePipelineTypes)
+ .combine('async', [false, true] as const)
+ )
+ .fn(async t => {
+ const { limitTest, testValueName, createPipelineType, async } = t.params;
+ await t.testDeviceWithRequestedMaximumLimits(
+ limitTest,
+ testValueName,
+ async ({ device, testValue, shouldError }) => {
+ const lastIndex = testValue - 1;
+
+ const code = t.getBindingIndexWGSLForPipelineType(createPipelineType, lastIndex);
+ const module = device.createShaderModule({ code });
+
+ await t.testCreatePipeline(createPipelineType, async, module, shouldError, code);
+ }
+ );
+ });
+
+g.test('validate')
+ .desc(`Test ${limit} matches the spec limits`)
+ .fn(t => {
+ const { adapter, adapterLimit } = t;
+ const maxBindingsPerShaderStage =
+ adapter.limits.maxSampledTexturesPerShaderStage +
+ adapter.limits.maxSamplersPerShaderStage +
+ adapter.limits.maxStorageBuffersPerShaderStage +
+ adapter.limits.maxStorageTexturesPerShaderStage +
+ adapter.limits.maxUniformBuffersPerShaderStage;
+ const maxShaderStagesPerPipeline = 2;
+ const minMaxBindingsPerBindGroup = maxBindingsPerShaderStage * maxShaderStagesPerPipeline;
+ t.expect(
+ adapterLimit >= minMaxBindingsPerBindGroup,
+ `maxBindingsPerBindGroup(${adapterLimit}) >= maxBindingsPerShaderStage(${maxBindingsPerShaderStage}) * maxShaderStagesPerPipeline(${maxShaderStagesPerPipeline} = (${minMaxBindingsPerBindGroup}))`
+ );
+ });