mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-07-10 15:15:58 +00:00
spirv-reader: Ignore Restrict, RestrictPointer decorations
They have no effect in graphics APIs. Fixes: tint:1440 Change-Id: I80a4b2f5875fbabbd53fd1ebd085ba146401ca71 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/80980 Auto-Submit: David Neto <dneto@google.com> Kokoro: David Neto <dneto@google.com> Kokoro: Kokoro <noreply+kokoro@google.com> Reviewed-by: Ben Clayton <bclayton@google.com> Commit-Queue: Ben Clayton <bclayton@google.com>
This commit is contained in:
parent
6f5316ba46
commit
27605e505b
@ -396,11 +396,19 @@ DecorationList ParserImpl::GetDecorationsFor(uint32_t id) const {
|
|||||||
// Example: OpDecorate %struct_id Block
|
// Example: OpDecorate %struct_id Block
|
||||||
// Example: OpDecorate %array_ty ArrayStride 16
|
// Example: OpDecorate %array_ty ArrayStride 16
|
||||||
auto decoration_kind = inst->GetSingleWordInOperand(1);
|
auto decoration_kind = inst->GetSingleWordInOperand(1);
|
||||||
if (visited.emplace(decoration_kind).second) {
|
switch (decoration_kind) {
|
||||||
std::vector<uint32_t> inst_as_words;
|
// Restrict and RestrictPointer have no effect in graphics APIs.
|
||||||
inst->ToBinaryWithoutAttachedDebugInsts(&inst_as_words);
|
case SpvDecorationRestrict:
|
||||||
Decoration d(inst_as_words.begin() + 2, inst_as_words.end());
|
case SpvDecorationRestrictPointer:
|
||||||
result.push_back(d);
|
break;
|
||||||
|
default:
|
||||||
|
if (visited.emplace(decoration_kind).second) {
|
||||||
|
std::vector<uint32_t> inst_as_words;
|
||||||
|
inst->ToBinaryWithoutAttachedDebugInsts(&inst_as_words);
|
||||||
|
Decoration d(inst_as_words.begin() + 2, inst_as_words.end());
|
||||||
|
result.push_back(d);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
@ -419,11 +427,18 @@ DecorationList ParserImpl::GetDecorationsForMember(
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
auto decoration_kind = inst->GetSingleWordInOperand(2);
|
auto decoration_kind = inst->GetSingleWordInOperand(2);
|
||||||
if (visited.emplace(decoration_kind).second) {
|
switch (decoration_kind) {
|
||||||
std::vector<uint32_t> inst_as_words;
|
// Restrict and RestrictPointer have no effect in graphics APIs.
|
||||||
inst->ToBinaryWithoutAttachedDebugInsts(&inst_as_words);
|
case SpvDecorationRestrict:
|
||||||
Decoration d(inst_as_words.begin() + 3, inst_as_words.end());
|
case SpvDecorationRestrictPointer:
|
||||||
result.push_back(d);
|
break;
|
||||||
|
default:
|
||||||
|
if (visited.emplace(decoration_kind).second) {
|
||||||
|
std::vector<uint32_t> inst_as_words;
|
||||||
|
inst->ToBinaryWithoutAttachedDebugInsts(&inst_as_words);
|
||||||
|
Decoration d(inst_as_words.begin() + 3, inst_as_words.end());
|
||||||
|
result.push_back(d);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
@ -221,6 +221,8 @@ class ParserImpl : Reader {
|
|||||||
/// Gets the list of unique decorations for a SPIR-V result ID. Returns an
|
/// Gets the list of unique decorations for a SPIR-V result ID. Returns an
|
||||||
/// empty vector if the ID is not a result ID, or if no decorations target
|
/// empty vector if the ID is not a result ID, or if no decorations target
|
||||||
/// that ID. The internal representation must have already been built.
|
/// that ID. The internal representation must have already been built.
|
||||||
|
/// Ignores decorations that have no effect in graphics APIs, e.g. Restrict
|
||||||
|
/// and RestrictPointer.
|
||||||
/// @param id SPIR-V ID
|
/// @param id SPIR-V ID
|
||||||
/// @returns the list of decorations on the given ID
|
/// @returns the list of decorations on the given ID
|
||||||
DecorationList GetDecorationsFor(uint32_t id) const;
|
DecorationList GetDecorationsFor(uint32_t id) const;
|
||||||
@ -228,6 +230,8 @@ class ParserImpl : Reader {
|
|||||||
/// an empty list if the `id` is not the ID of a struct, or if the member
|
/// an empty list if the `id` is not the ID of a struct, or if the member
|
||||||
/// index is out of range, or if the target member has no decorations. The
|
/// index is out of range, or if the target member has no decorations. The
|
||||||
/// internal representation must have already been built.
|
/// internal representation must have already been built.
|
||||||
|
/// Ignores decorations that have no effect in graphics APIs, e.g. Restrict
|
||||||
|
/// and RestrictPointer.
|
||||||
/// @param id SPIR-V ID of a struct
|
/// @param id SPIR-V ID of a struct
|
||||||
/// @param member_index the member within the struct
|
/// @param member_index the member within the struct
|
||||||
/// @returns the list of decorations on the member
|
/// @returns the list of decorations on the member
|
||||||
|
@ -198,6 +198,68 @@ TEST_F(SpvParserGetDecorationsTest,
|
|||||||
EXPECT_TRUE(p->error().empty());
|
EXPECT_TRUE(p->error().empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(SpvParserGetDecorationsTest, GetDecorationsFor_Restrict) {
|
||||||
|
// RestrictPointer applies to a memory object declaration. Use a variable.
|
||||||
|
auto p = parser(test::Assemble(R"(
|
||||||
|
OpDecorate %10 Restrict
|
||||||
|
%float = OpTypeFloat 32
|
||||||
|
%ptr = OpTypePointer Workgroup %float
|
||||||
|
%10 = OpVariable %ptr Workgroup
|
||||||
|
)"));
|
||||||
|
EXPECT_TRUE(p->BuildAndParseInternalModule());
|
||||||
|
auto decorations = p->GetDecorationsFor(10);
|
||||||
|
EXPECT_TRUE(decorations.empty());
|
||||||
|
EXPECT_TRUE(p->error().empty());
|
||||||
|
p->SkipDumpingPending(kSkipReason);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(SpvParserGetDecorationsTest, GetDecorationsForMember_Restrict) {
|
||||||
|
// Restrict applies to a memory object declaration.
|
||||||
|
// But OpMemberDecorate can only be applied to a structure type.
|
||||||
|
// Test the reader's ability to be resilient to more than what SPIR-V allows.
|
||||||
|
auto p = parser(test::Assemble(R"(
|
||||||
|
OpMemberDecorate %10 0 Restrict
|
||||||
|
%float = OpTypeFloat 32
|
||||||
|
%10 = OpTypeStruct %float
|
||||||
|
)"));
|
||||||
|
EXPECT_TRUE(p->BuildAndParseInternalModule());
|
||||||
|
auto decorations = p->GetDecorationsForMember(10, 0);
|
||||||
|
EXPECT_TRUE(decorations.empty());
|
||||||
|
EXPECT_TRUE(p->error().empty());
|
||||||
|
p->SkipDumpingPending(kSkipReason);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(SpvParserGetDecorationsTest, GetDecorationsFor_RestrictPointer) {
|
||||||
|
// RestrictPointer applies to a memory object declaration. Use a variable.
|
||||||
|
auto p = parser(test::Assemble(R"(
|
||||||
|
OpDecorate %10 RestrictPointer
|
||||||
|
%float = OpTypeFloat 32
|
||||||
|
%ptr = OpTypePointer Workgroup %float
|
||||||
|
%10 = OpVariable %ptr Workgroup
|
||||||
|
)"));
|
||||||
|
EXPECT_TRUE(p->BuildAndParseInternalModule()) << p->error();
|
||||||
|
auto decorations = p->GetDecorationsFor(10);
|
||||||
|
EXPECT_TRUE(decorations.empty());
|
||||||
|
EXPECT_TRUE(p->error().empty());
|
||||||
|
p->SkipDumpingPending(kSkipReason);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(SpvParserGetDecorationsTest, GetDecorationsForMember_RestrictPointer) {
|
||||||
|
// RestrictPointer applies to a memory object declaration.
|
||||||
|
// But OpMemberDecorate can only be applied to a structure type.
|
||||||
|
// Test the reader's ability to be resilient to more than what SPIR-V allows.
|
||||||
|
auto p = parser(test::Assemble(R"(
|
||||||
|
OpMemberDecorate %10 0 RestrictPointer
|
||||||
|
%float = OpTypeFloat 32
|
||||||
|
%10 = OpTypeStruct %float
|
||||||
|
)"));
|
||||||
|
EXPECT_TRUE(p->BuildAndParseInternalModule()) << p->error();
|
||||||
|
auto decorations = p->GetDecorationsFor(10);
|
||||||
|
EXPECT_TRUE(decorations.empty());
|
||||||
|
EXPECT_TRUE(p->error().empty());
|
||||||
|
p->SkipDumpingPending(kSkipReason);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace spirv
|
} // namespace spirv
|
||||||
} // namespace reader
|
} // namespace reader
|
||||||
|
Loading…
x
Reference in New Issue
Block a user