Skip to content

Commit c978e0b

Browse files
committed
Test createTexture() with invalid usages or combinations of usages
Per spec, TRANSIENT_ATTACHMENT cannot be used in any combination of usages other than RENDER_ATTACHMENT | TRANSIENT_ATTACHMENT.
1 parent ded8b77 commit c978e0b

2 files changed

Lines changed: 36 additions & 1 deletion

File tree

src/webgpu/api/validation/createTexture.spec.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
kTextureUsages,
99
isValidTextureUsageCombination,
1010
kValidCombinationsOfOneOrTwoTextureUsages,
11+
kAllTextureUsages,
1112
} from '../../capability_info.js';
1213
import { GPUConst } from '../../constants.js';
1314
import {
@@ -1098,6 +1099,40 @@ g.test('depthOrArrayLayers_and_mipLevelCount_for_transient_attachments')
10981099
}, !success);
10991100
});
11001101

1102+
const kInvalidUsage = 0x8000;
1103+
assert((kInvalidUsage & kAllTextureUsages) === 0);
1104+
g.test('usage')
1105+
.desc('Test combinations of zero to two usage flags are validated to be valid.')
1106+
.params(u =>
1107+
u
1108+
.combine('usage1', [0, ...kTextureUsages, kInvalidUsage])
1109+
.combine('usage2', [0, ...kTextureUsages, kInvalidUsage])
1110+
.filter(p => p.usage1 <= p.usage2)
1111+
)
1112+
.fn(t => {
1113+
const { usage1, usage2 } = t.params;
1114+
const usage = usage1 | usage2;
1115+
1116+
// MAINTENANCE_TODO(#4509): Remove this after all implementations have TRANSIENT_ATTACHMENT.
1117+
if ((usage & GPUConst.TextureUsage.TRANSIENT_ATTACHMENT) !== 0) {
1118+
t.skipIfTransientAttachmentNotSupported();
1119+
}
1120+
1121+
const isValid =
1122+
usage !== 0 &&
1123+
(usage & ~kAllTextureUsages) === 0 &&
1124+
((usage & GPUTextureUsage.TRANSIENT_ATTACHMENT) === 0 ||
1125+
usage === (GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TRANSIENT_ATTACHMENT));
1126+
1127+
t.expectGPUError(
1128+
'validation',
1129+
() => {
1130+
t.createTextureTracked({ format: 'rgba8unorm', size: [1, 1], usage });
1131+
},
1132+
!isValid
1133+
);
1134+
});
1135+
11011136
g.test('viewFormats')
11021137
.desc(
11031138
`Test creating a texture with viewFormats list for all {texture format}x{view format}. Only compatible view formats should be valid.`

src/webgpu/capability_info.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ const kTextureUsageInfo: {
225225
/** List of all GPUTextureUsage values. */
226226
export const kTextureUsages = numericKeysOf(kTextureUsageInfo);
227227
/** Bitmask of all known texture usages. */
228-
const kAllTextureUsages = kTextureUsages.reduce((acc, usage) => acc | usage, 0);
228+
export const kAllTextureUsages = kTextureUsages.reduce((acc, usage) => acc | usage, 0);
229229

230230
/** An arbitrary invalid texture usage bit. */
231231
export const kSomeBogusTextureUsage: GPUTextureUsageFlags = 0x4000_0000;

0 commit comments

Comments
 (0)