[spirv-reader][ir] Ignore more struct member decorations.
Ignore the `NonReadable`, `NonWritable` and `RelaxedPrecision`
decorations when attached to struct members.
Bug: 426244256, 426243226, 425901623
Change-Id: I10eca5dac5d355935a6c43e82ca08c71539a7597
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/249054
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Reviewed-by: James Price <jrprice@google.com>
diff --git a/src/tint/lang/spirv/reader/parser/composite_test.cc b/src/tint/lang/spirv/reader/parser/composite_test.cc
index c277575..1785195 100644
--- a/src/tint/lang/spirv/reader/parser/composite_test.cc
+++ b/src/tint/lang/spirv/reader/parser/composite_test.cc
@@ -114,6 +114,123 @@
)");
}
+TEST_F(SpirvParserTest, StructMemberRelaxedPrecision) {
+ EXPECT_IR(R"(
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main"
+ OpExecutionMode %main LocalSize 1 1 1
+ OpMemberDecorate %str 0 RelaxedPrecision
+ OpMemberDecorate %str 0 Offset 0
+ OpDecorate %str Block
+ OpDecorate %var DescriptorSet 1
+ OpDecorate %var Binding 2
+ %void = OpTypeVoid
+ %f32 = OpTypeFloat 32
+ %str = OpTypeStruct %f32
+ %ptr = OpTypePointer Uniform %str
+ %ep_type = OpTypeFunction %void
+ %var = OpVariable %ptr Uniform
+ %main = OpFunction %void None %ep_type
+ %main_start = OpLabel
+ OpReturn
+ OpFunctionEnd
+)",
+ R"(
+tint_symbol_1 = struct @align(4) {
+ tint_symbol:f32 @offset(0)
+}
+
+$B1: { # root
+ %1:ptr<uniform, tint_symbol_1, read> = var undef @binding_point(1, 2)
+}
+
+%main = @compute @workgroup_size(1u, 1u, 1u) func():void {
+ $B2: {
+ ret
+ }
+}
+)");
+}
+
+TEST_F(SpirvParserTest, StructMemberNonWritable) {
+ EXPECT_IR(R"(
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main"
+ OpExecutionMode %main LocalSize 1 1 1
+ OpMemberDecorate %str 0 NonWritable
+ OpMemberDecorate %str 0 Offset 0
+ OpDecorate %str Block
+ OpDecorate %var DescriptorSet 1
+ OpDecorate %var Binding 2
+ %void = OpTypeVoid
+ %f32 = OpTypeFloat 32
+ %str = OpTypeStruct %f32
+ %ptr = OpTypePointer Uniform %str
+ %ep_type = OpTypeFunction %void
+ %var = OpVariable %ptr Uniform
+ %main = OpFunction %void None %ep_type
+ %main_start = OpLabel
+ OpReturn
+ OpFunctionEnd
+)",
+ R"(
+tint_symbol_1 = struct @align(4) {
+ tint_symbol:f32 @offset(0)
+}
+
+$B1: { # root
+ %1:ptr<uniform, tint_symbol_1, read> = var undef @binding_point(1, 2)
+}
+
+%main = @compute @workgroup_size(1u, 1u, 1u) func():void {
+ $B2: {
+ ret
+ }
+}
+)");
+}
+
+TEST_F(SpirvParserTest, StructMemberNonReadable) {
+ EXPECT_IR(R"(
+ OpCapability Shader
+ OpMemoryModel Logical GLSL450
+ OpEntryPoint GLCompute %main "main"
+ OpExecutionMode %main LocalSize 1 1 1
+ OpMemberDecorate %str 0 NonReadable
+ OpMemberDecorate %str 0 Offset 0
+ OpDecorate %str Block
+ OpDecorate %var DescriptorSet 1
+ OpDecorate %var Binding 2
+ %void = OpTypeVoid
+ %f32 = OpTypeFloat 32
+ %str = OpTypeStruct %f32
+ %ptr = OpTypePointer Uniform %str
+ %ep_type = OpTypeFunction %void
+ %var = OpVariable %ptr Uniform
+ %main = OpFunction %void None %ep_type
+ %main_start = OpLabel
+ OpReturn
+ OpFunctionEnd
+)",
+ R"(
+tint_symbol_1 = struct @align(4) {
+ tint_symbol:f32 @offset(0)
+}
+
+$B1: { # root
+ %1:ptr<uniform, tint_symbol_1, read> = var undef @binding_point(1, 2)
+}
+
+%main = @compute @workgroup_size(1u, 1u, 1u) func():void {
+ $B2: {
+ ret
+ }
+}
+)");
+}
+
TEST_F(SpirvParserTest, CompositeConstruct_Vector) {
EXPECT_IR(R"(
OpCapability Shader
diff --git a/src/tint/lang/spirv/reader/parser/parser.cc b/src/tint/lang/spirv/reader/parser/parser.cc
index 15043b3..5ffb10b 100644
--- a/src/tint/lang/spirv/reader/parser/parser.cc
+++ b/src/tint/lang/spirv/reader/parser/parser.cc
@@ -792,8 +792,10 @@
if (struct_ty->element_decorations().count(i)) {
for (auto& deco : struct_ty->element_decorations().at(i)) {
switch (spv::Decoration(deco[0])) {
- case spv::Decoration::ColMajor:
- // Do nothing, WGSL is column major
+ case spv::Decoration::ColMajor: // Do nothing, WGSL is column major
+ case spv::Decoration::NonReadable: // Not supported in WGSL
+ case spv::Decoration::NonWritable: // Not supported in WGSL
+ case spv::Decoration::RelaxedPrecision: // Not supported in WGSL
break;
case spv::Decoration::RowMajor:
is_row_major = true;