Fix an issue of SPV generation for imageAtomicStore.
authorRex Xu <rex.xu@amd.com>
Sat, 22 Feb 2020 14:04:31 +0000 (22:04 +0800)
committerRex Xu <rex.xu@amd.com>
Sat, 22 Feb 2020 14:04:31 +0000 (22:04 +0800)
For GLSL function imageAtomicStore, it will be translated to
OpImageTexelPointer + OpAtomicStore. The result type of
OpImageTexelPointer must be the same as the sampled type of OpTypeImage.
On translation, the result type is mistakenly fetched from operand list
operands[2] while operands[2] corresponds to sampleNum whose type is
always uint. This leads to an error if the image type is iimageXXX that is
int image.

SPIRV/GlslangToSpv.cpp
Test/baseResults/spv.memoryScopeSemantics.comp.out
Test/spv.memoryScopeSemantics.comp

index 0c8a87e3ce2437e436e12a37a5603333c55869e4..0d4f2c64d7438f969a47bfe85db1dbe769785ef9 100755 (executable)
@@ -4731,7 +4731,7 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
             // imageAtomicStore has a void return type so base the pointer type on
             // the type of the value operand.
             if (node->getOp() == glslang::EOpImageAtomicStore) {
-                resultTypeId = builder.makePointer(spv::StorageClassImage, builder.getTypeId(operands[2].word));                
+                resultTypeId = builder.makePointer(spv::StorageClassImage, builder.getTypeId(*opIt));
             } else {
                 resultTypeId = builder.makePointer(spv::StorageClassImage, resultType());
             }
index cd99ec3e46f50c55316f18f592394ebda4b2adde..b8721f23420277da250fbfd9c30f83c73f72b212 100644 (file)
@@ -1,7 +1,7 @@
 spv.memoryScopeSemantics.comp
 // Module Version 10300
 // Generated by (magic number): 80008
-// Id's are bound by 167
+// Id's are bound by 169
 
                               Capability Shader
                               Capability Int64
@@ -181,6 +181,7 @@ spv.memoryScopeSemantics.comp
              163:             TypeImage 6(int) 2D multi-sampled nonsampled format:R32i
              164:             TypePointer UniformConstant 163
     165(imageMS):    164(ptr) Variable UniformConstant
+             167:      6(int) Constant 4294967289
          4(main):           2 Function None 3
                5:             Label
         8(origi):      7(ptr) Variable Function
@@ -280,5 +281,7 @@ spv.memoryScopeSemantics.comp
              162:     15(int) AtomicIAdd 160 12 42 16
              166:     40(ptr) ImageTexelPointer 165(imageMS) 39 12
                               AtomicStore 166 12 33 14
+             168:     40(ptr) ImageTexelPointer 36(imagei) 39 17
+                              AtomicStore 168 12 33 167
                               Return
                               FunctionEnd
index cb8545b6718a17839842ed65f9dcbf1c2fa2eb5d..528a639688e8b53d0988fe8f9bcdbee9b60d4e14 100644 (file)
@@ -69,5 +69,6 @@ void main()
     atomicAdd(bufferu.x, 5u, gl_ScopeDevice, 0, gl_SemanticsVolatile);\r
 \r
     imageAtomicStore(imageMS, ivec2(0,0), 1, 4, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease);\r
+    imageAtomicStore(imagei, ivec2(0,0), -7, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease);\r
 }\r
 \r