spirv-reader: ignore RelaxedPrecision on struct members Bug: tint:737 Change-Id: Ic9a37e70ad1e6c1aa49aa49fe37a842361e306e1 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/53440 Auto-Submit: David Neto <dneto@google.com> Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: James Price <jrprice@google.com> Reviewed-by: James Price <jrprice@google.com>
diff --git a/src/reader/spirv/function_var_test.cc b/src/reader/spirv/function_var_test.cc index c2ba7ec..114dfd9 100644 --- a/src/reader/spirv/function_var_test.cc +++ b/src/reader/spirv/function_var_test.cc
@@ -72,15 +72,21 @@ )"; } -// Returns the SPIR-V assembly for a vertex shader, optionally -// with OpName decorations for certain SPIR-V IDs -std::string PreambleNames(std::vector<std::string> ids) { +// Returns the SPIR-V assembly for capabilities, the memory model, +// a vertex shader entry point declaration, and name declarations +// for specified IDs. +std::string Caps(std::vector<std::string> ids = {}) { return R"( OpCapability Shader OpMemoryModel Logical Simple OpEntryPoint Vertex %100 "main" -)" + Names(ids) + - CommonTypes(); +)" + Names(ids); +} + +// Returns the SPIR-V assembly for a vertex shader, optionally +// with OpName decorations for certain SPIR-V IDs +std::string PreambleNames(std::vector<std::string> ids) { + return Caps(ids) + CommonTypes(); } std::string Preamble() { @@ -681,6 +687,77 @@ } TEST_F(SpvParserFunctionVarTest, + EmitFunctionVariables_Decorate_RelaxedPrecision) { + // RelaxedPrecisionis dropped + auto p = parser(test::Assemble(Caps({"myvar"}) + R"( + OpDecorate %myvar RelaxedPrecision + + %float = OpTypeFloat 32 + %ptr = OpTypePointer Function %float + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + + %100 = OpFunction %void None %voidfn + %entry = OpLabel + %myvar = OpVariable %ptr Function + OpReturn + OpFunctionEnd + )")); + ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()); + auto fe = p->function_emitter(100); + EXPECT_TRUE(fe.EmitFunctionVariables()); + + const auto got = ToString(p->builder(), fe.ast_body()); + EXPECT_EQ(got, R"(VariableDeclStatement{ + Variable{ + myvar + none + undefined + __f32 + } +} +)") << got; +} + +TEST_F(SpvParserFunctionVarTest, + EmitFunctionVariables_MemberDecorate_RelaxedPrecision) { + // RelaxedPrecisionis dropped + const auto assembly = Caps({"myvar", "strct"}) + R"( + OpMemberDecorate %strct 0 RelaxedPrecision + + %float = OpTypeFloat 32 + %strct = OpTypeStruct %float + %ptr = OpTypePointer Function %strct + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + + %100 = OpFunction %void None %voidfn + %entry = OpLabel + %myvar = OpVariable %ptr Function + OpReturn + OpFunctionEnd + )"; + auto p = parser(test::Assemble(assembly)); + ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions()) + << assembly << p->error() << std::endl; + auto fe = p->function_emitter(100); + EXPECT_TRUE(fe.EmitFunctionVariables()); + + const auto got = ToString(p->builder(), fe.ast_body()); + EXPECT_EQ(got, R"(VariableDeclStatement{ + Variable{ + myvar + none + undefined + __type_name_strct + } +} +)") << got; +} + +TEST_F(SpvParserFunctionVarTest, EmitStatement_CombinatorialValue_Defer_UsedOnceSameConstruct) { auto assembly = Preamble() + R"( %100 = OpFunction %void None %voidfn
diff --git a/src/reader/spirv/parser_impl.cc b/src/reader/spirv/parser_impl.cc index 9f6a865..70dd7eb 100644 --- a/src/reader/spirv/parser_impl.cc +++ b/src/reader/spirv/parser_impl.cc
@@ -445,6 +445,9 @@ case SpvDecorationColMajor: // WGSL only supports column major matrices. return nullptr; + case SpvDecorationRelaxedPrecision: + // WGSL doesn't support relaxed precision. + return nullptr; case SpvDecorationRowMajor: Fail() << "WGSL does not support row-major matrices: can't " "translate member "
diff --git a/src/reader/spirv/parser_impl_convert_member_decoration_test.cc b/src/reader/spirv/parser_impl_convert_member_decoration_test.cc index bd77db4..01f29d4 100644 --- a/src/reader/spirv/parser_impl_convert_member_decoration_test.cc +++ b/src/reader/spirv/parser_impl_convert_member_decoration_test.cc
@@ -61,6 +61,18 @@ EXPECT_TRUE(p->error().empty()); } +TEST_F(SpvParserTest, ConvertMemberDecoration_RelaxedPrecision) { + // WGSL does not support relaxed precision. Drop it. + // It's functionally correct to use full precision f32 instead of + // relaxed precision f32. + auto p = parser(std::vector<uint32_t>{}); + + auto* result = + p->ConvertMemberDecoration(1, 1, {SpvDecorationRelaxedPrecision}); + EXPECT_EQ(result, nullptr); + EXPECT_TRUE(p->error().empty()); +} + TEST_F(SpvParserTest, ConvertMemberDecoration_UnhandledDecoration) { auto p = parser(std::vector<uint32_t>{});
diff --git a/src/reader/spirv/parser_impl_get_decorations_test.cc b/src/reader/spirv/parser_impl_get_decorations_test.cc index bc0a88d..f70af99 100644 --- a/src/reader/spirv/parser_impl_get_decorations_test.cc +++ b/src/reader/spirv/parser_impl_get_decorations_test.cc
@@ -98,6 +98,19 @@ EXPECT_TRUE(p->error().empty()); } +TEST_F(SpvParserGetDecorationsTest, GetDecorationsForMember_RelaxedPrecision) { + auto p = parser(test::Assemble(R"( + OpMemberDecorate %10 0 RelaxedPrecision + %float = OpTypeFloat 32 + %10 = OpTypeStruct %float + )")); + EXPECT_TRUE(p->BuildAndParseInternalModule()) << p->error(); + auto decorations = p->GetDecorationsForMember(10, 0); + EXPECT_THAT(decorations, + UnorderedElementsAre(Decoration{SpvDecorationRelaxedPrecision})); + EXPECT_TRUE(p->error().empty()); +} + // TODO(dneto): Enable when ArrayStride is handled TEST_F(SpvParserGetDecorationsTest, DISABLED_GetDecorationsForMember_OneDecoration) {