[spirv-reader][ir] Add direct translation GLSL 450 methods Add support for the GLSL STD450 extension which does a direct translation of the parameters. Bug: 42250952 Change-Id: I5343c5ea1221481cf90745fcf8a3469e8a3cbc5b Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/220694 Reviewed-by: James Price <jrprice@google.com> Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/spirv/reader/import_glsl_std450_test.cc b/src/tint/lang/spirv/reader/import_glsl_std450_test.cc index f752916..0434bc1 100644 --- a/src/tint/lang/spirv/reader/import_glsl_std450_test.cc +++ b/src/tint/lang/spirv/reader/import_glsl_std450_test.cc
@@ -38,32 +38,6 @@ OpEntryPoint GLCompute %100 "main" OpExecutionMode %100 LocalSize 1 1 1 - OpName %u1 "u1" - OpName %u2 "u2" - OpName %u3 "u3" - OpName %i1 "i1" - OpName %i2 "i2" - OpName %i3 "i3" - OpName %f1 "f1" - OpName %f2 "f2" - OpName %f3 "f3" - OpName %v2u1 "v2u1" - OpName %v2u2 "v2u2" - OpName %v2u3 "v2u3" - OpName %v2i1 "v2i1" - OpName %v2i2 "v2i2" - OpName %v2i3 "v2i3" - OpName %v2f1 "v2f1" - OpName %v2f2 "v2f2" - OpName %v2f3 "v2f3" - OpName %v3f1 "v3f1" - OpName %v3f2 "v3f2" - OpName %v4f1 "v4f1" - OpName %v4f2 "v4f2" - OpName %m2x2f1 "m2x2f1" - OpName %m3x3f1 "m3x3f1" - OpName %m4x4f1 "m4x4f1" - %void = OpTypeVoid %voidfn = OpTypeFunction %void @@ -111,40 +85,6 @@ %100 = OpFunction %void None %voidfn %entry = OpLabel - - %u1 = OpCopyObject %uint %uint_10 - %u2 = OpCopyObject %uint %uint_15 - %u3 = OpCopyObject %uint %uint_20 - - %i1 = OpCopyObject %int %int_30 - %i2 = OpCopyObject %int %int_35 - %i3 = OpCopyObject %int %int_40 - - %f1 = OpCopyObject %float %float_50 - %f2 = OpCopyObject %float %float_60 - %f3 = OpCopyObject %float %float_70 - - %v2u1 = OpCopyObject %v2uint %v2uint_10_20 - %v2u2 = OpCopyObject %v2uint %v2uint_20_10 - %v2u3 = OpCopyObject %v2uint %v2uint_15_15 - - %v2i1 = OpCopyObject %v2int %v2int_30_40 - %v2i2 = OpCopyObject %v2int %v2int_40_30 - %v2i3 = OpCopyObject %v2int %v2int_35_35 - - %v2f1 = OpCopyObject %v2float %v2float_50_60 - %v2f2 = OpCopyObject %v2float %v2float_60_50 - %v2f3 = OpCopyObject %v2float %v2float_70_70 - - %v3f1 = OpCopyObject %v3float %v3float_50_60_70 - %v3f2 = OpCopyObject %v3float %v3float_60_70_50 - - %v4f1 = OpCopyObject %v4float %v4float_50_50_50_50 - %v4f2 = OpCopyObject %v4float %v4f1 - - %m2x2f1 = OpCopyObject %mat2v2float %mat2v2float_50_60 - %m3x3f1 = OpCopyObject %mat3v3float %mat3v3float_50_60_70 - %m4x4f1 = OpCopyObject %mat4v4float %mat4v4float_50_50_50_50 )"; } @@ -187,10 +127,11 @@ using SpirvReaderTest_GlslStd450_Uinting_UintingUintingUinting = SpirvReaderTestWithParam<GlslStd450Case>; -TEST_P(SpirvReaderTest_GlslStd450_Float_Floating, DISABLED_Scalar) { +TEST_P(SpirvReaderTest_GlslStd450_Float_Floating, Scalar) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %float %glsl )" + - GetParam().opcode + R"( %f1 + GetParam().opcode + R"( %float_50 + %2 = OpCopyObject %float %1 OpReturn OpFunctionEnd )", @@ -198,215 +139,257 @@ R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((f1);"); + %2:f32 = )" + GetParam().wgsl_func + + R"( 50.0f + %3:f32 = let %2 + ret } } )"); } -TEST_P(SpirvReaderTest_GlslStd450_Float_Floating, DISABLED_Vector) { +TEST_P(SpirvReaderTest_GlslStd450_Float_Floating, Vector) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %float %glsl )" + - GetParam().opcode + R"( %v2f1 + GetParam().opcode + R"( %v2float_50_60 + %2 = OpCopyObject %float %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((v2f1); + %2:f32 = )" + GetParam().wgsl_func + + R"( vec2<f32>(50.0f, 60.0f) + %3:f32 = let %2 + ret } } )"); } -TEST_P(SpirvReaderTest_GlslStd450_Float_FloatingFloating, DISABLED_Scalar) { +TEST_P(SpirvReaderTest_GlslStd450_Float_FloatingFloating, Scalar) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %float %glsl )" + - GetParam().opcode + R"( %f1 %f2 + GetParam().opcode + R"( %float_50 %float_60 + %2 = OpCopyObject %float %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((f1, f2);" + %2:f32 = )" + GetParam().wgsl_func + + R"( 50.0f, 60.0f + %3:f32 = let %2 + ret } } )"); } -TEST_P(SpirvReaderTest_GlslStd450_Float_FloatingFloating, DISABLED_Vector) { +TEST_P(SpirvReaderTest_GlslStd450_Float_FloatingFloating, Vector) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %float %glsl )" + - GetParam().opcode + R"( %v2f1 %v2f2 + GetParam().opcode + R"( %v2float_50_60 %v2float_60_50 + %2 = OpCopyObject %float %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((v2f1, v2f2); + %2:f32 = )" + GetParam().wgsl_func + + R"( vec2<f32>(50.0f, 60.0f), vec2<f32>(60.0f, 50.0f) + %3:f32 = let %2 + ret } } )"); } -TEST_P(SpirvReaderTest_GlslStd450_Floating_Floating, DISABLED_Scalar) { +TEST_P(SpirvReaderTest_GlslStd450_Floating_Floating, Scalar) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %float %glsl )" + - GetParam().opcode + R"( %f1 + GetParam().opcode + R"( %float_50 + %2 = OpCopyObject %float %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((f1); + %2:f32 = )" + GetParam().wgsl_func + + R"( 50.0f + %3:f32 = let %2 + ret } -} -)"); +})"); } -TEST_P(SpirvReaderTest_GlslStd450_Floating_Floating, DISABLED_Vector) { +TEST_P(SpirvReaderTest_GlslStd450_Floating_Floating, Vector) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %v2float %glsl )" + - GetParam().opcode + R"( %v2f1 + GetParam().opcode + R"( %v2float_50_60 + %2 = OpCopyObject %v2float %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((v2f1); + %2:vec2<f32> = )" + + GetParam().wgsl_func + + R"( vec2<f32>(50.0f, 60.0f) + %3:vec2<f32> = let %2 + ret } } )"); } -TEST_P(SpirvReaderTest_GlslStd450_Floating_FloatingFloating, DISABLED_Scalar) { +TEST_P(SpirvReaderTest_GlslStd450_Floating_FloatingFloating, Scalar) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %float %glsl )" + - GetParam().opcode + R"( %f1 %f2 + GetParam().opcode + R"( %float_50 %float_60 + %2 = OpCopyObject %float %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((f1, f2); + %2:f32 = )" + GetParam().wgsl_func + + R"( 50.0f, 60.0f + %3:f32 = let %2 + ret } } )"); } -TEST_P(SpirvReaderTest_GlslStd450_Floating_FloatingFloating, DISABLED_Vector) { +TEST_P(SpirvReaderTest_GlslStd450_Floating_FloatingFloating, Vector) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %v2float %glsl )" + - GetParam().opcode + R"( %v2f1 %v2f2 + GetParam().opcode + R"( %v2float_50_60 %v2float_60_50 + %2 = OpCopyObject %v2float %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((v2f1, v2f2); + %2:vec2<f32> = )" + + GetParam().wgsl_func + + R"( vec2<f32>(50.0f, 60.0f), vec2<f32>(60.0f, 50.0f) + %3:vec2<f32> = let %2 + ret } } )"); } -TEST_P(SpirvReaderTest_GlslStd450_Floating_FloatingFloatingFloating, DISABLED_Scalar) { +TEST_P(SpirvReaderTest_GlslStd450_Floating_FloatingFloatingFloating, Scalar) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %float %glsl )" + - GetParam().opcode + R"( %f1 %f2 %f3 + GetParam().opcode + R"( %float_50 %float_60 %float_70 + %2 = OpCopyObject %float %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((f1, f2, f3); + %2:f32 = )" + GetParam().wgsl_func + + R"( 50.0f, 60.0f, 70.0f + %3:f32 = let %2 + ret } } )"); } -TEST_P(SpirvReaderTest_GlslStd450_Floating_FloatingFloatingFloating, DISABLED_Vector) { +TEST_P(SpirvReaderTest_GlslStd450_Floating_FloatingFloatingFloating, Vector) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %v2float %glsl )" + GetParam().opcode + - R"( %v2f1 %v2f2 %v2f3 + R"( %v2float_50_60 %v2float_60_50 %v2float_70_70 + %2 = OpCopyObject %v2float %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((v2f1, v2f2, v2f3); + %2:vec2<f32> = )" + + GetParam().wgsl_func + + R"( vec2<f32>(50.0f, 60.0f), vec2<f32>(60.0f, 50.0f), vec2<f32>(70.0f) + %3:vec2<f32> = let %2 + ret } } )"); } -TEST_P(SpirvReaderTest_GlslStd450_Floating_FloatingInting, DISABLED_Scalar) { +TEST_P(SpirvReaderTest_GlslStd450_Floating_FloatingInting, Scalar) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %float %glsl )" + - GetParam().opcode + R"( %f1 %i1 + GetParam().opcode + R"( %float_50 %int_30 + %2 = OpCopyObject %float %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((f1, i1); -} + %2:f32 = )" + GetParam().wgsl_func + + R"( 50.0f, 30i + %3:f32 = let %2 + ret + } } )"); } -TEST_P(SpirvReaderTest_GlslStd450_Floating_FloatingInting, DISABLED_Vector) { +TEST_P(SpirvReaderTest_GlslStd450_Floating_FloatingInting, Vector) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %v2float %glsl )" + GetParam().opcode + - R"( %v2f1 %v2i1 + R"( %v2float_50_60 %v2int_30_40 + %2 = OpCopyObject %v2float %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((v2f1, v2i1); + %2:vec2<f32> = )" + + GetParam().wgsl_func + + R"( vec2<f32>(50.0f, 60.0f), vec2<i32>(30i, 40i) + %3:vec2<f32> = let %2 + ret } } )"); } -TEST_P(SpirvReaderTest_GlslStd450_Float3_Float3Float3, DISABLED_SpirvReader) { +TEST_P(SpirvReaderTest_GlslStd450_Float3_Float3Float3, SpirvParser) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %v3float %glsl )" + GetParam().opcode + - R"( %v3f1 %v3f2 + R"( %v3float_50_60_70 %v3float_60_70_50 + %2 = OpCopyObject %v3float %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((v3f1, v3f2); + %2:vec3<f32> = )" + + GetParam().wgsl_func + + R"( vec3<f32>(50.0f, 60.0f, 70.0f), vec3<f32>(60.0f, 70.0f, 50.0f) + %3:vec3<f32> = let %2 + ret } } )"); @@ -480,19 +463,22 @@ {"FMix", "mix"}, {"SmoothStep", "smoothstep"}})); -TEST_P(SpirvReaderTest_GlslStd450_Inting_Inting, DISABLED_Scalar) { +TEST_P(SpirvReaderTest_GlslStd450_Inting_Inting, Scalar) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %int %glsl )" + GetParam().opcode + - R"( %i1 + R"( %int_30 + %2 = OpCopyObject %int %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((i1); + %2:i32 = )" + GetParam().wgsl_func + + R"( 30i + %3:i32 = let %2 + ret } } )"); @@ -502,7 +488,8 @@ EXPECT_IR(Preamble() + R"( %1 = OpExtInst %int %glsl )" + GetParam().opcode + - R"( %u1 + R"( %uint_10 + %2 = OpCopyObject %int %1 OpReturn OpFunctionEnd )", @@ -521,7 +508,7 @@ EXPECT_IR(Preamble() + R"( %1 = OpExtInst %uint %glsl )" + GetParam().opcode + - R"( %i1 + R"( %int_30 OpReturn OpFunctionEnd )", @@ -535,19 +522,23 @@ )"); } -TEST_P(SpirvReaderTest_GlslStd450_Inting_Inting, DISABLED_Vector) { +TEST_P(SpirvReaderTest_GlslStd450_Inting_Inting, Vector) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %v2int %glsl )" + GetParam().opcode + - R"( %v2i1 + R"( %v2int_30_40 + %2 = OpCopyObject %v2int %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((v2i1); + %2:vec2<i32> = )" + + GetParam().wgsl_func + + R"( vec2<i32>(30i, 40i) + %3:vec2<i32> = let %2 + ret } } )"); @@ -557,7 +548,7 @@ EXPECT_IR(Preamble() + R"( %1 = OpExtInst %v2int %glsl )" + GetParam().opcode + - R"( %v2u1 + R"( %v2uint_10_20 OpReturn OpFunctionEnd )", @@ -576,7 +567,7 @@ EXPECT_IR(Preamble() + R"( %1 = OpExtInst %v2uint %glsl )" + GetParam().opcode + - R"( %v2i1 + R"( %v2int_30_40 OpReturn OpFunctionEnd )", @@ -590,73 +581,87 @@ )"); } -TEST_P(SpirvReaderTest_GlslStd450_Inting_IntingInting, DISABLED_Scalar) { +TEST_P(SpirvReaderTest_GlslStd450_Inting_IntingInting, Scalar) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %int %glsl )" + GetParam().opcode + - R"( %i1 %i2 + R"( %int_30 %int_35 + %2 = OpCopyObject %int %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((i1, i2); + %2:i32 = )" + GetParam().wgsl_func + + R"( 30i, 35i + %3:i32 = let %2 + ret } } )"); } -TEST_P(SpirvReaderTest_GlslStd450_Inting_IntingInting, DISABLED_Vector) { +TEST_P(SpirvReaderTest_GlslStd450_Inting_IntingInting, Vector) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %v2int %glsl )" + GetParam().opcode + - R"( %v2i1 %v2i2 + R"( %v2int_30_40 %v2int_40_30 + %2 = OpCopyObject %v2int %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((v2i1, v2i2); + %2:vec2<i32> = )" + + GetParam().wgsl_func + + R"( vec2<i32>(30i, 40i), vec2<i32>(40i, 30i) + %3:vec2<i32> = let %2 + ret } } )"); } -TEST_P(SpirvReaderTest_GlslStd450_Inting_IntingIntingInting, DISABLED_Scalar) { +TEST_P(SpirvReaderTest_GlslStd450_Inting_IntingIntingInting, Scalar) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %int %glsl )" + GetParam().opcode + - R"( %i1 %i2 %i3 + R"( %int_30 %int_35 %int_40 + %2 = OpCopyObject %int %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((i1, i2, i3); + %2:i32 = )" + GetParam().wgsl_func + + R"( 30i, 35i, 40i + %3:i32 = let %2 + ret } } )"); } -TEST_P(SpirvReaderTest_GlslStd450_Inting_IntingIntingInting, DISABLED_Vector) { +TEST_P(SpirvReaderTest_GlslStd450_Inting_IntingIntingInting, Vector) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %v2int %glsl )" + GetParam().opcode + - R"( %v2i1 %v2i2 %v2i3 + R"( %v2int_30_40 %v2int_40_30 %v2int_35_35 + %2 = OpCopyObject %v2int %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((v2i1, v2i2, v2i3); + %2:vec2<i32> = )" + + GetParam().wgsl_func + + R"( vec2<i32>(30i, 40i), vec2<i32>(40i, 30i), vec2<i32>(35i) + %3:vec2<i32> = let %2 + ret } } )"); @@ -682,107 +687,128 @@ SpirvReaderTest_GlslStd450_Inting_IntingIntingInting, ::testing::Values(GlslStd450Case{"SClamp", "clamp"})); -TEST_P(SpirvReaderTest_GlslStd450_Uinting_Uinting, DISABLED_Scalar) { +TEST_P(SpirvReaderTest_GlslStd450_Uinting_Uinting, Scalar) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %uint %glsl )" + GetParam().opcode + - R"( %u1 + R"( %uint_10 + %2 = OpCopyObject %uint %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((u1); + %2:u32 = )" + GetParam().wgsl_func + + R"( 10u + %3:u32 = let %2 + ret } } )"); } -TEST_P(SpirvReaderTest_GlslStd450_Uinting_Uinting, DISABLED_Vector) { +TEST_P(SpirvReaderTest_GlslStd450_Uinting_Uinting, Vector) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %v2uint %glsl )" + GetParam().opcode + - R"( %v2u1 + R"( %v2uint_10_20 + %2 = OpCopyObject %v2uint %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((v2u1); + %2:vec2<u32> = )" + + GetParam().wgsl_func + + R"( vec2<u32>(10u, 20u) + %3:vec2<u32> = let %2 + ret } } )"); } -TEST_P(SpirvReaderTest_GlslStd450_Uinting_UintingUinting, DISABLED_Scalar) { +TEST_P(SpirvReaderTest_GlslStd450_Uinting_UintingUinting, Scalar) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %uint %glsl )" + - GetParam().opcode + R"( %u1 %u2 + GetParam().opcode + R"( %uint_10 %uint_15 + %2 = OpCopyObject %uint %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((u1, u2); + %2:u32 = )" + GetParam().wgsl_func + + R"( 10u, 15u + %3:u32 = let %2 + ret } } )"); } -TEST_P(SpirvReaderTest_GlslStd450_Uinting_UintingUinting, DISABLED_Vector) { +TEST_P(SpirvReaderTest_GlslStd450_Uinting_UintingUinting, Vector) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %v2uint %glsl )" + GetParam().opcode + - R"( %v2u1 %v2u2 + R"( %v2uint_10_20 %v2uint_20_10 + %2 = OpCopyObject %v2uint %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((v2u1, v2u2); + %2:vec2<u32> = )" + + GetParam().wgsl_func + + R"( vec2<u32>(10u, 20u), vec2<u32>(20u, 10u) + %3:vec2<u32> = let %2 + ret } } )"); } -TEST_P(SpirvReaderTest_GlslStd450_Uinting_UintingUintingUinting, DISABLED_Scalar) { +TEST_P(SpirvReaderTest_GlslStd450_Uinting_UintingUintingUinting, Scalar) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %uint %glsl )" + - GetParam().opcode + R"( %u1 %u2 %u3 + GetParam().opcode + R"( %uint_10 %uint_15 %uint_20 + %2 = OpCopyObject %uint %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((u1, u2, u3); + %2:u32 = )" + GetParam().wgsl_func + + R"( 10u, 15u, 20u + %3:u32 = let %2 + ret } } )"); } -TEST_P(SpirvReaderTest_GlslStd450_Uinting_UintingUintingUinting, DISABLED_Vector) { +TEST_P(SpirvReaderTest_GlslStd450_Uinting_UintingUintingUinting, Vector) { EXPECT_IR(Preamble() + R"( %1 = OpExtInst %v2uint %glsl )" + GetParam().opcode + - R"( %v2u1 %v2u2 %v2u3 + R"( %v2uint_10_20 %v2uint_20_10 %v2uint_15_15 + %2 = OpCopyObject %v2uint %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + GetParam().wgsl_func + - R"((v2u1, v2u2, v2u3); + %2:vec2<u32> = )" + + GetParam().wgsl_func + + R"( vec2<u32>(10u, 20u), vec2<u32>(20u, 10u), vec2<u32>(15u) + %3:vec2<u32> = let %2 + ret } } )"); @@ -809,62 +835,71 @@ TEST_F(SpirvReaderTest, DISABLED_Normalize_Scalar) { // Scalar normalize maps to sign. EXPECT_IR(Preamble() + R"( - %1 = OpExtInst %float %glsl Normalize %f1 + %1 = OpExtInst %float %glsl Normalize %float_50 + %2 = OpCopyObject %float %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = sign(f1); + %2:f32 = sign 50.0f + %3:f32 = let %2 + ret } } )"); } TEST_F(SpirvReaderTest, DISABLED_Normalize_Vector2) { - // Scalar normalize always results in 1.0 EXPECT_IR(Preamble() + R"( - %1 = OpExtInst %v2float %glsl Normalize %v2f1 + %1 = OpExtInst %v2float %glsl Normalize %v2float_50_60 + %2 = OpCopyObject %v2float %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = normalize(v2f1); + %2:vec2<f32> = normalize vec2<f32>(50.0f, 60.0f) + %3:vec2<f32> = let %2 + ret } } )"); } TEST_F(SpirvReaderTest, DISABLED_Normalize_Vector3) { - // Scalar normalize always results in 1.0 EXPECT_IR(Preamble() + R"( - %1 = OpExtInst %v3float %glsl Normalize %v3f1 + %1 = OpExtInst %v3float %glsl Normalize %v3float_50_60_70 + %2 = OpCopyObject %v3float %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = normalize(v3f1); + %2:vec3<f32> = normalize vec3<f32>(50.0f, 60.0f, 70.0f) + %3:vec3<f32> = let %2 + ret } } )"); } TEST_F(SpirvReaderTest, DISABLED_Normalize_Vector4) { - // Scalar normalize always results in 1.0 EXPECT_IR(Preamble() + R"( - %1 = OpExtInst %v4float %glsl Normalize %v4f1 + %1 = OpExtInst %v4float %glsl Normalize %v4float_50_50_50_50 + %2 = OpCopyObject %v4float %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = normalize(v4f1); + %2:vec4<f32> = normalize vec4<f32>(50.0f) + %3:vec4<f32> = let %2 + ret } } )"); @@ -875,8 +910,8 @@ TEST_F(SpirvReaderTest, DISABLED_RectifyOperandsAndResult_SAbs) { EXPECT_IR(Preamble() + R"( - %1 = OpExtInst %uint %glsl SAbs %u1 - %2 = OpExtInst %v2uint %glsl SAbs %v2u1 + %1 = OpExtInst %uint %glsl SAbs %uint_10 + %2 = OpExtInst %v2uint %glsl SAbs %v2uint_10_20 OpReturn OpFunctionEnd )", @@ -892,8 +927,8 @@ TEST_F(SpirvReaderTest, DISABLED_RectifyOperandsAndResult_SMax) { EXPECT_IR(Preamble() + R"( - %1 = OpExtInst %uint %glsl SMax %u1 %u2 - %2 = OpExtInst %v2uint %glsl SMax %v2u1 %v2u2 + %1 = OpExtInst %uint %glsl SMax %uint_10 %uint_15 + %2 = OpExtInst %v2uint %glsl SMax %v2uint_10_20 %v2uint_20_10 OpReturn OpFunctionEnd )", @@ -909,8 +944,8 @@ TEST_F(SpirvReaderTest, DISABLED_RectifyOperandsAndResult_SMin) { EXPECT_IR(Preamble() + R"( - %1 = OpExtInst %uint %glsl SMin %u1 %u2 - %2 = OpExtInst %v2uint %glsl SMin %v2u1 %v2u2 + %1 = OpExtInst %uint %glsl SMin %uint_10 %uint_15 + %2 = OpExtInst %v2uint %glsl SMin %v2uint_10_20 %v2uint_20_10 OpReturn OpFunctionEnd )", @@ -926,8 +961,8 @@ TEST_F(SpirvReaderTest, DISABLED_RectifyOperandsAndResult_SClamp) { EXPECT_IR(Preamble() + R"( - %1 = OpExtInst %uint %glsl SClamp %u1 %i2 %u3 - %2 = OpExtInst %v2uint %glsl SClamp %v2u1 %v2i2 %v2u3 + %1 = OpExtInst %uint %glsl SClamp %uint_10 %int_35 %uint_20 + %2 = OpExtInst %v2uint %glsl SClamp %v2uint_10_20 %v2int_40_30 %v2uint_15_15 OpReturn OpFunctionEnd )", @@ -943,8 +978,8 @@ TEST_F(SpirvReaderTest, DISABLED_RectifyOperandsAndResult_UMax) { EXPECT_IR(Preamble() + R"( - %1 = OpExtInst %int %glsl UMax %i1 %i2 - %2 = OpExtInst %v2int %glsl UMax %v2i1 %v2i2 + %1 = OpExtInst %int %glsl UMax %int_30 %int_35 + %2 = OpExtInst %v2int %glsl UMax %v2int_30_40 %v2int_40_30 OpReturn OpFunctionEnd )", @@ -960,8 +995,8 @@ TEST_F(SpirvReaderTest, DISABLED_RectifyOperandsAndResult_UMin) { EXPECT_IR(Preamble() + R"( - %1 = OpExtInst %int %glsl UMin %i1 %i2 - %2 = OpExtInst %v2int %glsl UMin %v2i1 %v2i2 + %1 = OpExtInst %int %glsl UMin %int_30 %int_35 + %2 = OpExtInst %v2int %glsl UMin %v2int_30_40 %v2int_40_30 OpReturn OpFunctionEnd )", @@ -977,8 +1012,8 @@ TEST_F(SpirvReaderTest, DISABLED_RectifyOperandsAndResult_UClamp) { EXPECT_IR(Preamble() + R"( - %1 = OpExtInst %int %glsl UClamp %i1 %u2 %i3 - %2 = OpExtInst %v2int %glsl UClamp %v2i1 %v2u2 %v2i3 + %1 = OpExtInst %int %glsl UClamp %int_30 %uint_15 %int_40 + %2 = OpExtInst %v2int %glsl UClamp %v2int_30_40 %v2uint_20_10 %v2int_35_35 OpReturn OpFunctionEnd )", @@ -999,10 +1034,10 @@ // This is the first extended instruction we've supported which goes both // ways. EXPECT_IR(Preamble() + R"( - %1 = OpExtInst %uint %glsl FindILsb %i1 - %2 = OpExtInst %v2uint %glsl FindILsb %v2i1 - %3 = OpExtInst %int %glsl FindILsb %u1 - %4 = OpExtInst %v2int %glsl FindILsb %v2u1 + %1 = OpExtInst %uint %glsl FindILsb %int_30 + %2 = OpExtInst %v2uint %glsl FindILsb %v2int_30_40 + %3 = OpExtInst %int %glsl FindILsb %uint_10 + %4 = OpExtInst %v2int %glsl FindILsb %v2uint_10_20 OpReturn OpFunctionEnd )", @@ -1030,23 +1065,23 @@ EXPECT_IR(Preamble() + R"( ; signed arg ; signed result - %1 = OpExtInst %int %glsl FindSMsb %i1 - %2 = OpExtInst %v2int %glsl FindSMsb %v2i1 + %1 = OpExtInst %int %glsl FindSMsb %int_30 + %2 = OpExtInst %v2int %glsl FindSMsb %v2int_30_40 ; signed arg ; unsigned result - %3 = OpExtInst %uint %glsl FindSMsb %i1 - %4 = OpExtInst %v2uint %glsl FindSMsb %v2i1 + %3 = OpExtInst %uint %glsl FindSMsb %int_30 + %4 = OpExtInst %v2uint %glsl FindSMsb %v2int_30_40 ; unsigned arg ; signed result - %5 = OpExtInst %int %glsl FindSMsb %u1 - %6 = OpExtInst %v2int %glsl FindSMsb %v2u1 + %5 = OpExtInst %int %glsl FindSMsb %uint_10 + %6 = OpExtInst %v2int %glsl FindSMsb %v2uint_10_20 ; unsigned arg ; unsigned result - %7 = OpExtInst %uint %glsl FindSMsb %u1 - %8 = OpExtInst %v2uint %glsl FindSMsb %v2u1 + %7 = OpExtInst %uint %glsl FindSMsb %uint_10 + %8 = OpExtInst %v2uint %glsl FindSMsb %v2uint_10_20 OpReturn OpFunctionEnd )", @@ -1078,23 +1113,23 @@ EXPECT_IR(Preamble() + R"( ; signed arg ; signed result - %1 = OpExtInst %int %glsl FindUMsb %i1 - %2 = OpExtInst %v2int %glsl FindUMsb %v2i1 + %1 = OpExtInst %int %glsl FindUMsb %int_30 + %2 = OpExtInst %v2int %glsl FindUMsb %v2int_30_40 ; signed arg ; unsigned result - %3 = OpExtInst %uint %glsl FindUMsb %i1 - %4 = OpExtInst %v2uint %glsl FindUMsb %v2i1 + %3 = OpExtInst %uint %glsl FindUMsb %int_30 + %4 = OpExtInst %v2uint %glsl FindUMsb %v2int_30_40 ; unsigned arg ; signed result - %5 = OpExtInst %int %glsl FindUMsb %u1 - %6 = OpExtInst %v2int %glsl FindUMsb %v2u1 + %5 = OpExtInst %int %glsl FindUMsb %uint_10 + %6 = OpExtInst %v2int %glsl FindUMsb %v2uint_10_20 ; unsigned arg ; unsigned result - %7 = OpExtInst %uint %glsl FindUMsb %u1 - %8 = OpExtInst %v2uint %glsl FindUMsb %v2u1 + %7 = OpExtInst %uint %glsl FindUMsb %uint_10 + %8 = OpExtInst %v2uint %glsl FindUMsb %v2uint_10_20 OpReturn OpFunctionEnd )", @@ -1127,19 +1162,24 @@ using SpirvReaderTest_GlslStd450_DataPacking = SpirvReaderTestWithParam<DataPackingCase>; -TEST_P(SpirvReaderTest_GlslStd450_DataPacking, DISABLED_Valid) { +TEST_P(SpirvReaderTest_GlslStd450_DataPacking, Valid) { auto param = GetParam(); EXPECT_IR(Preamble() + R"( %1 = OpExtInst %uint %glsl )" + - param.opcode + (param.vec_size == 2 ? " %v2f1" : " %v4f1") + R"( + param.opcode + + (param.vec_size == 2 ? " %v2float_50_60" : " %v4float_50_50_50_50") + R"( + %2 = OpCopyObject %uint %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + param.wgsl_func + - "(v" + std::to_string(param.vec_size) + R"(f1); + %2:u32 = )" + param.wgsl_func + + " vec" + std::to_string(param.vec_size) + "<f32>(50.0f" + + (param.vec_size == 4 ? "" : ", 60.0f") + R"() + %3:u32 = let %2 + ret } } )"); @@ -1156,20 +1196,28 @@ using SpirvReaderTest_GlslStd450_DataUnpacking = SpirvReaderTestWithParam<DataPackingCase>; -TEST_P(SpirvReaderTest_GlslStd450_DataUnpacking, DISABLED_Valid) { +TEST_P(SpirvReaderTest_GlslStd450_DataUnpacking, Valid) { auto param = GetParam(); + auto type = param.vec_size == 2 ? "%v2float" : "%v4float"; + auto wgsl_type = "vec" + std::to_string(param.vec_size) + "<f32>"; + EXPECT_IR(Preamble() + R"( %1 = OpExtInst )" + - (param.vec_size == 2 ? "%v2float" : "%v4float") + std::string(" %glsl ") + - param.opcode + R"( %u1 + type + std::string(" %glsl ") + param.opcode + R"( %uint_10 + %2 = OpCopyObject )" + + type + R"( %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = )" + param.wgsl_func + - R"((u1); + %2:)" + wgsl_type + + " = " + param.wgsl_func + + R"( 10u + %3:)" + wgsl_type + + R"( = let %2 + ret } } )"); @@ -1186,7 +1234,7 @@ TEST_F(SpirvReaderTest, DISABLED_GlslStd450_Refract_Scalar) { EXPECT_IR(Preamble() + R"( - %1 = OpExtInst %float %glsl Refract %f1 %f2 %f3 + %1 = OpExtInst %float %glsl Refract %float_50 %float_60 %float_70 OpReturn OpFunctionEnd )", @@ -1201,7 +1249,7 @@ TEST_F(SpirvReaderTest, DISABLED_GlslStd450_Refract_Vector) { EXPECT_IR(Preamble() + R"( - %1 = OpExtInst %v2float %glsl Refract %v2f1 %v2f2 %f3 + %1 = OpExtInst %v2float %glsl Refract %v2float_50_60 %v2float_60_50 %float_70 OpReturn OpFunctionEnd )", @@ -1219,8 +1267,8 @@ // making a let-declaration for it, since it is the normal operand to // the builtin function, and code generation uses it twice. EXPECT_IR(Preamble() + R"( - %99 = OpFAdd %float %f1 %f1 ; normal operand has only one use - %1 = OpExtInst %float %glsl FaceForward %99 %f2 %f3 + %99 = OpFAdd %float %float_50 %float_50 ; normal operand has only one use + %1 = OpExtInst %float %glsl FaceForward %99 %float_60 %float_70 OpReturn OpFunctionEnd )", @@ -1235,15 +1283,17 @@ TEST_F(SpirvReaderTest, DISABLED_GlslStd450_FaceForward_Vector) { EXPECT_IR(Preamble() + R"( - %99 = OpFAdd %v2float %v2f1 %v2f1 - %1 = OpExtInst %v2float %glsl FaceForward %v2f1 %v2f2 %v2f3 + %1 = OpExtInst %v2float %glsl FaceForward %v2float_50_60 %v2float_60_50 %v2float_70_70 + %2 = OpCopyObject %v2float %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = faceForward(v2f1, v2f2, v2f3); + %2:vec2<f32> = faceForward vec2<f32>(50.0f, 60.0f), vec2<f32>(60.0f, 50.0f), vec2<f32>(70.0f) + %2:vec2<f32> = let %2 + ret } } )"); @@ -1251,16 +1301,18 @@ TEST_F(SpirvReaderTest, DISABLED_GlslStd450_Reflect_Scalar) { EXPECT_IR(Preamble() + R"( - %98 = OpFAdd %float %f1 %f1 ; has only one use - %99 = OpFAdd %float %f2 %f2 ; has only one use + %98 = OpFAdd %float %float_50 %float_50 ; has only one use + %99 = OpFAdd %float %float_60 %float_60 ; has only one use %1 = OpExtInst %float %glsl Reflect %98 %99 + %2 = OpCopyObject %float %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = (x_98 - (2.0f * (x_99 * (x_99 * x_98)))); + %2:f32 = (x_98 - (2.0f * (x_99 * (x_99 * x_98)))); + %3:f32 = let %2 } } )"); @@ -1268,18 +1320,21 @@ TEST_F(SpirvReaderTest, DISABLED_GlslStd450_Reflect_Vector) { EXPECT_IR(Preamble() + R"( - %98 = OpFAdd %v2float %v2f1 %v2f1 - %99 = OpFAdd %v2float %v2f2 %v2f2 + %98 = OpFAdd %v2float %v2float_50_60 %v2float_50_60 + %99 = OpFAdd %v2float %v2float_60_50 %v2float_60_50 %1 = OpExtInst %v2float %glsl Reflect %98 %99 + %2 = OpCopyObject %v2float %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_98 = (v2f1 + v2f1); - let x_99 = (v2f2 + v2f2); - let x_1 = reflect(x_98, x_99); + %2:vec2<f32> = add vec2<f32>(50.0f, 60.0f), vec2<f32>(50.0f, 60.0f) + %3:vec2<f32> = add vec2<f32>(60.0f, 50.0f), vec2<f32>(60.0f, 50.0f) + %4:vec2<f32> = reflect %2, %3 + %5:vec2<f32> = let %4 + ret } } )"); @@ -1288,7 +1343,7 @@ // For ldexp with signed second argument, see above. TEST_F(SpirvReaderTest, DISABLED_GlslStd450_Ldexp_Scalar_Float_Uint) { EXPECT_IR(Preamble() + R"( - %1 = OpExtInst %float %glsl Ldexp %f1 %u1 + %1 = OpExtInst %float %glsl Ldexp %float_50 %uint_10 OpReturn OpFunctionEnd )", @@ -1303,7 +1358,7 @@ TEST_F(SpirvReaderTest, DISABLED_GlslStd450_Ldexp_Vector_Floatvec_Uintvec) { EXPECT_IR(Preamble() + R"( - %1 = OpExtInst %v2float %glsl Ldexp %v2f1 %v2u1 + %1 = OpExtInst %v2float %glsl Ldexp %v2float_50_60 %v2uint_10_20 OpReturn OpFunctionEnd )", @@ -1316,31 +1371,50 @@ )"); } -using SpirvReaderTest_GlslStd450_Determinant = SpirvReaderTestWithParam<std::string>; +struct DeterminantData { + std::string in; + std::string out; +}; + +inline std::ostream& operator<<(std::ostream& out, DeterminantData c) { + out << "Determinant(" << c.in << ")"; + return out; +} + +using SpirvReaderTest_GlslStd450_Determinant = SpirvReaderTestWithParam<DeterminantData>; TEST_P(SpirvReaderTest_GlslStd450_Determinant, DISABLED_Test) { + auto param = GetParam(); + EXPECT_IR(Preamble() + R"( %1 = OpExtInst %float %glsl Determinant %)" + - GetParam() + R"( + param.in + R"( + %2 = OpCopyObject %float %1 OpReturn OpFunctionEnd )", R"( %main = @compute @workgroup_size(1u, 1u, 1u) func():void { $B1: { - let x_1 = determinant(" + GetParam() + "); + %2:f32 = determinant )" + + param.out + R"( + %3:f32 = let %2 + ret } } )"); } -INSTANTIATE_TEST_SUITE_P(SpirvReader, - SpirvReaderTest_GlslStd450_Determinant, - ::testing::Values("m2x2f1", "m3x3f1", "m4x4f1")); +INSTANTIATE_TEST_SUITE_P( + SpirvReader, + SpirvReaderTest_GlslStd450_Determinant, + ::testing::Values(DeterminantData{"m2x2f1", "mat2x2<f32>(vec2<f32>(50.0f, 60.0f))"}, + DeterminantData{"m3x3f1", "mat3x3<f32>(vec3<f32>(50.0f, 60.0f, 70.0f))"}, + DeterminantData{"m4x4f1", "mat4x4<f32>(vec4<f32>(50.0f))"})); TEST_F(SpirvReaderTest, DISABLED_GlslStd450_MatrixInverse_mat2x2) { EXPECT_IR(Preamble() + R"( - %1 = OpExtInst %mat2v2float %glsl MatrixInverse %m2x2f1 + %1 = OpExtInst %mat2v2float %glsl MatrixInverse %mat2v2float_50_60 OpReturn OpFunctionEnd )", @@ -1359,7 +1433,7 @@ TEST_F(SpirvReaderTest, DISABLED_GlslStd450_MatrixInverse_mat3x3) { EXPECT_IR(Preamble() + R"( - %1 = OpExtInst %mat3v3float %glsl MatrixInverse %m3x3f1 + %1 = OpExtInst %mat3v3float %glsl MatrixInverse %mat3v3float_50_60_70 OpReturn OpFunctionEnd )", @@ -1384,7 +1458,7 @@ TEST_F(SpirvReaderTest, DISABLED_GlslStd450_MatrixInverse_mat4x4) { EXPECT_IR(Preamble() + R"( - %1 = OpExtInst %mat4v4float %glsl MatrixInverse %m4x4f1 + %1 = OpExtInst %mat4v4float %glsl MatrixInverse %mat4v4float_50_50_50_50 OpReturn OpFunctionEnd )", @@ -1460,8 +1534,8 @@ TEST_F(SpirvReaderTest, DISABLED_GlslStd450_MatrixInverse_MultipleInScope) { EXPECT_IR(Preamble() + R"( - %1 = OpExtInst %mat2v2float %glsl MatrixInverse %m2x2f1 - %2 = OpExtInst %mat2v2float %glsl MatrixInverse %m2x2f1 + %1 = OpExtInst %mat2v2float %glsl MatrixInverse %mat2v2float_50_60 + %2 = OpExtInst %mat2v2float %glsl MatrixInverse %mat2v2float_50_60 OpReturn OpFunctionEnd )",
diff --git a/src/tint/lang/spirv/reader/parser/helper_test.h b/src/tint/lang/spirv/reader/parser/helper_test.h index 85b5dfd..6b7b9f8 100644 --- a/src/tint/lang/spirv/reader/parser/helper_test.h +++ b/src/tint/lang/spirv/reader/parser/helper_test.h
@@ -44,12 +44,12 @@ // Helper macro to run the parser and compare the disassembled IR to a string. // Automatically prefixes the IR disassembly with a newline to improve formatting of tests. -#define EXPECT_IR(asm, ir) \ - do { \ - auto result = Run(asm); \ - ASSERT_EQ(result, Success) << result.Failure().reason.Str(); \ - auto got = "\n" + result.Get(); \ - ASSERT_THAT(got, testing::HasSubstr(ir)) << got; \ +#define EXPECT_IR(asm, ir) \ + do { \ + auto result = Run(asm); \ + ASSERT_EQ(result, Success) << result.Failure().reason.Str(); \ + auto got = "\n" + result.Get(); \ + ASSERT_THAT(got, testing::HasSubstr(ir)) << "GOT:\n" << got << "EXPECTED:\n" << ir; \ } while (false) /// Base helper class for testing the SPIR-V parser implementation.
diff --git a/src/tint/lang/spirv/reader/parser/parser.cc b/src/tint/lang/spirv/reader/parser/parser.cc index f62496d..54823e4 100644 --- a/src/tint/lang/spirv/reader/parser/parser.cc +++ b/src/tint/lang/spirv/reader/parser/parser.cc
@@ -615,10 +615,154 @@ // Ignore it but don't error out. return; } - if (glsl_std_450_imports_.count(inst_set) == 0) { - TINT_UNIMPLEMENTED() << "unhandled extended instruction import with ID " - << inst.GetSingleWordInOperand(0); + if (glsl_std_450_imports_.count(inst_set) > 0) { + EmitGlslStd450ExtInst(inst); + return; } + + TINT_UNIMPLEMENTED() << "unhandled extended instruction import with ID " + << inst.GetSingleWordInOperand(0); + } + + // Returns the WGSL standard library function for the given GLSL.std.450 extended instruction + // operation code. This handles GLSL functions which directly translate to the WGSL equivalent. + // Any non-direct translation is returned as `kNone`. + core::BuiltinFn GetGlslStd450FuncName(uint32_t ext_opcode) { + switch (ext_opcode) { + case GLSLstd450Acos: + return core::BuiltinFn::kAcos; + case GLSLstd450Asin: + return core::BuiltinFn::kAsin; + case GLSLstd450Atan: + return core::BuiltinFn::kAtan; + case GLSLstd450Atan2: + return core::BuiltinFn::kAtan2; + case GLSLstd450Ceil: + return core::BuiltinFn::kCeil; + case GLSLstd450Cos: + return core::BuiltinFn::kCos; + case GLSLstd450Cosh: + return core::BuiltinFn::kCosh; + case GLSLstd450Cross: + return core::BuiltinFn::kCross; + case GLSLstd450Degrees: + return core::BuiltinFn::kDegrees; + case GLSLstd450Distance: + return core::BuiltinFn::kDistance; + case GLSLstd450Exp: + return core::BuiltinFn::kExp; + case GLSLstd450Exp2: + return core::BuiltinFn::kExp2; + case GLSLstd450FAbs: + case GLSLstd450SAbs: + return core::BuiltinFn::kAbs; + case GLSLstd450FSign: + case GLSLstd450SSign: + return core::BuiltinFn::kSign; + case GLSLstd450FindILsb: + return core::BuiltinFn::kFirstTrailingBit; + case GLSLstd450FindSMsb: + return core::BuiltinFn::kFirstLeadingBit; + case GLSLstd450FindUMsb: + return core::BuiltinFn::kFirstLeadingBit; + case GLSLstd450Floor: + return core::BuiltinFn::kFloor; + case GLSLstd450Fract: + return core::BuiltinFn::kFract; + case GLSLstd450Fma: + return core::BuiltinFn::kFma; + case GLSLstd450InverseSqrt: + return core::BuiltinFn::kInverseSqrt; + case GLSLstd450Ldexp: + return core::BuiltinFn::kLdexp; + case GLSLstd450Length: + return core::BuiltinFn::kLength; + case GLSLstd450Log: + return core::BuiltinFn::kLog; + case GLSLstd450Log2: + return core::BuiltinFn::kLog2; + case GLSLstd450SClamp: + case GLSLstd450UClamp: + case GLSLstd450NClamp: + case GLSLstd450FClamp: // FClamp is less prescriptive about NaN operands + return core::BuiltinFn::kClamp; + case GLSLstd450SMin: + case GLSLstd450UMin: + case GLSLstd450NMin: + case GLSLstd450FMin: // FMin is less prescriptive about NaN operands + return core::BuiltinFn::kMin; + case GLSLstd450SMax: + case GLSLstd450UMax: + case GLSLstd450NMax: + case GLSLstd450FMax: // FMax is less prescriptive about NaN operands + return core::BuiltinFn::kMax; + case GLSLstd450FMix: + return core::BuiltinFn::kMix; + case GLSLstd450PackSnorm4x8: + return core::BuiltinFn::kPack4X8Snorm; + case GLSLstd450PackUnorm4x8: + return core::BuiltinFn::kPack4X8Unorm; + case GLSLstd450PackSnorm2x16: + return core::BuiltinFn::kPack2X16Snorm; + case GLSLstd450PackUnorm2x16: + return core::BuiltinFn::kPack2X16Unorm; + case GLSLstd450PackHalf2x16: + return core::BuiltinFn::kPack2X16Float; + case GLSLstd450Pow: + return core::BuiltinFn::kPow; + case GLSLstd450Radians: + return core::BuiltinFn::kRadians; + case GLSLstd450Round: + case GLSLstd450RoundEven: + return core::BuiltinFn::kRound; + case GLSLstd450Sin: + return core::BuiltinFn::kSin; + case GLSLstd450Sinh: + return core::BuiltinFn::kSinh; + case GLSLstd450SmoothStep: + return core::BuiltinFn::kSmoothstep; + case GLSLstd450Sqrt: + return core::BuiltinFn::kSqrt; + case GLSLstd450Step: + return core::BuiltinFn::kStep; + case GLSLstd450Tan: + return core::BuiltinFn::kTan; + case GLSLstd450Tanh: + return core::BuiltinFn::kTanh; + case GLSLstd450Trunc: + return core::BuiltinFn::kTrunc; + case GLSLstd450UnpackSnorm4x8: + return core::BuiltinFn::kUnpack4X8Snorm; + case GLSLstd450UnpackUnorm4x8: + return core::BuiltinFn::kUnpack4X8Unorm; + case GLSLstd450UnpackSnorm2x16: + return core::BuiltinFn::kUnpack2X16Snorm; + case GLSLstd450UnpackUnorm2x16: + return core::BuiltinFn::kUnpack2X16Unorm; + case GLSLstd450UnpackHalf2x16: + return core::BuiltinFn::kUnpack2X16Float; + default: + break; + } + return core::BuiltinFn::kNone; + } + + /// @param inst the SPIR-V instruction for OpAccessChain + void EmitGlslStd450ExtInst(const spvtools::opt::Instruction& inst) { + const auto ext_opcode = inst.GetSingleWordInOperand(1); + auto* result_ty = Type(inst.type_id()); + + const auto fn = GetGlslStd450FuncName(ext_opcode); + if (fn == core::BuiltinFn::kNone) { + TINT_UNIMPLEMENTED() << "unhandled GLSL.std.450 instruction " << ext_opcode; + } + + Vector<core::ir::Value*, 4> operands; + // All parameters to GLSL.std.450 extended instructions are IDs. + for (uint32_t idx = 2; idx < inst.NumInOperands(); ++idx) { + operands.Push(Value(inst.GetSingleWordInOperand(idx))); + } + Emit(b_.Call(result_ty, fn, operands), inst.result_id()); } /// @param inst the SPIR-V instruction for OpAccessChain