in src/webgpu/api/validation/capability_checks/limits/limit_utils.ts [1271:1341]
export function testMaxStorageXXXInYYYStageDeviceCreationWithDependentLimit(
g: ReturnType<typeof makeLimitTestGroup>['g'],
limit:
| 'maxStorageBuffersInFragmentStage'
| 'maxStorageBuffersInVertexStage'
| 'maxStorageTexturesInFragmentStage'
| 'maxStorageTexturesInVertexStage',
dependentLimitName: 'maxStorageBuffersPerShaderStage' | 'maxStorageTexturesPerShaderStage'
) {
g.test(`auto_upgrades_per_stage,${dependentLimitName}`)
.desc(
`Test that
* adapter.limit.${limit} < adapter.limit.${dependentLimitName}
* requiredLimits.${limit} auto-upgrades device.limits.${dependentLimitName}
`
)
.fn(async t => {
const { adapterLimit: maximumLimit, adapter } = t;
{
const dependentLimit = adapter.limits[dependentLimitName]!;
t.expect(
maximumLimit <= dependentLimit,
`maximumLimit(${maximumLimit}) is <= adapter.limits.${dependentLimitName}(${dependentLimit})`
);
}
const shouldReject = false;
const device = await t.requestDeviceWithLimits(
adapter,
{
[limit]: maximumLimit,
},
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_upgraded_from_per_stage,${dependentLimitName}`)
.desc(
`Test that adapter.limit.${limit} is automatically upgraded to ${dependentLimitName} except in compat.`
)
.fn(async t => {
const { adapter, defaultLimit } = t;
const dependentAdapterLimit = adapter.limits[dependentLimitName];
const shouldReject = false;
const device = await t.requestDeviceWithLimits(
adapter,
{
[dependentLimitName]: dependentAdapterLimit,
},
shouldReject
);
const expectedLimit = t.isCompatibility ? defaultLimit : dependentAdapterLimit;
t.expect(
device!.limits[limit] === expectedLimit,
`${limit}(${device!.limits[limit]}) === ${expectedLimit}`
);
});
}