in src/webgpu/api/validation/capability_checks/limits/limit_utils.ts [465:537]
async _getDeviceWithSpecificLimit(
requestedLimit: number,
extraLimits?: LimitsRequest,
features?: GPUFeatureName[]
): Promise<DeviceAndLimits | undefined> {
const { adapter, limit, adapterLimit, defaultLimit } = this;
const requiredLimits: Record<string, number> = {};
requiredLimits[limit] = requestedLimit;
if (extraLimits) {
for (const [extraLimitStr, limitModeOrNumber] of Object.entries(extraLimits)) {
const extraLimit = extraLimitStr as GPUSupportedLimit;
if (adapter.limits[extraLimit] !== undefined) {
requiredLimits[extraLimit] =
typeof limitModeOrNumber === 'number'
? limitModeOrNumber
: limitModeOrNumber === 'defaultLimit'
? getDefaultLimitForAdapter(adapter, extraLimit)
: (adapter.limits[extraLimit] as number);
}
}
}
const shouldReject = kMinimumLimits.has(limit)
? requestedLimit < adapterLimit
: requestedLimit > adapterLimit;
const device = await this.requestDeviceWithLimits(
adapter,
requiredLimits,
shouldReject,
features
);
const actualLimit = (device ? device.limits[limit] : 0) as number;
if (shouldReject) {
this.expect(!device, 'expected no device');
} else {
if (kMinimumLimits.has(limit)) {
if (requestedLimit <= defaultLimit) {
this.expect(
actualLimit === requestedLimit,
`expected actual actualLimit: ${actualLimit} to equal defaultLimit: ${requestedLimit}`
);
} else {
this.expect(
actualLimit === defaultLimit,
`expected actual actualLimit: ${actualLimit} to equal defaultLimit: ${defaultLimit}`
);
}
} else {
const checked = this.limitTestParams.limitCheckFn
? this.limitTestParams.limitCheckFn(this, device!, { limit, actualLimit, defaultLimit })
: false;
if (!checked) {
if (requestedLimit <= defaultLimit) {
this.expect(
actualLimit === defaultLimit,
`expected actual actualLimit: ${actualLimit} to equal defaultLimit: ${defaultLimit}`
);
} else {
this.expect(
actualLimit === requestedLimit,
`expected actual actualLimit: ${actualLimit} to equal requestedLimit: ${requestedLimit}`
);
}
}
}
}
return device ? { device, defaultLimit, adapterLimit, requestedLimit, actualLimit } : undefined;
}