diff --git a/src/webgpu/api/validation/createTexture.spec.ts b/src/webgpu/api/validation/createTexture.spec.ts index a87580fa5051..1e7ba7ba99de 100644 --- a/src/webgpu/api/validation/createTexture.spec.ts +++ b/src/webgpu/api/validation/createTexture.spec.ts @@ -8,6 +8,7 @@ import { kTextureUsages, isValidTextureUsageCombination, kValidCombinationsOfOneOrTwoTextureUsages, + kAllTextureUsages, } from '../../capability_info.js'; import { GPUConst } from '../../constants.js'; import { @@ -1098,6 +1099,40 @@ g.test('depthOrArrayLayers_and_mipLevelCount_for_transient_attachments') }, !success); }); +const kInvalidUsage = 0x8000; +assert((kInvalidUsage & kAllTextureUsages) === 0); +g.test('usage') + .desc('Test combinations of zero to two usage flags are validated to be valid.') + .params(u => + u + .combine('usage1', [0, ...kTextureUsages, kInvalidUsage]) + .combine('usage2', [0, ...kTextureUsages, kInvalidUsage]) + .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..d4a5ea7a53cd 100644 --- a/src/webgpu/capability_info.ts +++ b/src/webgpu/capability_info.ts @@ -225,7 +225,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;