Atomic memory function can only be used for shader storage block member or shared...
authorZhiqianXia <xzq0528@outlook.com>
Wed, 12 May 2021 12:07:52 +0000 (20:07 +0800)
committerZhiqianXia <xzq0528@outlook.com>
Fri, 14 May 2021 16:13:43 +0000 (00:13 +0800)
The glsl spec says:A shader will fail to compile if the value passed to the mem argument of an atomic memory function does not
correspond to a buffer or shared variable.

Test/atomicAdd.comp [new file with mode: 0644]
Test/baseResults/atomicAdd.comp.out [new file with mode: 0644]
glslang/MachineIndependent/ParseHelper.cpp
gtests/AST.FromFile.cpp

diff --git a/Test/atomicAdd.comp b/Test/atomicAdd.comp
new file mode 100644 (file)
index 0000000..65aa962
--- /dev/null
@@ -0,0 +1,19 @@
+#version 320 es\r
+layout(local_size_x = 1) in;\r
+\r
+struct structType{\r
+    int y[3];\r
+};\r
+\r
+layout(std430) buffer t2 {\r
+    structType f;\r
+} t;\r
+\r
+buffer coherent Buffer { int x; };\r
+int z;\r
+\r
+void main() {\r
+  atomicAdd(x, 1);\r
+  atomicAdd(t.f.y[1], 1);\r
+  atomicAdd(z, 1);\r
+}\r
diff --git a/Test/baseResults/atomicAdd.comp.out b/Test/baseResults/atomicAdd.comp.out
new file mode 100644 (file)
index 0000000..6752a71
--- /dev/null
@@ -0,0 +1,87 @@
+atomicAdd.comp
+ERROR: 0:18: 'atomicAdd' : Atomic memory function can only be used for shader storage block member or shared variable. 
+ERROR: 1 compilation errors.  No code generated.
+
+
+Shader version: 320
+local_size = (1, 1, 1)
+ERROR: node is still EOpNull!
+0:15  Function Definition: main( ( global void)
+0:15    Function Parameters: 
+0:16    Sequence
+0:16      AtomicAdd ( global highp int)
+0:16        x: direct index for structure (layout( column_major shared) coherent buffer highp int)
+0:16          'anon@0' (layout( column_major shared) coherent buffer block{layout( column_major shared) coherent buffer highp int x})
+0:16          Constant:
+0:16            0 (const uint)
+0:16        Constant:
+0:16          1 (const int)
+0:17      AtomicAdd ( global highp int)
+0:17        direct index (layout( std430) temp highp int)
+0:17          y: direct index for structure (layout( std430) global 3-element array of highp int)
+0:17            f: direct index for structure (layout( column_major std430 offset=0) buffer structure{layout( std430) global 3-element array of highp int y})
+0:17              't' (layout( column_major std430) buffer block{layout( column_major std430 offset=0) buffer structure{layout( std430) global 3-element array of highp int y} f})
+0:17              Constant:
+0:17                0 (const int)
+0:17            Constant:
+0:17              0 (const int)
+0:17          Constant:
+0:17            1 (const int)
+0:17        Constant:
+0:17          1 (const int)
+0:18      AtomicAdd ( global highp int)
+0:18        'z' ( global highp int)
+0:18        Constant:
+0:18          1 (const int)
+0:?   Linker Objects
+0:?     'gl_WorkGroupSize' ( const highp 3-component vector of uint WorkGroupSize)
+0:?       1 (const uint)
+0:?       1 (const uint)
+0:?       1 (const uint)
+0:?     't' (layout( column_major std430) buffer block{layout( column_major std430 offset=0) buffer structure{layout( std430) global 3-element array of highp int y} f})
+0:?     'anon@0' (layout( column_major shared) coherent buffer block{layout( column_major shared) coherent buffer highp int x})
+0:?     'z' ( global highp int)
+
+
+Linked compute stage:
+
+
+Shader version: 320
+local_size = (1, 1, 1)
+ERROR: node is still EOpNull!
+0:15  Function Definition: main( ( global void)
+0:15    Function Parameters: 
+0:16    Sequence
+0:16      AtomicAdd ( global highp int)
+0:16        x: direct index for structure (layout( column_major shared) coherent buffer highp int)
+0:16          'anon@0' (layout( column_major shared) coherent buffer block{layout( column_major shared) coherent buffer highp int x})
+0:16          Constant:
+0:16            0 (const uint)
+0:16        Constant:
+0:16          1 (const int)
+0:17      AtomicAdd ( global highp int)
+0:17        direct index (layout( std430) temp highp int)
+0:17          y: direct index for structure (layout( std430) global 3-element array of highp int)
+0:17            f: direct index for structure (layout( column_major std430 offset=0) buffer structure{layout( std430) global 3-element array of highp int y})
+0:17              't' (layout( column_major std430) buffer block{layout( column_major std430 offset=0) buffer structure{layout( std430) global 3-element array of highp int y} f})
+0:17              Constant:
+0:17                0 (const int)
+0:17            Constant:
+0:17              0 (const int)
+0:17          Constant:
+0:17            1 (const int)
+0:17        Constant:
+0:17          1 (const int)
+0:18      AtomicAdd ( global highp int)
+0:18        'z' ( global highp int)
+0:18        Constant:
+0:18          1 (const int)
+0:?   Linker Objects
+0:?     'gl_WorkGroupSize' ( const highp 3-component vector of uint WorkGroupSize)
+0:?       1 (const uint)
+0:?       1 (const uint)
+0:?       1 (const uint)
+0:?     't' (layout( column_major std430) buffer block{layout( column_major std430 offset=0) buffer structure{layout( std430) global 3-element array of highp int y} f})
+0:?     'anon@0' (layout( column_major shared) coherent buffer block{layout( column_major shared) coherent buffer highp int x})
+0:?     'z' ( global highp int)
+
index 45c9362..53c91d7 100644 (file)
@@ -2330,6 +2330,12 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan
                    (arg0->getType().isFloatingDomain())) {
             requireExtensions(loc, 1, &E_GL_EXT_shader_atomic_float, fnCandidate.getName().c_str());
         }
+
+        const TIntermTyped* base = TIntermediate::findLValueBase(arg0, true);
+        const TQualifier& qualifier = base->getType().getQualifier();
+        if (qualifier.storage != EvqShared && qualifier.storage != EvqBuffer)
+            error(loc,"Atomic memory function can only be used for shader storage block member or shared variable.", fnCandidate.getName().c_str(), "");
+
         break;
     }
 
index 77f0aaf..cedd558 100644 (file)
@@ -282,6 +282,7 @@ INSTANTIATE_TEST_SUITE_P(
         "terminate.vert",
         "negativeWorkGroupSize.comp",
         "textureoffset_sampler2darrayshadow.vert",
+        "atomicAdd.comp",
     })),
     FileNameAsCustomTestSuffix
 );