commit 1f98ef34158b3db240a0b6a6fc03a44dbb3d7d0d parent c7548676269ed69a66bc4dd982d59a821952895f Author: Erich Gubler <erichdongubler@gmail.com> Date: Mon, 5 Jan 2026 21:35:39 +0000 Bug 2007351 - test(webgpu): update CTS to d5a131f3afc77be7f76bbf956db054e799f2e79d r=webgpu-reviewers,nical Differential Revision: https://phabricator.services.mozilla.com/D277322 Diffstat:
57 files changed, 2813 insertions(+), 423 deletions(-)
diff --git a/dom/webgpu/tests/cts/checkout/package-lock.json b/dom/webgpu/tests/cts/checkout/package-lock.json @@ -24,7 +24,7 @@ "@types/w3c-image-capture": "^1.0.10", "@typescript-eslint/eslint-plugin": "^6.9.1", "@typescript-eslint/parser": "^6.9.1", - "@webgpu/types": "^0.1.66", + "@webgpu/types": "^0.1.68", "ansi-colors": "4.1.3", "babel-plugin-add-header-comment": "^1.0.3", "babel-plugin-const-enum": "^1.2.0", @@ -1539,9 +1539,9 @@ "dev": true }, "node_modules/@webgpu/types": { - "version": "0.1.66", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.66.tgz", - "integrity": "sha512-YA2hLrwLpDsRueNDXIMqN9NTzD6bCDkuXbOSe0heS+f8YE8usA6Gbv1prj81pzVHrbaAma7zObnIC+I6/sXJgA==", + "version": "0.1.68", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.68.tgz", + "integrity": "sha512-3ab1B59Ojb6RwjOspYLsTpCzbNB3ZaamIAxBMmvnNkiDoLTZUOBXZ9p5nAYVEkQlDdf6qAZWi1pqj9+ypiqznA==", "dev": true, "license": "BSD-3-Clause" }, @@ -10077,9 +10077,9 @@ "dev": true }, "@webgpu/types": { - "version": "0.1.66", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.66.tgz", - "integrity": "sha512-YA2hLrwLpDsRueNDXIMqN9NTzD6bCDkuXbOSe0heS+f8YE8usA6Gbv1prj81pzVHrbaAma7zObnIC+I6/sXJgA==", + "version": "0.1.68", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.68.tgz", + "integrity": "sha512-3ab1B59Ojb6RwjOspYLsTpCzbNB3ZaamIAxBMmvnNkiDoLTZUOBXZ9p5nAYVEkQlDdf6qAZWi1pqj9+ypiqznA==", "dev": true }, "abbrev": { diff --git a/dom/webgpu/tests/cts/checkout/package.json b/dom/webgpu/tests/cts/checkout/package.json @@ -50,7 +50,7 @@ "@types/w3c-image-capture": "^1.0.10", "@typescript-eslint/eslint-plugin": "^6.9.1", "@typescript-eslint/parser": "^6.9.1", - "@webgpu/types": "^0.1.66", + "@webgpu/types": "^0.1.68", "ansi-colors": "4.1.3", "babel-plugin-add-header-comment": "^1.0.3", "babel-plugin-const-enum": "^1.2.0", diff --git a/dom/webgpu/tests/cts/checkout/src/common/util/data_tables.ts b/dom/webgpu/tests/cts/checkout/src/common/util/data_tables.ts @@ -6,8 +6,8 @@ export function keysOf<T extends string>(obj: { [k in T]?: unknown }): readonly return Object.keys(obj) as unknown[] as T[]; } -export function numericKeysOf<T>(obj: object): readonly T[] { - return Object.keys(obj).map(n => Number(n)) as unknown[] as T[]; +export function numericKeysOf<T extends number>(obj: { [k in T]?: unknown }): readonly T[] { + return Object.keys(obj).map(n => Number(n) as T); } /** diff --git a/dom/webgpu/tests/cts/checkout/src/common/util/util.ts b/dom/webgpu/tests/cts/checkout/src/common/util/util.ts @@ -505,3 +505,16 @@ export function hasFeature(features: GPUSupportedFeatures, feature: GPUFeatureNa // eslint-disable-next-line no-restricted-syntax return features.has(feature); } + +/** Convenience helper for combinations of 1-2 usage bits from a list of usage bits. */ +export function combinationsOfOneOrTwoUsages(usages: readonly number[]) { + const combinations = []; + for (const usage0 of usages) { + for (const usage1 of usages) { + if (usage0 <= usage1) { + combinations.push(usage0 | usage1); + } + } + } + return combinations; +} diff --git a/dom/webgpu/tests/cts/checkout/src/resources/cache/hashes.json b/dom/webgpu/tests/cts/checkout/src/resources/cache/hashes.json @@ -1,112 +1,112 @@ { - "webgpu/shader/execution/binary/af_addition.bin": "da003be4", - "webgpu/shader/execution/binary/af_logical.bin": "14ad43ca", - "webgpu/shader/execution/binary/af_division.bin": "1296892b", - "webgpu/shader/execution/binary/af_matrix_addition.bin": "1317ab16", - "webgpu/shader/execution/binary/af_matrix_subtraction.bin": "2853ad41", - "webgpu/shader/execution/binary/af_multiplication.bin": "5ee6bde6", - "webgpu/shader/execution/binary/af_remainder.bin": "366f8d30", - "webgpu/shader/execution/binary/af_subtraction.bin": "3c19e6fb", - "webgpu/shader/execution/binary/f16_addition.bin": "319185c0", - "webgpu/shader/execution/binary/f16_logical.bin": "94a83cb4", - "webgpu/shader/execution/binary/f16_division.bin": "635bbc5f", - "webgpu/shader/execution/binary/f16_matrix_addition.bin": "30070be5", - "webgpu/shader/execution/binary/f16_matrix_matrix_multiplication.bin": "7e0e00db", - "webgpu/shader/execution/binary/f16_matrix_scalar_multiplication.bin": "d538842d", - "webgpu/shader/execution/binary/f16_matrix_subtraction.bin": "4b5ce37c", - "webgpu/shader/execution/binary/f16_matrix_vector_multiplication.bin": "7a4445de", - "webgpu/shader/execution/binary/f16_multiplication.bin": "b2c70232", - "webgpu/shader/execution/binary/f16_remainder.bin": "d138c173", - "webgpu/shader/execution/binary/f16_subtraction.bin": "e2515ca5", - "webgpu/shader/execution/binary/f32_addition.bin": "60286efc", - "webgpu/shader/execution/binary/f32_logical.bin": "a578e65b", - "webgpu/shader/execution/binary/f32_division.bin": "36d196b1", - "webgpu/shader/execution/binary/f32_matrix_addition.bin": "a11d772e", - "webgpu/shader/execution/binary/f32_matrix_matrix_multiplication.bin": "d578a451", - "webgpu/shader/execution/binary/f32_matrix_scalar_multiplication.bin": "a0259221", - "webgpu/shader/execution/binary/f32_matrix_subtraction.bin": "9eb43464", - "webgpu/shader/execution/binary/f32_matrix_vector_multiplication.bin": "939f2e70", - "webgpu/shader/execution/binary/f32_multiplication.bin": "d34ce65d", - "webgpu/shader/execution/binary/f32_remainder.bin": "6fa6b892", - "webgpu/shader/execution/binary/f32_subtraction.bin": "ddb575f5", - "webgpu/shader/execution/binary/i32_arithmetic.bin": "5bc8c900", - "webgpu/shader/execution/binary/i32_comparison.bin": "9165629b", - "webgpu/shader/execution/binary/u32_arithmetic.bin": "fc8c6726", - "webgpu/shader/execution/binary/u32_comparison.bin": "598d0773", - "webgpu/shader/execution/abs.bin": "f4ea4f10", - "webgpu/shader/execution/acos.bin": "f7ccbfca", - "webgpu/shader/execution/acosh.bin": "11315a9f", - "webgpu/shader/execution/asin.bin": "7349a03b", - "webgpu/shader/execution/asinh.bin": "fdebffc6", - "webgpu/shader/execution/atan.bin": "723ae9a5", - "webgpu/shader/execution/atan2.bin": "57241996", - "webgpu/shader/execution/atanh.bin": "e72a7c31", - "webgpu/shader/execution/bitcast.bin": "3de97de", - "webgpu/shader/execution/ceil.bin": "29fd5fae", - "webgpu/shader/execution/clamp.bin": "8d0eafdb", - "webgpu/shader/execution/cos.bin": "eac17036", - "webgpu/shader/execution/cosh.bin": "575d952c", - "webgpu/shader/execution/cross.bin": "34b3306c", - "webgpu/shader/execution/degrees.bin": "e95cfd56", - "webgpu/shader/execution/determinant.bin": "cbf20e3c", - "webgpu/shader/execution/distance.bin": "1c119356", - "webgpu/shader/execution/dot.bin": "4da666a3", - "webgpu/shader/execution/exp.bin": "69ee596e", - "webgpu/shader/execution/exp2.bin": "1b0d4107", - "webgpu/shader/execution/faceForward.bin": "d9e806e", - "webgpu/shader/execution/floor.bin": "d04aaaed", - "webgpu/shader/execution/fma.bin": "ea6f3d9d", - "webgpu/shader/execution/fract.bin": "6041dbd3", - "webgpu/shader/execution/frexp.bin": "4f14eae", - "webgpu/shader/execution/inverseSqrt.bin": "a31d31ec", - "webgpu/shader/execution/ldexp.bin": "bc8d5e62", - "webgpu/shader/execution/length.bin": "52fc048a", - "webgpu/shader/execution/log.bin": "bdb94ae0", - "webgpu/shader/execution/log2.bin": "b92a3bca", - "webgpu/shader/execution/max.bin": "436f8f21", - "webgpu/shader/execution/min.bin": "21cb02b4", - "webgpu/shader/execution/mix.bin": "ef3d6b1b", - "webgpu/shader/execution/modf.bin": "55ff0437", - "webgpu/shader/execution/normalize.bin": "fd315393", - "webgpu/shader/execution/pack2x16float.bin": "8443853d", - "webgpu/shader/execution/pow.bin": "e1f4e61", - "webgpu/shader/execution/quantizeToF16.bin": "564caff5", - "webgpu/shader/execution/radians.bin": "3d50fa1a", - "webgpu/shader/execution/reflect.bin": "de3cdc23", - "webgpu/shader/execution/refract.bin": "a6b7cf0c", - "webgpu/shader/execution/round.bin": "5735993c", - "webgpu/shader/execution/saturate.bin": "58cb0de5", - "webgpu/shader/execution/sign.bin": "b59874a7", - "webgpu/shader/execution/sin.bin": "59c3422", - "webgpu/shader/execution/sinh.bin": "427c6297", - "webgpu/shader/execution/smoothstep.bin": "b0d9c07e", - "webgpu/shader/execution/sqrt.bin": "f207f4ac", - "webgpu/shader/execution/step.bin": "18a574a0", - "webgpu/shader/execution/tan.bin": "40504049", - "webgpu/shader/execution/tanh.bin": "7c1b22bd", - "webgpu/shader/execution/transpose.bin": "af20793c", - "webgpu/shader/execution/trunc.bin": "2d9f23e5", - "webgpu/shader/execution/unpack2x16float.bin": "de3c9cb4", - "webgpu/shader/execution/unpack2x16snorm.bin": "2cfc1791", - "webgpu/shader/execution/unpack2x16unorm.bin": "85ff09e", - "webgpu/shader/execution/unpack4x8snorm.bin": "e4c5b1f4", - "webgpu/shader/execution/unpack4x8unorm.bin": "1fd43872", - "webgpu/shader/execution/unary/af_arithmetic.bin": "daccee7d", - "webgpu/shader/execution/unary/af_assignment.bin": "fb1a84b1", - "webgpu/shader/execution/unary/bool_conversion.bin": "65b450a7", - "webgpu/shader/execution/unary/f16_arithmetic.bin": "79ee24a3", - "webgpu/shader/execution/unary/f16_conversion.bin": "920adf7", - "webgpu/shader/execution/unary/f32_arithmetic.bin": "9496759c", - "webgpu/shader/execution/unary/f32_conversion.bin": "dddb7940", - "webgpu/shader/execution/unary/i32_arithmetic.bin": "e9c53cb5", - "webgpu/shader/execution/unary/i32_conversion.bin": "87b5fd7", - "webgpu/shader/execution/unary/u32_conversion.bin": "70718f67", - "webgpu/shader/execution/unary/ai_assignment.bin": "4fad3c69", - "webgpu/shader/execution/binary/ai_arithmetic.bin": "a00c8197", - "webgpu/shader/execution/unary/ai_arithmetic.bin": "3b481d45", - "webgpu/shader/execution/binary/af_matrix_matrix_multiplication.bin": "47b72af2", - "webgpu/shader/execution/binary/af_matrix_scalar_multiplication.bin": "1a5c6719", - "webgpu/shader/execution/binary/af_matrix_vector_multiplication.bin": "1b8f17cf", - "webgpu/shader/execution/derivatives.bin": "6d72e1fb", - "webgpu/shader/execution/fwidth.bin": "c00ddf59" + "webgpu/shader/execution/binary/af_addition.bin": "5f076aa3", + "webgpu/shader/execution/binary/af_logical.bin": "e4e8dc9d", + "webgpu/shader/execution/binary/af_division.bin": "c5dfd211", + "webgpu/shader/execution/binary/af_matrix_addition.bin": "de5e0eac", + "webgpu/shader/execution/binary/af_matrix_subtraction.bin": "36896bfa", + "webgpu/shader/execution/binary/af_multiplication.bin": "cc404b81", + "webgpu/shader/execution/binary/af_remainder.bin": "8146d6d1", + "webgpu/shader/execution/binary/af_subtraction.bin": "ae2f7ae2", + "webgpu/shader/execution/binary/f16_addition.bin": "12cc89f6", + "webgpu/shader/execution/binary/f16_logical.bin": "4ec8c393", + "webgpu/shader/execution/binary/f16_division.bin": "8ac15469", + "webgpu/shader/execution/binary/f16_matrix_addition.bin": "1f0d0278", + "webgpu/shader/execution/binary/f16_matrix_matrix_multiplication.bin": "2b8023c0", + "webgpu/shader/execution/binary/f16_matrix_scalar_multiplication.bin": "45ef275b", + "webgpu/shader/execution/binary/f16_matrix_subtraction.bin": "5eb2b7a", + "webgpu/shader/execution/binary/f16_matrix_vector_multiplication.bin": "28e828fb", + "webgpu/shader/execution/binary/f16_multiplication.bin": "b408f36c", + "webgpu/shader/execution/binary/f16_remainder.bin": "a3b33d27", + "webgpu/shader/execution/binary/f16_subtraction.bin": "5aafbfda", + "webgpu/shader/execution/binary/f32_addition.bin": "b3506680", + "webgpu/shader/execution/binary/f32_logical.bin": "ee74d02", + "webgpu/shader/execution/binary/f32_division.bin": "5fbcd238", + "webgpu/shader/execution/binary/f32_matrix_addition.bin": "cc8c8f8a", + "webgpu/shader/execution/binary/f32_matrix_matrix_multiplication.bin": "4b2e3c03", + "webgpu/shader/execution/binary/f32_matrix_scalar_multiplication.bin": "1341acc4", + "webgpu/shader/execution/binary/f32_matrix_subtraction.bin": "cbae8b4c", + "webgpu/shader/execution/binary/f32_matrix_vector_multiplication.bin": "ee8f01ec", + "webgpu/shader/execution/binary/f32_multiplication.bin": "9ad9e62c", + "webgpu/shader/execution/binary/f32_remainder.bin": "4eae8a29", + "webgpu/shader/execution/binary/f32_subtraction.bin": "a83b66ec", + "webgpu/shader/execution/binary/i32_arithmetic.bin": "d7c8c0ab", + "webgpu/shader/execution/binary/i32_comparison.bin": "856e566f", + "webgpu/shader/execution/binary/u32_arithmetic.bin": "a11da8f9", + "webgpu/shader/execution/binary/u32_comparison.bin": "6bfc377", + "webgpu/shader/execution/abs.bin": "79819b63", + "webgpu/shader/execution/acos.bin": "683b325", + "webgpu/shader/execution/acosh.bin": "2d24d841", + "webgpu/shader/execution/asin.bin": "3edf2f46", + "webgpu/shader/execution/asinh.bin": "9690fa22", + "webgpu/shader/execution/atan.bin": "a30c7ea5", + "webgpu/shader/execution/atan2.bin": "94bcdb6", + "webgpu/shader/execution/atanh.bin": "d9c0bd64", + "webgpu/shader/execution/bitcast.bin": "377e7dbd", + "webgpu/shader/execution/ceil.bin": "bcd64579", + "webgpu/shader/execution/clamp.bin": "b1ce330e", + "webgpu/shader/execution/cos.bin": "7f4ad5f2", + "webgpu/shader/execution/cosh.bin": "d8cde23e", + "webgpu/shader/execution/cross.bin": "595a610d", + "webgpu/shader/execution/degrees.bin": "b056d323", + "webgpu/shader/execution/determinant.bin": "d3e6fc82", + "webgpu/shader/execution/distance.bin": "58552f3e", + "webgpu/shader/execution/dot.bin": "2abddd56", + "webgpu/shader/execution/exp.bin": "b0dbb649", + "webgpu/shader/execution/exp2.bin": "fd74475d", + "webgpu/shader/execution/faceForward.bin": "7409d8d9", + "webgpu/shader/execution/floor.bin": "4a1dc74b", + "webgpu/shader/execution/fma.bin": "751ad3fe", + "webgpu/shader/execution/fract.bin": "8622bda9", + "webgpu/shader/execution/frexp.bin": "7afb5377", + "webgpu/shader/execution/inverseSqrt.bin": "1a6955c1", + "webgpu/shader/execution/ldexp.bin": "fe606222", + "webgpu/shader/execution/length.bin": "ed8d6514", + "webgpu/shader/execution/log.bin": "4f202c3a", + "webgpu/shader/execution/log2.bin": "6d74778c", + "webgpu/shader/execution/max.bin": "baa71af9", + "webgpu/shader/execution/min.bin": "b09990b7", + "webgpu/shader/execution/mix.bin": "11416c1a", + "webgpu/shader/execution/modf.bin": "f3bbb1ed", + "webgpu/shader/execution/normalize.bin": "f987a36a", + "webgpu/shader/execution/pack2x16float.bin": "3dc3d0ec", + "webgpu/shader/execution/pow.bin": "f0aca6fd", + "webgpu/shader/execution/quantizeToF16.bin": "368618ad", + "webgpu/shader/execution/radians.bin": "dc9b7e77", + "webgpu/shader/execution/reflect.bin": "6e34625c", + "webgpu/shader/execution/refract.bin": "a875f956", + "webgpu/shader/execution/round.bin": "482489c3", + "webgpu/shader/execution/saturate.bin": "b2943d01", + "webgpu/shader/execution/sign.bin": "31c04ec2", + "webgpu/shader/execution/sin.bin": "85cc574c", + "webgpu/shader/execution/sinh.bin": "ec72b818", + "webgpu/shader/execution/smoothstep.bin": "2e54d194", + "webgpu/shader/execution/sqrt.bin": "33aa080f", + "webgpu/shader/execution/step.bin": "e7a45f26", + "webgpu/shader/execution/tan.bin": "6023a6c6", + "webgpu/shader/execution/tanh.bin": "94d8a47a", + "webgpu/shader/execution/transpose.bin": "cc620b0b", + "webgpu/shader/execution/trunc.bin": "49c96a7e", + "webgpu/shader/execution/unpack2x16float.bin": "7c503c8e", + "webgpu/shader/execution/unpack2x16snorm.bin": "3a9a6a83", + "webgpu/shader/execution/unpack2x16unorm.bin": "a6ba2b49", + "webgpu/shader/execution/unpack4x8snorm.bin": "3ad2d338", + "webgpu/shader/execution/unpack4x8unorm.bin": "67ce712", + "webgpu/shader/execution/unary/af_arithmetic.bin": "ab98a506", + "webgpu/shader/execution/unary/af_assignment.bin": "f2893675", + "webgpu/shader/execution/unary/bool_conversion.bin": "1c61708d", + "webgpu/shader/execution/unary/f16_arithmetic.bin": "e3cdad9f", + "webgpu/shader/execution/unary/f16_conversion.bin": "8deba5e5", + "webgpu/shader/execution/unary/f32_arithmetic.bin": "9539acfd", + "webgpu/shader/execution/unary/f32_conversion.bin": "9cbf6d43", + "webgpu/shader/execution/unary/i32_arithmetic.bin": "8f135e9a", + "webgpu/shader/execution/unary/i32_conversion.bin": "2cad9a53", + "webgpu/shader/execution/unary/u32_conversion.bin": "aecfc4e3", + "webgpu/shader/execution/unary/ai_assignment.bin": "a995bead", + "webgpu/shader/execution/binary/ai_arithmetic.bin": "6ad603c0", + "webgpu/shader/execution/unary/ai_arithmetic.bin": "1c635d9f", + "webgpu/shader/execution/binary/af_matrix_matrix_multiplication.bin": "ef62e9f2", + "webgpu/shader/execution/binary/af_matrix_scalar_multiplication.bin": "82de41cb", + "webgpu/shader/execution/binary/af_matrix_vector_multiplication.bin": "76e41ddb", + "webgpu/shader/execution/derivatives.bin": "92507782", + "webgpu/shader/execution/fwidth.bin": "fad2244f" } \ No newline at end of file diff --git a/dom/webgpu/tests/cts/checkout/src/webgpu/api/validation/capability_checks/limits/limit_utils.ts b/dom/webgpu/tests/cts/checkout/src/webgpu/api/validation/capability_checks/limits/limit_utils.ts @@ -404,9 +404,11 @@ export class LimitTestsImpl extends GPUTestBase { this._adapter = await gpu.requestAdapter(); const limit = this.limit; // MAINTENANCE_TODO: consider removing this skip if the spec has no optional limits. + // Note: The cast below is required because an optional limit has no entry + // in capability_info.ts kLimitInfoKeys, kLimitInfoDefaults, kLimitInfoData this.skipIf( (this._adapter?.limits[limit] === undefined && !!this.limitTestParams.limitOptional) || - getDefaultLimitsForCTS()[limit] === undefined, + !(limit in getDefaultLimitsForCTS()), `${limit} is missing but optional for now` ); this.defaultLimit = getDefaultLimitForAdapter(this.adapter, limit); diff --git a/dom/webgpu/tests/cts/checkout/src/webgpu/api/validation/createBindGroup.spec.ts b/dom/webgpu/tests/cts/checkout/src/webgpu/api/validation/createBindGroup.spec.ts @@ -23,7 +23,7 @@ import { kTextureViewDimensions, sampledAndStorageBindingEntries, texBindingTypeInfo, - IsValidTextureUsageCombination, + isValidTextureUsageCombination, } from '../../capability_info.js'; import { GPUConst } from '../../constants.js'; import { kPossibleStorageTextureFormats, kRegularTextureFormats } from '../../format_info.js'; @@ -795,7 +795,7 @@ g.test('storage_texture,usage') .combine('usage0', kTextureUsages) .combine('usage1', kTextureUsages) .unless(({ usage0, usage1 }) => { - return !IsValidTextureUsageCombination(usage0 | usage1); + return !isValidTextureUsageCombination(usage0 | usage1); }) ) .fn(t => { @@ -1234,7 +1234,7 @@ g.test('external_texture,texture_view,usage') .combine('usage0', kTextureUsages) .combine('usage1', kTextureUsages) .unless(({ usage0, usage1 }) => { - return !IsValidTextureUsageCombination(usage0 | usage1); + return !isValidTextureUsageCombination(usage0 | usage1); }) ) .fn(t => { diff --git a/dom/webgpu/tests/cts/checkout/src/webgpu/api/validation/createTexture.spec.ts b/dom/webgpu/tests/cts/checkout/src/webgpu/api/validation/createTexture.spec.ts @@ -6,7 +6,8 @@ import { assert, makeValueTestVariant } from '../../../common/util/util.js'; import { kTextureDimensions, kTextureUsages, - IsValidTextureUsageCombination, + isValidTextureUsageCombination, + kValidCombinationsOfOneOrTwoTextureUsages, } from '../../capability_info.js'; import { GPUConst } from '../../constants.js'; import { @@ -327,20 +328,12 @@ g.test('sampleCount,valid_sampleCount_with_other_parameter_varies') arrayLayerCount === 2 && dimension !== '2d' && dimension !== undefined ) .combine('mipLevelCount', [1, 2]) - .expand('usage', () => { - const usageSet = new Set<number>(); - for (const usage0 of kTextureUsages) { - for (const usage1 of kTextureUsages) { - usageSet.add(usage0 | usage1); - } - } - return usageSet; - }) + .combine('usage', kValidCombinationsOfOneOrTwoTextureUsages) // Filter out incompatible dimension type and format combinations. .filter(({ dimension, format }) => textureFormatAndDimensionPossiblyCompatible(dimension, format) ) - .unless(({ usage, format, mipLevelCount, dimension }) => { + .unless(({ usage, format, arrayLayerCount, mipLevelCount, dimension }) => { return ( ((usage & GPUConst.TextureUsage.RENDER_ATTACHMENT) !== 0 && (!isTextureFormatPossiblyUsableAsColorRenderAttachment(format) || @@ -349,9 +342,11 @@ g.test('sampleCount,valid_sampleCount_with_other_parameter_varies') !isTextureFormatPossiblyStorageReadable(format)) || (mipLevelCount !== 1 && dimension === '1d') || ((usage & GPUConst.TextureUsage.TRANSIENT_ATTACHMENT) !== 0 && - usage !== + (usage !== (GPUConst.TextureUsage.RENDER_ATTACHMENT | - GPUConst.TextureUsage.TRANSIENT_ATTACHMENT)) + GPUConst.TextureUsage.TRANSIENT_ATTACHMENT) || + mipLevelCount !== 1 || + arrayLayerCount !== 1)) ); }) ) @@ -1021,7 +1016,7 @@ g.test('texture_usage') textureFormatAndDimensionPossiblyCompatible(dimension, format) ) .unless(({ usage0, usage1 }) => { - return !IsValidTextureUsageCombination(usage0 | usage1); + return !isValidTextureUsageCombination(usage0 | usage1); }) ) .fn(t => { @@ -1057,6 +1052,42 @@ g.test('texture_usage') if (isColorTextureFormat(format) && !isTextureFormatColorRenderable(t.device, format)) success = false; } + if (usage & GPUTextureUsage.TRANSIENT_ATTACHMENT) { + if (appliedDimension !== '2d') success = false; + } + + t.expectValidationError(() => { + t.createTextureTracked(descriptor); + }, !success); + }); + +g.test('depthOrArrayLayers_and_mipLevelCount_for_transient_attachments') + .desc(`Test depthOrArrayLayers and mipLevelCount must be 1 for transient attachments`) + .params(u => + u + .combine('format', ['rgba8unorm', 'depth24plus'] as const) + .beginSubcases() + .combine('depthOrArrayLayers', [1, 2]) + .combine('mipLevelCount', [1, 2]) + ) + .fn(t => { + // MAINTENANCE_TODO(#4509): Remove this when TRANSIENT_ATTACHMENT is added to the WebGPU spec. + t.skipIfTransientAttachmentNotSupported(); + + const { format, depthOrArrayLayers, mipLevelCount } = t.params; + + const info = getBlockInfoForTextureFormat(format); + const size = [info.blockWidth, info.blockHeight, depthOrArrayLayers]; + const descriptor = { + size, + mipLevelCount, + format, + usage: GPUConst.TextureUsage.RENDER_ATTACHMENT | GPUConst.TextureUsage.TRANSIENT_ATTACHMENT, + }; + + let success = true; + if (depthOrArrayLayers !== 1) success = false; + if (mipLevelCount !== 1) success = false; t.expectValidationError(() => { t.createTextureTracked(descriptor); diff --git a/dom/webgpu/tests/cts/checkout/src/webgpu/api/validation/encoding/cmds/setImmediates.spec.ts b/dom/webgpu/tests/cts/checkout/src/webgpu/api/validation/encoding/cmds/setImmediates.spec.ts @@ -0,0 +1,202 @@ +export const description = ` +setImmediates validation tests. +TODO(#4297): enable Float16Array +`; + +import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { getGPU } from '../../../../../common/util/navigator_gpu.js'; +import { + kTypedArrayBufferViews, + kTypedArrayBufferViewKeys, +} from '../../../../../common/util/util.js'; +import { AllFeaturesMaxLimitsGPUTest } from '../../../../gpu_test.js'; +import { kProgrammableEncoderTypes } from '../../../../util/command_buffer_maker.js'; + +class SetImmediatesTest extends AllFeaturesMaxLimitsGPUTest { + override async init() { + await super.init(); + if ( + !('setImmediates' in GPURenderPassEncoder.prototype) && + !('setImmediates' in GPUComputePassEncoder.prototype) && + !('setImmediates' in GPURenderBundleEncoder.prototype) && + !('maxImmediateSize' in GPUSupportedLimits.prototype) && + !getGPU(this.rec).wgslLanguageFeatures.has('immediate_address_space') + ) { + this.skip('setImmediates not supported'); + } + } +} + +export const g = makeTestGroup(SetImmediatesTest); + +g.test('alignment') + .desc('Tests that rangeOffset and contentSize must align to 4 bytes.') + .params(u => + u // + .combine('encoderType', kProgrammableEncoderTypes) + .combine('arrayType', kTypedArrayBufferViewKeys) + .filter(p => p.arrayType !== 'Float16Array') + .combineWithParams([ + // control case: rangeOffset 4 is aligned. contentByteSize 8 is aligned. + { rangeOffset: 4, contentByteSize: 8 }, + // rangeOffset 6 is unaligned (6 % 4 !== 0). + { rangeOffset: 6, contentByteSize: 8 }, + // contentByteSize 10 is unaligned (10 % 4 !== 0). + // Note: This case will be skipped for types with element size > 2 (e.g. Uint32, Uint64) + // because they cannot form a 10-byte array. + { rangeOffset: 4, contentByteSize: 10 }, + ]) + .filter(({ arrayType, contentByteSize }) => { + // Skip if the contentByteSize is not a multiple of the element size. + // For example, we can't have 10 bytes if the element size is 4 or 8 bytes. + const arrayConstructor = kTypedArrayBufferViews[arrayType]; + return contentByteSize % arrayConstructor.BYTES_PER_ELEMENT === 0; + }) + ) + .fn(t => { + const { encoderType, arrayType, rangeOffset, contentByteSize } = t.params; + const arrayBufferType = kTypedArrayBufferViews[arrayType]; + const elementSize = arrayBufferType.BYTES_PER_ELEMENT; + const elementCount = contentByteSize / elementSize; + + const isRangeOffsetAligned = rangeOffset % 4 === 0; + const isContentSizeAligned = contentByteSize % 4 === 0; + + const { encoder, validateFinish } = t.createEncoder(encoderType); + const data = new arrayBufferType(elementCount); + + t.shouldThrow(isContentSizeAligned ? false : 'RangeError', () => { + // Cast to any to avoid Float16Array issues + // MAINTENANCE_TODO: remove this cast when the types are updated. + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (encoder as any).setImmediates(rangeOffset, data as any, 0, elementCount); + }); + + validateFinish(isRangeOffsetAligned); + }); + +g.test('overflow') + .desc( + ` + Tests that rangeOffset + contentSize or dataOffset + size is handled correctly if it exceeds limits. + ` + ) + .params(u => + u // + .combine('encoderType', kProgrammableEncoderTypes) + .combine('arrayType', kTypedArrayBufferViewKeys) + .filter(p => p.arrayType !== 'Float16Array') + .combineWithParams([ + // control case + { rangeOffset: 0, dataOffset: 0, elementCount: 4, _expectedError: null }, + // elementCount 0 + { rangeOffset: 0, dataOffset: 0, elementCount: 0, _expectedError: null }, + // rangeOffset + contentSize overflows + { + rangeOffset: 2 ** 31 - 8, + dataOffset: 0, + elementCount: 4, + _expectedError: 'validation', + }, + { + rangeOffset: 2 ** 32 - 8, + dataOffset: 0, + elementCount: 4, + _expectedError: 'validation', + }, + // dataOffset + size overflows + { + rangeOffset: 0, + dataOffset: 2 ** 31 - 1, + elementCount: 4, + _expectedError: 'RangeError', + }, + { + rangeOffset: 0, + dataOffset: 2 ** 32 - 1, + elementCount: 4, + _expectedError: 'RangeError', + }, + ]) + ) + .fn(t => { + const { encoderType, arrayType, rangeOffset, dataOffset, elementCount, _expectedError } = + t.params; + const arrayBufferType = kTypedArrayBufferViews[arrayType]; + + const { encoder, validateFinish } = t.createEncoder(encoderType); + const data = new arrayBufferType(elementCount); + + const doSetImmediates = () => { + // Cast to any to avoid Float16Array issues + // MAINTENANCE_TODO: remove this cast when the types are updated. + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (encoder as any).setImmediates(rangeOffset, data as any, dataOffset, elementCount); + }; + + if (_expectedError === 'RangeError') { + t.shouldThrow('RangeError', doSetImmediates); + } else { + doSetImmediates(); + validateFinish(_expectedError === null); + } + }); + +g.test('out_of_bounds') + .desc( + ` + Tests that rangeOffset + contentSize is greater than maxImmediateSize (Validation Error) + and contentSize is larger than data size (RangeError). + ` + ) + .params(u => + u // + .combine('encoderType', kProgrammableEncoderTypes) + .combine('arrayType', kTypedArrayBufferViewKeys) + .filter(p => p.arrayType !== 'Float16Array') + .combineWithParams([ + // control case + { rangeOffsetDelta: 0, dataLengthDelta: 0 }, + // rangeOffset + contentSize > maxImmediateSize + { rangeOffsetDelta: 4, dataLengthDelta: 0 }, + // dataOffset + size > data.length + { rangeOffsetDelta: 0, dataLengthDelta: -1 }, + ]) + ) + .fn(t => { + const { encoderType, arrayType, rangeOffsetDelta, dataLengthDelta } = t.params; + const arrayBufferType = kTypedArrayBufferViews[arrayType]; + const elementSize = arrayBufferType.BYTES_PER_ELEMENT; + + // MAINTENANCE_TODO: remove this cast when the types are updated. + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const maxImmediateSize = (t.device.limits as any).maxImmediateSize; + if (maxImmediateSize === undefined) { + t.skip('maxImmediateSize not found'); + } + + // We want contentByteSize to be aligned to 4 bytes to avoid alignment errors. + // We use 8 bytes to cover all types including BigUint64 (8 bytes). + const elementCount = elementSize >= 8 ? 1 : 8 / elementSize; + const contentByteSize = elementCount * elementSize; + + const rangeOffset = maxImmediateSize - contentByteSize + rangeOffsetDelta; + const dataLength = elementCount + dataLengthDelta; + + const data = new arrayBufferType(dataLength); + + const { encoder, validateFinish } = t.createEncoder(encoderType); + + const rangeOverLimit = rangeOffset + contentByteSize > maxImmediateSize; + const dataOverLimit = elementCount > dataLength; + + t.shouldThrow(dataOverLimit ? 'RangeError' : false, () => { + // MAINTENANCE_TODO: remove this cast when the types are updated. + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (encoder as any).setImmediates(rangeOffset, data as any, 0, elementCount); + }); + + if (!dataOverLimit) { + validateFinish(!rangeOverLimit); + } + }); diff --git a/dom/webgpu/tests/cts/checkout/src/webgpu/api/validation/encoding/encoder_open_state.spec.ts b/dom/webgpu/tests/cts/checkout/src/webgpu/api/validation/encoding/encoder_open_state.spec.ts @@ -98,6 +98,7 @@ const kRenderPassEncoderCommandInfo: { setScissorRect: {}, setBlendConstant: {}, setStencilReference: {}, + setImmediates: {}, beginOcclusionQuery: {}, endOcclusionQuery: {}, executeBundles: {}, @@ -122,6 +123,7 @@ const kRenderBundleEncoderCommandInfo: { setBindGroup: {}, setIndexBuffer: {}, setVertexBuffer: {}, + setImmediates: {}, pushDebugGroup: {}, popDebugGroup: {}, insertDebugMarker: {}, @@ -139,6 +141,7 @@ const kComputePassEncoderCommandInfo: { } = { setBindGroup: {}, setPipeline: {}, + setImmediates: {}, dispatchWorkgroups: {}, dispatchWorkgroupsIndirect: {}, pushDebugGroup: {}, @@ -286,6 +289,13 @@ g.test('render_pass_commands') .beginSubcases() .combine('finishBeforeCommand', ['no', 'pass', 'encoder']) ) + .beforeAllSubcases(t => { + // MAINTENANCE_TODO: Remove when setImmediates is added to spec. + t.skipIf( + t.params.command === 'setImmediates' && !('setImmediates' in GPURenderPassEncoder.prototype), + 'setImmediates not supported' + ); + }) .fn(t => { const { command, finishBeforeCommand } = t.params; if (command === 'multiDrawIndirect' || command === 'multiDrawIndexedIndirect') { @@ -440,6 +450,14 @@ g.test('render_bundle_commands') .beginSubcases() .combine('finishBeforeCommand', [false, true]) ) + .beforeAllSubcases(t => { + // MAINTENANCE_TODO: Remove when setImmediates is added to spec. + t.skipIf( + t.params.command === 'setImmediates' && + !('setImmediates' in GPURenderBundleEncoder.prototype), + 'setImmediates not supported' + ); + }) .fn(t => { const { command, finishBeforeCommand } = t.params; @@ -456,6 +474,11 @@ g.test('render_bundle_commands') colorFormats: ['rgba8unorm'], }); + t.skipIf( + command === 'setImmediates' && !('setImmediates' in bundleEncoder), + 'setImmediates not supported' + ); + if (finishBeforeCommand) { bundleEncoder.finish(); } @@ -540,6 +563,13 @@ g.test('compute_pass_commands') .beginSubcases() .combine('finishBeforeCommand', ['no', 'pass', 'encoder']) ) + .beforeAllSubcases(t => { + // MAINTENANCE_TODO: Remove when setImmediates is added to spec. + t.skipIf( + t.params.command === 'setImmediates' && !('setImmediates' in GPUComputePassEncoder.prototype), + 'setImmediates not supported' + ); + }) .fn(t => { const { command, finishBeforeCommand } = t.params; diff --git a/dom/webgpu/tests/cts/checkout/src/webgpu/api/validation/texture/bgra8unorm_storage.spec.ts b/dom/webgpu/tests/cts/checkout/src/webgpu/api/validation/texture/bgra8unorm_storage.spec.ts @@ -4,7 +4,11 @@ Tests for capabilities added by bgra8unorm-storage flag. import { makeTestGroup } from '../../../../common/framework/test_group.js'; import { assert } from '../../../../common/util/util.js'; -import { kTextureUsages, IsValidTextureUsageCombination } from '../../../capability_info.js'; +import { + kTextureUsages, + kValidCombinationsOfOneOrTwoTextureUsages, + usageIsTypeErrorForConfigure, +} from '../../../capability_info.js'; import { GPUConst } from '../../../constants.js'; import { UniqueFeaturesOrLimitsGPUTest } from '../../../gpu_test.js'; import { kAllCanvasTypes, createCanvas } from '../../../util/create_elements.js'; @@ -92,18 +96,12 @@ Test that it is invalid to configure a GPUCanvasContext to 'GPUStorageBinding' u u .combine('canvasType', kAllCanvasTypes) .beginSubcases() - .expand('usage', () => { - const usageSet = new Set<number>(); - for (const usage0 of kTextureUsages) { - for (const usage1 of kTextureUsages) { - usageSet.add(usage0 | usage1); - } - } - return usageSet; - }) - .unless(({ usage }) => { - return !IsValidTextureUsageCombination(usage); - }) + .combine( + 'usage', + kValidCombinationsOfOneOrTwoTextureUsages + // Don't test disallowed usages here, that's covered by configure() tests. + .filter(usage => !usageIsTypeErrorForConfigure(usage)) + ) ) .fn(t => { const { canvasType, usage } = t.params; @@ -146,16 +144,13 @@ with 'bgra8unorm-storage' enabled. u .combine('canvasType', kAllCanvasTypes) .beginSubcases() - .expand('usage', () => { - const usageSet = new Set<number>(); - for (const usage of kTextureUsages) { - usageSet.add(usage | GPUConst.TextureUsage.STORAGE_BINDING); - } - return usageSet; - }) - .unless(({ usage }) => { - return !IsValidTextureUsageCombination(usage); - }) + .combine( + 'usage', + kTextureUsages + // Don't test disallowed usages here, that's covered by configure() tests. + .filter(usage => !usageIsTypeErrorForConfigure(usage)) + .map(usage => usage | GPUConst.TextureUsage.STORAGE_BINDING) + ) ) .fn(t => { const { canvasType, usage } = t.params; diff --git a/dom/webgpu/tests/cts/checkout/src/webgpu/capability_info.ts b/dom/webgpu/tests/cts/checkout/src/webgpu/capability_info.ts @@ -12,7 +12,12 @@ import { valueof, } from '../common/util/data_tables.js'; import { assertTypeTrue, TypeEqual } from '../common/util/types.js'; -import { hasFeature, unreachable } from '../common/util/util.js'; +import { + assert, + combinationsOfOneOrTwoUsages, + hasFeature, + unreachable, +} from '../common/util/util.js'; import { GPUConst, kMaxUnsignedLongValue, kMaxUnsignedLongLongValue } from './constants.js'; @@ -201,28 +206,63 @@ export const kTextureUsageCopyInfo: { /** List of all GPUTextureUsage copy values. */ export const kTextureUsageCopy = keysOf(kTextureUsageCopyInfo); +type TextureUsageSingleBit = valueof<typeof GPUConst.TextureUsage>; /** Per-GPUTextureUsage info. */ -export const kTextureUsageInfo: { - readonly [k in valueof<typeof GPUConst.TextureUsage>]: {}; -} = { - [GPUConst.TextureUsage.COPY_SRC]: {}, - [GPUConst.TextureUsage.COPY_DST]: {}, - [GPUConst.TextureUsage.TEXTURE_BINDING]: {}, - [GPUConst.TextureUsage.STORAGE_BINDING]: {}, - [GPUConst.TextureUsage.RENDER_ATTACHMENT]: {}, - [GPUConst.TextureUsage.TRANSIENT_ATTACHMENT]: {}, +const kTextureUsageInfo: { + readonly [k in TextureUsageSingleBit]: { + /** If true, the usage should cause configure() to TypeError (not just validation error). */ + typeErrorForConfigure: boolean; + }; +} = + /* prettier-ignore */ { + [GPUConst.TextureUsage.COPY_SRC]: { typeErrorForConfigure: false }, + [GPUConst.TextureUsage.COPY_DST]: { typeErrorForConfigure: false }, + [GPUConst.TextureUsage.TEXTURE_BINDING]: { typeErrorForConfigure: false }, + [GPUConst.TextureUsage.STORAGE_BINDING]: { typeErrorForConfigure: false }, + [GPUConst.TextureUsage.RENDER_ATTACHMENT]: { typeErrorForConfigure: false }, + [GPUConst.TextureUsage.TRANSIENT_ATTACHMENT]: { typeErrorForConfigure: true }, }; /** List of all GPUTextureUsage values. */ -export const kTextureUsages = numericKeysOf<GPUTextureUsageFlags>(kTextureUsageInfo); - -/** Check if `usage` does not contain TRANSIENT_ATTACHMENT or is TRANSIENT_ATTACHMENT | RENDER_ATTACHMENT. */ -export function IsValidTextureUsageCombination(usage: GPUTextureUsageFlags): boolean { - return ( - (usage & GPUConst.TextureUsage.TRANSIENT_ATTACHMENT) === 0 || - usage === (GPUConst.TextureUsage.TRANSIENT_ATTACHMENT | GPUConst.TextureUsage.RENDER_ATTACHMENT) - ); +export const kTextureUsages = numericKeysOf(kTextureUsageInfo); +/** Bitmask of all known texture usages. */ +const kAllTextureUsages = kTextureUsages.reduce((acc, usage) => acc | usage, 0); + +/** An arbitrary invalid texture usage bit. */ +export const kSomeBogusTextureUsage: GPUTextureUsageFlags = 0x4000_0000; +assert((kSomeBogusTextureUsage & kAllTextureUsages) === 0); + +/** + * Check usage is valid for createTexture(): is non-zero, has only defined bits, + * and follows rules for TRANSIENT_ATTACHMENT. + */ +export function isValidTextureUsageCombination(usage: GPUTextureUsageFlags): boolean { + if (usage === 0) return false; + + if (usage & GPUConst.TextureUsage.TRANSIENT_ATTACHMENT) { + return ( + usage === + (GPUConst.TextureUsage.TRANSIENT_ATTACHMENT | GPUConst.TextureUsage.RENDER_ATTACHMENT) + ); + } + + return (usage & ~kAllTextureUsages) === 0; +} + +/** Check if usage contains a bit that is supposed to cause configure() to TypeError. */ +export function usageIsTypeErrorForConfigure(usage: GPUTextureUsageFlags): boolean { + for (const bit of kTextureUsages) { + if ((usage & bit) !== 0 && kTextureUsageInfo[bit].typeErrorForConfigure) { + return true; + } + } + return false; } +/** List of all combinations of 1-2 known texture usages, that are valid for createTexture(). */ +export const kValidCombinationsOfOneOrTwoTextureUsages = combinationsOfOneOrTwoUsages( + kTextureUsages +).filter(isValidTextureUsageCombination); + // Texture View /** Per-GPUTextureViewDimension info. */ @@ -777,6 +817,10 @@ const [kLimitInfoKeys, kLimitInfoDefaults, kLimitInfoData] = 'maxComputeWorkgroupSizeY': [ , 256, 128, ], 'maxComputeWorkgroupSizeZ': [ , 64, 64, ], 'maxComputeWorkgroupsPerDimension': [ , 65535, 65535, ], + // MAINTENANCE_TODO(4535): Consider allowing optional non-conforming limits. Currently they are not allowed. + // Any limit here is immediately required by all implementations. + // Also, consider having this table statically check that all limits listed in @webgpu/types exist in + // this table. } as const]; /** @@ -934,6 +978,7 @@ export const kKnownWGSLLanguageFeatures = [ 'pointer_composite_access', 'uniform_buffer_standard_layout', 'subgroup_id', + 'subgroup_uniformity', ] as const; export type WGSLLanguageFeature = (typeof kKnownWGSLLanguageFeatures)[number]; diff --git a/dom/webgpu/tests/cts/checkout/src/webgpu/gpu_test.ts b/dom/webgpu/tests/cts/checkout/src/webgpu/gpu_test.ts @@ -677,6 +677,7 @@ export class GPUTestBase extends Fixture<GPUTestSubcaseBatchState> { } /** Skips this test case if the GPUTextureUsage `TRANSIENT_ATTACHMENT` is *not* supported. */ + // MAINTENANCE_TODO(#4509): Remove this when TRANSIENT_ATTACHMENT is added to the WebGPU spec. skipIfTransientAttachmentNotSupported() { const isTransientAttachmentSupported = 'TRANSIENT_ATTACHMENT' in GPUTextureUsage; this.skipIf( diff --git a/dom/webgpu/tests/cts/checkout/src/webgpu/listing_meta.json b/dom/webgpu/tests/cts/checkout/src/webgpu/listing_meta.json @@ -2943,6 +2943,7 @@ "webgpu:shader,validation,uniformity,uniformity:short_circuit_expressions:*": { "subcaseMS": 1.401 }, "webgpu:shader,validation,uniformity,uniformity:subgroups,parameters:*": { "subcaseMS": 81.282 }, "webgpu:shader,validation,uniformity,uniformity:unary_expressions:*": { "subcaseMS": 1.279 }, + "webgpu:shader,validation,uniformity,uniformity:uniform_subgroup_ops:*": { "subcaseMS": 192.075 }, "webgpu:util,texture,color_space_conversions:util_matches_2d_canvas:*": { "subcaseMS": 1.001 }, "webgpu:util,texture,texel_data:float_texel_data_in_shader:*": { "subcaseMS": 2.042 }, "webgpu:util,texture,texel_data:sint_texel_data_in_shader:*": { "subcaseMS": 2.573 }, diff --git a/dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f16_matrix_addition.spec.ts b/dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f16_matrix_addition.spec.ts @@ -47,7 +47,7 @@ g.test('matrix_compound') .specURL('https://www.w3.org/TR/WGSL/#floating-point-evaluation') .desc( ` -Expression: x =+ y, where x and y are matrices +Expression: x += y, where x and y are matrices Accuracy: Correctly rounded ` ) diff --git a/dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f32_matrix_addition.spec.ts b/dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f32_matrix_addition.spec.ts @@ -46,7 +46,7 @@ g.test('matrix_compound') .specURL('https://www.w3.org/TR/WGSL/#floating-point-evaluation') .desc( ` -Expression: x =+ y, where x and y are matrices +Expression: x += y, where x and y are matrices Accuracy: Correctly rounded ` ) diff --git a/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/uniformity/uniformity.spec.ts b/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/uniformity/uniformity.spec.ts @@ -111,6 +111,44 @@ function generateCondition(condition: string): string { case 'storage_texture_rw': { return `textureLoad(rw_storage_texture, vec2()).x == 0`; } + case 'control_case': { + return 'true'; + } + case 'subgroupAdd': + case 'subgroupInclusiveAdd': + case 'subgroupExclusiveAdd': + case 'subgroupMul': + case 'subgroupInclusiveMul': + case 'subgroupExclusiveMul': + case 'subgroupMax': + case 'subgroupMin': + case 'subgroupAnd': + case 'subgroupOr': + case 'subgroupXor': + case 'subgroupBroadcastFirst': + case 'quadSwapX': + case 'quadSwapY': + case 'quadSwapDiagonal': { + return `${condition}(0) == 0`; + } + case 'subgroupAll': + case 'subgroupAny': { + return `${condition}(false)`; + } + case 'subgroupBallot': { + return `${condition}(false).x == 0`; + } + case 'subgroupElect': { + return `${condition}()`; + } + case 'subgroupBroadcast': + case 'subgroupShuffle': + case 'subgroupShuffleUp': + case 'subgroupShuffleDown': + case 'subgroupShuffleXor': + case 'quadBroadcast': { + return `${condition}(0, 0) == 0`; + } default: { unreachable(`Unhandled condition`); } @@ -483,14 +521,9 @@ g.test('basics') ); }); -const kSubgroupOps = [ - 'control_case', +const kUniformSubgroupOps: readonly string[] = [ 'subgroupAdd', - 'subgroupInclusiveAdd', - 'subgroupExclusiveAdd', 'subgroupMul', - 'subgroupInclusiveMul', - 'subgroupExclusiveMul', 'subgroupMax', 'subgroupMin', 'subgroupAll', @@ -499,9 +532,17 @@ const kSubgroupOps = [ 'subgroupOr', 'subgroupXor', 'subgroupBallot', - 'subgroupElect', 'subgroupBroadcast', 'subgroupBroadcastFirst', +] as const; + +const kSubgroupOps: readonly string[] = [ + 'control_case', + 'subgroupInclusiveAdd', + 'subgroupExclusiveAdd', + 'subgroupInclusiveMul', + 'subgroupExclusiveMul', + 'subgroupElect', 'subgroupShuffle', 'subgroupShuffleUp', 'subgroupShuffleDown', @@ -510,6 +551,7 @@ const kSubgroupOps = [ 'quadSwapX', 'quadSwapY', 'quadSwapDiagonal', + ...kUniformSubgroupOps, ] as const; g.test('basics,subgroups') @@ -578,6 +620,34 @@ g.test('basics,subgroups') ); }); +g.test('uniform_subgroup_ops') + .desc(`Test subgroup operations that are uniform with subgroup uniformity.`) + .params(u => u.combine('op', kSubgroupOps).combine('scope', ['workgroup', 'subgroup'] as const)) + .fn(t => { + const test_code = + t.params.scope === 'workgroup' ? 'workgroupBarrier();' : '_ = subgroupAny(true);'; + const code = ` +enable subgroups; +fn foo() { + if ${generateCondition(t.params.op)} { + ${test_code} + } +}`; + + const is_uniform = + kUniformSubgroupOps.includes(t.params.op) && + t.hasLanguageFeature('subgroup_uniformity') && + t.params.scope === 'subgroup'; + t.expectCompileResult( + compileShouldSucceed({ + requires_uniformity: !t.params.op.startsWith('control_case'), + condition_is_uniform: is_uniform, + verdict: 'sensitive', + }), + code + ); + }); + const kFragmentBuiltinValues = [ { builtin: `position`, @@ -715,11 +785,19 @@ const kComputeBuiltinValues = [ g.test('compute_builtin_values') .desc(`Test uniformity of compute built-in values`) - .params(u => u.combineWithParams(kComputeBuiltinValues).beginSubcases()) + .params(u => + u + .combineWithParams(kComputeBuiltinValues) + .beginSubcases() + .combine('scope', ['workgroup', 'subgroup'] as const) + ) .beforeAllSubcases(t => { if (t.params.builtin === `subgroup_id` || t.params.builtin === `num_subgroups`) { t.skipIfLanguageFeatureNotSupported('subgroup_id'); } + if (t.params.scope === 'subgroup') { + t.skipIfLanguageFeatureNotSupported('subgroup_uniformity'); + } }) .fn(t => { let cond = ``; @@ -744,18 +822,24 @@ g.test('compute_builtin_values') unreachable(`Unhandled type`); } } - const enable = t.params.builtin.includes('subgroup') ? 'enable subgroups;' : ''; + const enable = + t.params.builtin.includes('subgroup') || t.params.scope === 'subgroup' + ? 'enable subgroups;' + : ''; + const op = t.params.scope === 'workgroup' ? 'workgroupBarrier()' : '_ = subgroupAny(true)'; const code = ` ${enable} @compute @workgroup_size(16,1,1) fn main(@builtin(${t.params.builtin}) p : ${t.params.type}) { if ${cond} { - workgroupBarrier(); + ${op}; } } `; - t.expectCompileResult(t.params.uniform, code); + const expect = + t.params.uniform || (t.params.builtin === 'subgroup_id' && t.params.scope === 'subgroup'); + t.expectCompileResult(expect, code); }); function generatePointerCheck(check: string): string { diff --git a/dom/webgpu/tests/cts/checkout/src/webgpu/web_platform/canvas/configure.spec.ts b/dom/webgpu/tests/cts/checkout/src/webgpu/web_platform/canvas/configure.spec.ts @@ -9,9 +9,12 @@ TODO: import { makeTestGroup } from '../../../common/framework/test_group.js'; import { assert } from '../../../common/util/util.js'; import { + isValidTextureUsageCombination, kCanvasTextureFormats, + kSomeBogusTextureUsage, kTextureUsages, - IsValidTextureUsageCombination, + kValidCombinationsOfOneOrTwoTextureUsages, + usageIsTypeErrorForConfigure, } from '../../capability_info.js'; import { GPUConst } from '../../constants.js'; import { @@ -207,18 +210,12 @@ g.test('usage') u // .combine('canvasType', kAllCanvasTypes) .beginSubcases() - .expand('usage', () => { - const usageSet = new Set<number>(); - for (const usage0 of kTextureUsages) { - for (const usage1 of kTextureUsages) { - usageSet.add(usage0 | usage1); - } - } - return usageSet; - }) - .unless(({ usage }) => { - return !IsValidTextureUsageCombination(usage); - }) + .combine( + 'usage', + kValidCombinationsOfOneOrTwoTextureUsages + // TypeError cases are tested in the next test. + .filter(usage => !usageIsTypeErrorForConfigure(usage)) + ) ) .fn(t => { const { canvasType, usage } = t.params; @@ -333,6 +330,72 @@ g.test('usage') } }); +g.test('invalid_usage') + .desc(`Test what happens when an invalid usage is passed to configure().`) + .params(u => + u // + .combine('canvasType', kAllCanvasTypes) + // Test all formats because sometimes they're handled differently (require internal blits). + .combine('format', kCanvasTextureFormats) + .combine('usage', [ + 0, + GPUConst.TextureUsage.COPY_DST, + // Special case for bgra8unorm vs other formats + GPUConst.TextureUsage.STORAGE_BINDING, + // Special case(s) for canvases vs regular textures + ...kTextureUsages.filter(usageIsTypeErrorForConfigure), + GPUConst.TextureUsage.TRANSIENT_ATTACHMENT | GPUConst.TextureUsage.RENDER_ATTACHMENT, + // Various usages containing a bogus usage + kSomeBogusTextureUsage, + GPUConst.TextureUsage.COPY_DST | kSomeBogusTextureUsage, + GPUConst.TextureUsage.STORAGE_BINDING | kSomeBogusTextureUsage, + GPUConst.TextureUsage.TRANSIENT_ATTACHMENT | kSomeBogusTextureUsage, + ]) + ) + .fn(t => { + const { canvasType, format, usage } = t.params; + + // MAINTENANCE_TODO(#4509): Remove this when TRANSIENT_ATTACHMENT is added to the WebGPU spec. + if ((usage & GPUConst.TextureUsage.TRANSIENT_ATTACHMENT) !== 0) { + t.skipIfTransientAttachmentNotSupported(); + } + + const canvas = createCanvas(t, canvasType, 2, 2); + const ctx = canvas.getContext('webgpu'); + assert(ctx instanceof GPUCanvasContext, 'Failed to get WebGPU context from canvas'); + + if (usageIsTypeErrorForConfigure(usage)) { + t.shouldThrow('TypeError', () => { + ctx.configure({ device: t.device, format, usage }); + }); + + const configuration = ctx.getConfiguration(); + assert(configuration === null); + + t.shouldThrow('InvalidStateError', () => { + ctx.getCurrentTexture(); + }); + } else { + // Otherwise just the normal createTexture() usage validation applies. + const invalidUsage = !isValidTextureUsageCombination(usage); + t.expectValidationError(() => { + ctx.configure({ device: t.device, format, usage }); + }, invalidUsage); + + // The canvas still gets configured, and getCurrentTexture() can still be called. + const configuration = ctx.getConfiguration(); + assert(configuration !== null); + t.expect(configuration.usage === usage); + + let currentTexture: GPUTexture | undefined; + t.expectValidationError(() => { + currentTexture = ctx.getCurrentTexture(); + }, invalidUsage); + assert(currentTexture !== undefined && currentTexture instanceof GPUTexture); + t.expect(currentTexture.usage === usage); + } + }); + g.test('alpha_mode') .desc( ` diff --git a/dom/webgpu/tests/cts/checkout/tools/gen_version b/dom/webgpu/tests/cts/checkout/tools/gen_version @@ -14,7 +14,7 @@ if (!fs.existsSync(myself)) { process.exit(1); } -const version = 'b231a8cb24882dc5cb19655053515c4c34f28520'; +const version = 'd5a131f3afc77be7f76bbf956db054e799f2e79d'; fs.mkdirSync('./gen/common/internal', { recursive: true }); // This will be copied into the various other build directories. diff --git a/dom/webgpu/tests/cts/moz.yaml b/dom/webgpu/tests/cts/moz.yaml @@ -8,8 +8,8 @@ origin: name: WebGPU CTS description: WebGPU Compliance Test Suite url: https://gpuweb.github.io/cts/ - release: b231a8cb24882dc5cb19655053515c4c34f28520 (2025-12-12T23:54:56Z). - revision: b231a8cb24882dc5cb19655053515c4c34f28520 + release: d5a131f3afc77be7f76bbf956db054e799f2e79d (2025-12-19T22:41:23Z). + revision: d5a131f3afc77be7f76bbf956db054e799f2e79d license: ['BSD-3-Clause'] updatebot: diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/createTexture/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/createTexture/cts.https.html.ini @@ -1,3 +1,9 @@ +[cts.https.html?q=webgpu:api,validation,createTexture:depthOrArrayLayers_and_mipLevelCount_for_transient_attachments:*] + [:format="depth24plus"] + + [:format="rgba8unorm"] + + [cts.https.html?q=webgpu:api,validation,createTexture:dimension_type_and_format_compatibility:*] [:dimension="1d";format="astc-10x10-unorm"] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/encoding/cmds/setImmediates/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/encoding/cmds/setImmediates/cts.https.html.ini @@ -0,0 +1,760 @@ +[cts.https.html?q=webgpu:api,validation,encoding,cmds,setImmediates:alignment:*] + [:encoderType="compute%20pass";arrayType="BigInt64Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="compute%20pass";arrayType="BigInt64Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="compute%20pass";arrayType="BigUint64Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="compute%20pass";arrayType="BigUint64Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="compute%20pass";arrayType="Float32Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="compute%20pass";arrayType="Float32Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="compute%20pass";arrayType="Float64Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="compute%20pass";arrayType="Float64Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="compute%20pass";arrayType="Int16Array";rangeOffset=4;contentByteSize=10] + + [:encoderType="compute%20pass";arrayType="Int16Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="compute%20pass";arrayType="Int16Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="compute%20pass";arrayType="Int32Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="compute%20pass";arrayType="Int32Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="compute%20pass";arrayType="Int8Array";rangeOffset=4;contentByteSize=10] + + [:encoderType="compute%20pass";arrayType="Int8Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="compute%20pass";arrayType="Int8Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="compute%20pass";arrayType="Uint16Array";rangeOffset=4;contentByteSize=10] + + [:encoderType="compute%20pass";arrayType="Uint16Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="compute%20pass";arrayType="Uint16Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="compute%20pass";arrayType="Uint32Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="compute%20pass";arrayType="Uint32Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="compute%20pass";arrayType="Uint8Array";rangeOffset=4;contentByteSize=10] + + [:encoderType="compute%20pass";arrayType="Uint8Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="compute%20pass";arrayType="Uint8Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="compute%20pass";arrayType="Uint8ClampedArray";rangeOffset=4;contentByteSize=10] + + [:encoderType="compute%20pass";arrayType="Uint8ClampedArray";rangeOffset=4;contentByteSize=8] + + [:encoderType="compute%20pass";arrayType="Uint8ClampedArray";rangeOffset=6;contentByteSize=8] + + [:encoderType="render%20bundle";arrayType="BigInt64Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="render%20bundle";arrayType="BigInt64Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="render%20bundle";arrayType="BigUint64Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="render%20bundle";arrayType="BigUint64Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="render%20bundle";arrayType="Float32Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="render%20bundle";arrayType="Float32Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="render%20bundle";arrayType="Float64Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="render%20bundle";arrayType="Float64Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="render%20bundle";arrayType="Int16Array";rangeOffset=4;contentByteSize=10] + + [:encoderType="render%20bundle";arrayType="Int16Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="render%20bundle";arrayType="Int16Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="render%20bundle";arrayType="Int32Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="render%20bundle";arrayType="Int32Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="render%20bundle";arrayType="Int8Array";rangeOffset=4;contentByteSize=10] + + [:encoderType="render%20bundle";arrayType="Int8Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="render%20bundle";arrayType="Int8Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="render%20bundle";arrayType="Uint16Array";rangeOffset=4;contentByteSize=10] + + [:encoderType="render%20bundle";arrayType="Uint16Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="render%20bundle";arrayType="Uint16Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="render%20bundle";arrayType="Uint32Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="render%20bundle";arrayType="Uint32Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="render%20bundle";arrayType="Uint8Array";rangeOffset=4;contentByteSize=10] + + [:encoderType="render%20bundle";arrayType="Uint8Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="render%20bundle";arrayType="Uint8Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="render%20bundle";arrayType="Uint8ClampedArray";rangeOffset=4;contentByteSize=10] + + [:encoderType="render%20bundle";arrayType="Uint8ClampedArray";rangeOffset=4;contentByteSize=8] + + [:encoderType="render%20bundle";arrayType="Uint8ClampedArray";rangeOffset=6;contentByteSize=8] + + [:encoderType="render%20pass";arrayType="BigInt64Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="render%20pass";arrayType="BigInt64Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="render%20pass";arrayType="BigUint64Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="render%20pass";arrayType="BigUint64Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="render%20pass";arrayType="Float32Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="render%20pass";arrayType="Float32Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="render%20pass";arrayType="Float64Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="render%20pass";arrayType="Float64Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="render%20pass";arrayType="Int16Array";rangeOffset=4;contentByteSize=10] + + [:encoderType="render%20pass";arrayType="Int16Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="render%20pass";arrayType="Int16Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="render%20pass";arrayType="Int32Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="render%20pass";arrayType="Int32Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="render%20pass";arrayType="Int8Array";rangeOffset=4;contentByteSize=10] + + [:encoderType="render%20pass";arrayType="Int8Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="render%20pass";arrayType="Int8Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="render%20pass";arrayType="Uint16Array";rangeOffset=4;contentByteSize=10] + + [:encoderType="render%20pass";arrayType="Uint16Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="render%20pass";arrayType="Uint16Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="render%20pass";arrayType="Uint32Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="render%20pass";arrayType="Uint32Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="render%20pass";arrayType="Uint8Array";rangeOffset=4;contentByteSize=10] + + [:encoderType="render%20pass";arrayType="Uint8Array";rangeOffset=4;contentByteSize=8] + + [:encoderType="render%20pass";arrayType="Uint8Array";rangeOffset=6;contentByteSize=8] + + [:encoderType="render%20pass";arrayType="Uint8ClampedArray";rangeOffset=4;contentByteSize=10] + + [:encoderType="render%20pass";arrayType="Uint8ClampedArray";rangeOffset=4;contentByteSize=8] + + [:encoderType="render%20pass";arrayType="Uint8ClampedArray";rangeOffset=6;contentByteSize=8] + + +[cts.https.html?q=webgpu:api,validation,encoding,cmds,setImmediates:out_of_bounds:*] + [:encoderType="compute%20pass";arrayType="BigInt64Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="compute%20pass";arrayType="BigInt64Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="compute%20pass";arrayType="BigInt64Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="compute%20pass";arrayType="BigUint64Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="compute%20pass";arrayType="BigUint64Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="compute%20pass";arrayType="BigUint64Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="compute%20pass";arrayType="Float32Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="compute%20pass";arrayType="Float32Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="compute%20pass";arrayType="Float32Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="compute%20pass";arrayType="Float64Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="compute%20pass";arrayType="Float64Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="compute%20pass";arrayType="Float64Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="compute%20pass";arrayType="Int16Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="compute%20pass";arrayType="Int16Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="compute%20pass";arrayType="Int16Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="compute%20pass";arrayType="Int32Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="compute%20pass";arrayType="Int32Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="compute%20pass";arrayType="Int32Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="compute%20pass";arrayType="Int8Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="compute%20pass";arrayType="Int8Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="compute%20pass";arrayType="Int8Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="compute%20pass";arrayType="Uint16Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="compute%20pass";arrayType="Uint16Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="compute%20pass";arrayType="Uint16Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="compute%20pass";arrayType="Uint32Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="compute%20pass";arrayType="Uint32Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="compute%20pass";arrayType="Uint32Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="compute%20pass";arrayType="Uint8Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="compute%20pass";arrayType="Uint8Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="compute%20pass";arrayType="Uint8Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="compute%20pass";arrayType="Uint8ClampedArray";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="compute%20pass";arrayType="Uint8ClampedArray";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="compute%20pass";arrayType="Uint8ClampedArray";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="render%20bundle";arrayType="BigInt64Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="render%20bundle";arrayType="BigInt64Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="render%20bundle";arrayType="BigInt64Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="render%20bundle";arrayType="BigUint64Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="render%20bundle";arrayType="BigUint64Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="render%20bundle";arrayType="BigUint64Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="render%20bundle";arrayType="Float32Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="render%20bundle";arrayType="Float32Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="render%20bundle";arrayType="Float32Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="render%20bundle";arrayType="Float64Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="render%20bundle";arrayType="Float64Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="render%20bundle";arrayType="Float64Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="render%20bundle";arrayType="Int16Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="render%20bundle";arrayType="Int16Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="render%20bundle";arrayType="Int16Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="render%20bundle";arrayType="Int32Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="render%20bundle";arrayType="Int32Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="render%20bundle";arrayType="Int32Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="render%20bundle";arrayType="Int8Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="render%20bundle";arrayType="Int8Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="render%20bundle";arrayType="Int8Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="render%20bundle";arrayType="Uint16Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="render%20bundle";arrayType="Uint16Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="render%20bundle";arrayType="Uint16Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="render%20bundle";arrayType="Uint32Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="render%20bundle";arrayType="Uint32Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="render%20bundle";arrayType="Uint32Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="render%20bundle";arrayType="Uint8Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="render%20bundle";arrayType="Uint8Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="render%20bundle";arrayType="Uint8Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="render%20bundle";arrayType="Uint8ClampedArray";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="render%20bundle";arrayType="Uint8ClampedArray";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="render%20bundle";arrayType="Uint8ClampedArray";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="render%20pass";arrayType="BigInt64Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="render%20pass";arrayType="BigInt64Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="render%20pass";arrayType="BigInt64Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="render%20pass";arrayType="BigUint64Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="render%20pass";arrayType="BigUint64Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="render%20pass";arrayType="BigUint64Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="render%20pass";arrayType="Float32Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="render%20pass";arrayType="Float32Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="render%20pass";arrayType="Float32Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="render%20pass";arrayType="Float64Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="render%20pass";arrayType="Float64Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="render%20pass";arrayType="Float64Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="render%20pass";arrayType="Int16Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="render%20pass";arrayType="Int16Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="render%20pass";arrayType="Int16Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="render%20pass";arrayType="Int32Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="render%20pass";arrayType="Int32Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="render%20pass";arrayType="Int32Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="render%20pass";arrayType="Int8Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="render%20pass";arrayType="Int8Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="render%20pass";arrayType="Int8Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="render%20pass";arrayType="Uint16Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="render%20pass";arrayType="Uint16Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="render%20pass";arrayType="Uint16Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="render%20pass";arrayType="Uint32Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="render%20pass";arrayType="Uint32Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="render%20pass";arrayType="Uint32Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="render%20pass";arrayType="Uint8Array";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="render%20pass";arrayType="Uint8Array";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="render%20pass";arrayType="Uint8Array";rangeOffsetDelta=4;dataLengthDelta=0] + + [:encoderType="render%20pass";arrayType="Uint8ClampedArray";rangeOffsetDelta=0;dataLengthDelta=-1] + + [:encoderType="render%20pass";arrayType="Uint8ClampedArray";rangeOffsetDelta=0;dataLengthDelta=0] + + [:encoderType="render%20pass";arrayType="Uint8ClampedArray";rangeOffsetDelta=4;dataLengthDelta=0] + + +[cts.https.html?q=webgpu:api,validation,encoding,cmds,setImmediates:overflow:*] + [:encoderType="compute%20pass";arrayType="BigInt64Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="compute%20pass";arrayType="BigInt64Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="BigInt64Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="compute%20pass";arrayType="BigInt64Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="compute%20pass";arrayType="BigInt64Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="BigInt64Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="BigUint64Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="compute%20pass";arrayType="BigUint64Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="BigUint64Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="compute%20pass";arrayType="BigUint64Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="compute%20pass";arrayType="BigUint64Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="BigUint64Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Float32Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="compute%20pass";arrayType="Float32Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Float32Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Float32Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Float32Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Float32Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Float64Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="compute%20pass";arrayType="Float64Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Float64Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Float64Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Float64Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Float64Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Int16Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="compute%20pass";arrayType="Int16Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Int16Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Int16Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Int16Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Int16Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Int32Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="compute%20pass";arrayType="Int32Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Int32Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Int32Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Int32Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Int32Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Int8Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="compute%20pass";arrayType="Int8Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Int8Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Int8Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Int8Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Int8Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Uint16Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="compute%20pass";arrayType="Uint16Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Uint16Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Uint16Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Uint16Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Uint16Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Uint32Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="compute%20pass";arrayType="Uint32Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Uint32Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Uint32Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Uint32Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Uint32Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Uint8Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="compute%20pass";arrayType="Uint8Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Uint8Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Uint8Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Uint8Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Uint8Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Uint8ClampedArray";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="compute%20pass";arrayType="Uint8ClampedArray";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Uint8ClampedArray";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Uint8ClampedArray";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Uint8ClampedArray";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="compute%20pass";arrayType="Uint8ClampedArray";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="BigInt64Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="render%20bundle";arrayType="BigInt64Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="BigInt64Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="render%20bundle";arrayType="BigInt64Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="render%20bundle";arrayType="BigInt64Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="BigInt64Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="BigUint64Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="render%20bundle";arrayType="BigUint64Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="BigUint64Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="render%20bundle";arrayType="BigUint64Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="render%20bundle";arrayType="BigUint64Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="BigUint64Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Float32Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="render%20bundle";arrayType="Float32Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Float32Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Float32Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Float32Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Float32Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Float64Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="render%20bundle";arrayType="Float64Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Float64Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Float64Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Float64Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Float64Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Int16Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="render%20bundle";arrayType="Int16Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Int16Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Int16Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Int16Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Int16Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Int32Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="render%20bundle";arrayType="Int32Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Int32Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Int32Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Int32Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Int32Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Int8Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="render%20bundle";arrayType="Int8Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Int8Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Int8Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Int8Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Int8Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Uint16Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="render%20bundle";arrayType="Uint16Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Uint16Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Uint16Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Uint16Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Uint16Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Uint32Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="render%20bundle";arrayType="Uint32Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Uint32Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Uint32Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Uint32Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Uint32Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Uint8Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="render%20bundle";arrayType="Uint8Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Uint8Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Uint8Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Uint8Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Uint8Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Uint8ClampedArray";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="render%20bundle";arrayType="Uint8ClampedArray";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Uint8ClampedArray";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Uint8ClampedArray";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Uint8ClampedArray";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="render%20bundle";arrayType="Uint8ClampedArray";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="BigInt64Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="render%20pass";arrayType="BigInt64Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="BigInt64Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="render%20pass";arrayType="BigInt64Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="render%20pass";arrayType="BigInt64Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="BigInt64Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="BigUint64Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="render%20pass";arrayType="BigUint64Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="BigUint64Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="render%20pass";arrayType="BigUint64Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="render%20pass";arrayType="BigUint64Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="BigUint64Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Float32Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="render%20pass";arrayType="Float32Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Float32Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="render%20pass";arrayType="Float32Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="render%20pass";arrayType="Float32Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Float32Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Float64Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="render%20pass";arrayType="Float64Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Float64Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="render%20pass";arrayType="Float64Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="render%20pass";arrayType="Float64Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Float64Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Int16Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="render%20pass";arrayType="Int16Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Int16Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="render%20pass";arrayType="Int16Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="render%20pass";arrayType="Int16Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Int16Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Int32Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="render%20pass";arrayType="Int32Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Int32Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="render%20pass";arrayType="Int32Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="render%20pass";arrayType="Int32Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Int32Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Int8Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="render%20pass";arrayType="Int8Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Int8Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="render%20pass";arrayType="Int8Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="render%20pass";arrayType="Int8Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Int8Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Uint16Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="render%20pass";arrayType="Uint16Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Uint16Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="render%20pass";arrayType="Uint16Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="render%20pass";arrayType="Uint16Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Uint16Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Uint32Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="render%20pass";arrayType="Uint32Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Uint32Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="render%20pass";arrayType="Uint32Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="render%20pass";arrayType="Uint32Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Uint32Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Uint8Array";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="render%20pass";arrayType="Uint8Array";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Uint8Array";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="render%20pass";arrayType="Uint8Array";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="render%20pass";arrayType="Uint8Array";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Uint8Array";rangeOffset=4294967288;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Uint8ClampedArray";rangeOffset=0;dataOffset=0;elementCount=0] + + [:encoderType="render%20pass";arrayType="Uint8ClampedArray";rangeOffset=0;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Uint8ClampedArray";rangeOffset=0;dataOffset=2147483647;elementCount=4] + + [:encoderType="render%20pass";arrayType="Uint8ClampedArray";rangeOffset=0;dataOffset=4294967295;elementCount=4] + + [:encoderType="render%20pass";arrayType="Uint8ClampedArray";rangeOffset=2147483640;dataOffset=0;elementCount=4] + + [:encoderType="render%20pass";arrayType="Uint8ClampedArray";rangeOffset=4294967288;dataOffset=0;elementCount=4] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/encoding/encoder_open_state/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/encoding/encoder_open_state/cts.https.html.ini @@ -18,6 +18,8 @@ [:command="setBindGroup"] expected: FAIL + [:command="setImmediates"] + [:command="setPipeline"] expected: FAIL @@ -72,6 +74,8 @@ [:command="setBindGroup"] expected: FAIL + [:command="setImmediates"] + [:command="setIndexBuffer"] expected: FAIL @@ -124,6 +128,8 @@ [:command="setBlendConstant"] expected: FAIL + [:command="setImmediates"] + [:command="setIndexBuffer"] expected: FAIL diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/image_copy/texture_related/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/image_copy/texture_related/cts.https.html.ini @@ -5245,18 +5245,13 @@ [cts.https.html?q=webgpu:api,validation,image_copy,texture_related:usage:*] - implementation-status: backlog [:method="CopyB2T";dimension="1d";size=[4,1,1\]] - expected: FAIL [:method="CopyB2T";dimension="2d";size=[4,4,1\]] - expected: FAIL [:method="CopyB2T";dimension="2d";size=[4,4,3\]] - expected: FAIL [:method="CopyB2T";dimension="3d";size=[4,4,3\]] - expected: FAIL [:method="CopyT2B";dimension="1d";size=[4,1,1\]] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/state/device_lost/destroy/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/api/validation/state/device_lost/destroy/cts.https.html.ini @@ -11361,8 +11361,7 @@ expected: if os == "win": FAIL if os == "linux": FAIL - if os == "mac" and debug: [PASS, TIMEOUT, NOTRUN] - if os == "mac" and not debug: [FAIL, TIMEOUT, NOTRUN] + if os == "mac": [FAIL, TIMEOUT, NOTRUN] [:format="rgba8uint";usageType="render";usageCopy="src-dest";awaitLost=true] expected: diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/idl/constants/flags/service.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/idl/constants/flags/service.https.html.ini @@ -53,13 +53,10 @@ [service.https.html?worker=service&q=webgpu:idl,constants,flags:TextureUsage,count:*] - implementation-status: backlog [:] - expected: FAIL [service.https.html?worker=service&q=webgpu:idl,constants,flags:TextureUsage,values:*] - implementation-status: backlog [:key="COPY_DST"] [:key="COPY_SRC"] @@ -71,4 +68,3 @@ [:key="TEXTURE_BINDING"] [:key="TRANSIENT_ATTACHMENT"] - expected: FAIL diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/idl/javascript/service.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/idl/javascript/service.https.html.ini @@ -15,18 +15,15 @@ [service.https.html?worker=service&q=webgpu:idl,javascript:getter_replacement:*] - implementation-status: backlog [:type="adapter"] [:type="adapter.limits"] - expected: FAIL [:type="buffer"] [:type="device"] [:type="device.limits"] - expected: FAIL [:type="gpu"] @@ -99,11 +96,11 @@ [service.https.html?worker=service&q=webgpu:idl,javascript:obj,for_in:*] - implementation-status: backlog + implementation-status: + if os == "linux": backlog [:type="adapter"] [:type="adapter.limits"] - expected: FAIL [:type="buffer"] @@ -112,7 +109,6 @@ if os == "linux": FAIL [:type="device.limits"] - expected: FAIL [:type="gpu"] @@ -176,18 +172,15 @@ [service.https.html?worker=service&q=webgpu:idl,javascript:readonly_properties:*] - implementation-status: backlog [:type="adapter"] [:type="adapter.limits"] - expected: FAIL [:type="buffer"] [:type="device"] [:type="device.limits"] - expected: FAIL [:type="gpu"] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/validation/parse/requires/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/validation/parse/requires/cts.https.html.ini @@ -39,6 +39,8 @@ [:feature="subgroup_id"] + [:feature="subgroup_uniformity"] + [:feature="uniform_buffer_standard_layout"] [:feature="unrestricted_pointer_parameters"] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/validation/uniformity/uniformity/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/shader/validation/uniformity/uniformity/cts.https.html.ini @@ -1863,3 +1863,109 @@ [:e="uniform_struct";op="-i32(i_tmp)%20%3E%200"] [:e="uniform_struct";op="~i_tmp%20%3E%200"] + + +[cts.https.html?q=webgpu:shader,validation,uniformity,uniformity:uniform_subgroup_ops:*] + [:op="control_case";scope="subgroup"] + + [:op="control_case";scope="workgroup"] + + [:op="quadBroadcast";scope="subgroup"] + + [:op="quadBroadcast";scope="workgroup"] + + [:op="quadSwapDiagonal";scope="subgroup"] + + [:op="quadSwapDiagonal";scope="workgroup"] + + [:op="quadSwapX";scope="subgroup"] + + [:op="quadSwapX";scope="workgroup"] + + [:op="quadSwapY";scope="subgroup"] + + [:op="quadSwapY";scope="workgroup"] + + [:op="subgroupAdd";scope="subgroup"] + + [:op="subgroupAdd";scope="workgroup"] + + [:op="subgroupAll";scope="subgroup"] + + [:op="subgroupAll";scope="workgroup"] + + [:op="subgroupAnd";scope="subgroup"] + + [:op="subgroupAnd";scope="workgroup"] + + [:op="subgroupAny";scope="subgroup"] + + [:op="subgroupAny";scope="workgroup"] + + [:op="subgroupBallot";scope="subgroup"] + + [:op="subgroupBallot";scope="workgroup"] + + [:op="subgroupBroadcast";scope="subgroup"] + + [:op="subgroupBroadcast";scope="workgroup"] + + [:op="subgroupBroadcastFirst";scope="subgroup"] + + [:op="subgroupBroadcastFirst";scope="workgroup"] + + [:op="subgroupElect";scope="subgroup"] + + [:op="subgroupElect";scope="workgroup"] + + [:op="subgroupExclusiveAdd";scope="subgroup"] + + [:op="subgroupExclusiveAdd";scope="workgroup"] + + [:op="subgroupExclusiveMul";scope="subgroup"] + + [:op="subgroupExclusiveMul";scope="workgroup"] + + [:op="subgroupInclusiveAdd";scope="subgroup"] + + [:op="subgroupInclusiveAdd";scope="workgroup"] + + [:op="subgroupInclusiveMul";scope="subgroup"] + + [:op="subgroupInclusiveMul";scope="workgroup"] + + [:op="subgroupMax";scope="subgroup"] + + [:op="subgroupMax";scope="workgroup"] + + [:op="subgroupMin";scope="subgroup"] + + [:op="subgroupMin";scope="workgroup"] + + [:op="subgroupMul";scope="subgroup"] + + [:op="subgroupMul";scope="workgroup"] + + [:op="subgroupOr";scope="subgroup"] + + [:op="subgroupOr";scope="workgroup"] + + [:op="subgroupShuffle";scope="subgroup"] + + [:op="subgroupShuffle";scope="workgroup"] + + [:op="subgroupShuffleDown";scope="subgroup"] + + [:op="subgroupShuffleDown";scope="workgroup"] + + [:op="subgroupShuffleUp";scope="subgroup"] + + [:op="subgroupShuffleUp";scope="workgroup"] + + [:op="subgroupShuffleXor";scope="subgroup"] + + [:op="subgroupShuffleXor";scope="workgroup"] + + [:op="subgroupXor";scope="subgroup"] + + [:op="subgroupXor";scope="workgroup"] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/web_platform/canvas/configure/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/web_platform/canvas/configure/cts.https.html.ini @@ -431,6 +431,153 @@ [:canvasType="onscreen";format="stencil8"] +[cts.https.html?q=webgpu:web_platform,canvas,configure:invalid_usage:*] + implementation-status: backlog + [:canvasType="offscreen";format="bgra8unorm";usage=0] + expected: FAIL + + [:canvasType="offscreen";format="bgra8unorm";usage=1073741824] + expected: FAIL + + [:canvasType="offscreen";format="bgra8unorm";usage=1073741826] + expected: FAIL + + [:canvasType="offscreen";format="bgra8unorm";usage=1073741832] + expected: FAIL + + [:canvasType="offscreen";format="bgra8unorm";usage=1073741856] + + [:canvasType="offscreen";format="bgra8unorm";usage=2] + expected: FAIL + + [:canvasType="offscreen";format="bgra8unorm";usage=32] + + [:canvasType="offscreen";format="bgra8unorm";usage=48] + + [:canvasType="offscreen";format="bgra8unorm";usage=8] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=0] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=1073741824] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=1073741826] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=1073741832] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=1073741856] + + [:canvasType="offscreen";format="rgba16float";usage=2] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=32] + + [:canvasType="offscreen";format="rgba16float";usage=48] + + [:canvasType="offscreen";format="rgba16float";usage=8] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=0] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=1073741824] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=1073741826] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=1073741832] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=1073741856] + + [:canvasType="offscreen";format="rgba8unorm";usage=2] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=32] + + [:canvasType="offscreen";format="rgba8unorm";usage=48] + + [:canvasType="offscreen";format="rgba8unorm";usage=8] + expected: FAIL + + [:canvasType="onscreen";format="bgra8unorm";usage=0] + expected: FAIL + + [:canvasType="onscreen";format="bgra8unorm";usage=1073741824] + expected: FAIL + + [:canvasType="onscreen";format="bgra8unorm";usage=1073741826] + expected: FAIL + + [:canvasType="onscreen";format="bgra8unorm";usage=1073741832] + expected: FAIL + + [:canvasType="onscreen";format="bgra8unorm";usage=1073741856] + + [:canvasType="onscreen";format="bgra8unorm";usage=2] + expected: FAIL + + [:canvasType="onscreen";format="bgra8unorm";usage=32] + + [:canvasType="onscreen";format="bgra8unorm";usage=48] + + [:canvasType="onscreen";format="bgra8unorm";usage=8] + expected: FAIL + + [:canvasType="onscreen";format="rgba16float";usage=0] + expected: FAIL + + [:canvasType="onscreen";format="rgba16float";usage=1073741824] + expected: FAIL + + [:canvasType="onscreen";format="rgba16float";usage=1073741826] + expected: FAIL + + [:canvasType="onscreen";format="rgba16float";usage=1073741832] + expected: FAIL + + [:canvasType="onscreen";format="rgba16float";usage=1073741856] + + [:canvasType="onscreen";format="rgba16float";usage=2] + expected: FAIL + + [:canvasType="onscreen";format="rgba16float";usage=32] + + [:canvasType="onscreen";format="rgba16float";usage=48] + + [:canvasType="onscreen";format="rgba16float";usage=8] + expected: FAIL + + [:canvasType="onscreen";format="rgba8unorm";usage=0] + expected: FAIL + + [:canvasType="onscreen";format="rgba8unorm";usage=1073741824] + expected: FAIL + + [:canvasType="onscreen";format="rgba8unorm";usage=1073741826] + expected: FAIL + + [:canvasType="onscreen";format="rgba8unorm";usage=1073741832] + expected: FAIL + + [:canvasType="onscreen";format="rgba8unorm";usage=1073741856] + + [:canvasType="onscreen";format="rgba8unorm";usage=2] + expected: FAIL + + [:canvasType="onscreen";format="rgba8unorm";usage=32] + + [:canvasType="onscreen";format="rgba8unorm";usage=48] + + [:canvasType="onscreen";format="rgba8unorm";usage=8] + expected: FAIL + + [cts.https.html?q=webgpu:web_platform,canvas,configure:size_zero_after_configure:*] implementation-status: backlog [:canvasType="offscreen";zeroDimension="height"] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/web_platform/canvas/configure/dedicated.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/web_platform/canvas/configure/dedicated.https.html.ini @@ -428,6 +428,135 @@ [:canvasType="onscreen";format="stencil8"] +[dedicated.https.html?worker=dedicated&q=webgpu:web_platform,canvas,configure:invalid_usage:*] + implementation-status: backlog + [:canvasType="offscreen";format="bgra8unorm";usage=0] + expected: FAIL + + [:canvasType="offscreen";format="bgra8unorm";usage=1073741824] + expected: FAIL + + [:canvasType="offscreen";format="bgra8unorm";usage=1073741826] + expected: FAIL + + [:canvasType="offscreen";format="bgra8unorm";usage=1073741832] + expected: FAIL + + [:canvasType="offscreen";format="bgra8unorm";usage=1073741856] + + [:canvasType="offscreen";format="bgra8unorm";usage=2] + expected: FAIL + + [:canvasType="offscreen";format="bgra8unorm";usage=32] + + [:canvasType="offscreen";format="bgra8unorm";usage=48] + + [:canvasType="offscreen";format="bgra8unorm";usage=8] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=0] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=1073741824] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=1073741826] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=1073741832] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=1073741856] + + [:canvasType="offscreen";format="rgba16float";usage=2] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=32] + + [:canvasType="offscreen";format="rgba16float";usage=48] + + [:canvasType="offscreen";format="rgba16float";usage=8] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=0] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=1073741824] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=1073741826] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=1073741832] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=1073741856] + + [:canvasType="offscreen";format="rgba8unorm";usage=2] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=32] + + [:canvasType="offscreen";format="rgba8unorm";usage=48] + + [:canvasType="offscreen";format="rgba8unorm";usage=8] + expected: FAIL + + [:canvasType="onscreen";format="bgra8unorm";usage=0] + + [:canvasType="onscreen";format="bgra8unorm";usage=1073741824] + + [:canvasType="onscreen";format="bgra8unorm";usage=1073741826] + + [:canvasType="onscreen";format="bgra8unorm";usage=1073741832] + + [:canvasType="onscreen";format="bgra8unorm";usage=1073741856] + + [:canvasType="onscreen";format="bgra8unorm";usage=2] + + [:canvasType="onscreen";format="bgra8unorm";usage=32] + + [:canvasType="onscreen";format="bgra8unorm";usage=48] + + [:canvasType="onscreen";format="bgra8unorm";usage=8] + + [:canvasType="onscreen";format="rgba16float";usage=0] + + [:canvasType="onscreen";format="rgba16float";usage=1073741824] + + [:canvasType="onscreen";format="rgba16float";usage=1073741826] + + [:canvasType="onscreen";format="rgba16float";usage=1073741832] + + [:canvasType="onscreen";format="rgba16float";usage=1073741856] + + [:canvasType="onscreen";format="rgba16float";usage=2] + + [:canvasType="onscreen";format="rgba16float";usage=32] + + [:canvasType="onscreen";format="rgba16float";usage=48] + + [:canvasType="onscreen";format="rgba16float";usage=8] + + [:canvasType="onscreen";format="rgba8unorm";usage=0] + + [:canvasType="onscreen";format="rgba8unorm";usage=1073741824] + + [:canvasType="onscreen";format="rgba8unorm";usage=1073741826] + + [:canvasType="onscreen";format="rgba8unorm";usage=1073741832] + + [:canvasType="onscreen";format="rgba8unorm";usage=1073741856] + + [:canvasType="onscreen";format="rgba8unorm";usage=2] + + [:canvasType="onscreen";format="rgba8unorm";usage=32] + + [:canvasType="onscreen";format="rgba8unorm";usage=48] + + [:canvasType="onscreen";format="rgba8unorm";usage=8] + + [dedicated.https.html?worker=dedicated&q=webgpu:web_platform,canvas,configure:size_zero_after_configure:*] implementation-status: backlog [:canvasType="offscreen";zeroDimension="height"] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/web_platform/canvas/configure/service.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/web_platform/canvas/configure/service.https.html.ini @@ -428,6 +428,135 @@ [:canvasType="onscreen";format="stencil8"] +[service.https.html?worker=service&q=webgpu:web_platform,canvas,configure:invalid_usage:*] + implementation-status: backlog + [:canvasType="offscreen";format="bgra8unorm";usage=0] + expected: FAIL + + [:canvasType="offscreen";format="bgra8unorm";usage=1073741824] + expected: FAIL + + [:canvasType="offscreen";format="bgra8unorm";usage=1073741826] + expected: FAIL + + [:canvasType="offscreen";format="bgra8unorm";usage=1073741832] + expected: FAIL + + [:canvasType="offscreen";format="bgra8unorm";usage=1073741856] + + [:canvasType="offscreen";format="bgra8unorm";usage=2] + expected: FAIL + + [:canvasType="offscreen";format="bgra8unorm";usage=32] + + [:canvasType="offscreen";format="bgra8unorm";usage=48] + + [:canvasType="offscreen";format="bgra8unorm";usage=8] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=0] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=1073741824] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=1073741826] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=1073741832] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=1073741856] + + [:canvasType="offscreen";format="rgba16float";usage=2] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=32] + + [:canvasType="offscreen";format="rgba16float";usage=48] + + [:canvasType="offscreen";format="rgba16float";usage=8] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=0] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=1073741824] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=1073741826] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=1073741832] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=1073741856] + + [:canvasType="offscreen";format="rgba8unorm";usage=2] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=32] + + [:canvasType="offscreen";format="rgba8unorm";usage=48] + + [:canvasType="offscreen";format="rgba8unorm";usage=8] + expected: FAIL + + [:canvasType="onscreen";format="bgra8unorm";usage=0] + + [:canvasType="onscreen";format="bgra8unorm";usage=1073741824] + + [:canvasType="onscreen";format="bgra8unorm";usage=1073741826] + + [:canvasType="onscreen";format="bgra8unorm";usage=1073741832] + + [:canvasType="onscreen";format="bgra8unorm";usage=1073741856] + + [:canvasType="onscreen";format="bgra8unorm";usage=2] + + [:canvasType="onscreen";format="bgra8unorm";usage=32] + + [:canvasType="onscreen";format="bgra8unorm";usage=48] + + [:canvasType="onscreen";format="bgra8unorm";usage=8] + + [:canvasType="onscreen";format="rgba16float";usage=0] + + [:canvasType="onscreen";format="rgba16float";usage=1073741824] + + [:canvasType="onscreen";format="rgba16float";usage=1073741826] + + [:canvasType="onscreen";format="rgba16float";usage=1073741832] + + [:canvasType="onscreen";format="rgba16float";usage=1073741856] + + [:canvasType="onscreen";format="rgba16float";usage=2] + + [:canvasType="onscreen";format="rgba16float";usage=32] + + [:canvasType="onscreen";format="rgba16float";usage=48] + + [:canvasType="onscreen";format="rgba16float";usage=8] + + [:canvasType="onscreen";format="rgba8unorm";usage=0] + + [:canvasType="onscreen";format="rgba8unorm";usage=1073741824] + + [:canvasType="onscreen";format="rgba8unorm";usage=1073741826] + + [:canvasType="onscreen";format="rgba8unorm";usage=1073741832] + + [:canvasType="onscreen";format="rgba8unorm";usage=1073741856] + + [:canvasType="onscreen";format="rgba8unorm";usage=2] + + [:canvasType="onscreen";format="rgba8unorm";usage=32] + + [:canvasType="onscreen";format="rgba8unorm";usage=48] + + [:canvasType="onscreen";format="rgba8unorm";usage=8] + + [service.https.html?worker=service&q=webgpu:web_platform,canvas,configure:size_zero_after_configure:*] implementation-status: backlog [:canvasType="offscreen";zeroDimension="height"] diff --git a/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/web_platform/canvas/configure/shared.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/cts/webgpu/web_platform/canvas/configure/shared.https.html.ini @@ -428,6 +428,135 @@ [:canvasType="onscreen";format="stencil8"] +[shared.https.html?worker=shared&q=webgpu:web_platform,canvas,configure:invalid_usage:*] + implementation-status: backlog + [:canvasType="offscreen";format="bgra8unorm";usage=0] + expected: FAIL + + [:canvasType="offscreen";format="bgra8unorm";usage=1073741824] + expected: FAIL + + [:canvasType="offscreen";format="bgra8unorm";usage=1073741826] + expected: FAIL + + [:canvasType="offscreen";format="bgra8unorm";usage=1073741832] + expected: FAIL + + [:canvasType="offscreen";format="bgra8unorm";usage=1073741856] + + [:canvasType="offscreen";format="bgra8unorm";usage=2] + expected: FAIL + + [:canvasType="offscreen";format="bgra8unorm";usage=32] + + [:canvasType="offscreen";format="bgra8unorm";usage=48] + + [:canvasType="offscreen";format="bgra8unorm";usage=8] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=0] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=1073741824] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=1073741826] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=1073741832] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=1073741856] + + [:canvasType="offscreen";format="rgba16float";usage=2] + expected: FAIL + + [:canvasType="offscreen";format="rgba16float";usage=32] + + [:canvasType="offscreen";format="rgba16float";usage=48] + + [:canvasType="offscreen";format="rgba16float";usage=8] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=0] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=1073741824] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=1073741826] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=1073741832] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=1073741856] + + [:canvasType="offscreen";format="rgba8unorm";usage=2] + expected: FAIL + + [:canvasType="offscreen";format="rgba8unorm";usage=32] + + [:canvasType="offscreen";format="rgba8unorm";usage=48] + + [:canvasType="offscreen";format="rgba8unorm";usage=8] + expected: FAIL + + [:canvasType="onscreen";format="bgra8unorm";usage=0] + + [:canvasType="onscreen";format="bgra8unorm";usage=1073741824] + + [:canvasType="onscreen";format="bgra8unorm";usage=1073741826] + + [:canvasType="onscreen";format="bgra8unorm";usage=1073741832] + + [:canvasType="onscreen";format="bgra8unorm";usage=1073741856] + + [:canvasType="onscreen";format="bgra8unorm";usage=2] + + [:canvasType="onscreen";format="bgra8unorm";usage=32] + + [:canvasType="onscreen";format="bgra8unorm";usage=48] + + [:canvasType="onscreen";format="bgra8unorm";usage=8] + + [:canvasType="onscreen";format="rgba16float";usage=0] + + [:canvasType="onscreen";format="rgba16float";usage=1073741824] + + [:canvasType="onscreen";format="rgba16float";usage=1073741826] + + [:canvasType="onscreen";format="rgba16float";usage=1073741832] + + [:canvasType="onscreen";format="rgba16float";usage=1073741856] + + [:canvasType="onscreen";format="rgba16float";usage=2] + + [:canvasType="onscreen";format="rgba16float";usage=32] + + [:canvasType="onscreen";format="rgba16float";usage=48] + + [:canvasType="onscreen";format="rgba16float";usage=8] + + [:canvasType="onscreen";format="rgba8unorm";usage=0] + + [:canvasType="onscreen";format="rgba8unorm";usage=1073741824] + + [:canvasType="onscreen";format="rgba8unorm";usage=1073741826] + + [:canvasType="onscreen";format="rgba8unorm";usage=1073741832] + + [:canvasType="onscreen";format="rgba8unorm";usage=1073741856] + + [:canvasType="onscreen";format="rgba8unorm";usage=2] + + [:canvasType="onscreen";format="rgba8unorm";usage=32] + + [:canvasType="onscreen";format="rgba8unorm";usage=48] + + [:canvasType="onscreen";format="rgba8unorm";usage=8] + + [shared.https.html?worker=shared&q=webgpu:web_platform,canvas,configure:size_zero_after_configure:*] implementation-status: backlog [:canvasType="offscreen";zeroDimension="height"] diff --git a/testing/web-platform/mozilla/tests/webgpu/common/internal/version.js b/testing/web-platform/mozilla/tests/webgpu/common/internal/version.js @@ -1,3 +1,3 @@ // AUTO-GENERATED - DO NOT EDIT. See tools/gen_version. -export const version = 'b231a8cb24882dc5cb19655053515c4c34f28520'; +export const version = 'd5a131f3afc77be7f76bbf956db054e799f2e79d'; diff --git a/testing/web-platform/mozilla/tests/webgpu/common/util/util.js b/testing/web-platform/mozilla/tests/webgpu/common/util/util.js @@ -504,4 +504,17 @@ export function makeValueTestVariant(base, variant) { export function hasFeature(features, feature) { return features.has(feature); +} + +/** Convenience helper for combinations of 1-2 usage bits from a list of usage bits. */ +export function combinationsOfOneOrTwoUsages(usages) { + const combinations = []; + for (const usage0 of usages) { + for (const usage1 of usages) { + if (usage0 <= usage1) { + combinations.push(usage0 | usage1); + } + } + } + return combinations; } \ No newline at end of file diff --git a/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/api/validation/createTexture/cts.https.html b/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/api/validation/createTexture/cts.https.html @@ -33,6 +33,7 @@ </script> <script type=module src=/_mozilla/webgpu/common/runtime/wpt.js></script> +<meta name=variant content='?q=webgpu:api,validation,createTexture:depthOrArrayLayers_and_mipLevelCount_for_transient_attachments:*'> <meta name=variant content='?q=webgpu:api,validation,createTexture:dimension_type_and_format_compatibility:*'> <meta name=variant content='?q=webgpu:api,validation,createTexture:mipLevelCount,bound_check,bigger_than_integer_bit_width:*'> <meta name=variant content='?q=webgpu:api,validation,createTexture:mipLevelCount,bound_check:*'> diff --git a/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/api/validation/encoding/cmds/setImmediates/cts.https.html b/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/api/validation/encoding/cmds/setImmediates/cts.https.html @@ -0,0 +1,38 @@ +<!-- AUTO-GENERATED - DO NOT EDIT. See WebGPU CTS: tools/gen_wpt_cts_html. --> +<!-- + This test suite is built from the TypeScript sources at: + https://github.com/gpuweb/cts + + If you are debugging WebGPU conformance tests, it's highly recommended that + you use the standalone interactive runner in that repository, which + provides tools for easier debugging and editing (source maps, debug + logging, warn/skip functionality, etc.) + + NOTE: + The WPT version of this file is generated with *one variant per test spec + file*. If your harness needs more fine-grained suppressions, you'll need to + generate your own variants list from your suppression list. + See `tools/gen_wpt_cts_html` to do this. + + When run under browser CI, the original cts.https.html should be skipped, and + this alternate version should be run instead, under a non-exported WPT test + directory (e.g. Chromium's wpt_internal). +--> + +<!doctype html> +<title>WebGPU CTS</title> +<meta charset=utf-8> +<meta name="timeout" content="long"> <!-- TODO: narrow to only where it's needed, see https://bugzilla.mozilla.org/show_bug.cgi?id=1850537 --> +<link rel=help href='https://gpuweb.github.io/gpuweb/'> + +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script> + const loadWebGPUExpectations = undefined; + const shouldWebGPUCTSFailOnWarnings = undefined; +</script> +<script type=module src=/_mozilla/webgpu/common/runtime/wpt.js></script> + +<meta name=variant content='?q=webgpu:api,validation,encoding,cmds,setImmediates:alignment:*'> +<meta name=variant content='?q=webgpu:api,validation,encoding,cmds,setImmediates:out_of_bounds:*'> +<meta name=variant content='?q=webgpu:api,validation,encoding,cmds,setImmediates:overflow:*'> diff --git a/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/shader/validation/uniformity/uniformity/cts.https.html b/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/shader/validation/uniformity/uniformity/cts.https.html @@ -45,3 +45,4 @@ <meta name=variant content='?q=webgpu:shader,validation,uniformity,uniformity:short_circuit_expressions:*'> <meta name=variant content='?q=webgpu:shader,validation,uniformity,uniformity:subgroups,parameters:*'> <meta name=variant content='?q=webgpu:shader,validation,uniformity,uniformity:unary_expressions:*'> +<meta name=variant content='?q=webgpu:shader,validation,uniformity,uniformity:uniform_subgroup_ops:*'> diff --git a/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/web_platform/canvas/configure/cts.https.html b/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/web_platform/canvas/configure/cts.https.html @@ -37,6 +37,7 @@ <meta name=variant content='?q=webgpu:web_platform,canvas,configure:defaults:*'> <meta name=variant content='?q=webgpu:web_platform,canvas,configure:device:*'> <meta name=variant content='?q=webgpu:web_platform,canvas,configure:format:*'> +<meta name=variant content='?q=webgpu:web_platform,canvas,configure:invalid_usage:*'> <meta name=variant content='?q=webgpu:web_platform,canvas,configure:size_zero_after_configure:*'> <meta name=variant content='?q=webgpu:web_platform,canvas,configure:size_zero_before_configure:*'> <meta name=variant content='?q=webgpu:web_platform,canvas,configure:usage:*'> diff --git a/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/web_platform/canvas/configure/dedicated.https.html b/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/web_platform/canvas/configure/dedicated.https.html @@ -37,6 +37,7 @@ <meta name=variant content='?worker=dedicated&q=webgpu:web_platform,canvas,configure:defaults:*'> <meta name=variant content='?worker=dedicated&q=webgpu:web_platform,canvas,configure:device:*'> <meta name=variant content='?worker=dedicated&q=webgpu:web_platform,canvas,configure:format:*'> +<meta name=variant content='?worker=dedicated&q=webgpu:web_platform,canvas,configure:invalid_usage:*'> <meta name=variant content='?worker=dedicated&q=webgpu:web_platform,canvas,configure:size_zero_after_configure:*'> <meta name=variant content='?worker=dedicated&q=webgpu:web_platform,canvas,configure:size_zero_before_configure:*'> <meta name=variant content='?worker=dedicated&q=webgpu:web_platform,canvas,configure:usage:*'> diff --git a/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/web_platform/canvas/configure/service.https.html b/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/web_platform/canvas/configure/service.https.html @@ -37,6 +37,7 @@ <meta name=variant content='?worker=service&q=webgpu:web_platform,canvas,configure:defaults:*'> <meta name=variant content='?worker=service&q=webgpu:web_platform,canvas,configure:device:*'> <meta name=variant content='?worker=service&q=webgpu:web_platform,canvas,configure:format:*'> +<meta name=variant content='?worker=service&q=webgpu:web_platform,canvas,configure:invalid_usage:*'> <meta name=variant content='?worker=service&q=webgpu:web_platform,canvas,configure:size_zero_after_configure:*'> <meta name=variant content='?worker=service&q=webgpu:web_platform,canvas,configure:size_zero_before_configure:*'> <meta name=variant content='?worker=service&q=webgpu:web_platform,canvas,configure:usage:*'> diff --git a/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/web_platform/canvas/configure/shared.https.html b/testing/web-platform/mozilla/tests/webgpu/cts/webgpu/web_platform/canvas/configure/shared.https.html @@ -37,6 +37,7 @@ <meta name=variant content='?worker=shared&q=webgpu:web_platform,canvas,configure:defaults:*'> <meta name=variant content='?worker=shared&q=webgpu:web_platform,canvas,configure:device:*'> <meta name=variant content='?worker=shared&q=webgpu:web_platform,canvas,configure:format:*'> +<meta name=variant content='?worker=shared&q=webgpu:web_platform,canvas,configure:invalid_usage:*'> <meta name=variant content='?worker=shared&q=webgpu:web_platform,canvas,configure:size_zero_after_configure:*'> <meta name=variant content='?worker=shared&q=webgpu:web_platform,canvas,configure:size_zero_before_configure:*'> <meta name=variant content='?worker=shared&q=webgpu:web_platform,canvas,configure:usage:*'> diff --git a/testing/web-platform/mozilla/tests/webgpu/resources/cache/hashes.json b/testing/web-platform/mozilla/tests/webgpu/resources/cache/hashes.json @@ -1,112 +1,112 @@ { - "webgpu/shader/execution/binary/af_addition.bin": "da003be4", - "webgpu/shader/execution/binary/af_logical.bin": "14ad43ca", - "webgpu/shader/execution/binary/af_division.bin": "1296892b", - "webgpu/shader/execution/binary/af_matrix_addition.bin": "1317ab16", - "webgpu/shader/execution/binary/af_matrix_subtraction.bin": "2853ad41", - "webgpu/shader/execution/binary/af_multiplication.bin": "5ee6bde6", - "webgpu/shader/execution/binary/af_remainder.bin": "366f8d30", - "webgpu/shader/execution/binary/af_subtraction.bin": "3c19e6fb", - "webgpu/shader/execution/binary/f16_addition.bin": "319185c0", - "webgpu/shader/execution/binary/f16_logical.bin": "94a83cb4", - "webgpu/shader/execution/binary/f16_division.bin": "635bbc5f", - "webgpu/shader/execution/binary/f16_matrix_addition.bin": "30070be5", - "webgpu/shader/execution/binary/f16_matrix_matrix_multiplication.bin": "7e0e00db", - "webgpu/shader/execution/binary/f16_matrix_scalar_multiplication.bin": "d538842d", - "webgpu/shader/execution/binary/f16_matrix_subtraction.bin": "4b5ce37c", - "webgpu/shader/execution/binary/f16_matrix_vector_multiplication.bin": "7a4445de", - "webgpu/shader/execution/binary/f16_multiplication.bin": "b2c70232", - "webgpu/shader/execution/binary/f16_remainder.bin": "d138c173", - "webgpu/shader/execution/binary/f16_subtraction.bin": "e2515ca5", - "webgpu/shader/execution/binary/f32_addition.bin": "60286efc", - "webgpu/shader/execution/binary/f32_logical.bin": "a578e65b", - "webgpu/shader/execution/binary/f32_division.bin": "36d196b1", - "webgpu/shader/execution/binary/f32_matrix_addition.bin": "a11d772e", - "webgpu/shader/execution/binary/f32_matrix_matrix_multiplication.bin": "d578a451", - "webgpu/shader/execution/binary/f32_matrix_scalar_multiplication.bin": "a0259221", - "webgpu/shader/execution/binary/f32_matrix_subtraction.bin": "9eb43464", - "webgpu/shader/execution/binary/f32_matrix_vector_multiplication.bin": "939f2e70", - "webgpu/shader/execution/binary/f32_multiplication.bin": "d34ce65d", - "webgpu/shader/execution/binary/f32_remainder.bin": "6fa6b892", - "webgpu/shader/execution/binary/f32_subtraction.bin": "ddb575f5", - "webgpu/shader/execution/binary/i32_arithmetic.bin": "5bc8c900", - "webgpu/shader/execution/binary/i32_comparison.bin": "9165629b", - "webgpu/shader/execution/binary/u32_arithmetic.bin": "fc8c6726", - "webgpu/shader/execution/binary/u32_comparison.bin": "598d0773", - "webgpu/shader/execution/abs.bin": "f4ea4f10", - "webgpu/shader/execution/acos.bin": "f7ccbfca", - "webgpu/shader/execution/acosh.bin": "11315a9f", - "webgpu/shader/execution/asin.bin": "7349a03b", - "webgpu/shader/execution/asinh.bin": "fdebffc6", - "webgpu/shader/execution/atan.bin": "723ae9a5", - "webgpu/shader/execution/atan2.bin": "57241996", - "webgpu/shader/execution/atanh.bin": "e72a7c31", - "webgpu/shader/execution/bitcast.bin": "3de97de", - "webgpu/shader/execution/ceil.bin": "29fd5fae", - "webgpu/shader/execution/clamp.bin": "8d0eafdb", - "webgpu/shader/execution/cos.bin": "eac17036", - "webgpu/shader/execution/cosh.bin": "575d952c", - "webgpu/shader/execution/cross.bin": "34b3306c", - "webgpu/shader/execution/degrees.bin": "e95cfd56", - "webgpu/shader/execution/determinant.bin": "cbf20e3c", - "webgpu/shader/execution/distance.bin": "1c119356", - "webgpu/shader/execution/dot.bin": "4da666a3", - "webgpu/shader/execution/exp.bin": "69ee596e", - "webgpu/shader/execution/exp2.bin": "1b0d4107", - "webgpu/shader/execution/faceForward.bin": "d9e806e", - "webgpu/shader/execution/floor.bin": "d04aaaed", - "webgpu/shader/execution/fma.bin": "ea6f3d9d", - "webgpu/shader/execution/fract.bin": "6041dbd3", - "webgpu/shader/execution/frexp.bin": "4f14eae", - "webgpu/shader/execution/inverseSqrt.bin": "a31d31ec", - "webgpu/shader/execution/ldexp.bin": "bc8d5e62", - "webgpu/shader/execution/length.bin": "52fc048a", - "webgpu/shader/execution/log.bin": "bdb94ae0", - "webgpu/shader/execution/log2.bin": "b92a3bca", - "webgpu/shader/execution/max.bin": "436f8f21", - "webgpu/shader/execution/min.bin": "21cb02b4", - "webgpu/shader/execution/mix.bin": "ef3d6b1b", - "webgpu/shader/execution/modf.bin": "55ff0437", - "webgpu/shader/execution/normalize.bin": "fd315393", - "webgpu/shader/execution/pack2x16float.bin": "8443853d", - "webgpu/shader/execution/pow.bin": "e1f4e61", - "webgpu/shader/execution/quantizeToF16.bin": "564caff5", - "webgpu/shader/execution/radians.bin": "3d50fa1a", - "webgpu/shader/execution/reflect.bin": "de3cdc23", - "webgpu/shader/execution/refract.bin": "a6b7cf0c", - "webgpu/shader/execution/round.bin": "5735993c", - "webgpu/shader/execution/saturate.bin": "58cb0de5", - "webgpu/shader/execution/sign.bin": "b59874a7", - "webgpu/shader/execution/sin.bin": "59c3422", - "webgpu/shader/execution/sinh.bin": "427c6297", - "webgpu/shader/execution/smoothstep.bin": "b0d9c07e", - "webgpu/shader/execution/sqrt.bin": "f207f4ac", - "webgpu/shader/execution/step.bin": "18a574a0", - "webgpu/shader/execution/tan.bin": "40504049", - "webgpu/shader/execution/tanh.bin": "7c1b22bd", - "webgpu/shader/execution/transpose.bin": "af20793c", - "webgpu/shader/execution/trunc.bin": "2d9f23e5", - "webgpu/shader/execution/unpack2x16float.bin": "de3c9cb4", - "webgpu/shader/execution/unpack2x16snorm.bin": "2cfc1791", - "webgpu/shader/execution/unpack2x16unorm.bin": "85ff09e", - "webgpu/shader/execution/unpack4x8snorm.bin": "e4c5b1f4", - "webgpu/shader/execution/unpack4x8unorm.bin": "1fd43872", - "webgpu/shader/execution/unary/af_arithmetic.bin": "daccee7d", - "webgpu/shader/execution/unary/af_assignment.bin": "fb1a84b1", - "webgpu/shader/execution/unary/bool_conversion.bin": "65b450a7", - "webgpu/shader/execution/unary/f16_arithmetic.bin": "79ee24a3", - "webgpu/shader/execution/unary/f16_conversion.bin": "920adf7", - "webgpu/shader/execution/unary/f32_arithmetic.bin": "9496759c", - "webgpu/shader/execution/unary/f32_conversion.bin": "dddb7940", - "webgpu/shader/execution/unary/i32_arithmetic.bin": "e9c53cb5", - "webgpu/shader/execution/unary/i32_conversion.bin": "87b5fd7", - "webgpu/shader/execution/unary/u32_conversion.bin": "70718f67", - "webgpu/shader/execution/unary/ai_assignment.bin": "4fad3c69", - "webgpu/shader/execution/binary/ai_arithmetic.bin": "a00c8197", - "webgpu/shader/execution/unary/ai_arithmetic.bin": "3b481d45", - "webgpu/shader/execution/binary/af_matrix_matrix_multiplication.bin": "47b72af2", - "webgpu/shader/execution/binary/af_matrix_scalar_multiplication.bin": "1a5c6719", - "webgpu/shader/execution/binary/af_matrix_vector_multiplication.bin": "1b8f17cf", - "webgpu/shader/execution/derivatives.bin": "6d72e1fb", - "webgpu/shader/execution/fwidth.bin": "c00ddf59" + "webgpu/shader/execution/binary/af_addition.bin": "5f076aa3", + "webgpu/shader/execution/binary/af_logical.bin": "e4e8dc9d", + "webgpu/shader/execution/binary/af_division.bin": "c5dfd211", + "webgpu/shader/execution/binary/af_matrix_addition.bin": "de5e0eac", + "webgpu/shader/execution/binary/af_matrix_subtraction.bin": "36896bfa", + "webgpu/shader/execution/binary/af_multiplication.bin": "cc404b81", + "webgpu/shader/execution/binary/af_remainder.bin": "8146d6d1", + "webgpu/shader/execution/binary/af_subtraction.bin": "ae2f7ae2", + "webgpu/shader/execution/binary/f16_addition.bin": "12cc89f6", + "webgpu/shader/execution/binary/f16_logical.bin": "4ec8c393", + "webgpu/shader/execution/binary/f16_division.bin": "8ac15469", + "webgpu/shader/execution/binary/f16_matrix_addition.bin": "1f0d0278", + "webgpu/shader/execution/binary/f16_matrix_matrix_multiplication.bin": "2b8023c0", + "webgpu/shader/execution/binary/f16_matrix_scalar_multiplication.bin": "45ef275b", + "webgpu/shader/execution/binary/f16_matrix_subtraction.bin": "5eb2b7a", + "webgpu/shader/execution/binary/f16_matrix_vector_multiplication.bin": "28e828fb", + "webgpu/shader/execution/binary/f16_multiplication.bin": "b408f36c", + "webgpu/shader/execution/binary/f16_remainder.bin": "a3b33d27", + "webgpu/shader/execution/binary/f16_subtraction.bin": "5aafbfda", + "webgpu/shader/execution/binary/f32_addition.bin": "b3506680", + "webgpu/shader/execution/binary/f32_logical.bin": "ee74d02", + "webgpu/shader/execution/binary/f32_division.bin": "5fbcd238", + "webgpu/shader/execution/binary/f32_matrix_addition.bin": "cc8c8f8a", + "webgpu/shader/execution/binary/f32_matrix_matrix_multiplication.bin": "4b2e3c03", + "webgpu/shader/execution/binary/f32_matrix_scalar_multiplication.bin": "1341acc4", + "webgpu/shader/execution/binary/f32_matrix_subtraction.bin": "cbae8b4c", + "webgpu/shader/execution/binary/f32_matrix_vector_multiplication.bin": "ee8f01ec", + "webgpu/shader/execution/binary/f32_multiplication.bin": "9ad9e62c", + "webgpu/shader/execution/binary/f32_remainder.bin": "4eae8a29", + "webgpu/shader/execution/binary/f32_subtraction.bin": "a83b66ec", + "webgpu/shader/execution/binary/i32_arithmetic.bin": "d7c8c0ab", + "webgpu/shader/execution/binary/i32_comparison.bin": "856e566f", + "webgpu/shader/execution/binary/u32_arithmetic.bin": "a11da8f9", + "webgpu/shader/execution/binary/u32_comparison.bin": "6bfc377", + "webgpu/shader/execution/abs.bin": "79819b63", + "webgpu/shader/execution/acos.bin": "683b325", + "webgpu/shader/execution/acosh.bin": "2d24d841", + "webgpu/shader/execution/asin.bin": "3edf2f46", + "webgpu/shader/execution/asinh.bin": "9690fa22", + "webgpu/shader/execution/atan.bin": "a30c7ea5", + "webgpu/shader/execution/atan2.bin": "94bcdb6", + "webgpu/shader/execution/atanh.bin": "d9c0bd64", + "webgpu/shader/execution/bitcast.bin": "377e7dbd", + "webgpu/shader/execution/ceil.bin": "bcd64579", + "webgpu/shader/execution/clamp.bin": "b1ce330e", + "webgpu/shader/execution/cos.bin": "7f4ad5f2", + "webgpu/shader/execution/cosh.bin": "d8cde23e", + "webgpu/shader/execution/cross.bin": "595a610d", + "webgpu/shader/execution/degrees.bin": "b056d323", + "webgpu/shader/execution/determinant.bin": "d3e6fc82", + "webgpu/shader/execution/distance.bin": "58552f3e", + "webgpu/shader/execution/dot.bin": "2abddd56", + "webgpu/shader/execution/exp.bin": "b0dbb649", + "webgpu/shader/execution/exp2.bin": "fd74475d", + "webgpu/shader/execution/faceForward.bin": "7409d8d9", + "webgpu/shader/execution/floor.bin": "4a1dc74b", + "webgpu/shader/execution/fma.bin": "751ad3fe", + "webgpu/shader/execution/fract.bin": "8622bda9", + "webgpu/shader/execution/frexp.bin": "7afb5377", + "webgpu/shader/execution/inverseSqrt.bin": "1a6955c1", + "webgpu/shader/execution/ldexp.bin": "fe606222", + "webgpu/shader/execution/length.bin": "ed8d6514", + "webgpu/shader/execution/log.bin": "4f202c3a", + "webgpu/shader/execution/log2.bin": "6d74778c", + "webgpu/shader/execution/max.bin": "baa71af9", + "webgpu/shader/execution/min.bin": "b09990b7", + "webgpu/shader/execution/mix.bin": "11416c1a", + "webgpu/shader/execution/modf.bin": "f3bbb1ed", + "webgpu/shader/execution/normalize.bin": "f987a36a", + "webgpu/shader/execution/pack2x16float.bin": "3dc3d0ec", + "webgpu/shader/execution/pow.bin": "f0aca6fd", + "webgpu/shader/execution/quantizeToF16.bin": "368618ad", + "webgpu/shader/execution/radians.bin": "dc9b7e77", + "webgpu/shader/execution/reflect.bin": "6e34625c", + "webgpu/shader/execution/refract.bin": "a875f956", + "webgpu/shader/execution/round.bin": "482489c3", + "webgpu/shader/execution/saturate.bin": "b2943d01", + "webgpu/shader/execution/sign.bin": "31c04ec2", + "webgpu/shader/execution/sin.bin": "85cc574c", + "webgpu/shader/execution/sinh.bin": "ec72b818", + "webgpu/shader/execution/smoothstep.bin": "2e54d194", + "webgpu/shader/execution/sqrt.bin": "33aa080f", + "webgpu/shader/execution/step.bin": "e7a45f26", + "webgpu/shader/execution/tan.bin": "6023a6c6", + "webgpu/shader/execution/tanh.bin": "94d8a47a", + "webgpu/shader/execution/transpose.bin": "cc620b0b", + "webgpu/shader/execution/trunc.bin": "49c96a7e", + "webgpu/shader/execution/unpack2x16float.bin": "7c503c8e", + "webgpu/shader/execution/unpack2x16snorm.bin": "3a9a6a83", + "webgpu/shader/execution/unpack2x16unorm.bin": "a6ba2b49", + "webgpu/shader/execution/unpack4x8snorm.bin": "3ad2d338", + "webgpu/shader/execution/unpack4x8unorm.bin": "67ce712", + "webgpu/shader/execution/unary/af_arithmetic.bin": "ab98a506", + "webgpu/shader/execution/unary/af_assignment.bin": "f2893675", + "webgpu/shader/execution/unary/bool_conversion.bin": "1c61708d", + "webgpu/shader/execution/unary/f16_arithmetic.bin": "e3cdad9f", + "webgpu/shader/execution/unary/f16_conversion.bin": "8deba5e5", + "webgpu/shader/execution/unary/f32_arithmetic.bin": "9539acfd", + "webgpu/shader/execution/unary/f32_conversion.bin": "9cbf6d43", + "webgpu/shader/execution/unary/i32_arithmetic.bin": "8f135e9a", + "webgpu/shader/execution/unary/i32_conversion.bin": "2cad9a53", + "webgpu/shader/execution/unary/u32_conversion.bin": "aecfc4e3", + "webgpu/shader/execution/unary/ai_assignment.bin": "a995bead", + "webgpu/shader/execution/binary/ai_arithmetic.bin": "6ad603c0", + "webgpu/shader/execution/unary/ai_arithmetic.bin": "1c635d9f", + "webgpu/shader/execution/binary/af_matrix_matrix_multiplication.bin": "ef62e9f2", + "webgpu/shader/execution/binary/af_matrix_scalar_multiplication.bin": "82de41cb", + "webgpu/shader/execution/binary/af_matrix_vector_multiplication.bin": "76e41ddb", + "webgpu/shader/execution/derivatives.bin": "92507782", + "webgpu/shader/execution/fwidth.bin": "fad2244f" } \ No newline at end of file diff --git a/testing/web-platform/mozilla/tests/webgpu/webgpu/api/validation/capability_checks/limits/limit_utils.js b/testing/web-platform/mozilla/tests/webgpu/webgpu/api/validation/capability_checks/limits/limit_utils.js @@ -404,9 +404,11 @@ export class LimitTestsImpl extends GPUTestBase { this._adapter = await gpu.requestAdapter(); const limit = this.limit; // MAINTENANCE_TODO: consider removing this skip if the spec has no optional limits. + // Note: The cast below is required because an optional limit has no entry + // in capability_info.ts kLimitInfoKeys, kLimitInfoDefaults, kLimitInfoData this.skipIf( this._adapter?.limits[limit] === undefined && !!this.limitTestParams.limitOptional || - getDefaultLimitsForCTS()[limit] === undefined, + !(limit in getDefaultLimitsForCTS()), `${limit} is missing but optional for now` ); this.defaultLimit = getDefaultLimitForAdapter(this.adapter, limit); diff --git a/testing/web-platform/mozilla/tests/webgpu/webgpu/api/validation/createBindGroup.spec.js b/testing/web-platform/mozilla/tests/webgpu/webgpu/api/validation/createBindGroup.spec.js @@ -23,7 +23,7 @@ import { kTextureViewDimensions, sampledAndStorageBindingEntries, texBindingTypeInfo, - IsValidTextureUsageCombination } from + isValidTextureUsageCombination } from '../../capability_info.js'; import { GPUConst } from '../../constants.js'; import { kPossibleStorageTextureFormats, kRegularTextureFormats } from '../../format_info.js'; @@ -795,7 +795,7 @@ u // .combine('usage0', kTextureUsages). combine('usage1', kTextureUsages). unless(({ usage0, usage1 }) => { - return !IsValidTextureUsageCombination(usage0 | usage1); + return !isValidTextureUsageCombination(usage0 | usage1); }) ). fn((t) => { @@ -1234,7 +1234,7 @@ u // .combine('usage0', kTextureUsages). combine('usage1', kTextureUsages). unless(({ usage0, usage1 }) => { - return !IsValidTextureUsageCombination(usage0 | usage1); + return !isValidTextureUsageCombination(usage0 | usage1); }) ). fn((t) => { diff --git a/testing/web-platform/mozilla/tests/webgpu/webgpu/api/validation/createTexture.spec.js b/testing/web-platform/mozilla/tests/webgpu/webgpu/api/validation/createTexture.spec.js @@ -6,7 +6,8 @@ import { assert, makeValueTestVariant } from '../../../common/util/util.js'; import { kTextureDimensions, kTextureUsages, - IsValidTextureUsageCombination } from + isValidTextureUsageCombination, + kValidCombinationsOfOneOrTwoTextureUsages } from '../../capability_info.js'; import { GPUConst } from '../../constants.js'; import { @@ -327,20 +328,12 @@ unless( arrayLayerCount === 2 && dimension !== '2d' && dimension !== undefined ). combine('mipLevelCount', [1, 2]). -expand('usage', () => { - const usageSet = new Set(); - for (const usage0 of kTextureUsages) { - for (const usage1 of kTextureUsages) { - usageSet.add(usage0 | usage1); - } - } - return usageSet; -}) +combine('usage', kValidCombinationsOfOneOrTwoTextureUsages) // Filter out incompatible dimension type and format combinations. .filter(({ dimension, format }) => textureFormatAndDimensionPossiblyCompatible(dimension, format) ). -unless(({ usage, format, mipLevelCount, dimension }) => { +unless(({ usage, format, arrayLayerCount, mipLevelCount, dimension }) => { return ( (usage & GPUConst.TextureUsage.RENDER_ATTACHMENT) !== 0 && ( !isTextureFormatPossiblyUsableAsColorRenderAttachment(format) || @@ -348,10 +341,12 @@ unless(({ usage, format, mipLevelCount, dimension }) => { (usage & GPUConst.TextureUsage.STORAGE_BINDING) !== 0 && !isTextureFormatPossiblyStorageReadable(format) || mipLevelCount !== 1 && dimension === '1d' || - (usage & GPUConst.TextureUsage.TRANSIENT_ATTACHMENT) !== 0 && + (usage & GPUConst.TextureUsage.TRANSIENT_ATTACHMENT) !== 0 && ( usage !== ( GPUConst.TextureUsage.RENDER_ATTACHMENT | - GPUConst.TextureUsage.TRANSIENT_ATTACHMENT)); + GPUConst.TextureUsage.TRANSIENT_ATTACHMENT) || + mipLevelCount !== 1 || + arrayLayerCount !== 1)); }) ). @@ -1021,7 +1016,7 @@ combine('usage1', kTextureUsages) textureFormatAndDimensionPossiblyCompatible(dimension, format) ). unless(({ usage0, usage1 }) => { - return !IsValidTextureUsageCombination(usage0 | usage1); + return !isValidTextureUsageCombination(usage0 | usage1); }) ). fn((t) => { @@ -1057,6 +1052,42 @@ fn((t) => { if (isColorTextureFormat(format) && !isTextureFormatColorRenderable(t.device, format)) success = false; } + if (usage & GPUTextureUsage.TRANSIENT_ATTACHMENT) { + if (appliedDimension !== '2d') success = false; + } + + t.expectValidationError(() => { + t.createTextureTracked(descriptor); + }, !success); +}); + +g.test('depthOrArrayLayers_and_mipLevelCount_for_transient_attachments'). +desc(`Test depthOrArrayLayers and mipLevelCount must be 1 for transient attachments`). +params((u) => +u. +combine('format', ['rgba8unorm', 'depth24plus']). +beginSubcases(). +combine('depthOrArrayLayers', [1, 2]). +combine('mipLevelCount', [1, 2]) +). +fn((t) => { + // MAINTENANCE_TODO(#4509): Remove this when TRANSIENT_ATTACHMENT is added to the WebGPU spec. + t.skipIfTransientAttachmentNotSupported(); + + const { format, depthOrArrayLayers, mipLevelCount } = t.params; + + const info = getBlockInfoForTextureFormat(format); + const size = [info.blockWidth, info.blockHeight, depthOrArrayLayers]; + const descriptor = { + size, + mipLevelCount, + format, + usage: GPUConst.TextureUsage.RENDER_ATTACHMENT | GPUConst.TextureUsage.TRANSIENT_ATTACHMENT + }; + + let success = true; + if (depthOrArrayLayers !== 1) success = false; + if (mipLevelCount !== 1) success = false; t.expectValidationError(() => { t.createTextureTracked(descriptor); diff --git a/testing/web-platform/mozilla/tests/webgpu/webgpu/api/validation/encoding/cmds/setImmediates.spec.js b/testing/web-platform/mozilla/tests/webgpu/webgpu/api/validation/encoding/cmds/setImmediates.spec.js @@ -0,0 +1,202 @@ +/** +* AUTO-GENERATED - DO NOT EDIT. Source: https://github.com/gpuweb/cts +**/export const description = ` +setImmediates validation tests. +TODO(#4297): enable Float16Array +`;import { makeTestGroup } from '../../../../../common/framework/test_group.js'; +import { getGPU } from '../../../../../common/util/navigator_gpu.js'; +import { + kTypedArrayBufferViews, + kTypedArrayBufferViewKeys } from +'../../../../../common/util/util.js'; +import { AllFeaturesMaxLimitsGPUTest } from '../../../../gpu_test.js'; +import { kProgrammableEncoderTypes } from '../../../../util/command_buffer_maker.js'; + +class SetImmediatesTest extends AllFeaturesMaxLimitsGPUTest { + async init() { + await super.init(); + if ( + !('setImmediates' in GPURenderPassEncoder.prototype) && + !('setImmediates' in GPUComputePassEncoder.prototype) && + !('setImmediates' in GPURenderBundleEncoder.prototype) && + !('maxImmediateSize' in GPUSupportedLimits.prototype) && + !getGPU(this.rec).wgslLanguageFeatures.has('immediate_address_space')) + { + this.skip('setImmediates not supported'); + } + } +} + +export const g = makeTestGroup(SetImmediatesTest); + +g.test('alignment'). +desc('Tests that rangeOffset and contentSize must align to 4 bytes.'). +params((u) => +u // +.combine('encoderType', kProgrammableEncoderTypes). +combine('arrayType', kTypedArrayBufferViewKeys). +filter((p) => p.arrayType !== 'Float16Array'). +combineWithParams([ +// control case: rangeOffset 4 is aligned. contentByteSize 8 is aligned. +{ rangeOffset: 4, contentByteSize: 8 }, +// rangeOffset 6 is unaligned (6 % 4 !== 0). +{ rangeOffset: 6, contentByteSize: 8 }, +// contentByteSize 10 is unaligned (10 % 4 !== 0). +// Note: This case will be skipped for types with element size > 2 (e.g. Uint32, Uint64) +// because they cannot form a 10-byte array. +{ rangeOffset: 4, contentByteSize: 10 }] +). +filter(({ arrayType, contentByteSize }) => { + // Skip if the contentByteSize is not a multiple of the element size. + // For example, we can't have 10 bytes if the element size is 4 or 8 bytes. + const arrayConstructor = kTypedArrayBufferViews[arrayType]; + return contentByteSize % arrayConstructor.BYTES_PER_ELEMENT === 0; +}) +). +fn((t) => { + const { encoderType, arrayType, rangeOffset, contentByteSize } = t.params; + const arrayBufferType = kTypedArrayBufferViews[arrayType]; + const elementSize = arrayBufferType.BYTES_PER_ELEMENT; + const elementCount = contentByteSize / elementSize; + + const isRangeOffsetAligned = rangeOffset % 4 === 0; + const isContentSizeAligned = contentByteSize % 4 === 0; + + const { encoder, validateFinish } = t.createEncoder(encoderType); + const data = new arrayBufferType(elementCount); + + t.shouldThrow(isContentSizeAligned ? false : 'RangeError', () => { + // Cast to any to avoid Float16Array issues + // MAINTENANCE_TODO: remove this cast when the types are updated. + + encoder.setImmediates(rangeOffset, data, 0, elementCount); + }); + + validateFinish(isRangeOffsetAligned); +}); + +g.test('overflow'). +desc( + ` + Tests that rangeOffset + contentSize or dataOffset + size is handled correctly if it exceeds limits. + ` +). +params((u) => +u // +.combine('encoderType', kProgrammableEncoderTypes). +combine('arrayType', kTypedArrayBufferViewKeys). +filter((p) => p.arrayType !== 'Float16Array'). +combineWithParams([ +// control case +{ rangeOffset: 0, dataOffset: 0, elementCount: 4, _expectedError: null }, +// elementCount 0 +{ rangeOffset: 0, dataOffset: 0, elementCount: 0, _expectedError: null }, +// rangeOffset + contentSize overflows +{ + rangeOffset: 2 ** 31 - 8, + dataOffset: 0, + elementCount: 4, + _expectedError: 'validation' +}, +{ + rangeOffset: 2 ** 32 - 8, + dataOffset: 0, + elementCount: 4, + _expectedError: 'validation' +}, +// dataOffset + size overflows +{ + rangeOffset: 0, + dataOffset: 2 ** 31 - 1, + elementCount: 4, + _expectedError: 'RangeError' +}, +{ + rangeOffset: 0, + dataOffset: 2 ** 32 - 1, + elementCount: 4, + _expectedError: 'RangeError' +}] +) +). +fn((t) => { + const { encoderType, arrayType, rangeOffset, dataOffset, elementCount, _expectedError } = + t.params; + const arrayBufferType = kTypedArrayBufferViews[arrayType]; + + const { encoder, validateFinish } = t.createEncoder(encoderType); + const data = new arrayBufferType(elementCount); + + const doSetImmediates = () => { + // Cast to any to avoid Float16Array issues + // MAINTENANCE_TODO: remove this cast when the types are updated. + + encoder.setImmediates(rangeOffset, data, dataOffset, elementCount); + }; + + if (_expectedError === 'RangeError') { + t.shouldThrow('RangeError', doSetImmediates); + } else { + doSetImmediates(); + validateFinish(_expectedError === null); + } +}); + +g.test('out_of_bounds'). +desc( + ` + Tests that rangeOffset + contentSize is greater than maxImmediateSize (Validation Error) + and contentSize is larger than data size (RangeError). + ` +). +params((u) => +u // +.combine('encoderType', kProgrammableEncoderTypes). +combine('arrayType', kTypedArrayBufferViewKeys). +filter((p) => p.arrayType !== 'Float16Array'). +combineWithParams([ +// control case +{ rangeOffsetDelta: 0, dataLengthDelta: 0 }, +// rangeOffset + contentSize > maxImmediateSize +{ rangeOffsetDelta: 4, dataLengthDelta: 0 }, +// dataOffset + size > data.length +{ rangeOffsetDelta: 0, dataLengthDelta: -1 }] +) +). +fn((t) => { + const { encoderType, arrayType, rangeOffsetDelta, dataLengthDelta } = t.params; + const arrayBufferType = kTypedArrayBufferViews[arrayType]; + const elementSize = arrayBufferType.BYTES_PER_ELEMENT; + + // MAINTENANCE_TODO: remove this cast when the types are updated. + + const maxImmediateSize = t.device.limits.maxImmediateSize; + if (maxImmediateSize === undefined) { + t.skip('maxImmediateSize not found'); + } + + // We want contentByteSize to be aligned to 4 bytes to avoid alignment errors. + // We use 8 bytes to cover all types including BigUint64 (8 bytes). + const elementCount = elementSize >= 8 ? 1 : 8 / elementSize; + const contentByteSize = elementCount * elementSize; + + const rangeOffset = maxImmediateSize - contentByteSize + rangeOffsetDelta; + const dataLength = elementCount + dataLengthDelta; + + const data = new arrayBufferType(dataLength); + + const { encoder, validateFinish } = t.createEncoder(encoderType); + + const rangeOverLimit = rangeOffset + contentByteSize > maxImmediateSize; + const dataOverLimit = elementCount > dataLength; + + t.shouldThrow(dataOverLimit ? 'RangeError' : false, () => { + // MAINTENANCE_TODO: remove this cast when the types are updated. + + encoder.setImmediates(rangeOffset, data, 0, elementCount); + }); + + if (!dataOverLimit) { + validateFinish(!rangeOverLimit); + } +}); +\ No newline at end of file diff --git a/testing/web-platform/mozilla/tests/webgpu/webgpu/api/validation/encoding/encoder_open_state.spec.js b/testing/web-platform/mozilla/tests/webgpu/webgpu/api/validation/encoding/encoder_open_state.spec.js @@ -98,6 +98,7 @@ const kRenderPassEncoderCommandInfo = setScissorRect: {}, setBlendConstant: {}, setStencilReference: {}, + setImmediates: {}, beginOcclusionQuery: {}, endOcclusionQuery: {}, executeBundles: {}, @@ -122,6 +123,7 @@ const kRenderBundleEncoderCommandInfo = setBindGroup: {}, setIndexBuffer: {}, setVertexBuffer: {}, + setImmediates: {}, pushDebugGroup: {}, popDebugGroup: {}, insertDebugMarker: {} @@ -139,6 +141,7 @@ const kComputePassEncoderCommandInfo = { setBindGroup: {}, setPipeline: {}, + setImmediates: {}, dispatchWorkgroups: {}, dispatchWorkgroupsIndirect: {}, pushDebugGroup: {}, @@ -286,6 +289,13 @@ combine('command', kRenderPassEncoderCommands). beginSubcases(). combine('finishBeforeCommand', ['no', 'pass', 'encoder']) ). +beforeAllSubcases((t) => { + // MAINTENANCE_TODO: Remove when setImmediates is added to spec. + t.skipIf( + t.params.command === 'setImmediates' && !('setImmediates' in GPURenderPassEncoder.prototype), + 'setImmediates not supported' + ); +}). fn((t) => { const { command, finishBeforeCommand } = t.params; if (command === 'multiDrawIndirect' || command === 'multiDrawIndexedIndirect') { @@ -440,6 +450,14 @@ combine('command', kRenderBundleEncoderCommands). beginSubcases(). combine('finishBeforeCommand', [false, true]) ). +beforeAllSubcases((t) => { + // MAINTENANCE_TODO: Remove when setImmediates is added to spec. + t.skipIf( + t.params.command === 'setImmediates' && + !('setImmediates' in GPURenderBundleEncoder.prototype), + 'setImmediates not supported' + ); +}). fn((t) => { const { command, finishBeforeCommand } = t.params; @@ -456,6 +474,11 @@ fn((t) => { colorFormats: ['rgba8unorm'] }); + t.skipIf( + command === 'setImmediates' && !('setImmediates' in bundleEncoder), + 'setImmediates not supported' + ); + if (finishBeforeCommand) { bundleEncoder.finish(); } @@ -540,6 +563,13 @@ combine('command', kComputePassEncoderCommands). beginSubcases(). combine('finishBeforeCommand', ['no', 'pass', 'encoder']) ). +beforeAllSubcases((t) => { + // MAINTENANCE_TODO: Remove when setImmediates is added to spec. + t.skipIf( + t.params.command === 'setImmediates' && !('setImmediates' in GPUComputePassEncoder.prototype), + 'setImmediates not supported' + ); +}). fn((t) => { const { command, finishBeforeCommand } = t.params; diff --git a/testing/web-platform/mozilla/tests/webgpu/webgpu/api/validation/texture/bgra8unorm_storage.spec.js b/testing/web-platform/mozilla/tests/webgpu/webgpu/api/validation/texture/bgra8unorm_storage.spec.js @@ -4,7 +4,11 @@ Tests for capabilities added by bgra8unorm-storage flag. `;import { makeTestGroup } from '../../../../common/framework/test_group.js'; import { assert } from '../../../../common/util/util.js'; -import { kTextureUsages, IsValidTextureUsageCombination } from '../../../capability_info.js'; +import { + kTextureUsages, + kValidCombinationsOfOneOrTwoTextureUsages, + usageIsTypeErrorForConfigure } from +'../../../capability_info.js'; import { GPUConst } from '../../../constants.js'; import { UniqueFeaturesOrLimitsGPUTest } from '../../../gpu_test.js'; import { kAllCanvasTypes, createCanvas } from '../../../util/create_elements.js'; @@ -92,18 +96,12 @@ params((u) => u. combine('canvasType', kAllCanvasTypes). beginSubcases(). -expand('usage', () => { - const usageSet = new Set(); - for (const usage0 of kTextureUsages) { - for (const usage1 of kTextureUsages) { - usageSet.add(usage0 | usage1); - } - } - return usageSet; -}). -unless(({ usage }) => { - return !IsValidTextureUsageCombination(usage); -}) +combine( + 'usage', + kValidCombinationsOfOneOrTwoTextureUsages + // Don't test disallowed usages here, that's covered by configure() tests. + .filter((usage) => !usageIsTypeErrorForConfigure(usage)) +) ). fn((t) => { const { canvasType, usage } = t.params; @@ -146,16 +144,13 @@ params((u) => u. combine('canvasType', kAllCanvasTypes). beginSubcases(). -expand('usage', () => { - const usageSet = new Set(); - for (const usage of kTextureUsages) { - usageSet.add(usage | GPUConst.TextureUsage.STORAGE_BINDING); - } - return usageSet; -}). -unless(({ usage }) => { - return !IsValidTextureUsageCombination(usage); -}) +combine( + 'usage', + kTextureUsages + // Don't test disallowed usages here, that's covered by configure() tests. + .filter((usage) => !usageIsTypeErrorForConfigure(usage)). + map((usage) => usage | GPUConst.TextureUsage.STORAGE_BINDING) +) ). fn((t) => { const { canvasType, usage } = t.params; diff --git a/testing/web-platform/mozilla/tests/webgpu/webgpu/capability_info.js b/testing/web-platform/mozilla/tests/webgpu/webgpu/capability_info.js @@ -12,7 +12,12 @@ import { '../common/util/data_tables.js'; import { assertTypeTrue } from '../common/util/types.js'; -import { hasFeature, unreachable } from '../common/util/util.js'; +import { + assert, + combinationsOfOneOrTwoUsages, + hasFeature, + unreachable } from +'../common/util/util.js'; import { GPUConst, kMaxUnsignedLongValue, kMaxUnsignedLongLongValue } from './constants.js'; @@ -201,28 +206,63 @@ export const kTextureUsageCopyInfo = /** List of all GPUTextureUsage copy values. */ export const kTextureUsageCopy = keysOf(kTextureUsageCopyInfo); + /** Per-GPUTextureUsage info. */ -export const kTextureUsageInfo = +const kTextureUsageInfo = + + + + { - [GPUConst.TextureUsage.COPY_SRC]: {}, - [GPUConst.TextureUsage.COPY_DST]: {}, - [GPUConst.TextureUsage.TEXTURE_BINDING]: {}, - [GPUConst.TextureUsage.STORAGE_BINDING]: {}, - [GPUConst.TextureUsage.RENDER_ATTACHMENT]: {}, - [GPUConst.TextureUsage.TRANSIENT_ATTACHMENT]: {} + [GPUConst.TextureUsage.COPY_SRC]: { typeErrorForConfigure: false }, + [GPUConst.TextureUsage.COPY_DST]: { typeErrorForConfigure: false }, + [GPUConst.TextureUsage.TEXTURE_BINDING]: { typeErrorForConfigure: false }, + [GPUConst.TextureUsage.STORAGE_BINDING]: { typeErrorForConfigure: false }, + [GPUConst.TextureUsage.RENDER_ATTACHMENT]: { typeErrorForConfigure: false }, + [GPUConst.TextureUsage.TRANSIENT_ATTACHMENT]: { typeErrorForConfigure: true } }; /** List of all GPUTextureUsage values. */ export const kTextureUsages = numericKeysOf(kTextureUsageInfo); +/** Bitmask of all known texture usages. */ +const kAllTextureUsages = kTextureUsages.reduce((acc, usage) => acc | usage, 0); + +/** An arbitrary invalid texture usage bit. */ +export const kSomeBogusTextureUsage = 0x4000_0000; +assert((kSomeBogusTextureUsage & kAllTextureUsages) === 0); -/** Check if `usage` does not contain TRANSIENT_ATTACHMENT or is TRANSIENT_ATTACHMENT | RENDER_ATTACHMENT. */ -export function IsValidTextureUsageCombination(usage) { - return ( - (usage & GPUConst.TextureUsage.TRANSIENT_ATTACHMENT) === 0 || - usage === (GPUConst.TextureUsage.TRANSIENT_ATTACHMENT | GPUConst.TextureUsage.RENDER_ATTACHMENT)); +/** + * Check usage is valid for createTexture(): is non-zero, has only defined bits, + * and follows rules for TRANSIENT_ATTACHMENT. + */ +export function isValidTextureUsageCombination(usage) { + if (usage === 0) return false; + if (usage & GPUConst.TextureUsage.TRANSIENT_ATTACHMENT) { + return ( + usage === ( + GPUConst.TextureUsage.TRANSIENT_ATTACHMENT | GPUConst.TextureUsage.RENDER_ATTACHMENT)); + + } + + return (usage & ~kAllTextureUsages) === 0; +} + +/** Check if usage contains a bit that is supposed to cause configure() to TypeError. */ +export function usageIsTypeErrorForConfigure(usage) { + for (const bit of kTextureUsages) { + if ((usage & bit) !== 0 && kTextureUsageInfo[bit].typeErrorForConfigure) { + return true; + } + } + return false; } +/** List of all combinations of 1-2 known texture usages, that are valid for createTexture(). */ +export const kValidCombinationsOfOneOrTwoTextureUsages = combinationsOfOneOrTwoUsages( + kTextureUsages +).filter(isValidTextureUsageCombination); + // Texture View /** Per-GPUTextureViewDimension info. */ @@ -777,6 +817,10 @@ const [kLimitInfoKeys, kLimitInfoDefaults, kLimitInfoData] = 'maxComputeWorkgroupSizeY': [, 256, 128], 'maxComputeWorkgroupSizeZ': [, 64, 64], 'maxComputeWorkgroupsPerDimension': [, 65535, 65535] + // MAINTENANCE_TODO(4535): Consider allowing optional non-conforming limits. Currently they are not allowed. + // Any limit here is immediately required by all implementations. + // Also, consider having this table statically check that all limits listed in @webgpu/types exist in + // this table. }]; /** @@ -933,4 +977,5 @@ export const kKnownWGSLLanguageFeatures = [ 'unrestricted_pointer_parameters', 'pointer_composite_access', 'uniform_buffer_standard_layout', -'subgroup_id']; -\ No newline at end of file +'subgroup_id', +'subgroup_uniformity']; +\ No newline at end of file diff --git a/testing/web-platform/mozilla/tests/webgpu/webgpu/gpu_test.js b/testing/web-platform/mozilla/tests/webgpu/webgpu/gpu_test.js @@ -677,6 +677,7 @@ export class GPUTestBase extends Fixture { } /** Skips this test case if the GPUTextureUsage `TRANSIENT_ATTACHMENT` is *not* supported. */ + // MAINTENANCE_TODO(#4509): Remove this when TRANSIENT_ATTACHMENT is added to the WebGPU spec. skipIfTransientAttachmentNotSupported() { const isTransientAttachmentSupported = ('TRANSIENT_ATTACHMENT' in GPUTextureUsage); this.skipIf( diff --git a/testing/web-platform/mozilla/tests/webgpu/webgpu/listing.js b/testing/web-platform/mozilla/tests/webgpu/webgpu/listing.js @@ -1295,6 +1295,15 @@ export const listing = [ "api", "validation", "encoding", + "cmds", + "setImmediates" + ] + }, + { + "file": [ + "api", + "validation", + "encoding", "createRenderBundleEncoder" ] }, diff --git a/testing/web-platform/mozilla/tests/webgpu/webgpu/shader/execution/expression/binary/f16_matrix_addition.spec.js b/testing/web-platform/mozilla/tests/webgpu/webgpu/shader/execution/expression/binary/f16_matrix_addition.spec.js @@ -47,7 +47,7 @@ g.test('matrix_compound'). specURL('https://www.w3.org/TR/WGSL/#floating-point-evaluation'). desc( ` -Expression: x =+ y, where x and y are matrices +Expression: x += y, where x and y are matrices Accuracy: Correctly rounded ` ). diff --git a/testing/web-platform/mozilla/tests/webgpu/webgpu/shader/execution/expression/binary/f32_matrix_addition.spec.js b/testing/web-platform/mozilla/tests/webgpu/webgpu/shader/execution/expression/binary/f32_matrix_addition.spec.js @@ -46,7 +46,7 @@ g.test('matrix_compound'). specURL('https://www.w3.org/TR/WGSL/#floating-point-evaluation'). desc( ` -Expression: x =+ y, where x and y are matrices +Expression: x += y, where x and y are matrices Accuracy: Correctly rounded ` ). diff --git a/testing/web-platform/mozilla/tests/webgpu/webgpu/shader/validation/uniformity/uniformity.spec.js b/testing/web-platform/mozilla/tests/webgpu/webgpu/shader/validation/uniformity/uniformity.spec.js @@ -111,6 +111,44 @@ function generateCondition(condition) { case 'storage_texture_rw':{ return `textureLoad(rw_storage_texture, vec2()).x == 0`; } + case 'control_case':{ + return 'true'; + } + case 'subgroupAdd': + case 'subgroupInclusiveAdd': + case 'subgroupExclusiveAdd': + case 'subgroupMul': + case 'subgroupInclusiveMul': + case 'subgroupExclusiveMul': + case 'subgroupMax': + case 'subgroupMin': + case 'subgroupAnd': + case 'subgroupOr': + case 'subgroupXor': + case 'subgroupBroadcastFirst': + case 'quadSwapX': + case 'quadSwapY': + case 'quadSwapDiagonal':{ + return `${condition}(0) == 0`; + } + case 'subgroupAll': + case 'subgroupAny':{ + return `${condition}(false)`; + } + case 'subgroupBallot':{ + return `${condition}(false).x == 0`; + } + case 'subgroupElect':{ + return `${condition}()`; + } + case 'subgroupBroadcast': + case 'subgroupShuffle': + case 'subgroupShuffleUp': + case 'subgroupShuffleDown': + case 'subgroupShuffleXor': + case 'quadBroadcast':{ + return `${condition}(0, 0) == 0`; + } default:{ unreachable(`Unhandled condition`); } @@ -483,14 +521,9 @@ fn((t) => { ); }); -const kSubgroupOps = [ -'control_case', +const kUniformSubgroupOps = [ 'subgroupAdd', -'subgroupInclusiveAdd', -'subgroupExclusiveAdd', 'subgroupMul', -'subgroupInclusiveMul', -'subgroupExclusiveMul', 'subgroupMax', 'subgroupMin', 'subgroupAll', @@ -499,9 +532,17 @@ const kSubgroupOps = [ 'subgroupOr', 'subgroupXor', 'subgroupBallot', -'subgroupElect', 'subgroupBroadcast', -'subgroupBroadcastFirst', +'subgroupBroadcastFirst']; + + +const kSubgroupOps = [ +'control_case', +'subgroupInclusiveAdd', +'subgroupExclusiveAdd', +'subgroupInclusiveMul', +'subgroupExclusiveMul', +'subgroupElect', 'subgroupShuffle', 'subgroupShuffleUp', 'subgroupShuffleDown', @@ -509,7 +550,8 @@ const kSubgroupOps = [ 'quadBroadcast', 'quadSwapX', 'quadSwapY', -'quadSwapDiagonal']; +'quadSwapDiagonal', +...kUniformSubgroupOps]; g.test('basics,subgroups'). @@ -578,6 +620,34 @@ fn((t) => { ); }); +g.test('uniform_subgroup_ops'). +desc(`Test subgroup operations that are uniform with subgroup uniformity.`). +params((u) => u.combine('op', kSubgroupOps).combine('scope', ['workgroup', 'subgroup'])). +fn((t) => { + const test_code = + t.params.scope === 'workgroup' ? 'workgroupBarrier();' : '_ = subgroupAny(true);'; + const code = ` +enable subgroups; +fn foo() { + if ${generateCondition(t.params.op)} { + ${test_code} + } +}`; + + const is_uniform = + kUniformSubgroupOps.includes(t.params.op) && + t.hasLanguageFeature('subgroup_uniformity') && + t.params.scope === 'subgroup'; + t.expectCompileResult( + compileShouldSucceed({ + requires_uniformity: !t.params.op.startsWith('control_case'), + condition_is_uniform: is_uniform, + verdict: 'sensitive' + }), + code + ); +}); + const kFragmentBuiltinValues = [ { builtin: `position`, @@ -715,11 +785,19 @@ const kComputeBuiltinValues = [ g.test('compute_builtin_values'). desc(`Test uniformity of compute built-in values`). -params((u) => u.combineWithParams(kComputeBuiltinValues).beginSubcases()). +params((u) => +u. +combineWithParams(kComputeBuiltinValues). +beginSubcases(). +combine('scope', ['workgroup', 'subgroup']) +). beforeAllSubcases((t) => { if (t.params.builtin === `subgroup_id` || t.params.builtin === `num_subgroups`) { t.skipIfLanguageFeatureNotSupported('subgroup_id'); } + if (t.params.scope === 'subgroup') { + t.skipIfLanguageFeatureNotSupported('subgroup_uniformity'); + } }). fn((t) => { let cond = ``; @@ -744,18 +822,24 @@ fn((t) => { unreachable(`Unhandled type`); } } - const enable = t.params.builtin.includes('subgroup') ? 'enable subgroups;' : ''; + const enable = + t.params.builtin.includes('subgroup') || t.params.scope === 'subgroup' ? + 'enable subgroups;' : + ''; + const op = t.params.scope === 'workgroup' ? 'workgroupBarrier()' : '_ = subgroupAny(true)'; const code = ` ${enable} @compute @workgroup_size(16,1,1) fn main(@builtin(${t.params.builtin}) p : ${t.params.type}) { if ${cond} { - workgroupBarrier(); + ${op}; } } `; - t.expectCompileResult(t.params.uniform, code); + const expect = + t.params.uniform || t.params.builtin === 'subgroup_id' && t.params.scope === 'subgroup'; + t.expectCompileResult(expect, code); }); function generatePointerCheck(check) { diff --git a/testing/web-platform/mozilla/tests/webgpu/webgpu/web_platform/canvas/configure.spec.js b/testing/web-platform/mozilla/tests/webgpu/webgpu/web_platform/canvas/configure.spec.js @@ -9,9 +9,12 @@ TODO: `;import { makeTestGroup } from '../../../common/framework/test_group.js'; import { assert } from '../../../common/util/util.js'; import { + isValidTextureUsageCombination, kCanvasTextureFormats, + kSomeBogusTextureUsage, kTextureUsages, - IsValidTextureUsageCombination } from + kValidCombinationsOfOneOrTwoTextureUsages, + usageIsTypeErrorForConfigure } from '../../capability_info.js'; import { GPUConst } from '../../constants.js'; import { @@ -207,18 +210,12 @@ params((u) => u // .combine('canvasType', kAllCanvasTypes). beginSubcases(). -expand('usage', () => { - const usageSet = new Set(); - for (const usage0 of kTextureUsages) { - for (const usage1 of kTextureUsages) { - usageSet.add(usage0 | usage1); - } - } - return usageSet; -}). -unless(({ usage }) => { - return !IsValidTextureUsageCombination(usage); -}) +combine( + 'usage', + kValidCombinationsOfOneOrTwoTextureUsages + // TypeError cases are tested in the next test. + .filter((usage) => !usageIsTypeErrorForConfigure(usage)) +) ). fn((t) => { const { canvasType, usage } = t.params; @@ -333,6 +330,72 @@ fn((t) => { } }); +g.test('invalid_usage'). +desc(`Test what happens when an invalid usage is passed to configure().`). +params((u) => +u // +.combine('canvasType', kAllCanvasTypes) +// Test all formats because sometimes they're handled differently (require internal blits). +.combine('format', kCanvasTextureFormats). +combine('usage', [ +0, +GPUConst.TextureUsage.COPY_DST, +// Special case for bgra8unorm vs other formats +GPUConst.TextureUsage.STORAGE_BINDING, +// Special case(s) for canvases vs regular textures +...kTextureUsages.filter(usageIsTypeErrorForConfigure), +GPUConst.TextureUsage.TRANSIENT_ATTACHMENT | GPUConst.TextureUsage.RENDER_ATTACHMENT, +// Various usages containing a bogus usage +kSomeBogusTextureUsage, +GPUConst.TextureUsage.COPY_DST | kSomeBogusTextureUsage, +GPUConst.TextureUsage.STORAGE_BINDING | kSomeBogusTextureUsage, +GPUConst.TextureUsage.TRANSIENT_ATTACHMENT | kSomeBogusTextureUsage] +) +). +fn((t) => { + const { canvasType, format, usage } = t.params; + + // MAINTENANCE_TODO(#4509): Remove this when TRANSIENT_ATTACHMENT is added to the WebGPU spec. + if ((usage & GPUConst.TextureUsage.TRANSIENT_ATTACHMENT) !== 0) { + t.skipIfTransientAttachmentNotSupported(); + } + + const canvas = createCanvas(t, canvasType, 2, 2); + const ctx = canvas.getContext('webgpu'); + assert(ctx instanceof GPUCanvasContext, 'Failed to get WebGPU context from canvas'); + + if (usageIsTypeErrorForConfigure(usage)) { + t.shouldThrow('TypeError', () => { + ctx.configure({ device: t.device, format, usage }); + }); + + const configuration = ctx.getConfiguration(); + assert(configuration === null); + + t.shouldThrow('InvalidStateError', () => { + ctx.getCurrentTexture(); + }); + } else { + // Otherwise just the normal createTexture() usage validation applies. + const invalidUsage = !isValidTextureUsageCombination(usage); + t.expectValidationError(() => { + ctx.configure({ device: t.device, format, usage }); + }, invalidUsage); + + // The canvas still gets configured, and getCurrentTexture() can still be called. + const configuration = ctx.getConfiguration(); + assert(configuration !== null); + t.expect(configuration.usage === usage); + + let currentTexture; + t.expectValidationError(() => { + currentTexture = ctx.getCurrentTexture(); + }, invalidUsage); + assert(currentTexture !== undefined && currentTexture instanceof GPUTexture); + t.expect(currentTexture.usage === usage); + } +}); + g.test('alpha_mode'). desc( ` diff --git a/testing/web-platform/mozilla/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/setImmediates.as_worker.js b/testing/web-platform/mozilla/tests/webgpu/webgpu/webworker/api/validation/encoding/cmds/setImmediates.as_worker.js @@ -0,0 +1,6 @@ +// AUTO-GENERATED - DO NOT EDIT. See src/common/tools/gen_listings_and_webworkers.ts. + +import { g } from '../../../../../api/validation/encoding/cmds/setImmediates.spec.js'; +import { wrapTestGroupForWorker } from '../../../../../../common/runtime/helper/wrap_for_worker.js'; + +wrapTestGroupForWorker(g);