From 938c911294c3f7e06d184e1586323b1034e17933 Mon Sep 17 00:00:00 2001 From: alan-baker Date: Wed, 15 May 2024 10:17:39 -0400 Subject: [PATCH] Move builtin must_use tests to specific builtin tests (#3745) Fixes #3502 * Moves must_use tests for builtin functions to specific files --- src/webgpu/listing_meta.json | 22 +- .../expression/call/builtin/abs.spec.ts | 4 + .../expression/call/builtin/acos.spec.ts | 5 + .../expression/call/builtin/acosh.spec.ts | 5 + .../call/builtin/arrayLength.spec.ts | 12 ++ .../expression/call/builtin/asin.spec.ts | 5 + .../expression/call/builtin/asinh.spec.ts | 5 + .../expression/call/builtin/atan.spec.ts | 5 + .../expression/call/builtin/atan2.spec.ts | 6 + .../expression/call/builtin/atanh.spec.ts | 5 + .../expression/call/builtin/bitcast.spec.ts | 21 ++ .../call/builtin/derivatives.spec.ts | 11 + .../call/builtin/smoothstep.spec.ts | 5 + .../call/builtin/textureDimensions.spec.ts | 12 ++ .../call/builtin/textureGather.spec.ts | 13 ++ .../call/builtin/textureGatherCompare.spec.ts | 13 ++ .../call/builtin/textureLoad.spec.ts | 12 ++ .../call/builtin/textureNumLayers.spec.ts | 12 ++ .../call/builtin/textureNumLevels.spec.ts | 12 ++ .../call/builtin/textureNumSamples.spec.ts | 12 ++ .../call/builtin/textureSample.spec.ts | 13 ++ .../textureSampleBaseClampToEdge.spec.ts | 13 ++ .../call/builtin/textureSampleBias.spec.ts | 13 ++ .../call/builtin/textureSampleCompare.spec.ts | 13 ++ .../builtin/textureSampleCompareLevel.spec.ts | 13 ++ .../call/builtin/textureSampleGrad.spec.ts | 13 ++ .../call/builtin/textureSampleLevel.spec.ts | 13 ++ .../call/builtin/value_constructor.spec.ts | 63 ++++++ .../call/builtin/workgroupUniformLoad.spec.ts | 12 ++ .../shader/validation/parse/must_use.spec.ts | 188 ------------------ 30 files changed, 361 insertions(+), 190 deletions(-) diff --git a/src/webgpu/listing_meta.json b/src/webgpu/listing_meta.json index 68537bd691af..1ae83cf37a06 100644 --- a/src/webgpu/listing_meta.json +++ b/src/webgpu/listing_meta.json @@ -1987,6 +1987,7 @@ "webgpu:shader,validation,expression,call,builtin,any:must_use:*": { "subcaseMS": 7467.652 }, "webgpu:shader,validation,expression,call,builtin,arrayLength:access_mode:*": { "subcaseMS": 0.000 }, "webgpu:shader,validation,expression,call,builtin,arrayLength:bool_type:*": { "subcaseMS": 0.000 }, + "webgpu:shader,validation,expression,call,builtin,arrayLength:must_use:*": { "subcaseMS": 1.822 }, "webgpu:shader,validation,expression,call,builtin,arrayLength:type:*": { "subcaseMS": 0.000 }, "webgpu:shader,validation,expression,call,builtin,asin:integer_argument:*": { "subcaseMS": 0.878 }, "webgpu:shader,validation,expression,call,builtin,asin:parameters:*": { "subcaseMS": 20072.777 }, @@ -2018,6 +2019,7 @@ "webgpu:shader,validation,expression,call,builtin,bitcast:bad_to_vec3h:*": { "subcaseMS": 17.641 }, "webgpu:shader,validation,expression,call,builtin,bitcast:bad_type_constructible:*": { "subcaseMS": 1.214 }, "webgpu:shader,validation,expression,call,builtin,bitcast:bad_type_nonconstructible:*": { "subcaseMS": 1.425 }, + "webgpu:shader,validation,expression,call,builtin,bitcast:must_use:*": { "subcaseMS": 1.715 }, "webgpu:shader,validation,expression,call,builtin,bitcast:valid_vec2h:*": { "subcaseMS": 3.405 }, "webgpu:shader,validation,expression,call,builtin,bitcast:valid_vec4h:*": { "subcaseMS": 5.610 }, "webgpu:shader,validation,expression,call,builtin,ceil:arguments:*": { "subcaseMS": 70.393 }, @@ -2056,6 +2058,7 @@ "webgpu:shader,validation,expression,call,builtin,degrees:must_use:*": { "subcaseMS": 1.406 }, "webgpu:shader,validation,expression,call,builtin,degrees:values:*": { "subcaseMS": 0.303 }, "webgpu:shader,validation,expression,call,builtin,derivatives:invalid_argument_types:*": { "subcaseMS": 1.000 }, + "webgpu:shader,validation,expression,call,builtin,derivatives:must_use:*": { "subcaseMS": 11.328 }, "webgpu:shader,validation,expression,call,builtin,derivatives:only_in_fragment:*": { "subcaseMS": 1.000 }, "webgpu:shader,validation,expression,call,builtin,determinant:args:*": { "subcaseMS": 15.538 }, "webgpu:shader,validation,expression,call,builtin,determinant:matrix_args:*": { "subcaseMS": 193.897 }, @@ -2199,6 +2202,7 @@ "webgpu:shader,validation,expression,call,builtin,reflect:values:*": { "subcaseMS": 1.000 }, "webgpu:shader,validation,expression,call,builtin,refract:args:*": { "subcaseMS": 106.512 }, "webgpu:shader,validation,expression,call,builtin,refract:must_use:*": { "subcaseMS": 5.935 }, + "webgpu:shader,validation,expression,call,builtin,refract:return:*": { "subcaseMS": 27.210 }, "webgpu:shader,validation,expression,call,builtin,refract:values:*": { "subcaseMS": 81326.953 }, "webgpu:shader,validation,expression,call,builtin,reverseBits:arguments:*": { "subcaseMS": 77.380 }, "webgpu:shader,validation,expression,call,builtin,reverseBits:float_argument:*": { "subcaseMS": 28.806 }, @@ -2243,6 +2247,7 @@ "webgpu:shader,validation,expression,call,builtin,tanh:must_use:*": { "subcaseMS": 6.270 }, "webgpu:shader,validation,expression,call,builtin,tanh:values:*": { "subcaseMS": 4590.491 }, "webgpu:shader,validation,expression,call,builtin,textureDimensions:level_argument,non_storage:*": { "subcaseMS": 1.884 }, + "webgpu:shader,validation,expression,call,builtin,textureDimensions:must_use:*": { "subcaseMS": 1.777 }, "webgpu:shader,validation,expression,call,builtin,textureDimensions:return_type,non_storage:*": { "subcaseMS": 1.640 }, "webgpu:shader,validation,expression,call,builtin,textureDimensions:return_type,storage:*": { "subcaseMS": 1.064 }, "webgpu:shader,validation,expression,call,builtin,textureDimensions:texture_type,non_storage:*": { "subcaseMS": 1.275 }, @@ -2250,6 +2255,7 @@ "webgpu:shader,validation,expression,call,builtin,textureGather:component_argument,non_const:*": { "subcaseMS": 1.731 }, "webgpu:shader,validation,expression,call,builtin,textureGather:component_argument:*": { "subcaseMS": 1.321 }, "webgpu:shader,validation,expression,call,builtin,textureGather:coords_argument:*": { "subcaseMS": 1.352 }, + "webgpu:shader,validation,expression,call,builtin,textureGather:must_use:*": { "subcaseMS": 2.873 }, "webgpu:shader,validation,expression,call,builtin,textureGather:offset_argument,non_const:*": { "subcaseMS": 1.231 }, "webgpu:shader,validation,expression,call,builtin,textureGather:offset_argument:*": { "subcaseMS": 1.534 }, "webgpu:shader,validation,expression,call,builtin,textureGather:return_type:*": { "subcaseMS": 1.481 }, @@ -2257,6 +2263,7 @@ "webgpu:shader,validation,expression,call,builtin,textureGatherCompare:array_index_argument:*": { "subcaseMS": 1.932 }, "webgpu:shader,validation,expression,call,builtin,textureGatherCompare:coords_argument:*": { "subcaseMS": 1.764 }, "webgpu:shader,validation,expression,call,builtin,textureGatherCompare:depth_ref_argument:*": { "subcaseMS": 1.753 }, + "webgpu:shader,validation,expression,call,builtin,textureGatherCompare:must_use:*": { "subcaseMS": 2.693 }, "webgpu:shader,validation,expression,call,builtin,textureGatherCompare:offset_argument,non_const:*": { "subcaseMS": 1.534 }, "webgpu:shader,validation,expression,call,builtin,textureGatherCompare:offset_argument:*": { "subcaseMS": 1.243 }, "webgpu:shader,validation,expression,call,builtin,textureGatherCompare:return_type:*": { "subcaseMS": 49.467 }, @@ -2266,30 +2273,37 @@ "webgpu:shader,validation,expression,call,builtin,textureLoad:coords_argument,non_storage:*": { "subcaseMS": 1.717 }, "webgpu:shader,validation,expression,call,builtin,textureLoad:coords_argument,storage:*": { "subcaseMS": 1.750 }, "webgpu:shader,validation,expression,call,builtin,textureLoad:level_argument,non_storage:*": { "subcaseMS": 1.113 }, + "webgpu:shader,validation,expression,call,builtin,textureLoad:must_use:*": { "subcaseMS": 1.666 }, "webgpu:shader,validation,expression,call,builtin,textureLoad:return_type,non_storage:*": { "subcaseMS": 128.581 }, "webgpu:shader,validation,expression,call,builtin,textureLoad:sample_index_argument,non_storage:*": { "subcaseMS": 1.395 }, "webgpu:shader,validation,expression,call,builtin,textureLoad:texture_type,non_storage:*": { "subcaseMS": 2.807 }, "webgpu:shader,validation,expression,call,builtin,textureLoad:texture_type,storage:*": { "subcaseMS": 1.690 }, + "webgpu:shader,validation,expression,call,builtin,textureNumLayers:must_use:*": { "subcaseMS": 1.246 }, "webgpu:shader,validation,expression,call,builtin,textureNumLayers:return_type,non_storage:*": { "subcaseMS": 1.195 }, "webgpu:shader,validation,expression,call,builtin,textureNumLayers:return_type,storage:*": { "subcaseMS": 1.436 }, "webgpu:shader,validation,expression,call,builtin,textureNumLayers:texture_type:*": { "subcaseMS": 1.493 }, + "webgpu:shader,validation,expression,call,builtin,textureNumLevels:must_use:*": { "subcaseMS": 2.351 }, "webgpu:shader,validation,expression,call,builtin,textureNumLevels:return_type:*": { "subcaseMS": 1.977 }, "webgpu:shader,validation,expression,call,builtin,textureNumLevels:texture_type:*": { "subcaseMS": 1.608 }, + "webgpu:shader,validation,expression,call,builtin,textureNumSamples:must_use:*": { "subcaseMS": 1.305 }, "webgpu:shader,validation,expression,call,builtin,textureNumSamples:return_type:*": { "subcaseMS": 1.650 }, "webgpu:shader,validation,expression,call,builtin,textureNumSamples:texture_type:*": { "subcaseMS": 1.514 }, "webgpu:shader,validation,expression,call,builtin,textureSample:array_index_argument:*": { "subcaseMS": 1.888 }, "webgpu:shader,validation,expression,call,builtin,textureSample:coords_argument:*": { "subcaseMS": 1.342 }, + "webgpu:shader,validation,expression,call,builtin,textureSample:must_use:*": { "subcaseMS": 2.412 }, "webgpu:shader,validation,expression,call,builtin,textureSample:offset_argument,non_const:*": { "subcaseMS": 1.604 }, "webgpu:shader,validation,expression,call,builtin,textureSample:offset_argument:*": { "subcaseMS": 1.401 }, "webgpu:shader,validation,expression,call,builtin,textureSample:only_in_fragment:*": { "subcaseMS": 1.121 }, "webgpu:shader,validation,expression,call,builtin,textureSample:return_type:*": { "subcaseMS": 1.888 }, "webgpu:shader,validation,expression,call,builtin,textureSample:texture_type:*": { "subcaseMS": 1.888 }, "webgpu:shader,validation,expression,call,builtin,textureSampleBaseClampToEdge:coords_argument:*": { "subcaseMS": 1.356 }, + "webgpu:shader,validation,expression,call,builtin,textureSampleBaseClampToEdge:must_use:*": { "subcaseMS": 2.387 }, "webgpu:shader,validation,expression,call,builtin,textureSampleBaseClampToEdge:return_type:*": { "subcaseMS": 1.797 }, "webgpu:shader,validation,expression,call,builtin,textureSampleBaseClampToEdge:texture_type:*": { "subcaseMS": 1.088 }, "webgpu:shader,validation,expression,call,builtin,textureSampleBias:array_index_argument:*": { "subcaseMS": 1.630 }, "webgpu:shader,validation,expression,call,builtin,textureSampleBias:bias_argument:*": { "subcaseMS": 1.102 }, "webgpu:shader,validation,expression,call,builtin,textureSampleBias:coords_argument:*": { "subcaseMS": 1.938 }, + "webgpu:shader,validation,expression,call,builtin,textureSampleBias:must_use:*": { "subcaseMS": 3.096 }, "webgpu:shader,validation,expression,call,builtin,textureSampleBias:offset_argument,non_const:*": { "subcaseMS": 1.985 }, "webgpu:shader,validation,expression,call,builtin,textureSampleBias:offset_argument:*": { "subcaseMS": 1.081 }, "webgpu:shader,validation,expression,call,builtin,textureSampleBias:only_in_fragment:*": { "subcaseMS": 1.181 }, @@ -2298,6 +2312,7 @@ "webgpu:shader,validation,expression,call,builtin,textureSampleCompare:array_index_argument:*": { "subcaseMS": 1.932 }, "webgpu:shader,validation,expression,call,builtin,textureSampleCompare:coords_argument:*": { "subcaseMS": 1.282 }, "webgpu:shader,validation,expression,call,builtin,textureSampleCompare:depth_ref_argument:*": { "subcaseMS": 1.563 }, + "webgpu:shader,validation,expression,call,builtin,textureSampleCompare:must_use:*": { "subcaseMS": 1.845 }, "webgpu:shader,validation,expression,call,builtin,textureSampleCompare:offset_argument,non_const:*": { "subcaseMS": 1.720 }, "webgpu:shader,validation,expression,call,builtin,textureSampleCompare:offset_argument:*": { "subcaseMS": 1.540 }, "webgpu:shader,validation,expression,call,builtin,textureSampleCompare:only_in_fragment:*": { "subcaseMS": 1.121 }, @@ -2306,6 +2321,7 @@ "webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:array_index_argument:*": { "subcaseMS": 1.989 }, "webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:coords_argument:*": { "subcaseMS": 1.932 }, "webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:depth_ref_argument:*": { "subcaseMS": 1.578 }, + "webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:must_use:*": { "subcaseMS": 2.807 }, "webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:offset_argument,non_const:*": { "subcaseMS": 1.347 }, "webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:offset_argument:*": { "subcaseMS": 1.619 }, "webgpu:shader,validation,expression,call,builtin,textureSampleCompareLevel:return_type:*": { "subcaseMS": 1.606 }, @@ -2314,6 +2330,7 @@ "webgpu:shader,validation,expression,call,builtin,textureSampleGrad:coords_argument:*": { "subcaseMS": 1.802 }, "webgpu:shader,validation,expression,call,builtin,textureSampleGrad:ddX_argument:*": { "subcaseMS": 1.882 }, "webgpu:shader,validation,expression,call,builtin,textureSampleGrad:ddY_argument:*": { "subcaseMS": 1.515 }, + "webgpu:shader,validation,expression,call,builtin,textureSampleGrad:must_use:*": { "subcaseMS": 2.775 }, "webgpu:shader,validation,expression,call,builtin,textureSampleGrad:offset_argument,non_const:*": { "subcaseMS": 1.987 }, "webgpu:shader,validation,expression,call,builtin,textureSampleGrad:offset_argument:*": { "subcaseMS": 1.317 }, "webgpu:shader,validation,expression,call,builtin,textureSampleGrad:return_type:*": { "subcaseMS": 111.578 }, @@ -2321,6 +2338,7 @@ "webgpu:shader,validation,expression,call,builtin,textureSampleLevel:array_index_argument:*": { "subcaseMS": 1.888 }, "webgpu:shader,validation,expression,call,builtin,textureSampleLevel:coords_argument:*": { "subcaseMS": 1.342 }, "webgpu:shader,validation,expression,call,builtin,textureSampleLevel:level_argument:*": { "subcaseMS": 1.422 }, + "webgpu:shader,validation,expression,call,builtin,textureSampleLevel:must_use:*": { "subcaseMS": 2.686 }, "webgpu:shader,validation,expression,call,builtin,textureSampleLevel:offset_argument,non_const:*": { "subcaseMS": 1.604 }, "webgpu:shader,validation,expression,call,builtin,textureSampleLevel:offset_argument:*": { "subcaseMS": 1.401 }, "webgpu:shader,validation,expression,call,builtin,textureSampleLevel:return_type:*": { "subcaseMS": 1.666 }, @@ -2367,6 +2385,7 @@ "webgpu:shader,validation,expression,call,builtin,value_constructor:matrix_copy:*": { "subcaseMS": 0.056 }, "webgpu:shader,validation,expression,call,builtin,value_constructor:matrix_elementwise:*": { "subcaseMS": 0.095 }, "webgpu:shader,validation,expression,call,builtin,value_constructor:matrix_zero_value:*": { "subcaseMS": 26.722 }, + "webgpu:shader,validation,expression,call,builtin,value_constructor:must_use:*": { "subcaseMS": 61.112 }, "webgpu:shader,validation,expression,call,builtin,value_constructor:scalar_value:*": { "subcaseMS": 39.728 }, "webgpu:shader,validation,expression,call,builtin,value_constructor:scalar_zero_value:*": { "subcaseMS": 538.303 }, "webgpu:shader,validation,expression,call,builtin,value_constructor:struct_value:*": { "subcaseMS": 5.548 }, @@ -2376,6 +2395,7 @@ "webgpu:shader,validation,expression,call,builtin,value_constructor:vector_mixed:*": { "subcaseMS": 460.069 }, "webgpu:shader,validation,expression,call,builtin,value_constructor:vector_splat:*": { "subcaseMS": 0.116 }, "webgpu:shader,validation,expression,call,builtin,value_constructor:vector_zero_value:*": { "subcaseMS": 21.684 }, + "webgpu:shader,validation,expression,call,builtin,workgroupUniformLoad:must_use:*": { "subcaseMS": 1.474 }, "webgpu:shader,validation,expression,call,builtin,workgroupUniformLoad:no_atomics:*": { "subcaseMS": 1.000 }, "webgpu:shader,validation,expression,call,builtin,workgroupUniformLoad:only_in_compute:*": { "subcaseMS": 1.000 }, "webgpu:shader,validation,expression,matrix,add_sub:invalid:*": { "subcaseMS": 59542.637 }, @@ -2511,8 +2531,6 @@ "webgpu:shader,validation,parse,literal:f32:*": { "subcaseMS": 1.393 }, "webgpu:shader,validation,parse,literal:i32:*": { "subcaseMS": 1.541 }, "webgpu:shader,validation,parse,literal:u32:*": { "subcaseMS": 1.379 }, - "webgpu:shader,validation,parse,must_use:builtin_must_use:*": { "subcaseMS": 1.400 }, - "webgpu:shader,validation,parse,must_use:builtin_no_must_use:*": { "subcaseMS": 1.206 }, "webgpu:shader,validation,parse,must_use:call:*": { "subcaseMS": 1.275 }, "webgpu:shader,validation,parse,must_use:declaration:*": { "subcaseMS": 1.523 }, "webgpu:shader,validation,parse,must_use:ignore_result_of_non_must_use_that_returns_call_of_must_use:*": { "subcaseMS": 0.000 }, diff --git a/src/webgpu/shader/validation/expression/call/builtin/abs.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/abs.spec.ts index 2b0375d7835f..246173cc93b3 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/abs.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/abs.spec.ts @@ -125,6 +125,10 @@ const kTests = { src: `_ = abs(1, 2);`, pass: false, }, + must_use: { + src: `abs(1);`, + pass: false, + }, }; g.test('parameters') diff --git a/src/webgpu/shader/validation/expression/call/builtin/acos.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/acos.spec.ts index d76bb470b061..60cc024a3695 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/acos.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/acos.spec.ts @@ -183,6 +183,11 @@ const kTests = { src: `_ = acos(-1.1f);`, pass: false, }, + + must_use: { + src: `acos(1);`, + pass: false, + }, }; g.test('parameters') diff --git a/src/webgpu/shader/validation/expression/call/builtin/acosh.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/acosh.spec.ts index 82da85fddebe..6bf4b4d7b2bf 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/acosh.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/acosh.spec.ts @@ -180,6 +180,11 @@ const kTests = { src: `_ = acosh(.9f);`, pass: false, }, + + must_use: { + src: `acosh(1);`, + pass: false, + }, }; g.test('parameters') diff --git a/src/webgpu/shader/validation/expression/call/builtin/arrayLength.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/arrayLength.spec.ts index 27d8814b1457..37fdee30898b 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/arrayLength.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/arrayLength.spec.ts @@ -107,3 +107,15 @@ fn main() { t.expectCompileResult(t.params.mode !== 'write', code); }); + +g.test('must_use') + .desc('Test that the result must be used') + .params(u => u.combine('use', [true, false] as const)) + .fn(t => { + const code = ` + @group(0) @binding(0) var v : array; + fn foo() { + ${t.params.use ? '_ =' : ''} arrayLength(&v); + }`; + t.expectCompileResult(t.params.use, code); + }); diff --git a/src/webgpu/shader/validation/expression/call/builtin/asin.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/asin.spec.ts index 16a193aec4fb..2d6238a45f37 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/asin.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/asin.spec.ts @@ -182,6 +182,11 @@ const kTests = { src: `_ = asin(-1.1f);`, pass: false, }, + + must_use: { + src: `asin(1);`, + pass: false, + }, }; g.test('parameters') diff --git a/src/webgpu/shader/validation/expression/call/builtin/asinh.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/asinh.spec.ts index 285ff2dcd275..c98537b1b1d9 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/asinh.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/asinh.spec.ts @@ -178,6 +178,11 @@ const kTests = { src: `_ = asinh(1, 2);`, pass: false, }, + + must_use: { + src: `asinh(1);`, + pass: false, + }, }; g.test('parameters') diff --git a/src/webgpu/shader/validation/expression/call/builtin/atan.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/atan.spec.ts index c5e964084df7..f5fd2a472ae9 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/atan.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/atan.spec.ts @@ -170,6 +170,11 @@ const kTests = { src: `_ = atan(1, 2);`, pass: false, }, + + must_use: { + src: `atan(1);`, + pass: false, + }, }; g.test('parameters') diff --git a/src/webgpu/shader/validation/expression/call/builtin/atan2.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/atan2.spec.ts index 731f254ad681..c124151caea1 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/atan2.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/atan2.spec.ts @@ -303,6 +303,12 @@ const kTests = { pass: false, is_f16: false, }, + + must_use: { + src: `atan2(1, 2);`, + pass: false, + is_f16: false, + }, }; g.test('parameters') diff --git a/src/webgpu/shader/validation/expression/call/builtin/atanh.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/atanh.spec.ts index 4eae8a71f09a..fd4479ea6ffd 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/atanh.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/atanh.spec.ts @@ -190,6 +190,11 @@ const kTests = { src: `_ = atanh(-1.1f);`, pass: false, }, + + must_use: { + src: `atanh(0.1);`, + pass: false, + }, }; g.test('parameters') diff --git a/src/webgpu/shader/validation/expression/call/builtin/bitcast.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/bitcast.spec.ts index 20c2c40664d7..6cee1d986b92 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/bitcast.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/bitcast.spec.ts @@ -391,3 +391,24 @@ fn main() { }`; t.expectCompileResult(true, code); }); + +g.test('must_use') + .desc('Test that bitcast result must be used') + .params(u => + u + .combine('case', [ + 'bitcast(1i)', + 'bitcast(1u)', + 'bitcast(vec2i())', + 'bitcast(vec3u())', + 'bitcast(vec4f())', + ] as const) + .combine('use', [true, false] as const) + ) + .fn(t => { + const code = ` + fn foo() { + ${t.params.use ? '_ =' : ''} ${t.params.case}; + }`; + t.expectCompileResult(t.params.use, code); + }); diff --git a/src/webgpu/shader/validation/expression/call/builtin/derivatives.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/derivatives.spec.ts index 54620ce17904..01b219d9f701 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/derivatives.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/derivatives.spec.ts @@ -127,3 +127,14 @@ fn foo() { }`; t.expectCompileResult(kArgumentTypes[t.params.type] === Type.f32 || t.params.call === '', code); }); + +g.test('must_use') + .desc('Tests that the result must be used') + .params(u => u.combine('use', [true, false] as const).combine('func', kDerivativeBuiltins)) + .fn(t => { + const code = ` + fn foo() { + ${t.params.use ? '_ =' : ''} ${t.params.func}(1.0); + }`; + t.expectCompileResult(t.params.use, code); + }); diff --git a/src/webgpu/shader/validation/expression/call/builtin/smoothstep.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/smoothstep.spec.ts index 643e5df09eed..3a7558eaf85b 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/smoothstep.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/smoothstep.spec.ts @@ -202,6 +202,11 @@ const kTests = { src: `_ = ${builtin}(1.0, 2.0, 3.0, 4.0);`, pass: false, }, + + must_use: { + src: `${builtin}(1.0,2.0,3.0);`, + pass: false, + }, }; g.test('arguments') diff --git a/src/webgpu/shader/validation/expression/call/builtin/textureDimensions.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/textureDimensions.spec.ts index 104b234efb0d..e4cf4d9ca2ad 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/textureDimensions.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/textureDimensions.spec.ts @@ -267,3 +267,15 @@ Validates that incompatible texture types don't work with ${builtin} t.expectCompileResult(expectSuccess, code); }); + +g.test('must_use') + .desc('Tests that the result must be used') + .params(u => u.combine('use', [true, false] as const)) + .fn(t => { + const code = ` + @group(0) @binding(0) var t : texture_2d; + fn foo() { + ${t.params.use ? '_ =' : ''} textureDimensions(t); + }`; + t.expectCompileResult(t.params.use, code); + }); diff --git a/src/webgpu/shader/validation/expression/call/builtin/textureGather.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/textureGather.spec.ts index 57b60b56dcc8..ff78349cbffa 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/textureGather.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/textureGather.spec.ts @@ -488,3 +488,16 @@ Validates that incompatible texture types don't work with ${builtin} const expectSuccess = typesMatch; t.expectCompileResult(expectSuccess, code); }); + +g.test('must_use') + .desc('Tests that the result must be used') + .params(u => u.combine('use', [true, false] as const)) + .fn(t => { + const code = ` + @group(0) @binding(0) var t : texture_2d; + @group(0) @binding(1) var s : sampler; + fn foo() { + ${t.params.use ? '_ =' : ''} textureGather(0, t, s, vec2(0,0)); + }`; + t.expectCompileResult(t.params.use, code); + }); diff --git a/src/webgpu/shader/validation/expression/call/builtin/textureGatherCompare.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/textureGatherCompare.spec.ts index 1cfa1d52fc39..297b950bd771 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/textureGatherCompare.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/textureGatherCompare.spec.ts @@ -358,3 +358,16 @@ Validates that incompatible texture types don't work with ${builtin} const expectSuccess = typesMatch; t.expectCompileResult(expectSuccess, code); }); + +g.test('must_use') + .desc('Tests that the result must be used') + .params(u => u.combine('use', [true, false] as const)) + .fn(t => { + const code = ` + @group(0) @binding(0) var t : texture_depth_2d; + @group(0) @binding(1) var s : sampler_comparison; + fn foo() { + ${t.params.use ? '_ =' : ''} textureGatherCompare(t, s, vec2(0,0), 0); + }`; + t.expectCompileResult(t.params.use, code); + }); diff --git a/src/webgpu/shader/validation/expression/call/builtin/textureLoad.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/textureLoad.spec.ts index 606f0d5dd7d0..a3dd270d71b6 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/textureLoad.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/textureLoad.spec.ts @@ -526,3 +526,15 @@ Validates that incompatible texture types don't work with ${builtin} t.expectCompileResult(expectSuccess, code); }); + +g.test('must_use') + .desc('Tests that the result must be used') + .params(u => u.combine('use', [true, false] as const)) + .fn(t => { + const code = ` + @group(0) @binding(0) var t : texture_2d; + fn foo() { + ${t.params.use ? '_ =' : ''} textureLoad(t, vec2(0,0), 0); + }`; + t.expectCompileResult(t.params.use, code); + }); diff --git a/src/webgpu/shader/validation/expression/call/builtin/textureNumLayers.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/textureNumLayers.spec.ts index 4dba68b5d8ef..34efb425eb71 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/textureNumLayers.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/textureNumLayers.spec.ts @@ -126,3 +126,15 @@ Validates that incompatible texture types don't work with ${builtin} t.expectCompileResult(expectSuccess, code); }); + +g.test('must_use') + .desc('Tests that the result must be used') + .params(u => u.combine('use', [true, false] as const)) + .fn(t => { + const code = ` + @group(0) @binding(0) var t : texture_2d_array; + fn foo() { + ${t.params.use ? '_ =' : ''} textureNumLayers(t); + }`; + t.expectCompileResult(t.params.use, code); + }); diff --git a/src/webgpu/shader/validation/expression/call/builtin/textureNumLevels.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/textureNumLevels.spec.ts index 74e6fb42c508..988c6b56c63f 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/textureNumLevels.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/textureNumLevels.spec.ts @@ -95,3 +95,15 @@ Validates that incompatible texture types don't work with ${builtin} t.expectCompileResult(expectSuccess, code); }); + +g.test('must_use') + .desc('Tests that the result must be used') + .params(u => u.combine('use', [true, false] as const)) + .fn(t => { + const code = ` + @group(0) @binding(0) var t : texture_2d; + fn foo() { + ${t.params.use ? '_ =' : ''} textureNumLevels(t); + }`; + t.expectCompileResult(t.params.use, code); + }); diff --git a/src/webgpu/shader/validation/expression/call/builtin/textureNumSamples.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/textureNumSamples.spec.ts index 35345c31c57c..f288e740123b 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/textureNumSamples.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/textureNumSamples.spec.ts @@ -87,3 +87,15 @@ Validates that incompatible texture types don't work with ${builtin} t.expectCompileResult(expectSuccess, code); }); + +g.test('must_use') + .desc('Tests that the result must be used') + .params(u => u.combine('use', [true, false] as const)) + .fn(t => { + const code = ` + @group(0) @binding(0) var t : texture_multisampled_2d; + fn foo() { + ${t.params.use ? '_ =' : ''} textureDimensions(t); + }`; + t.expectCompileResult(t.params.use, code); + }); diff --git a/src/webgpu/shader/validation/expression/call/builtin/textureSample.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/textureSample.spec.ts index 58e0280a450c..5274826b016a 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/textureSample.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/textureSample.spec.ts @@ -376,3 +376,16 @@ Validates that incompatible texture types don't work with ${builtin} const expectSuccess = testTextureType === textureType || typesMatch; t.expectCompileResult(expectSuccess, code); }); + +g.test('must_use') + .desc('Tests that the result must be used') + .params(u => u.combine('use', [true, false] as const)) + .fn(t => { + const code = ` + @group(0) @binding(0) var t : texture_2d; + @group(0) @binding(1) var s : sampler; + fn foo() { + ${t.params.use ? '_ =' : ''} textureSample(t, s, vec2(0,0)); + }`; + t.expectCompileResult(t.params.use, code); + }); diff --git a/src/webgpu/shader/validation/expression/call/builtin/textureSampleBaseClampToEdge.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/textureSampleBaseClampToEdge.spec.ts index 894dfef1cee4..cf8f8e5bdaec 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/textureSampleBaseClampToEdge.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/textureSampleBaseClampToEdge.spec.ts @@ -109,3 +109,16 @@ Validates that incompatible texture types don't work with ${builtin} const expectSuccess = kTextureSampleBaseClampToEdgeTextureTypes.includes(testTextureType); t.expectCompileResult(expectSuccess, code); }); + +g.test('must_use') + .desc('Tests that the result must be used') + .params(u => u.combine('use', [true, false] as const)) + .fn(t => { + const code = ` + @group(0) @binding(0) var t : texture_2d; + @group(0) @binding(1) var s : sampler; + fn foo() { + ${t.params.use ? '_ =' : ''} textureSampleBaseClampToEdge(t,s, vec2(0,0)); + }`; + t.expectCompileResult(t.params.use, code); + }); diff --git a/src/webgpu/shader/validation/expression/call/builtin/textureSampleBias.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/textureSampleBias.spec.ts index bdfa328fce4f..465c7a0f9a4f 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/textureSampleBias.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/textureSampleBias.spec.ts @@ -396,3 +396,16 @@ Validates that incompatible texture types don't work with ${builtin} const expectSuccess = testTextureType === textureType || typesMatch; t.expectCompileResult(expectSuccess, code); }); + +g.test('must_use') + .desc('Tests that the result must be used') + .params(u => u.combine('use', [true, false] as const)) + .fn(t => { + const code = ` + @group(0) @binding(0) var t : texture_2d; + @group(0) @binding(1) var s : sampler; + fn foo() { + ${t.params.use ? '_ =' : ''} textureSampleBias(t, s, vec2(0,0), 0); + }`; + t.expectCompileResult(t.params.use, code); + }); diff --git a/src/webgpu/shader/validation/expression/call/builtin/textureSampleCompare.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/textureSampleCompare.spec.ts index d99b842f00b0..f23290cd5f40 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/textureSampleCompare.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/textureSampleCompare.spec.ts @@ -399,3 +399,16 @@ Validates that incompatible texture types don't work with ${builtin} const expectSuccess = testTextureType === textureType || typesMatch; t.expectCompileResult(expectSuccess, code); }); + +g.test('must_use') + .desc('Tests that the result must be used') + .params(u => u.combine('use', [true, false] as const)) + .fn(t => { + const code = ` + @group(0) @binding(0) var t : texture_depth_2d; + @group(0) @binding(1) var s : sampler_comparison; + fn foo() { + ${t.params.use ? '_ =' : ''} textureSampleCompare(t,s,vec2(0,0),0); + }`; + t.expectCompileResult(t.params.use, code); + }); diff --git a/src/webgpu/shader/validation/expression/call/builtin/textureSampleCompareLevel.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/textureSampleCompareLevel.spec.ts index 957e755cea81..12567699b0b8 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/textureSampleCompareLevel.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/textureSampleCompareLevel.spec.ts @@ -358,3 +358,16 @@ Validates that incompatible texture types don't work with ${builtin} const expectSuccess = testTextureType === textureType || typesMatch; t.expectCompileResult(expectSuccess, code); }); + +g.test('must_use') + .desc('Tests that the result must be used') + .params(u => u.combine('use', [true, false] as const)) + .fn(t => { + const code = ` + @group(0) @binding(0) var t : texture_depth_2d; + @group(0) @binding(1) var s : sampler_comparison; + fn foo() { + ${t.params.use ? '_ =' : ''} textureSampleCompareLevel(t, s, vec2(0,0), 0); + }`; + t.expectCompileResult(t.params.use, code); + }); diff --git a/src/webgpu/shader/validation/expression/call/builtin/textureSampleGrad.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/textureSampleGrad.spec.ts index 250ef9b8638e..3cac98b02f8d 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/textureSampleGrad.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/textureSampleGrad.spec.ts @@ -405,3 +405,16 @@ Validates that incompatible texture types don't work with ${builtin} const expectSuccess = testTextureType === textureType || typesMatch; t.expectCompileResult(expectSuccess, code); }); + +g.test('must_use') + .desc('Tests that the result must be used') + .params(u => u.combine('use', [true, false] as const)) + .fn(t => { + const code = ` + @group(0) @binding(0) var t : texture_2d; + @group(0) @binding(1) var s : sampler; + fn foo() { + ${t.params.use ? '_ =' : ''} textureSampleGrad(t,s,vec2(0,0),vec2(0,0),vec2(0,0)); + }`; + t.expectCompileResult(t.params.use, code); + }); diff --git a/src/webgpu/shader/validation/expression/call/builtin/textureSampleLevel.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/textureSampleLevel.spec.ts index a6a551c00c6a..b61d0656dfdd 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/textureSampleLevel.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/textureSampleLevel.spec.ts @@ -373,3 +373,16 @@ Validates that incompatible texture types don't work with ${builtin} const expectSuccess = testTextureType === textureType || typesMatch; t.expectCompileResult(expectSuccess, code); }); + +g.test('must_use') + .desc('Tests that the result must be used') + .params(u => u.combine('use', [true, false] as const)) + .fn(t => { + const code = ` + @group(0) @binding(0) var t : texture_2d; + @group(0) @binding(1) var s : sampler; + fn foo() { + ${t.params.use ? '_ =' : ''} textureSampleLevel(t,s,vec2(0,0), 0); + }`; + t.expectCompileResult(t.params.use, code); + }); diff --git a/src/webgpu/shader/validation/expression/call/builtin/value_constructor.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/value_constructor.spec.ts index c5bf8b252316..c4d162c26517 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/value_constructor.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/value_constructor.spec.ts @@ -662,3 +662,66 @@ g.test('struct_value') const x : ${testcase.name} = ${testcase.name}(${testcase.values});`; t.expectCompileResult(testcase.valid, code); }); + +const kConstructors = { + u32_0: 'u32()', + i32_0: 'i32()', + bool_0: 'bool()', + f32_0: 'f32()', + f16_0: 'f16()', + vec2_0: 'vec2()', + vec3_0: 'vec3()', + vec4_0: 'vec4()', + mat2x2_0: 'mat2x2f()', + mat2x3_0: 'mat2x3f()', + mat2x4_0: 'mat2x4f()', + mat3x2_0: 'mat3x2f()', + mat3x3_0: 'mat3x3f()', + mat3x4_0: 'mat3x4f()', + mat4x2_0_f16: 'mat4x2h()', + mat4x3_0_f16: 'mat4x3h()', + mat4x4_0_f16: 'mat4x4h()', + S_0: 'S()', + array_0: 'array()', + u32: 'u32(1)', + i32: 'i32(1)', + bool: 'bool(true)', + f32: 'f32(1)', + f16: 'f16(1)', + vec2f: 'vec2(1)', + vec3_f16: 'vec3(1)', + vec4: 'vec4(1)', + mat2x2: 'mat2x2f(1,1,1,1)', + mat2x3: 'mat2x3f(1,1,1,1,1,1)', + mat2x4: 'mat2x4f(1,1,1,1,1,1,1,1)', + mat3x2_f16: 'mat3x2(vec2h(),vec2h(),vec2h())', + mat3x3_f16: 'mat3x3(vec3h(),vec3h(),vec3h())', + mat3x4_f16: 'mat3x4(vec4h(),vec4h(),vec4h())', + mat4x2: 'mat4x2(vec2(),vec2(),vec2(),vec2())', + mat4x3: 'mat4x3(vec3(),vec3(),vec3(),vec3())', + mat4x4: 'mat4x4(vec4(),vec4(),vec4(),vec4())', + S: 'S(1,1)', + array_abs: 'array(1,2,3)', + array: 'array(1,2,3,4)', +}; + +g.test('must_use') + .desc('Tests that value constructors must be used') + .params(u => u.combine('ctor', keysOf(kConstructors)).combine('use', [true, false] as const)) + .beforeAllSubcases(t => { + if (t.params.ctor.includes('f16')) { + t.selectDeviceOrSkipTestCase('shader-f16'); + } + }) + .fn(t => { + const code = ` + ${t.params.ctor.includes('f16') ? 'enable f16;' : ''} + struct S { + x : u32, + y : f32, + } + fn foo() { + ${t.params.use ? '_ =' : ''} ${kConstructors[t.params.ctor]}; + }`; + t.expectCompileResult(t.params.use, code); + }); diff --git a/src/webgpu/shader/validation/expression/call/builtin/workgroupUniformLoad.spec.ts b/src/webgpu/shader/validation/expression/call/builtin/workgroupUniformLoad.spec.ts index ac7fd042eb5d..daa510494b89 100644 --- a/src/webgpu/shader/validation/expression/call/builtin/workgroupUniformLoad.spec.ts +++ b/src/webgpu/shader/validation/expression/call/builtin/workgroupUniformLoad.spec.ts @@ -120,3 +120,15 @@ fn foo() { }`; t.expectCompileResult(t.params.type === 'bool' || t.params.call === 'bar()', code); }); + +g.test('must_use') + .desc('Tests that the result must be used') + .params(u => u.combine('use', [true, false] as const)) + .fn(t => { + const code = ` + var v : u32; + fn foo() { + ${t.params.use ? '_ =' : ''} workgroupUniformLoad(&v); + }`; + t.expectCompileResult(t.params.use, code); + }); diff --git a/src/webgpu/shader/validation/parse/must_use.spec.ts b/src/webgpu/shader/validation/parse/must_use.spec.ts index ced5954a7d57..80bb8fba6b3f 100644 --- a/src/webgpu/shader/validation/parse/must_use.spec.ts +++ b/src/webgpu/shader/validation/parse/must_use.spec.ts @@ -130,191 +130,3 @@ g.test('ignore_result_of_non_must_use_that_returns_call_of_must_use') t.expectCompileResult(true, wgsl); }); - -const kMustUseBuiltinCalls = { - // Type constructors - u32: `u32()`, - i32: `i32(0)`, - struct: `S()`, - // Reinterpretation - bitcast: `bitcast(8u)`, - // Logical - all: `all(vec2(true))`, - any: `any(vec2(true))`, - select: `select(0i, 1i, true)`, - // Array - arrayLength: `arrayLength(&storage_var)`, - // Numeric - abs: `abs(0.5)`, - acos: `acos(0.5)`, - acosh: `acosh(1.0)`, - asin: `asin(0.5)`, - asinh: `asinh(0.5)`, - atan: `atan(0.5)`, - atanh: `atanh(0.5)`, - atan2: `atan2(0.5, 0.5)`, - ceil: `ceil(0.5)`, - clamp: `clamp(0.5, 0.1, 1.0)`, - cos: `cos(0.5)`, - cosh: `cosh(0.5)`, - countLeadingZeros: `countLeadingZeros(0)`, - countOneBits: `countOneBits(0)`, - countTrailingZeros: `countTrailingZeros(0)`, - cross: `cross(vec3f(), vec3f())`, - degrees: `degrees(0.5)`, - determinant: `determinant(mat2x2f())`, - distance: `distance(0.5, 0.5)`, - dot: `dot(vec2f(0.5, 0.5), vec2f(0.5, 0.5))`, - exp: `exp(0.5)`, - exp2: `exp2(0.5)`, - extractBits: `extractBits(0, 0, 1)`, - faceForward: `faceForward(vec2f(), vec2f(), vec2f())`, - firstLeadingBit: `firstLeadingBit(0)`, - firstTrailingBit: `firstTrailingBit(0)`, - floor: `floor(0.5)`, - fma: `fma(0.5, 0.5, 0.5)`, - fract: `fract(0.5)`, - frexp: `frexp(0.5)`, - insertBits: `insertBits(0, 0, 0, 1)`, - inverseSqrt: `inverseSqrt(0.5)`, - ldexp: `ldexp(0.5, 1)`, - length: `length(0.5)`, - log: `log(0.5)`, - log2: `log2(0.5)`, - max: `max(0, 0)`, - min: `min(0, 0)`, - mix: `mix(0.5, 0.5, 0.5)`, - modf: `modf(0.5)`, - normalize: `normalize(vec2f(0.5, 0.5))`, - pow: `pow(0.5, 0.5)`, - quantizeToF16: `quantizeToF16(0.5)`, - radians: `radians(0.5)`, - reflect: `reflect(vec2f(0.5, 0.5), vec2f(0.5, 0.5))`, - refract: `refract(vec2f(0.5, 0.5), vec2f(0.5, 0.5), 0.5)`, - reverseBits: `reverseBits(0)`, - round: `round(0.5)`, - saturate: `saturate(0.5)`, - sign: `sign(0.5)`, - sin: `sin(0.5)`, - sinh: `sinh(0.5)`, - smoothstep: `smoothstep(0.1, 1.0, 0.5)`, - sqrt: `sqrt(0.5)`, - step: `step(0.1, 0.5)`, - tan: `tan(0.5)`, - tanh: `tanh(0.5)`, - transpose: `transpose(mat2x2f())`, - trunc: `trunc(0.5)`, - // Derivative - dpdx: `dpdx(0.5)`, - dpdxCoarse: `dpdxCoarse(0.5)`, - dpdxFine: `dpdxFine(0.5)`, - dpdy: `dpdy(0.5)`, - dpdyCoarse: `dpdyCoarse(0.5)`, - dpdyFine: `dpdyFine(0.5)`, - fwidth: `fwidth(0.5)`, - fwidthCoarse: `fwidthCoarse(0.5)`, - fwidthFine: `fwidthFine(0.5)`, - // Texture - textureDimensions: `textureDimensions(tex_2d)`, - textureGather: `textureGather(0, tex_2d, s, vec2f(0,0))`, - textureGatherCompare: `textureGatherCompare(tex_depth_2d, s_comp, vec2f(0,0), 0)`, - textureLoad: `textureLoad(tex_2d, vec2i(0,0), 0)`, - textureNumLayers: `textureNumLayers(tex_array_2d)`, - textureNumLevels: `textureNumLevels(tex_2d)`, - textureNumSamples: `textureNumSamples(tex_multi_2d)`, - textureSample: `textureSample(tex_2d, s, vec2f(0,0))`, - textureSampleBias: `textureSampleBias(tex_2d, s, vec2f(0,0), 0)`, - textureSampleCompare: `textureSampleCompare(tex_depth_2d, s_comp, vec2f(0,0), 0)`, - textureSampleCompareLevel: `textureSampleCompareLevel(tex_depth_2d, s_comp, vec2f(0,0), 0)`, - textureSampleGrad: `textureSampleGrad(tex_2d, s, vec2f(0,0), vec2f(0,0), vec2f(0,0))`, - textureSampleLevel: `textureSampleLevel(tex_2d, s, vec2f(0,0), 0)`, - textureSampleBaseClampToEdge: `textureSampleBaseClampToEdge(tex_2d, s, vec2f(0,0))`, - // Data Packing - pack4x8snorm: `pack4x8snorm(vec4f())`, - pack4x8unorm: `pack4x8unorm(vec4f())`, - pack2x16snorm: `pack2x16snorm(vec2f())`, - pack2x16unorm: `pack2x16unorm(vec2f())`, - pack2x16float: `pack2x16float(vec2f())`, - // Data Unpacking - unpack4x8snorm: `unpack4x8snorm(0)`, - unpack4x8unorm: `unpack4x8unorm(0)`, - unpack2x16snorm: `unpack2x16snorm(0)`, - unpack2x16unorm: `unpack2x16unorm(0)`, - unpack2x16float: `unpack2x16float(0)`, - // Synchronization - workgroupUniformLoad: `workgroupUniformLoad(&wg_var)`, -}; - -g.test('builtin_must_use') - .desc(`Validate must_use built-in functions`) - .params(u => - u.combine('call', keysOf(kMustUseBuiltinCalls)).combine('use', [true, false] as const) - ) - .fn(t => { - let call = kMustUseBuiltinCalls[t.params.call]; - if (t.params.use) { - call = `_ = ${call}`; - } - const code = ` -struct S { - x : u32 -} - -@group(0) @binding(0) -var storage_var : array; -@group(0) @binding(1) -var tex_2d : texture_2d; -@group(0) @binding(2) -var s : sampler; -@group(0) @binding(3) -var tex_depth_2d : texture_depth_2d; -@group(0) @binding(4) -var s_comp : sampler_comparison; -@group(0) @binding(5) -var tex_storage_2d : texture_storage_2d; -@group(0) @binding(6) -var tex_multi_2d : texture_multisampled_2d; -@group(0) @binding(7) -var tex_array_2d : texture_2d_array; - -var wg_var : u32; - -fn foo() { - ${call}; -}`; - - t.expectCompileResult(t.params.use, code); - }); - -const kNoMustUseBuiltinCalls = { - atomicLoad: `atomicLoad(&a)`, - atomicAdd: `atomicAdd(&a, 0)`, - atomicSub: `atomicSub(&a, 0)`, - atomicMax: `atomicMax(&a, 0)`, - atomicMin: `atomicMin(&a, 0)`, - atomicAnd: `atomicAnd(&a, 0)`, - atomicOr: `atomicOr(&a, 0)`, - atomicXor: `atomicXor(&a, 0)`, - atomicExchange: `atomicExchange(&a, 0)`, - atomicCompareExchangeWeak: `atomicCompareExchangeWeak(&a, 0, 0)`, -}; - -g.test('builtin_no_must_use') - .desc(`Validate built-in functions without must_use`) - .params(u => - u.combine('call', keysOf(kNoMustUseBuiltinCalls)).combine('use', [true, false] as const) - ) - .fn(t => { - let call = kNoMustUseBuiltinCalls[t.params.call]; - if (t.params.use) { - call = `_ = ${call}`; - } - const code = ` -var a : atomic; - -fn foo() { - ${call}; -}`; - - t.expectCompileResult(true, code); - });