From 96851221ff805987a94917d5fcbf75819f5168ea Mon Sep 17 00:00:00 2001 From: Kai Ninomiya Date: Sun, 26 Apr 2026 01:33:55 -0700 Subject: [PATCH 1/2] Test that createBuffer/createTexture only allows exposed usages For any buffer/texture usages known by the CTS, check that the browser only accepts it if it also exposes it. Currently the buffer test passes in all browsers - there haven't been any new usages in a long time. But next time we add a usage, this makes sure that when they start accepting the usage, they also start exposing it. The texture test fails in Safari because it's missing validation of unknown texture usages (this is also caught by another new test that tests an invalid usage). Passes in Chrome/Firefox. Unrelated cleanup: filter out redundant cases in createBuffer usage tests. --- .../api/validation/buffer/create.spec.ts | 27 +++++++++++++++++ .../api/validation/createTexture.spec.ts | 29 +++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/src/webgpu/api/validation/buffer/create.spec.ts b/src/webgpu/api/validation/buffer/create.spec.ts index b014626225f3..2342a440b835 100644 --- a/src/webgpu/api/validation/buffer/create.spec.ts +++ b/src/webgpu/api/validation/buffer/create.spec.ts @@ -61,6 +61,7 @@ g.test('usage') u .combine('usage1', [0, ...kBufferUsages, kInvalidUsage]) .combine('usage2', [0, ...kBufferUsages, kInvalidUsage]) + .filter(p => p.usage1 <= p.usage2) .beginSubcases() .combine('mappedAtCreation', [false, true]) ) @@ -83,6 +84,32 @@ g.test('usage') ); }); +g.test('new_usages') + .desc(`Valid sages not present in GPUBufferUsage shouldn't be accepted by createBuffer().`) + .params(u => + u // + .beginSubcases() + .combine('usage', kBufferUsages) + ) + .fn(t => { + const { usage } = t.params; + + let exposedUsages = 0; + for (const v of Object.values(GPUBufferUsage)) { + exposedUsages |= v; + } + + const success = (usage & exposedUsages) === usage; + + t.expectGPUError( + 'validation', + () => { + t.createBufferTracked({ size: 16, usage }); + }, + !success + ); + }); + const BufferUsage = GPUConst.BufferUsage; g.test('createBuffer_invalid_and_oom') diff --git a/src/webgpu/api/validation/createTexture.spec.ts b/src/webgpu/api/validation/createTexture.spec.ts index a87580fa5051..f1e1e6ceb1e5 100644 --- a/src/webgpu/api/validation/createTexture.spec.ts +++ b/src/webgpu/api/validation/createTexture.spec.ts @@ -1098,6 +1098,35 @@ g.test('depthOrArrayLayers_and_mipLevelCount_for_transient_attachments') }, !success); }); +g.test('new_usages') + .desc(`Valid sages not present in GPUTextureUsage shouldn't be accepted by createTexture().`) + .params(u => + u + .combine('usage', [ + ...kTextureUsages, + GPUConst.TextureUsage.RENDER_ATTACHMENT | GPUConst.TextureUsage.TRANSIENT_ATTACHMENT, + ]) + .filter(p => isValidTextureUsageCombination(p.usage)) + ) + .fn(t => { + const { usage } = t.params; + + let exposedUsages = 0; + for (const v of Object.values(GPUTextureUsage)) { + exposedUsages |= v; + } + + const success = (usage & exposedUsages) === usage; + + t.expectGPUError( + 'validation', + () => { + t.createTextureTracked({ format: 'rgba8unorm', size: [1, 1], usage }); + }, + !success + ); + }); + g.test('viewFormats') .desc( `Test creating a texture with viewFormats list for all {texture format}x{view format}. Only compatible view formats should be valid.` From f839c18029340a9c7425c7448593c2a6c22b6388 Mon Sep 17 00:00:00 2001 From: Kai Ninomiya Date: Tue, 28 Apr 2026 13:17:41 +0200 Subject: [PATCH 2/2] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: François Beaufort --- src/webgpu/api/validation/buffer/create.spec.ts | 2 +- src/webgpu/api/validation/createTexture.spec.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/webgpu/api/validation/buffer/create.spec.ts b/src/webgpu/api/validation/buffer/create.spec.ts index 2342a440b835..0ab531485fa2 100644 --- a/src/webgpu/api/validation/buffer/create.spec.ts +++ b/src/webgpu/api/validation/buffer/create.spec.ts @@ -85,7 +85,7 @@ g.test('usage') }); g.test('new_usages') - .desc(`Valid sages not present in GPUBufferUsage shouldn't be accepted by createBuffer().`) + .desc(`Valid usages not present in GPUBufferUsage shouldn't be accepted by createBuffer().`) .params(u => u // .beginSubcases() diff --git a/src/webgpu/api/validation/createTexture.spec.ts b/src/webgpu/api/validation/createTexture.spec.ts index f1e1e6ceb1e5..87a4fff10c44 100644 --- a/src/webgpu/api/validation/createTexture.spec.ts +++ b/src/webgpu/api/validation/createTexture.spec.ts @@ -1099,7 +1099,7 @@ g.test('depthOrArrayLayers_and_mipLevelCount_for_transient_attachments') }); g.test('new_usages') - .desc(`Valid sages not present in GPUTextureUsage shouldn't be accepted by createTexture().`) + .desc(`Valid usages not present in GPUTextureUsage shouldn't be accepted by createTexture().`) .params(u => u .combine('usage', [