export function testMaxStorageXXXInYYYStageDeviceCreationWithDependentLimit()

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}`
      );
    });
}