diff options
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.ts | 75 |
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}))` + ); + }); |