Modify atomic_uint binding check
authorChow <laddoc@outlook.com>
Wed, 25 Dec 2019 09:08:48 +0000 (17:08 +0800)
committerChow <laddoc@outlook.com>
Wed, 25 Dec 2019 09:08:48 +0000 (17:08 +0800)
Modify atomic_uint binding check.

Currently, when not declared with offset, default atomic_unint won't check whether its binding is valid or not more than its limit value.

Test/450.comp
Test/baseResults/450.comp.out
glslang/MachineIndependent/ParseHelper.cpp

index fb2b56a..316674d 100644 (file)
@@ -1,5 +1,8 @@
 #version 450 core\r
 layout(local_size_x = 0) in; // ERROR, 0 not allowed\r
+\r
+layout(binding=10000) uniform atomic_uint;     // ERROR\r
+\r
 void main()\r
 {\r
     shared float f;   // ERROR shared must be global\r
index 4ae77cc..ce95f8d 100644 (file)
@@ -1,14 +1,15 @@
 450.comp
 ERROR: 0:2: 'local_size_x' : must be at least 1 
-ERROR: 0:5: 'shared' : not allowed in nested scope 
-ERROR: 2 compilation errors.  No code generated.
+ERROR: 0:4: 'binding' : atomic_uint binding is too large 
+ERROR: 0:8: 'shared' : not allowed in nested scope 
+ERROR: 3 compilation errors.  No code generated.
 
 
 Shader version: 450
 local_size = (1, 1, 1)
 ERROR: node is still EOpNull!
-0:3  Function Definition: main( ( global void)
-0:3    Function Parameters: 
+0:6  Function Definition: main( ( global void)
+0:6    Function Parameters: 
 0:?   Linker Objects
 
 
@@ -18,7 +19,7 @@ Linked compute stage:
 Shader version: 450
 local_size = (1, 1, 1)
 ERROR: node is still EOpNull!
-0:3  Function Definition: main( ( global void)
-0:3    Function Parameters: 
+0:6  Function Definition: main( ( global void)
+0:6    Function Parameters: 
 0:?   Linker Objects
 
index 9c46d57..d7a8510 100644 (file)
@@ -6380,13 +6380,15 @@ const TFunction* TParseContext::findFunctionExplicitTypes(const TSourceLoc& loc,
 void TParseContext::declareTypeDefaults(const TSourceLoc& loc, const TPublicType& publicType)
 {
 #ifndef GLSLANG_WEB
-    if (publicType.basicType == EbtAtomicUint && publicType.qualifier.hasBinding() &&
-        publicType.qualifier.hasOffset()) {
+    if (publicType.basicType == EbtAtomicUint && publicType.qualifier.hasBinding()) {
         if (publicType.qualifier.layoutBinding >= (unsigned int)resources.maxAtomicCounterBindings) {
             error(loc, "atomic_uint binding is too large", "binding", "");
             return;
         }
-        atomicUintOffsets[publicType.qualifier.layoutBinding] = publicType.qualifier.layoutOffset;
+
+        if(publicType.qualifier.hasOffset()) {
+            atomicUintOffsets[publicType.qualifier.layoutBinding] = publicType.qualifier.layoutOffset;
+        }
         return;
     }