From 9e0ebcc5d4c7f380bdc2361060f56627765feed8 Mon Sep 17 00:00:00 2001 From: Gregg Tavares Date: Thu, 30 Jan 2025 17:11:13 -0800 Subject: [PATCH 1/2] Compat: update maxXXXInYYYStage tests The proposal changed so that the corresponding PerStage limit is auto-upgraded so these tests need to change. --- .../capability_checks/limits/limit_utils.ts | 43 +++++++++++-------- .../maxStorageBuffersInFragmentStage.spec.ts | 19 +++----- .../maxStorageBuffersInVertexStage.spec.ts | 19 +++----- .../maxStorageTexturesInFragmentStage.spec.ts | 19 +++----- .../maxStorageTexturesInVertexStage.spec.ts | 19 +++----- 5 files changed, 44 insertions(+), 75 deletions(-) diff --git a/src/webgpu/api/validation/capability_checks/limits/limit_utils.ts b/src/webgpu/api/validation/capability_checks/limits/limit_utils.ts index a075e9fff220..9039d5bc895e 100644 --- a/src/webgpu/api/validation/capability_checks/limits/limit_utils.ts +++ b/src/webgpu/api/validation/capability_checks/limits/limit_utils.ts @@ -1275,42 +1275,47 @@ export function testMaxStorageXXXInYYYStageDeviceCreationWithDependentLimit( | 'maxStorageTexturesInVertexStage', dependentLimitName: 'maxStorageBuffersPerShaderStage' | 'maxStorageTexturesPerShaderStage' ) { - g.test(`validate,${dependentLimitName}`) + g.test(`auto_upgrades_per_stage,${dependentLimitName}`) .desc( - `Test that adapter.limit.${limit} and requiredLimits.${limit} must be <= ${dependentLimitName}` + `Test that + * adapter.limit.${limit} < adapter.limit${dependentLimitName} + * requiredLimits.${limit} auto-upgrades device.limits.${dependentLimitName} + ` ) .params(u => u.combine('useMax', [true, false] as const)) // true case should not reject. .fn(async t => { - const { useMax } = t.params; const { adapterLimit: maximumLimit, adapter } = t; - const dependentLimit = adapter.limits[dependentLimitName]!; - t.expect( - maximumLimit <= dependentLimit, - `maximumLimit(${maximumLimit}) is <= adapter.limits.${dependentLimitName}(${dependentLimit})` - ); + { + const dependentLimit = adapter.limits[dependentLimitName]!; + t.expect( + maximumLimit <= dependentLimit, + `maximumLimit(${maximumLimit}) is <= adapter.limits.${dependentLimitName}(${dependentLimit})` + ); + } - const dependentEffectiveLimits = useMax - ? dependentLimit - : t.getDefaultLimit(dependentLimitName); - const shouldReject = maximumLimit > dependentEffectiveLimits; - t.debug( - `${limit}(${maximumLimit}) > ${dependentLimitName}(${dependentEffectiveLimits}) shouldReject: ${shouldReject}` - ); + const shouldReject = false; const device = await t.requestDeviceWithLimits( adapter, { [limit]: maximumLimit, - ...(useMax && { - [dependentLimitName]: dependentLimit, - }), }, shouldReject ); + + { + const dependentLimit = device!.limits[dependentLimitName]!; + const actualLimit = device!.limits[limit]!; + t.expect( + dependentLimit >= actualLimit, + `device.limits.${dependentLimitName}(${dependentLimit}) is >= adapter.limits.${limit}(${actualLimit})` + ); + } + device?.destroy(); }); - g.test(`auto_upgrade,${dependentLimitName}`) + g.test(`auto_upgraded_from_per_stage,${dependentLimitName}`) .desc( `Test that adapter.limit.${limit} is automatically upgraded to ${dependentLimitName} except in compat.` ) diff --git a/src/webgpu/api/validation/capability_checks/limits/maxStorageBuffersInFragmentStage.spec.ts b/src/webgpu/api/validation/capability_checks/limits/maxStorageBuffersInFragmentStage.spec.ts index 09216807796e..9a8bf0d592fd 100644 --- a/src/webgpu/api/validation/capability_checks/limits/maxStorageBuffersInFragmentStage.spec.ts +++ b/src/webgpu/api/validation/capability_checks/limits/maxStorageBuffersInFragmentStage.spec.ts @@ -18,28 +18,15 @@ import { } from './limit_utils.js'; const limit = 'maxStorageBuffersInFragmentStage'; -const dependentLimitName = 'maxStorageBuffersPerShaderStage'; const kExtraLimits: LimitsRequest = { maxBindingsPerBindGroup: 'adapterLimit', maxBindGroups: 'adapterLimit', - [dependentLimitName]: 'adapterLimit', }; export const { g, description } = makeLimitTestGroup(limit, { // MAINTAINANCE_TODO: remove once this limit is required. limitOptional: true, - limitCheckFn(t, device, { actualLimit }) { - if (!t.isCompatibility) { - const expectedLimit = device.limits[dependentLimitName]; - t.expect( - actualLimit === expectedLimit, - `expected actual actualLimit: ${actualLimit} to equal ${dependentLimitName}: ${expectedLimit}` - ); - return true; - } - return false; - }, }); function createBindGroupLayout( @@ -208,4 +195,8 @@ g.test('createPipeline,at_over') ); }); -testMaxStorageXXXInYYYStageDeviceCreationWithDependentLimit(g, limit, dependentLimitName); +testMaxStorageXXXInYYYStageDeviceCreationWithDependentLimit( + g, + limit, + 'maxStorageBuffersPerShaderStage' +); diff --git a/src/webgpu/api/validation/capability_checks/limits/maxStorageBuffersInVertexStage.spec.ts b/src/webgpu/api/validation/capability_checks/limits/maxStorageBuffersInVertexStage.spec.ts index e6feb14be41a..8847d69b7980 100644 --- a/src/webgpu/api/validation/capability_checks/limits/maxStorageBuffersInVertexStage.spec.ts +++ b/src/webgpu/api/validation/capability_checks/limits/maxStorageBuffersInVertexStage.spec.ts @@ -18,28 +18,15 @@ import { } from './limit_utils.js'; const limit = 'maxStorageBuffersInVertexStage'; -const dependentLimitName = 'maxStorageBuffersPerShaderStage'; const kExtraLimits: LimitsRequest = { maxBindingsPerBindGroup: 'adapterLimit', maxBindGroups: 'adapterLimit', - [dependentLimitName]: 'adapterLimit', }; export const { g, description } = makeLimitTestGroup(limit, { // MAINTAINANCE_TODO: remove once this limit is required. limitOptional: true, - limitCheckFn(t, device, { actualLimit }) { - if (!t.isCompatibility) { - const expectedLimit = device.limits[dependentLimitName]; - t.expect( - actualLimit === expectedLimit, - `expected actual actualLimit: ${actualLimit} to equal ${dependentLimitName}: ${expectedLimit}` - ); - return true; - } - return false; - }, }); function createBindGroupLayout( @@ -199,4 +186,8 @@ g.test('createPipeline,at_over') ); }); -testMaxStorageXXXInYYYStageDeviceCreationWithDependentLimit(g, limit, dependentLimitName); +testMaxStorageXXXInYYYStageDeviceCreationWithDependentLimit( + g, + limit, + 'maxStorageBuffersPerShaderStage' +); diff --git a/src/webgpu/api/validation/capability_checks/limits/maxStorageTexturesInFragmentStage.spec.ts b/src/webgpu/api/validation/capability_checks/limits/maxStorageTexturesInFragmentStage.spec.ts index 2fae97f596cf..c99339ccf425 100644 --- a/src/webgpu/api/validation/capability_checks/limits/maxStorageTexturesInFragmentStage.spec.ts +++ b/src/webgpu/api/validation/capability_checks/limits/maxStorageTexturesInFragmentStage.spec.ts @@ -19,28 +19,15 @@ import { } from './limit_utils.js'; const limit = 'maxStorageTexturesInFragmentStage'; -const dependentLimitName = 'maxStorageTexturesPerShaderStage'; const kExtraLimits: LimitsRequest = { maxBindingsPerBindGroup: 'adapterLimit', maxBindGroups: 'adapterLimit', - [dependentLimitName]: 'adapterLimit', }; export const { g, description } = makeLimitTestGroup(limit, { // MAINTAINANCE_TODO: remove once this limit is required. limitOptional: true, - limitCheckFn(t, device, { actualLimit }) { - if (!t.isCompatibility) { - const expectedLimit = device.limits[dependentLimitName]; - t.expect( - actualLimit === expectedLimit, - `expected actual actualLimit: ${actualLimit} to equal ${dependentLimitName}: ${expectedLimit}` - ); - return true; - } - return false; - }, }); function createBindGroupLayout( @@ -209,4 +196,8 @@ g.test('createPipeline,at_over') ); }); -testMaxStorageXXXInYYYStageDeviceCreationWithDependentLimit(g, limit, dependentLimitName); +testMaxStorageXXXInYYYStageDeviceCreationWithDependentLimit( + g, + limit, + 'maxStorageTexturesPerShaderStage' +); diff --git a/src/webgpu/api/validation/capability_checks/limits/maxStorageTexturesInVertexStage.spec.ts b/src/webgpu/api/validation/capability_checks/limits/maxStorageTexturesInVertexStage.spec.ts index c51bb9392e6d..2dbaaa122933 100644 --- a/src/webgpu/api/validation/capability_checks/limits/maxStorageTexturesInVertexStage.spec.ts +++ b/src/webgpu/api/validation/capability_checks/limits/maxStorageTexturesInVertexStage.spec.ts @@ -18,28 +18,15 @@ import { } from './limit_utils.js'; const limit = 'maxStorageTexturesInVertexStage'; -const dependentLimitName = 'maxStorageTexturesPerShaderStage'; const kExtraLimits: LimitsRequest = { maxBindingsPerBindGroup: 'adapterLimit', maxBindGroups: 'adapterLimit', - [dependentLimitName]: 'adapterLimit', }; export const { g, description } = makeLimitTestGroup(limit, { // MAINTAINANCE_TODO: remove once this limit is required. limitOptional: true, - limitCheckFn(t, device, { actualLimit }) { - if (!t.isCompatibility) { - const expectedLimit = device.limits[dependentLimitName]; - t.expect( - actualLimit === expectedLimit, - `expected actual actualLimit: ${actualLimit} to equal ${dependentLimitName}: ${expectedLimit}` - ); - return true; - } - return false; - }, }); function createBindGroupLayout( @@ -199,4 +186,8 @@ g.test('createPipeline,at_over') ); }); -testMaxStorageXXXInYYYStageDeviceCreationWithDependentLimit(g, limit, dependentLimitName); +testMaxStorageXXXInYYYStageDeviceCreationWithDependentLimit( + g, + limit, + 'maxStorageTexturesPerShaderStage' +); From ec04d2b571c679838dc8c8b3e141b85e48c477b1 Mon Sep 17 00:00:00 2001 From: Gregg Tavares Date: Fri, 31 Jan 2025 09:23:00 -0800 Subject: [PATCH 2/2] address comments --- .../api/validation/capability_checks/limits/limit_utils.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/webgpu/api/validation/capability_checks/limits/limit_utils.ts b/src/webgpu/api/validation/capability_checks/limits/limit_utils.ts index 9039d5bc895e..f082c3176d65 100644 --- a/src/webgpu/api/validation/capability_checks/limits/limit_utils.ts +++ b/src/webgpu/api/validation/capability_checks/limits/limit_utils.ts @@ -1278,11 +1278,10 @@ export function testMaxStorageXXXInYYYStageDeviceCreationWithDependentLimit( g.test(`auto_upgrades_per_stage,${dependentLimitName}`) .desc( `Test that - * adapter.limit.${limit} < adapter.limit${dependentLimitName} + * adapter.limit.${limit} < adapter.limit.${dependentLimitName} * requiredLimits.${limit} auto-upgrades device.limits.${dependentLimitName} ` ) - .params(u => u.combine('useMax', [true, false] as const)) // true case should not reject. .fn(async t => { const { adapterLimit: maximumLimit, adapter } = t;