From 8cac6fe0825c2f28945a0159d3d135225810e7ed Mon Sep 17 00:00:00 2001 From: David Neto Date: Thu, 14 Mar 2024 18:03:18 -0400 Subject: [PATCH] wgsl: validate bad arg counts, arg types, must_use for sin, cos (#3496) wgsl: validate bad arg counts, arg types, must_use for sin, cos --- src/webgpu/listing_meta.json | 4 +++ .../expression/call/builtin/cos.spec.ts | 33 ++++++++++++++++++ .../expression/call/builtin/sin.spec.ts | 34 +++++++++++++++++++ 3 files changed, 71 insertions(+) diff --git a/src/webgpu/listing_meta.json b/src/webgpu/listing_meta.json index b6cd790bd4db..ea3f8b3397bb 100644 --- a/src/webgpu/listing_meta.json +++ b/src/webgpu/listing_meta.json @@ -1867,7 +1867,9 @@ "webgpu:shader,validation,expression,call,builtin,ceil:integer_argument:*": { "subcaseMS": 1.456 }, "webgpu:shader,validation,expression,call,builtin,ceil:values:*": { "subcaseMS": 1.539 }, "webgpu:shader,validation,expression,call,builtin,clamp:values:*": { "subcaseMS": 0.377 }, + "webgpu:shader,validation,expression,call,builtin,cos:args:*": { "subcaseMS": 4.445 }, "webgpu:shader,validation,expression,call,builtin,cos:integer_argument:*": { "subcaseMS": 1.601 }, + "webgpu:shader,validation,expression,call,builtin,cos:must_use:*": { "subcaseMS": 0.526 }, "webgpu:shader,validation,expression,call,builtin,cos:values:*": { "subcaseMS": 0.338 }, "webgpu:shader,validation,expression,call,builtin,cosh:integer_argument:*": { "subcaseMS": 0.889 }, "webgpu:shader,validation,expression,call,builtin,cosh:values:*": { "subcaseMS": 0.272 }, @@ -1928,7 +1930,9 @@ "webgpu:shader,validation,expression,call,builtin,saturate:values:*": { "subcaseMS": 0.317 }, "webgpu:shader,validation,expression,call,builtin,sign:unsigned_integer_argument:*": { "subcaseMS": 1.120 }, "webgpu:shader,validation,expression,call,builtin,sign:values:*": { "subcaseMS": 0.343 }, + "webgpu:shader,validation,expression,call,builtin,sin:args:*": { "subcaseMS": 4.443 }, "webgpu:shader,validation,expression,call,builtin,sin:integer_argument:*": { "subcaseMS": 1.189 }, + "webgpu:shader,validation,expression,call,builtin,sin:must_use:*": { "subcaseMS": 0.588 }, "webgpu:shader,validation,expression,call,builtin,sin:values:*": { "subcaseMS": 0.349 }, "webgpu:shader,validation,expression,call,builtin,sinh:integer_argument:*": { "subcaseMS": 1.078 }, "webgpu:shader,validation,expression,call,builtin,sinh:values:*": { "subcaseMS": 0.357 }, diff --git a/src/webgpu/shader/validation/expression/call/builtin/cos.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/cos.spec.ts index 81d283abb299..361cb8ed9955 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/cos.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/cos.spec.ts @@ -79,3 +79,36 @@ Validates that scalar and vector integer arguments are rejected by ${builtin}() 'constant' ); }); + +const kArgCases = { + good: '(1.1)', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_2args: '(1.0,2.0)', + // Bad value type for arg 0 + bad_0i32: '(1i)', + bad_0u32: '(1u)', + bad_0bool: '(false)', + bad_0vec2u: '(vec2u())', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))', +}; + +g.test('args') + .desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`) + .params(u => u.combine('arg', keysOf(kArgCases))) + .fn(t => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); + }); + +g.test('must_use') + .desc(`Result of ${builtin} must be used`) + .params(u => u.combine('use', [true, false])) + .fn(t => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); + }); diff --git a/src/webgpu/shader/validation/expression/call/builtin/sin.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/sin.spec.ts index 3c807d094c5c..6be01123cc94 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/sin.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/sin.spec.ts @@ -75,7 +75,41 @@ Validates that scalar and vector integer arguments are rejected by ${builtin}() t, builtin, /* expectedResult */ type === Type.f32, + [type.create(0)], 'constant' ); }); + +const kArgCases = { + good: '(1.1)', + bad_no_parens: '', + // Bad number of args + bad_0args: '()', + bad_2args: '(1.0,2.0)', + // Bad value type for arg 0 + bad_0i32: '(1i)', + bad_0u32: '(1u)', + bad_0bool: '(false)', + bad_0vec2u: '(vec2u())', + bad_0array: '(array(1.1,2.2))', + bad_0struct: '(modf(2.2))', +}; + +g.test('args') + .desc(`Test compilation failure of ${builtin} with variously shaped and typed arguments`) + .params(u => u.combine('arg', keysOf(kArgCases))) + .fn(t => { + t.expectCompileResult( + t.params.arg === 'good', + `const c = ${builtin}${kArgCases[t.params.arg]};` + ); + }); + +g.test('must_use') + .desc(`Result of ${builtin} must be used`) + .params(u => u.combine('use', [true, false])) + .fn(t => { + const use_it = t.params.use ? '_ = ' : ''; + t.expectCompileResult(t.params.use, `fn f() { ${use_it}${builtin}${kArgCases['good']}; }`); + });