spirv-reader: support ldexp Bug: tint:3 Change-Id: I6a9204b19c5b4d631634b9a585a0081eaead9c1b Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/35046 Auto-Submit: David Neto <dneto@google.com> Commit-Queue: dan sinclair <dsinclair@chromium.org> Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/reader/spirv/function.cc b/src/reader/spirv/function.cc index d35f0d9..956aec6 100644 --- a/src/reader/spirv/function.cc +++ b/src/reader/spirv/function.cc
@@ -364,6 +364,8 @@ return "fract"; case GLSLstd450InverseSqrt: return "inverseSqrt"; + case GLSLstd450Ldexp: + return "ldexp"; case GLSLstd450Length: return "length"; case GLSLstd450Log: @@ -431,7 +433,6 @@ case GLSLstd450Frexp: case GLSLstd450FrexpStruct: - case GLSLstd450Ldexp: case GLSLstd450PackSnorm4x8: case GLSLstd450PackUnorm4x8:
diff --git a/src/reader/spirv/function_glsl_std_450_test.cc b/src/reader/spirv/function_glsl_std_450_test.cc index add0dac..10c16da 100644 --- a/src/reader/spirv/function_glsl_std_450_test.cc +++ b/src/reader/spirv/function_glsl_std_450_test.cc
@@ -154,6 +154,10 @@ SpvParserTestBase<::testing::TestWithParam<GlslStd450Case>>; using SpvParserTest_GlslStd450_Floating_FloatingFloatingFloating = SpvParserTestBase<::testing::TestWithParam<GlslStd450Case>>; +using SpvParserTest_GlslStd450_Floating_FloatingInting = + SpvParserTestBase<::testing::TestWithParam<GlslStd450Case>>; +using SpvParserTest_GlslStd450_Floating_FloatingUinting = + SpvParserTestBase<::testing::TestWithParam<GlslStd450Case>>; using SpvParserTest_GlslStd450_Float3_Float3Float3 = SpvParserTestBase<::testing::TestWithParam<GlslStd450Case>>; @@ -461,6 +465,128 @@ << ToString(fe.ast_body()); } +TEST_P(SpvParserTest_GlslStd450_Floating_FloatingUinting, Scalar) { + const auto assembly = Preamble() + R"( + %1 = OpExtInst %float %glsl )" + + GetParam().opcode + R"( %f1 %u1 + OpReturn + OpFunctionEnd + )"; + auto p = parser(test::Assemble(assembly)); + ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()); + FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100)); + EXPECT_TRUE(fe.EmitBody()) << p->error(); + EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"( + VariableConst{ + x_1 + none + __f32 + { + Call[not set]{ + Identifier[not set]{)" + GetParam().wgsl_func + + R"(} + ( + Identifier[not set]{f1} + Identifier[not set]{u1} + ) + } + } + })")) + << ToString(fe.ast_body()); +} + +TEST_P(SpvParserTest_GlslStd450_Floating_FloatingUinting, Vector) { + const auto assembly = Preamble() + R"( + %1 = OpExtInst %v2float %glsl )" + + GetParam().opcode + + R"( %v2f1 %v2u1 + OpReturn + OpFunctionEnd + )"; + auto p = parser(test::Assemble(assembly)); + ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()); + FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100)); + EXPECT_TRUE(fe.EmitBody()) << p->error(); + EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"( + VariableConst{ + x_1 + none + __vec_2__f32 + { + Call[not set]{ + Identifier[not set]{)" + GetParam().wgsl_func + + R"(} + ( + Identifier[not set]{v2f1} + Identifier[not set]{v2u1} + ) + } + } + })")) + << ToString(fe.ast_body()); +} + +TEST_P(SpvParserTest_GlslStd450_Floating_FloatingInting, Scalar) { + const auto assembly = Preamble() + R"( + %1 = OpExtInst %float %glsl )" + + GetParam().opcode + R"( %f1 %i1 + OpReturn + OpFunctionEnd + )"; + auto p = parser(test::Assemble(assembly)); + ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()); + FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100)); + EXPECT_TRUE(fe.EmitBody()) << p->error(); + EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"( + VariableConst{ + x_1 + none + __f32 + { + Call[not set]{ + Identifier[not set]{)" + GetParam().wgsl_func + + R"(} + ( + Identifier[not set]{f1} + Identifier[not set]{i1} + ) + } + } + })")) + << ToString(fe.ast_body()); +} + +TEST_P(SpvParserTest_GlslStd450_Floating_FloatingInting, Vector) { + const auto assembly = Preamble() + R"( + %1 = OpExtInst %v2float %glsl )" + + GetParam().opcode + + R"( %v2f1 %v2i1 + OpReturn + OpFunctionEnd + )"; + auto p = parser(test::Assemble(assembly)); + ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()); + FunctionEmitter fe(p.get(), *spirv_function(p.get(), 100)); + EXPECT_TRUE(fe.EmitBody()) << p->error(); + EXPECT_THAT(ToString(fe.ast_body()), HasSubstr(R"( + VariableConst{ + x_1 + none + __vec_2__f32 + { + Call[not set]{ + Identifier[not set]{)" + GetParam().wgsl_func + + R"(} + ( + Identifier[not set]{v2f1} + Identifier[not set]{v2i1} + ) + } + } + })")) + << ToString(fe.ast_body()); +} + TEST_P(SpvParserTest_GlslStd450_Float3_Float3Float3, Samples) { const auto assembly = Preamble() + R"( %1 = OpExtInst %v3float %glsl )" + @@ -543,6 +669,14 @@ })); INSTANTIATE_TEST_SUITE_P(Samples, + SpvParserTest_GlslStd450_Floating_FloatingUinting, + ::testing::Values(GlslStd450Case{"Ldexp", "ldexp"})); + +INSTANTIATE_TEST_SUITE_P(Samples, + SpvParserTest_GlslStd450_Floating_FloatingInting, + ::testing::Values(GlslStd450Case{"Ldexp", "ldexp"})); + +INSTANTIATE_TEST_SUITE_P(Samples, SpvParserTest_GlslStd450_Float3_Float3Float3, ::testing::Values(GlslStd450Case{"Cross", "cross"}));