diff options
Diffstat (limited to 'dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/decl/var_access_mode.spec.ts')
-rw-r--r-- | dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/decl/var_access_mode.spec.ts | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/decl/var_access_mode.spec.ts b/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/decl/var_access_mode.spec.ts new file mode 100644 index 0000000000..467f61d0da --- /dev/null +++ b/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/decl/var_access_mode.spec.ts @@ -0,0 +1,116 @@ +export const description = ` +7.3 var Declarations + +The access mode always has a default value, and except for variables in the +storage address space, must not be specified in the WGSL source. See ยง13.3 Address Spaces. +`; + +import { makeTestGroup } from '../../../../common/framework/test_group.js'; +import { keysOf } from '../../../../common/util/data_tables.js'; +import { AddressSpace, kAccessModeInfo, kAddressSpaceInfo } from '../../types.js'; +import { ShaderValidationTest } from '../shader_validation_test.js'; + +import { + explicitSpaceExpander, + getVarDeclShader, + accessModeExpander, + supportsRead, + supportsWrite, + ShaderStage, +} from './util.js'; + +// Address spaces that can hold an i32 variable. +const kNonHandleAddressSpaces = keysOf(kAddressSpaceInfo).filter( + as => as !== 'handle' +) as AddressSpace[]; + +export const g = makeTestGroup(ShaderValidationTest); + +g.test('explicit_access_mode') + .desc('Validate uses of an explicit access mode on a var declaration') + .specURL('https://gpuweb.github.io/gpuweb/wgsl/#var-decls') + .params( + u => + u + .combine('addressSpace', kNonHandleAddressSpaces) + .combine('explicitSpace', [true, false]) + // Only keep cases where: + // *if* the address space must be specified on a var decl (e.g. var<private>) + // then the address space will actually be specified in this test case. + .filter(t => kAddressSpaceInfo[t.addressSpace].spell !== 'must' || t.explicitSpace) + .combine('explicitAccess', [true]) + .combine('accessMode', keysOf(kAccessModeInfo)) + .combine('stage', ['compute' as ShaderStage]) // Only need to check compute shaders + ) + .fn(t => { + const prog = getVarDeclShader(t.params); + const info = kAddressSpaceInfo[t.params.addressSpace]; + + const ok = + // The address space must be explicitly specified. + t.params.explicitSpace && + // The address space must allow an access mode to be spelled, and the + // access mode must be in the list of modes for the address space. + info.spellAccessMode !== 'never' && + info.accessModes.includes(t.params.accessMode); + + t.expectCompileResult(ok, prog); + }); + +g.test('implicit_access_mode') + .desc('Validate an implicit access mode on a var declaration') + .specURL('https://gpuweb.github.io/gpuweb/wgsl/#var-decls') + .params( + u => + u + .combine('addressSpace', kNonHandleAddressSpaces) + .expand('explicitSpace', explicitSpaceExpander) + .combine('explicitAccess', [false]) + .combine('accessMode', [''] as const) + .combine('stage', ['compute' as ShaderStage]) // Only need to check compute shaders + ) + .fn(t => { + const prog = getVarDeclShader(t.params); + + // 7.3 var Declarations + // "The access mode always has a default value,.." + const ok = true; + + t.expectCompileResult(ok, prog); + }); + +g.test('read_access') + .desc('A variable can be read from when the access mode permits') + .specURL('https://gpuweb.github.io/gpuweb/wgsl/#var-decls') + .params( + u => + u + .combine('addressSpace', kNonHandleAddressSpaces) + .expand('explicitSpace', explicitSpaceExpander) + .combine('explicitAccess', [false, true]) + .expand('accessMode', accessModeExpander) + .combine('stage', ['compute' as ShaderStage]) // Only need to check compute shaders + ) + .fn(t => { + const prog = getVarDeclShader(t.params, 'let copy = x;'); + const ok = supportsRead(t.params); + t.expectCompileResult(ok, prog); + }); + +g.test('write_access') + .desc('A variable can be written to when the access mode permits') + .specURL('https://gpuweb.github.io/gpuweb/wgsl/#var-decls') + .params( + u => + u + .combine('addressSpace', kNonHandleAddressSpaces) + .expand('explicitSpace', explicitSpaceExpander) + .combine('explicitAccess', [false, true]) + .expand('accessMode', accessModeExpander) + .combine('stage', ['compute' as ShaderStage]) // Only need to check compute shaders + ) + .fn(t => { + const prog = getVarDeclShader(t.params, 'x = 0;'); + const ok = supportsWrite(t.params); + t.expectCompileResult(ok, prog); + }); |