diff --git a/src/webgpu/api/validation/buffer/create.spec.ts b/src/webgpu/api/validation/buffer/create.spec.ts index 6efbfb39f02f..41f6f79a58ff 100644 --- a/src/webgpu/api/validation/buffer/create.spec.ts +++ b/src/webgpu/api/validation/buffer/create.spec.ts @@ -8,6 +8,7 @@ import { kAllBufferUsageBits, kBufferSizeAlignment, kBufferUsages, + kSomeBogusBufferUsage, } from '../../../capability_info.js'; import { GPUConst } from '../../../constants.js'; import { AllFeaturesMaxLimitsGPUTest } from '../../../gpu_test.js'; @@ -54,14 +55,12 @@ g.test('limit') t.expectGPUError('validation', () => t.createBufferTracked({ size, usage }), !isValid); }); -const kInvalidUsage = 0x8000; -assert((kInvalidUsage & kAllBufferUsageBits) === 0); g.test('usage') .desc('Test combinations of zero to two usage flags are validated to be valid.') .params(u => u - .combine('usage1', [0, ...kBufferUsages, kInvalidUsage]) - .combine('usage2', [0, ...kBufferUsages, kInvalidUsage]) + .combine('usage1', [0, ...kBufferUsages, kSomeBogusBufferUsage]) + .combine('usage2', [0, ...kBufferUsages, kSomeBogusBufferUsage]) .beginSubcases() .combine('mappedAtCreation', [false, true]) ) diff --git a/src/webgpu/api/validation/createTexture.spec.ts b/src/webgpu/api/validation/createTexture.spec.ts index 0cc0ac5ed8e7..e2c570d614ac 100644 --- a/src/webgpu/api/validation/createTexture.spec.ts +++ b/src/webgpu/api/validation/createTexture.spec.ts @@ -8,6 +8,8 @@ import { kTextureUsages, isValidTextureUsageCombination, kValidCombinationsOfOneOrTwoTextureUsages, + kAllTextureUsages, + kSomeBogusTextureUsage, } from '../../capability_info.js'; import { GPUConst } from '../../constants.js'; import { @@ -1098,6 +1100,38 @@ g.test('depthOrArrayLayers_and_mipLevelCount_for_transient_attachments') }, !success); }); +g.test('usage') + .desc('Test combinations of zero to two usage flags are validated to be valid.') + .params(u => + u + .combine('usage1', [0, ...kTextureUsages, kSomeBogusTextureUsage]) + .combine('usage2', [0, ...kTextureUsages, kSomeBogusTextureUsage]) + .filter(p => p.usage1 <= p.usage2) + ) + .fn(t => { + const { usage1, usage2 } = t.params; + const usage = usage1 | usage2; + + // MAINTENANCE_TODO(#4509): Remove this after all implementations have TRANSIENT_ATTACHMENT. + if ((usage & GPUConst.TextureUsage.TRANSIENT_ATTACHMENT) !== 0) { + t.skipIfTransientAttachmentNotSupported(); + } + + const isValid = + usage !== 0 && + (usage & ~kAllTextureUsages) === 0 && + ((usage & GPUTextureUsage.TRANSIENT_ATTACHMENT) === 0 || + usage === (GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TRANSIENT_ATTACHMENT)); + + t.expectGPUError( + 'validation', + () => { + t.createTextureTracked({ format: 'rgba8unorm', size: [1, 1], usage }); + }, + !isValid + ); + }); + 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.` diff --git a/src/webgpu/capability_info.ts b/src/webgpu/capability_info.ts index 46da76f7f9cc..3d7160bb894e 100644 --- a/src/webgpu/capability_info.ts +++ b/src/webgpu/capability_info.ts @@ -77,6 +77,10 @@ export const kAllBufferUsageBits = kBufferUsages.reduce( 0 ); +/** An arbitrary invalid buffer usage bit. */ +export const kSomeBogusBufferUsage: GPUBufferUsageFlags = 0x4000_0000; +assert((kSomeBogusBufferUsage & kAllBufferUsageBits) === 0); + // Errors /** Per-GPUErrorFilter info. */ @@ -225,7 +229,7 @@ const kTextureUsageInfo: { /** 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); +export const kAllTextureUsages = kTextureUsages.reduce((acc, usage) => acc | usage, 0); /** An arbitrary invalid texture usage bit. */ export const kSomeBogusTextureUsage: GPUTextureUsageFlags = 0x4000_0000;