GLSL front-end: Check recursively for opaque types in a block; these are all illegal.
authorJohn Kessenich <cepheus@frii.com>
Thu, 1 Oct 2015 00:57:47 +0000 (18:57 -0600)
committerJohn Kessenich <cepheus@frii.com>
Thu, 1 Oct 2015 00:57:47 +0000 (18:57 -0600)
Test/300block.frag
Test/baseResults/300block.frag.out
Test/baseResults/310.vert.out
glslang/Include/Types.h
glslang/Include/revision.h
glslang/MachineIndependent/ParseHelper.cpp

index e665b5e..9820e2a 100644 (file)
@@ -18,10 +18,10 @@ uniform fooBlock {
     uvec4 bv;
     uniform mat2 bm2;
     lowp isampler2D sampler;   // ERROR
-    struct T2 {           // ERROR
+    struct T2 {                // ERROR
         int a;
     } t;
-    S fbs;
+    S fbs;                     // ERROR, contains a sampler
 };
 
 uniform barBlock {
index 1704845..67801a4 100644 (file)
@@ -1,7 +1,8 @@
 300block.frag\r
 ERROR: 0:10: '' : cannot nest a structure definition inside a structure or block \r
 ERROR: 0:21: '' : cannot nest a structure definition inside a structure or block \r
-ERROR: 0:20: 'sampler' : member of block cannot be a sampler type \r
+ERROR: 0:20: 'sampler' : member of block cannot be or contain a sampler, image, or atomic_uint type \r
+ERROR: 0:24: 'fbs' : member of block cannot be or contain a sampler, image, or atomic_uint type \r
 ERROR: 0:45: 'variable indexing uniform block array' : not supported for this version or the enabled extensions \r
 ERROR: 0:46: 'fooBlock' : cannot be used (maybe an instance name is needed) \r
 ERROR: 0:46: 'fooBlock' : undeclared identifier \r
@@ -15,7 +16,7 @@ ERROR: 0:55: 'barBlockArray' : cannot be used (maybe an instance name is needed)
 ERROR: 0:55: 'barBlockArray' : undeclared identifier \r
 ERROR: 0:55: '*' :  wrong operand types: no operation '*' exists that takes a left-hand operand of type 'const int' and a right operand of type 'temp float' (or there is no acceptable conversion)\r
 ERROR: 0:58: 'fooBlock' : redefinition \r
-ERROR: 16 compilation errors.  No code generated.\r
+ERROR: 17 compilation errors.  No code generated.\r
 \r
 \r
 Shader version: 300\r
index 3833d75..c03ee82 100644 (file)
@@ -15,7 +15,7 @@ ERROR: 0:79: 'vertex-shader array-of-struct output' : not supported with this pr
 ERROR: 0:81: 'vertex-shader struct output containing an array' : not supported with this profile: es\r
 ERROR: 0:83: 'vertex-shader struct output containing structure' : not supported with this profile: es\r
 ERROR: 0:85: 'std430 on a uniform block' : not supported with this profile: es\r
-ERROR: 0:97: 's' : member of block cannot be a sampler type \r
+ERROR: 0:97: 's' : member of block cannot be or contain a sampler, image, or atomic_uint type \r
 ERROR: 0:105: 'location' : overlapping use of location 12\r
 ERROR: 0:107: 'input block' : not supported in this stage: vertex\r
 ERROR: 0:109: 'gl_PerVertex' : block redeclaration has extra members \r
index 9d7c280..efab2d8 100644 (file)
@@ -1161,6 +1161,19 @@ public:
         return false;
     }
 
+    virtual bool containsOpaque() const
+    {
+        if (basicType == EbtSampler || basicType == EbtAtomicUint)
+            return true;
+        if (! structure)
+            return false;
+        for (unsigned int i = 0; i < structure->size(); ++i) {
+            if ((*structure)[i].type->containsOpaque())
+                return true;
+        }
+        return false;
+    }
+
     // Array editing methods.  Array descriptors can be shared across
     // type instances.  This allows all uses of the same array
     // to be updated at once.  E.g., all nodes can be explicitly sized
index 3a82635..d3f11ca 100644 (file)
@@ -2,5 +2,5 @@
 // For the version, it uses the latest git tag followed by the number of commits.
 // For the date, it uses the current date (when then script is run).
 
-#define GLSLANG_REVISION "3.0.775"
-#define GLSLANG_DATE "21-Sep-2015"
+#define GLSLANG_REVISION "3.0.776"
+#define GLSLANG_DATE "30-Sep-2015"
index f91d93d..b4f0c0b 100644 (file)
@@ -4981,9 +4981,8 @@ void TParseContext::declareBlock(const TSourceLoc& loc, TTypeList& typeList, con
             profileRequires(memberLoc, ~EEsProfile, 440, E_GL_ARB_enhanced_layouts, "offset on block member");
         }
 
-        TBasicType basicType = memberType.getBasicType();
-        if (basicType == EbtSampler)
-            error(memberLoc, "member of block cannot be a sampler type", typeList[member].type->getFieldName().c_str(), "");
+        if (memberType.containsOpaque())
+            error(memberLoc, "member of block cannot be or contain a sampler, image, or atomic_uint type", typeList[member].type->getFieldName().c_str(), "");
     }
 
     // This might be a redeclaration of a built-in block.  If so, redeclareBuiltinBlock() will