diff --git a/src/webgpu/shader/validation/types/pointer.spec.ts b/src/webgpu/shader/validation/types/pointer.spec.ts index 8bc1389ae3cd..ad89a76f8219 100644 --- a/src/webgpu/shader/validation/types/pointer.spec.ts +++ b/src/webgpu/shader/validation/types/pointer.spec.ts @@ -97,6 +97,7 @@ interface TypeCase { storable: boolean; f16?: boolean; aspace?: string; + buffer_view?: boolean; } const kTypeCases: Record = { @@ -150,6 +151,20 @@ const kTypeCases: Record = { // Reference reference: { type: `ref`, storable: false, aspace: 'function' }, + + // Runtime arrays (allowed by buffer_view). + uniform_runtime_array: { + type: 'array', + storable: true, + aspace: 'uniform', + buffer_view: true, + }, + workgroup_runtime_array: { + type: 'array', + storable: true, + aspace: 'workgroup', + buffer_view: true, + }, }; g.test('type') @@ -157,6 +172,10 @@ g.test('type') .params(u => u.combine('case', keysOf(kTypeCases))) .fn(t => { const testcase = kTypeCases[t.params.case]; + let expect = testcase.storable; + if (testcase.buffer_view === true) { + expect &&= t.hasLanguageFeature('buffer_view'); + } const aspace = testcase.aspace ?? 'storage'; const access = testcase.type.includes('atomic') ? ', read_write' : ''; const code = `${testcase.f16 ? 'enable f16;' : ''} @@ -165,7 +184,7 @@ g.test('type') struct T { s : array } alias u32_alias = u32; alias Type = ptr<${aspace}, ${testcase.type}${access}>;`; - t.expectCompileResult(testcase.storable, code); + t.expectCompileResult(expect, code); }); // Address spaces that can hold an i32 variable. @@ -269,8 +288,6 @@ const kStoreTypeNotInstantiable: Record = { privateAtomic: 'alias p = ptr>;', functionAtomic: 'alias p = ptr>;', uniformAtomic: 'alias p = ptr>;', - workgroupRTArray: 'alias p = ptr>;', - uniformRTArray: 'alias p = ptr>;', privateRTArray: 'alias p = ptr>;', functionRTArray: 'alias p = ptr>;', RTArrayNotLast: 'struct S { a: array, b: i32 } alias p = ptr;',