diff --git a/src/common/framework/test_config.ts b/src/common/framework/test_config.ts index 072aaf736027..48d090c45185 100644 --- a/src/common/framework/test_config.ts +++ b/src/common/framework/test_config.ts @@ -44,6 +44,11 @@ export type TestConfig = { */ forceFallbackAdapter: boolean; + /** + * Enforce the default limits on the adapter + */ + enforceDefaultLimits: boolean; + /** * Whether to enable the `logToWebSocket` function used for out-of-band test logging. */ @@ -59,5 +64,6 @@ export const globalTestConfig: TestConfig = { unrollConstEvalLoops: false, compatibility: false, forceFallbackAdapter: false, + enforceDefaultLimits: false, logToWebSocket: false, }; diff --git a/src/common/runtime/cmdline.ts b/src/common/runtime/cmdline.ts index b2d220ec8ef9..635c30eb1410 100644 --- a/src/common/runtime/cmdline.ts +++ b/src/common/runtime/cmdline.ts @@ -107,6 +107,8 @@ for (let i = 0; i < sys.args.length; ++i) { globalTestConfig.compatibility = true; } else if (a === '--force-fallback-adapter') { globalTestConfig.forceFallbackAdapter = true; + } else if (a === '--enforce-default-limits') { + globalTestConfig.enforceDefaultLimits = true; } else if (a === '--log-to-websocket') { globalTestConfig.logToWebSocket = true; } else { diff --git a/src/common/runtime/helper/options.ts b/src/common/runtime/helper/options.ts index 4a82c7d2928e..2bea817d44a1 100644 --- a/src/common/runtime/helper/options.ts +++ b/src/common/runtime/helper/options.ts @@ -53,6 +53,7 @@ export interface CTSOptions { debug: boolean; compatibility: boolean; forceFallbackAdapter: boolean; + enforceDefaultLimits: boolean; unrollConstEvalLoops: boolean; powerPreference: GPUPowerPreference | null; logToWebSocket: boolean; @@ -63,6 +64,7 @@ export const kDefaultCTSOptions: CTSOptions = { debug: true, compatibility: false, forceFallbackAdapter: false, + enforceDefaultLimits: false, unrollConstEvalLoops: false, powerPreference: null, logToWebSocket: false, @@ -100,6 +102,10 @@ export const kCTSOptionsInfo: OptionsInfos = { debug: { description: 'show more info' }, compatibility: { description: 'run in compatibility mode' }, forceFallbackAdapter: { description: 'pass forceFallbackAdapter: true to requestAdapter' }, + enforceDefaultLimits: { + description: `force the adapter limits to the default limits. +Note: May fail on tests for low-power/high-performance`, + }, unrollConstEvalLoops: { description: 'unroll const eval loops in WGSL' }, powerPreference: { description: 'set default powerPreference for some tests', diff --git a/src/common/runtime/helper/utils_worker.ts b/src/common/runtime/helper/utils_worker.ts index 5886839f6c33..7054be317c13 100644 --- a/src/common/runtime/helper/utils_worker.ts +++ b/src/common/runtime/helper/utils_worker.ts @@ -19,6 +19,7 @@ export function setupWorkerEnvironment(ctsOptions: CTSOptions): Logger { globalTestConfig.enableDebugLogs = ctsOptions.debug; globalTestConfig.unrollConstEvalLoops = ctsOptions.unrollConstEvalLoops; globalTestConfig.compatibility = compatibility; + globalTestConfig.enforceDefaultLimits = ctsOptions.enforceDefaultLimits; globalTestConfig.logToWebSocket = ctsOptions.logToWebSocket; const log = new Logger(); diff --git a/src/common/runtime/server.ts b/src/common/runtime/server.ts index d908ce89ba7a..bb68b0413353 100644 --- a/src/common/runtime/server.ts +++ b/src/common/runtime/server.ts @@ -96,6 +96,8 @@ for (let i = 0; i < sys.args.length; ++i) { emitCoverage = true; } else if (a === '--force-fallback-adapter') { globalTestConfig.forceFallbackAdapter = true; + } else if (a === '--enforce-default-limits') { + globalTestConfig.enforceDefaultLimits = true; } else if (a === '--log-to-websocket') { globalTestConfig.logToWebSocket = true; } else if (a === '--gpu-provider') { diff --git a/src/common/runtime/standalone.ts b/src/common/runtime/standalone.ts index a079ac28dd98..d5b51b11c6f5 100644 --- a/src/common/runtime/standalone.ts +++ b/src/common/runtime/standalone.ts @@ -52,6 +52,7 @@ const { runnow, powerPreference, compatibility, forceFallbackAdapter } = options globalTestConfig.enableDebugLogs = options.debug; globalTestConfig.unrollConstEvalLoops = options.unrollConstEvalLoops; globalTestConfig.compatibility = compatibility; +globalTestConfig.enforceDefaultLimits = options.enforceDefaultLimits; globalTestConfig.logToWebSocket = options.logToWebSocket; const logger = new Logger(); diff --git a/src/common/util/navigator_gpu.ts b/src/common/util/navigator_gpu.ts index 4e58797097ed..728b8cdadf54 100644 --- a/src/common/util/navigator_gpu.ts +++ b/src/common/util/navigator_gpu.ts @@ -1,4 +1,6 @@ +// eslint-disable-next-line import/no-restricted-paths import { TestCaseRecorder } from '../framework/fixture.js'; +import { globalTestConfig } from '../framework/test_config.js'; import { ErrorWithExtra, assert, objectEquals } from './util.js'; @@ -31,6 +33,7 @@ export function setGPUProvider(provider: GPUProvider) { } let impl: GPU | undefined = undefined; +let s_defaultLimits: Record | undefined = undefined; let defaultRequestAdapterOptions: GPURequestAdapterOptions | undefined; @@ -49,6 +52,14 @@ export function getDefaultRequestAdapterOptions() { return defaultRequestAdapterOptions; } +function copyLimits(objLike: GPUSupportedLimits) { + const obj: Record = {}; + for (const key in objLike) { + obj[key] = (objLike as unknown as Record)[key]; + } + return obj; +} + /** * Finds and returns the `navigator.gpu` object (or equivalent, for non-browser implementations). * Throws an exception if not found. @@ -60,6 +71,79 @@ export function getGPU(recorder: TestCaseRecorder | null): GPU { impl = gpuProvider(); + if (globalTestConfig.enforceDefaultLimits) { + // eslint-disable-next-line @typescript-eslint/unbound-method + const origRequestAdapterFn = impl.requestAdapter; + // eslint-disable-next-line @typescript-eslint/unbound-method + const origRequestDeviceFn = GPUAdapter.prototype.requestDevice; + + impl.requestAdapter = async function (options?: GPURequestAdapterOptions) { + if (!s_defaultLimits) { + const tempAdapter = await origRequestAdapterFn.call(this, { + ...defaultRequestAdapterOptions, + ...options, + }); + // eslint-disable-next-line no-restricted-syntax + const tempDevice = await tempAdapter?.requestDevice(); + s_defaultLimits = copyLimits(tempDevice!.limits); + tempDevice?.destroy(); + } + const adapter = await origRequestAdapterFn.call(this, { + ...defaultRequestAdapterOptions, + ...options, + }); + if (adapter) { + const limits = Object.fromEntries( + Object.entries(s_defaultLimits).map(([key, v]) => [key, v]) + ); + + Object.defineProperty(adapter, 'limits', { + get() { + return limits; + }, + }); + } + return adapter; + }; + + const enforceDefaultLimits = (adapter: GPUAdapter, desc: GPUDeviceDescriptor | undefined) => { + if (desc?.requiredLimits) { + for (const [key, value] of Object.entries(desc.requiredLimits)) { + const limit = s_defaultLimits![key]; + if (limit !== undefined && value !== undefined) { + const [beyondLimit, condition] = key.startsWith('max') + ? [value > limit, 'greater'] + : [value < limit, 'less']; + if (beyondLimit) { + throw new DOMException( + `requestedLimit ${value} for ${key} is ${condition} than adapter limit ${limit}`, + 'OperationError' + ); + } + } + } + } + }; + + GPUAdapter.prototype.requestDevice = async function ( + this: GPUAdapter, + desc?: GPUDeviceDescriptor | undefined + ) { + // We need to enforce the default limits because even though we patched the adapter to + // show defaults for adapter.limits, there are tests that test we throw when we request more than the max. + // In other words. + // + // adapter.requestDevice({ requiredLimits: { + // maxXXX: addapter.limits.maxXXX + 1, // should throw + // }); + // + // But unless we enforce this manually, it won't actual through if the adapter's + // true limits are higher than we patched above. + enforceDefaultLimits(this, desc); + return await origRequestDeviceFn.call(this, desc); + }; + } + if (defaultRequestAdapterOptions) { // eslint-disable-next-line @typescript-eslint/unbound-method const oldFn = impl.requestAdapter; diff --git a/src/resources/cache/hashes.json b/src/resources/cache/hashes.json index 16ed2d6f855f..7f214ed4d33b 100644 --- a/src/resources/cache/hashes.json +++ b/src/resources/cache/hashes.json @@ -1,112 +1,112 @@ { - "webgpu/shader/execution/binary/af_addition.bin": "e5d3d0ec", - "webgpu/shader/execution/binary/af_logical.bin": "4cadb0c4", - "webgpu/shader/execution/binary/af_division.bin": "24d5c047", - "webgpu/shader/execution/binary/af_matrix_addition.bin": "27b5045f", - "webgpu/shader/execution/binary/af_matrix_subtraction.bin": "e51ed65c", - "webgpu/shader/execution/binary/af_multiplication.bin": "ccdd9db3", - "webgpu/shader/execution/binary/af_remainder.bin": "7ba7561", - "webgpu/shader/execution/binary/af_subtraction.bin": "77ae32fd", - "webgpu/shader/execution/binary/f16_addition.bin": "7cf4d65a", - "webgpu/shader/execution/binary/f16_logical.bin": "b9e93570", - "webgpu/shader/execution/binary/f16_division.bin": "9ec5ad6a", - "webgpu/shader/execution/binary/f16_matrix_addition.bin": "e89ed3cb", - "webgpu/shader/execution/binary/f16_matrix_matrix_multiplication.bin": "375d5af3", - "webgpu/shader/execution/binary/f16_matrix_scalar_multiplication.bin": "9bd3af4e", - "webgpu/shader/execution/binary/f16_matrix_subtraction.bin": "43350bb3", - "webgpu/shader/execution/binary/f16_matrix_vector_multiplication.bin": "1edb6630", - "webgpu/shader/execution/binary/f16_multiplication.bin": "7485e77b", - "webgpu/shader/execution/binary/f16_remainder.bin": "ec817ba", - "webgpu/shader/execution/binary/f16_subtraction.bin": "aae1c57a", - "webgpu/shader/execution/binary/f32_addition.bin": "7134e85", - "webgpu/shader/execution/binary/f32_logical.bin": "24ba1a54", - "webgpu/shader/execution/binary/f32_division.bin": "f51e95fe", - "webgpu/shader/execution/binary/f32_matrix_addition.bin": "97f4a153", - "webgpu/shader/execution/binary/f32_matrix_matrix_multiplication.bin": "70677010", - "webgpu/shader/execution/binary/f32_matrix_scalar_multiplication.bin": "355c0954", - "webgpu/shader/execution/binary/f32_matrix_subtraction.bin": "85135fad", - "webgpu/shader/execution/binary/f32_matrix_vector_multiplication.bin": "a3fa2750", - "webgpu/shader/execution/binary/f32_multiplication.bin": "ba41fc13", - "webgpu/shader/execution/binary/f32_remainder.bin": "142765dd", - "webgpu/shader/execution/binary/f32_subtraction.bin": "c1523f1c", - "webgpu/shader/execution/binary/i32_arithmetic.bin": "bcff0350", - "webgpu/shader/execution/binary/i32_comparison.bin": "396f7bad", - "webgpu/shader/execution/binary/u32_arithmetic.bin": "7357b8e9", - "webgpu/shader/execution/binary/u32_comparison.bin": "374b246a", - "webgpu/shader/execution/abs.bin": "1ab55590", - "webgpu/shader/execution/acos.bin": "d85ca70", - "webgpu/shader/execution/acosh.bin": "e28fd395", - "webgpu/shader/execution/asin.bin": "eced623b", - "webgpu/shader/execution/asinh.bin": "223989ea", - "webgpu/shader/execution/atan.bin": "d896ec78", - "webgpu/shader/execution/atan2.bin": "b394e737", - "webgpu/shader/execution/atanh.bin": "9e4a5a", - "webgpu/shader/execution/bitcast.bin": "51bb8e9f", - "webgpu/shader/execution/ceil.bin": "11d3b9aa", - "webgpu/shader/execution/clamp.bin": "b2860448", - "webgpu/shader/execution/cos.bin": "c965712f", - "webgpu/shader/execution/cosh.bin": "89f1ce32", - "webgpu/shader/execution/cross.bin": "8b3df30b", - "webgpu/shader/execution/degrees.bin": "182a521e", - "webgpu/shader/execution/determinant.bin": "d5b3ed92", - "webgpu/shader/execution/distance.bin": "d21d853b", - "webgpu/shader/execution/dot.bin": "c91e716", - "webgpu/shader/execution/exp.bin": "4240da7", - "webgpu/shader/execution/exp2.bin": "11938883", - "webgpu/shader/execution/faceForward.bin": "a2e27acc", - "webgpu/shader/execution/floor.bin": "c06553ca", - "webgpu/shader/execution/fma.bin": "7dea01cf", - "webgpu/shader/execution/fract.bin": "677b1105", - "webgpu/shader/execution/frexp.bin": "3dbf112c", - "webgpu/shader/execution/inverseSqrt.bin": "8f6bb04e", - "webgpu/shader/execution/ldexp.bin": "287a7307", - "webgpu/shader/execution/length.bin": "908ff679", - "webgpu/shader/execution/log.bin": "8585f4ac", - "webgpu/shader/execution/log2.bin": "6847e7ca", - "webgpu/shader/execution/max.bin": "777cfa16", - "webgpu/shader/execution/min.bin": "51ae81f5", - "webgpu/shader/execution/mix.bin": "56c2fa65", - "webgpu/shader/execution/modf.bin": "4e106c58", - "webgpu/shader/execution/normalize.bin": "32c44235", - "webgpu/shader/execution/pack2x16float.bin": "133f1db3", - "webgpu/shader/execution/pow.bin": "370df2fa", - "webgpu/shader/execution/quantizeToF16.bin": "8a4fa4a8", - "webgpu/shader/execution/radians.bin": "c4684d86", - "webgpu/shader/execution/reflect.bin": "3620e893", - "webgpu/shader/execution/refract.bin": "f6bd722f", - "webgpu/shader/execution/round.bin": "765d4e71", - "webgpu/shader/execution/saturate.bin": "772a5d55", - "webgpu/shader/execution/sign.bin": "b99ea52d", - "webgpu/shader/execution/sin.bin": "69c8cce9", - "webgpu/shader/execution/sinh.bin": "3bc5f870", - "webgpu/shader/execution/smoothstep.bin": "bc6be719", - "webgpu/shader/execution/sqrt.bin": "c3960a52", - "webgpu/shader/execution/step.bin": "8a715292", - "webgpu/shader/execution/tan.bin": "5c531104", - "webgpu/shader/execution/tanh.bin": "ff9cadf1", - "webgpu/shader/execution/transpose.bin": "f9cebed4", - "webgpu/shader/execution/trunc.bin": "1c0edd1b", - "webgpu/shader/execution/unpack2x16float.bin": "1d4051b9", - "webgpu/shader/execution/unpack2x16snorm.bin": "f9a16118", - "webgpu/shader/execution/unpack2x16unorm.bin": "cad45023", - "webgpu/shader/execution/unpack4x8snorm.bin": "26f9cbc4", - "webgpu/shader/execution/unpack4x8unorm.bin": "76de2d56", - "webgpu/shader/execution/unary/af_arithmetic.bin": "7044a2b4", - "webgpu/shader/execution/unary/af_assignment.bin": "fca7094b", - "webgpu/shader/execution/unary/bool_conversion.bin": "ac26e6b8", - "webgpu/shader/execution/unary/f16_arithmetic.bin": "913af76", - "webgpu/shader/execution/unary/f16_conversion.bin": "1fb4a7a4", - "webgpu/shader/execution/unary/f32_arithmetic.bin": "7c274ba7", - "webgpu/shader/execution/unary/f32_conversion.bin": "1175ae48", - "webgpu/shader/execution/unary/i32_arithmetic.bin": "7bf685a3", - "webgpu/shader/execution/unary/i32_conversion.bin": "60437023", - "webgpu/shader/execution/unary/u32_conversion.bin": "3bc30fc0", - "webgpu/shader/execution/unary/ai_assignment.bin": "66d85afa", - "webgpu/shader/execution/binary/ai_arithmetic.bin": "3c6c91e3", - "webgpu/shader/execution/unary/ai_arithmetic.bin": "37cc249a", - "webgpu/shader/execution/binary/af_matrix_matrix_multiplication.bin": "c22028c6", - "webgpu/shader/execution/binary/af_matrix_scalar_multiplication.bin": "8fa6602", - "webgpu/shader/execution/binary/af_matrix_vector_multiplication.bin": "f1bc0050", - "webgpu/shader/execution/derivatives.bin": "d96a3465", - "webgpu/shader/execution/fwidth.bin": "c63db6a9" + "webgpu/shader/execution/binary/af_addition.bin": "a076fefd", + "webgpu/shader/execution/binary/af_logical.bin": "5ef95b51", + "webgpu/shader/execution/binary/af_division.bin": "2ee1f517", + "webgpu/shader/execution/binary/af_matrix_addition.bin": "46d1c536", + "webgpu/shader/execution/binary/af_matrix_subtraction.bin": "1ba9140b", + "webgpu/shader/execution/binary/af_multiplication.bin": "f55ec87f", + "webgpu/shader/execution/binary/af_remainder.bin": "39607546", + "webgpu/shader/execution/binary/af_subtraction.bin": "a1e1671b", + "webgpu/shader/execution/binary/f16_addition.bin": "98ec8cbb", + "webgpu/shader/execution/binary/f16_logical.bin": "e1b101aa", + "webgpu/shader/execution/binary/f16_division.bin": "f24f41e6", + "webgpu/shader/execution/binary/f16_matrix_addition.bin": "a6c126ba", + "webgpu/shader/execution/binary/f16_matrix_matrix_multiplication.bin": "4810437f", + "webgpu/shader/execution/binary/f16_matrix_scalar_multiplication.bin": "33bd4e0b", + "webgpu/shader/execution/binary/f16_matrix_subtraction.bin": "2a42a145", + "webgpu/shader/execution/binary/f16_matrix_vector_multiplication.bin": "17eeecc2", + "webgpu/shader/execution/binary/f16_multiplication.bin": "5ee924d2", + "webgpu/shader/execution/binary/f16_remainder.bin": "a371e824", + "webgpu/shader/execution/binary/f16_subtraction.bin": "c5e6d455", + "webgpu/shader/execution/binary/f32_addition.bin": "371675d2", + "webgpu/shader/execution/binary/f32_logical.bin": "6c691798", + "webgpu/shader/execution/binary/f32_division.bin": "11ed1f8d", + "webgpu/shader/execution/binary/f32_matrix_addition.bin": "662a8c2a", + "webgpu/shader/execution/binary/f32_matrix_matrix_multiplication.bin": "3bef3e82", + "webgpu/shader/execution/binary/f32_matrix_scalar_multiplication.bin": "4b0d7b28", + "webgpu/shader/execution/binary/f32_matrix_subtraction.bin": "c1b78a5f", + "webgpu/shader/execution/binary/f32_matrix_vector_multiplication.bin": "3ae5663c", + "webgpu/shader/execution/binary/f32_multiplication.bin": "7c887b3c", + "webgpu/shader/execution/binary/f32_remainder.bin": "955b27f7", + "webgpu/shader/execution/binary/f32_subtraction.bin": "10a5d990", + "webgpu/shader/execution/binary/i32_arithmetic.bin": "d8d24c51", + "webgpu/shader/execution/binary/i32_comparison.bin": "97a65e83", + "webgpu/shader/execution/binary/u32_arithmetic.bin": "76af97a5", + "webgpu/shader/execution/binary/u32_comparison.bin": "107ae7dd", + "webgpu/shader/execution/abs.bin": "8702bbde", + "webgpu/shader/execution/acos.bin": "505d4e5c", + "webgpu/shader/execution/acosh.bin": "6d849181", + "webgpu/shader/execution/asin.bin": "3739abaa", + "webgpu/shader/execution/asinh.bin": "5f912ea9", + "webgpu/shader/execution/atan.bin": "d15dc231", + "webgpu/shader/execution/atan2.bin": "60eb6015", + "webgpu/shader/execution/atanh.bin": "f8b2fb79", + "webgpu/shader/execution/bitcast.bin": "af41ce05", + "webgpu/shader/execution/ceil.bin": "8da53d8b", + "webgpu/shader/execution/clamp.bin": "a02c15b", + "webgpu/shader/execution/cos.bin": "4f444ab6", + "webgpu/shader/execution/cosh.bin": "aaa40c4b", + "webgpu/shader/execution/cross.bin": "534a949c", + "webgpu/shader/execution/degrees.bin": "2d55f678", + "webgpu/shader/execution/determinant.bin": "5b49ee94", + "webgpu/shader/execution/distance.bin": "d6963680", + "webgpu/shader/execution/dot.bin": "e03347d6", + "webgpu/shader/execution/exp.bin": "a5affb43", + "webgpu/shader/execution/exp2.bin": "21d376a0", + "webgpu/shader/execution/faceForward.bin": "e0e2ad0e", + "webgpu/shader/execution/floor.bin": "3658073", + "webgpu/shader/execution/fma.bin": "a7cc5707", + "webgpu/shader/execution/fract.bin": "44a3775d", + "webgpu/shader/execution/frexp.bin": "241abedb", + "webgpu/shader/execution/inverseSqrt.bin": "766974b5", + "webgpu/shader/execution/ldexp.bin": "db0c0fcf", + "webgpu/shader/execution/length.bin": "c1240c03", + "webgpu/shader/execution/log.bin": "98aceda7", + "webgpu/shader/execution/log2.bin": "ffdc85d7", + "webgpu/shader/execution/max.bin": "a2c6c4b1", + "webgpu/shader/execution/min.bin": "344390ef", + "webgpu/shader/execution/mix.bin": "367c1ff3", + "webgpu/shader/execution/modf.bin": "7be6faa3", + "webgpu/shader/execution/normalize.bin": "b2b9eb0c", + "webgpu/shader/execution/pack2x16float.bin": "a66da753", + "webgpu/shader/execution/pow.bin": "a9858b9", + "webgpu/shader/execution/quantizeToF16.bin": "bf80d34e", + "webgpu/shader/execution/radians.bin": "cc7b8d0c", + "webgpu/shader/execution/reflect.bin": "cb0be6ee", + "webgpu/shader/execution/refract.bin": "501ac731", + "webgpu/shader/execution/round.bin": "b4ea1e61", + "webgpu/shader/execution/saturate.bin": "2783de66", + "webgpu/shader/execution/sign.bin": "30ad6ecf", + "webgpu/shader/execution/sin.bin": "9f8b5d9e", + "webgpu/shader/execution/sinh.bin": "d988cc09", + "webgpu/shader/execution/smoothstep.bin": "2e89af8e", + "webgpu/shader/execution/sqrt.bin": "55dd81cf", + "webgpu/shader/execution/step.bin": "f1bced79", + "webgpu/shader/execution/tan.bin": "a8354079", + "webgpu/shader/execution/tanh.bin": "fd1c38ee", + "webgpu/shader/execution/transpose.bin": "e8bdca54", + "webgpu/shader/execution/trunc.bin": "ffedffa", + "webgpu/shader/execution/unpack2x16float.bin": "9251ad61", + "webgpu/shader/execution/unpack2x16snorm.bin": "6133b78b", + "webgpu/shader/execution/unpack2x16unorm.bin": "291b47bd", + "webgpu/shader/execution/unpack4x8snorm.bin": "93230ee1", + "webgpu/shader/execution/unpack4x8unorm.bin": "99fd9a23", + "webgpu/shader/execution/unary/af_arithmetic.bin": "dc1de35b", + "webgpu/shader/execution/unary/af_assignment.bin": "6a907068", + "webgpu/shader/execution/unary/bool_conversion.bin": "4fb09ad6", + "webgpu/shader/execution/unary/f16_arithmetic.bin": "5443808d", + "webgpu/shader/execution/unary/f16_conversion.bin": "e6f6743", + "webgpu/shader/execution/unary/f32_arithmetic.bin": "980abd9d", + "webgpu/shader/execution/unary/f32_conversion.bin": "c666a6e8", + "webgpu/shader/execution/unary/i32_arithmetic.bin": "4c1bf2ef", + "webgpu/shader/execution/unary/i32_conversion.bin": "9d2e1411", + "webgpu/shader/execution/unary/u32_conversion.bin": "962b68ac", + "webgpu/shader/execution/unary/ai_assignment.bin": "d34f3811", + "webgpu/shader/execution/binary/ai_arithmetic.bin": "b4811a5c", + "webgpu/shader/execution/unary/ai_arithmetic.bin": "d203a070", + "webgpu/shader/execution/binary/af_matrix_matrix_multiplication.bin": "1405c422", + "webgpu/shader/execution/binary/af_matrix_scalar_multiplication.bin": "c24e7f75", + "webgpu/shader/execution/binary/af_matrix_vector_multiplication.bin": "e36fcfd", + "webgpu/shader/execution/derivatives.bin": "e8c5ea73", + "webgpu/shader/execution/fwidth.bin": "cb050a6f" } \ No newline at end of file