export const description = ` Validation tests for matrix comparison expressions. `; 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); // A list of comparison operators const kComparisonOperators = { eq: { op: '==' }, ne: { op: '!=' }, gt: { op: '>' }, ge: { op: '>=' }, lt: { op: '<' }, le: { op: '<=' }, }; interface Argument { /** Value as a string. */ readonly src: string; /** Requires f16 */ readonly is_f16?: boolean; } const kTests: { readonly [name: string]: Argument } = { bool: { src: 'false', }, vec: { src: 'vec2()', }, i32: { src: '1i', }, u32: { src: '1u', }, ai: { src: '1', }, f32: { src: '1f', }, f16: { src: '1h', is_f16: true, }, af: { src: '1.0', }, texture: { src: 't', }, sampler: { src: 's', }, atomic: { src: 'a', }, struct: { src: 'str', }, array: { src: 'arr', }, matf_matching: { src: 'mat2x3f()', }, matf_no_match: { src: 'mat4x4f()', }, math: { src: 'mat2x3h()', is_f16: true, }, }; g.test('invalid') .desc(`Validates that comparison expressions are never accepted for matrix types.`) .params(u => u .combine('op', keysOf(kComparisonOperators)) // 1i is the control that the test passes .combine('rhs', ['1i', 'ai', 'mat2x3f()', 'mat2x3h()']) .combine('test', keysOf(kTests)) ) .fn(t => { const lhs = kTests[t.params.test].src; const rhs = t.params.rhs === 'ai' ? 'mat2x3(0, 0, 0, 0, 0, 0)' : t.params.rhs; const code = ` ${kTests[t.params.test].is_f16 || t.params.rhs.startsWith('mat2x3h(') ? 'enable f16;' : ''} @group(0) @binding(0) var t : texture_2d; @group(0) @binding(1) var s : sampler; @group(0) @binding(2) var a : atomic; struct S { u : u32 } var arr : array; var str : S; @compute @workgroup_size(1) fn main() { let foo = ${lhs} ${kComparisonOperators[t.params.op].op} ${rhs}; } `; const pass = (lhs === '1i' || lhs === '1') && rhs === '1i'; t.expectCompileResult(pass, code); });