blob: 384b87a2195fe083947a8f8c3ac066a56d9ff3de [file]
export const description = `Validation tests for binding`;
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 kTests = {
const_expr: {
src: `const z = 5;
const y = 2;
@binding(z + y)`,
pass: true,
},
override_expr: {
src: `override z = 5;
@binding(z)`,
pass: false,
},
zero: {
src: `@binding(0)`,
pass: true,
},
one: {
src: `@binding(1)`,
pass: true,
},
comment: {
src: `@/* comment */binding(1)`,
pass: true,
},
split_line: {
src: '@ \n binding(1)',
pass: true,
},
trailing_comma: {
src: `@binding(1,)`,
pass: true,
},
int_literal: {
src: `@binding(1i)`,
pass: true,
},
uint_literal: {
src: `@binding(1u)`,
pass: true,
},
hex_literal: {
src: `@binding(0x1)`,
pass: true,
},
negative: {
src: `@binding(-1)`,
pass: false,
},
missing_value: {
src: `@binding()`,
pass: false,
},
missing_left_paren: {
src: `@binding 1)`,
pass: false,
},
missing_right_paren: {
src: `@binding(1`,
pass: false,
},
multiple_values: {
src: `@binding(1,2)`,
pass: false,
},
f32_val_literal: {
src: `@binding(1.0)`,
pass: false,
},
f32_val: {
src: `@binding(1f)`,
pass: false,
},
no_params: {
src: `@binding`,
pass: false,
},
misspelling: {
src: `@abinding(1)`,
pass: false,
},
multi_binding: {
src: `@binding(1) @binding(1)`,
pass: false,
},
};
g.test('binding')
.desc(`Test validation of binding`)
.params(u => u.combine('attr', keysOf(kTests)))
.fn(t => {
const code = `
${kTests[t.params.attr].src} @group(1)
var<storage> a: i32;
@workgroup_size(1, 1, 1)
@compute fn main() {
_ = a;
}`;
t.expectCompileResult(kTests[t.params.attr].pass, code);
});
g.test('binding_f16')
.desc(`Test validation of binding with f16`)
.fn(t => {
const code = `
@group(1) @binding(1h)
var<storage> a: i32;
@workgroup_size(1, 1, 1)
@compute fn main() {
_ = a;
}`;
t.expectCompileResult(false, code);
});