From 2f79a24e317eb729dbf0c6e89ab185ff7d877110 Mon Sep 17 00:00:00 2001 From: David Neto Date: Wed, 13 Mar 2024 16:22:04 -0400 Subject: [PATCH] wgsl: validate bad arg counts, arg types, must_use for log, log2 --- src/webgpu/listing_meta.json | 4 +++ .../expression/call/builtin/log.spec.ts | 30 +++++++++++++++++++ .../expression/call/builtin/log2.spec.ts | 30 +++++++++++++++++++ 3 files changed, 64 insertions(+) diff --git a/src/webgpu/listing_meta.json b/src/webgpu/listing_meta.json index 6e30934e818c..e2276fe28347 100644 --- a/src/webgpu/listing_meta.json +++ b/src/webgpu/listing_meta.json @@ -1892,9 +1892,13 @@ "webgpu:shader,validation,expression,call,builtin,length:vec2:*": { "subcaseMS": 0.319 }, "webgpu:shader,validation,expression,call,builtin,length:vec3:*": { "subcaseMS": 1.401 }, "webgpu:shader,validation,expression,call,builtin,length:vec4:*": { "subcaseMS": 1.301 }, + "webgpu:shader,validation,expression,call,builtin,log2:bad_args:*": { "subcaseMS": 4.240 }, "webgpu:shader,validation,expression,call,builtin,log2:integer_argument:*": { "subcaseMS": 1.034 }, + "webgpu:shader,validation,expression,call,builtin,log2:must_use:*": { "subcaseMS": 1.149 }, "webgpu:shader,validation,expression,call,builtin,log2:values:*": { "subcaseMS": 0.398 }, + "webgpu:shader,validation,expression,call,builtin,log:bad_args:*": { "subcaseMS": 15682.590 }, "webgpu:shader,validation,expression,call,builtin,log:integer_argument:*": { "subcaseMS": 1.134 }, + "webgpu:shader,validation,expression,call,builtin,log:must_use:*": { "subcaseMS": 1597.590 }, "webgpu:shader,validation,expression,call,builtin,log:values:*": { "subcaseMS": 0.291 }, "webgpu:shader,validation,expression,call,builtin,modf:integer_argument:*": { "subcaseMS": 1.089 }, "webgpu:shader,validation,expression,call,builtin,modf:values:*": { "subcaseMS": 1.866 }, diff --git a/src/webgpu/shader/validation/expression/call/builtin/log.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/log.spec.ts index 6d755304f2ff..559593e1b06c 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/log.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/log.spec.ts @@ -73,3 +73,33 @@ Validates that scalar and vector integer arguments are rejected by ${builtin}() 'constant' ); }); + +const kGoodArgs = '(1.1)'; +const kBadArgs = { + no_parens: '', + // Bad number of args + '0args': '()', + '2args': '(1.0,2.0)', + // Bad value for arg 0 + '0i32': '(1i)', + '0u32': '(1u)', + '0bool': '(false)', + '0vec2u': '(vec2u())', + '0array': '(array(1.1,2.2))', + '0struct': '(modf(2.2))', +}; + +g.test('bad_args') + .desc(`Test compilation failure of ${builtin} with bad arguments`) + .params(u => u.combine('arg', keysOf(kBadArgs))) + .fn(t => { + t.expectCompileResult(false, `const c = ${builtin}${kBadArgs[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}${kGoodArgs}; }`); + }); diff --git a/src/webgpu/shader/validation/expression/call/builtin/log2.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/log2.spec.ts index 0dfe64153651..dc92316f92f7 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/log2.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/log2.spec.ts @@ -73,3 +73,33 @@ Validates that scalar and vector integer arguments are rejected by ${builtin}() 'constant' ); }); + +const kGoodArgs = '(1.1)'; +const kBadArgs = { + no_parens: '', + // Bad number of args + '0args': '()', + '2args': '(1.0,2.0)', + // Bad value for arg 0 + '0i32': '(1i)', + '0u32': '(1u)', + '0bool': '(false)', + '0vec2u': '(vec2u())', + '0array': '(array(1.1,2.2))', + '0struct': '(modf(2.2))', +}; + +g.test('bad_args') + .desc(`Test compilation failure of ${builtin} with bad arguments`) + .params(u => u.combine('arg', keysOf(kBadArgs))) + .fn(t => { + t.expectCompileResult(false, `const c = ${builtin}${kBadArgs[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}${kGoodArgs}; }`); + });