summaryrefslogtreecommitdiffstats
path: root/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/parse/attribute.spec.ts
diff options
context:
space:
mode:
Diffstat (limited to 'dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/parse/attribute.spec.ts')
-rw-r--r--dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/parse/attribute.spec.ts87
1 files changed, 87 insertions, 0 deletions
diff --git a/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/parse/attribute.spec.ts b/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/parse/attribute.spec.ts
new file mode 100644
index 0000000000..5e5fb18d3c
--- /dev/null
+++ b/dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/parse/attribute.spec.ts
@@ -0,0 +1,87 @@
+export const description = `Validation tests for attributes`;
+
+import { makeTestGroup } from '../../../../common/framework/test_group.js';
+import { keysOf } from '../../../../common/util/data_tables.js';
+import { ShaderValidationTest } from '../shader_validation_test.js';
+
+export const g = makeTestGroup(ShaderValidationTest);
+
+const kPossibleValues = {
+ val: '32',
+ expr: '30 + 2',
+ override: 'a_override',
+ user_func: 'a_func()',
+ const_func: 'min(4, 8)',
+ const: 'a_const',
+};
+const kAttributeUsage = {
+ align: '@align($val)',
+ binding: '@binding($val) @group(0)',
+ group: '@binding(1) @group($val)',
+ id: '@id($val)',
+ location: '@location($val)',
+ size: '@size($val)',
+ workgroup_size: '@workgroup_size($val, $val, $val)',
+};
+const kAllowedUsages = {
+ align: ['val', 'expr', 'const', 'const_func'],
+ binding: ['val', 'expr', 'const', 'const_func'],
+ group: ['val', 'expr', 'const', 'const_func'],
+ id: ['val', 'expr', 'const', 'const_func'],
+ location: ['val', 'expr', 'const', 'const_func'],
+ size: ['val', 'expr', 'const', 'const_func'],
+ workgroup_size: ['val', 'expr', 'const', 'const_func', 'override'],
+};
+
+g.test('expressions')
+ .desc(`Tests attributes which allow expressions`)
+ .params(u =>
+ u.combine('value', keysOf(kPossibleValues)).combine('attribute', keysOf(kAllowedUsages))
+ )
+ .fn(t => {
+ const attributes = {
+ align: '',
+ binding: '@binding(0) @group(0)',
+ group: '@binding(1) @group(1)',
+ id: '@id(2)',
+ location: '@location(0)',
+ size: '',
+ workgroup_size: '@workgroup_size(1)',
+ };
+
+ const val = kPossibleValues[t.params.value];
+ attributes[t.params.attribute] = kAttributeUsage[t.params.attribute].replace(/(\$val)/g, val);
+
+ const code = `
+fn a_func() -> i32 {
+ return 4;
+}
+
+const a_const = -2 + 10;
+override a_override: i32 = 2;
+
+${attributes.id} override my_id: i32 = 4;
+
+struct B {
+ ${attributes.align} ${attributes.size} a: i32,
+}
+
+${attributes.binding}
+var<uniform> uniform_buffer_1: B;
+
+${attributes.group}
+var<uniform> uniform_buffer_2: B;
+
+@fragment
+fn main() -> ${attributes.location} vec4<f32> {
+ return vec4<f32>(.4, .2, .3, .1);
+}
+
+@compute
+${attributes.workgroup_size}
+fn compute_main() {}
+`;
+
+ const pass = kAllowedUsages[t.params.attribute].includes(t.params.value);
+ t.expectCompileResult(pass, code);
+ });