From 286ca432cfc7b0f12129c4a9f3c2e96935ce9a27 Mon Sep 17 00:00:00 2001
From: Rex Xu <rex.xu@amd.com>
Date: Thu, 27 Jul 2017 14:33:16 +0800
Subject: [PATCH] SPV: Memory qualifiers should decorate top-level block
 members

---
 SPIRV/GlslangToSpv.cpp                               | 4 +++-
 Test/baseResults/hlsl.structbuffer.coherent.frag.out | 2 --
 Test/baseResults/hlsl.structbuffer.frag.out          | 3 ---
 Test/baseResults/spv.memoryQualifier.frag.out        | 2 --
 Test/baseResults/spv.ssbo.autoassign.frag.out        | 2 --
 5 files changed, 3 insertions(+), 10 deletions(-)

diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index 50d53d5f0..36b27075a 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -2531,7 +2531,9 @@ void TGlslangToSpvTraverser::decorateStructType(const glslang::TType& type,
             }
             addMemberDecoration(spvType, member, TranslateInvariantDecoration(memberQualifier));
 
-            if (qualifier.storage == glslang::EvqBuffer) {
+            if (type.getBasicType() == glslang::EbtBlock &&
+                qualifier.storage == glslang::EvqBuffer) {
+                // Add memory decorations only to top-level members of shader storage block
                 std::vector<spv::Decoration> memory;
                 TranslateMemoryDecoration(memberQualifier, memory);
                 for (unsigned int i = 0; i < memory.size(); ++i)
diff --git a/Test/baseResults/hlsl.structbuffer.coherent.frag.out b/Test/baseResults/hlsl.structbuffer.coherent.frag.out
index c3e5e730f..702d92c6e 100644
--- a/Test/baseResults/hlsl.structbuffer.coherent.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.coherent.frag.out
@@ -208,9 +208,7 @@ gl_FragCoord origin is upper left
                               MemberDecorate 15(sbuf2) 0 Offset 0
                               Decorate 15(sbuf2) BufferBlock
                               Decorate 17(sbuf2) DescriptorSet 0
-                              MemberDecorate 28(sb_t) 0 Coherent
                               MemberDecorate 28(sb_t) 0 Offset 0
-                              MemberDecorate 28(sb_t) 1 Coherent
                               MemberDecorate 28(sb_t) 1 Offset 12
                               Decorate 29 ArrayStride 16
                               MemberDecorate 30(sbuf) 0 Coherent
diff --git a/Test/baseResults/hlsl.structbuffer.frag.out b/Test/baseResults/hlsl.structbuffer.frag.out
index d13b9752d..a60ce80aa 100644
--- a/Test/baseResults/hlsl.structbuffer.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.frag.out
@@ -221,11 +221,8 @@ gl_FragCoord origin is upper left
                               Name 89  "pos"
                               Name 92  "@entryPointOutput"
                               Name 93  "param"
-                              MemberDecorate 19(sb_t) 0 NonWritable
                               MemberDecorate 19(sb_t) 0 Offset 0
-                              MemberDecorate 19(sb_t) 1 NonWritable
                               MemberDecorate 19(sb_t) 1 Offset 12
-                              MemberDecorate 19(sb_t) 2 NonWritable
                               MemberDecorate 19(sb_t) 2 Offset 16
                               Decorate 20 ArrayStride 32
                               MemberDecorate 21(sbuf) 0 NonWritable
diff --git a/Test/baseResults/spv.memoryQualifier.frag.out b/Test/baseResults/spv.memoryQualifier.frag.out
index d4841a413..00608680d 100644
--- a/Test/baseResults/spv.memoryQualifier.frag.out
+++ b/Test/baseResults/spv.memoryQualifier.frag.out
@@ -44,9 +44,7 @@ spv.memoryQualifier.frag
                               Decorate 44(iCube) DescriptorSet 0
                               Decorate 44(iCube) Binding 3
                               Decorate 44(iCube) NonReadable
-                              MemberDecorate 49(Data) 0 Coherent
                               MemberDecorate 49(Data) 0 Offset 0
-                              MemberDecorate 49(Data) 1 Coherent
                               MemberDecorate 49(Data) 1 Offset 8
                               MemberDecorate 50(Buffer) 0 Coherent
                               MemberDecorate 50(Buffer) 0 Volatile
diff --git a/Test/baseResults/spv.ssbo.autoassign.frag.out b/Test/baseResults/spv.ssbo.autoassign.frag.out
index ca282c60a..6b7c723e2 100644
--- a/Test/baseResults/spv.ssbo.autoassign.frag.out
+++ b/Test/baseResults/spv.ssbo.autoassign.frag.out
@@ -30,9 +30,7 @@ spv.ssbo.autoassign.frag
                               Name 92  "pos"
                               Name 95  "@entryPointOutput"
                               Name 96  "param"
-                              MemberDecorate 14(BufType) 0 NonWritable
                               MemberDecorate 14(BufType) 0 Offset 0
-                              MemberDecorate 14(BufType) 1 NonWritable
                               MemberDecorate 14(BufType) 1 Offset 16
                               Decorate 15 ArrayStride 32
                               MemberDecorate 16(SB0) 0 NonWritable
-- 
GitLab