Check for structures out from vertex or into fragment for ES 100 or desktop pre-150.


git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@24349 e7fa87d3-cd2b-0410-9028-fcbf551c1848
diff --git a/Test/100.frag b/Test/100.frag
index 1b7f0d0..28b0ec4 100644
--- a/Test/100.frag
+++ b/Test/100.frag
@@ -176,4 +176,6 @@
 int agggf(float f);

 int agggf(float f);  // ERROR, second prototype

 

+varying struct SSS { float f; } s; // ERROR

+

 uniform samplerExternalOES badExt;  // syntax ERROR

diff --git a/Test/100scope.vert b/Test/100scope.vert
index 7e9f82b..f7e2675 100644
--- a/Test/100scope.vert
+++ b/Test/100scope.vert
@@ -66,3 +66,5 @@
         S.x;        // 'S' is now visible as a variable

     }

 }

+

+varying struct SSS { float f; } s; // ERROR

diff --git a/Test/140.frag b/Test/140.frag
index e7ae26d..1ac44ce 100644
--- a/Test/140.frag
+++ b/Test/140.frag
@@ -16,3 +16,5 @@
 #else
 #error GL_ES is not set
 #endif
+
+in struct S { float f; } s; // ERROR
diff --git a/Test/150.frag b/Test/150.frag
index d4d4488..49d5636 100644
--- a/Test/150.frag
+++ b/Test/150.frag
@@ -12,3 +12,5 @@
 }

 

 layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord;  // ERROR, declared after use

+

+in struct S { float f; } s;

diff --git a/Test/300.vert b/Test/300.vert
index 29453cf..05a5932 100644
--- a/Test/300.vert
+++ b/Test/300.vert
@@ -157,3 +157,5 @@
 
 int agggf(float f) { return 2; }
 int agggf(float f);
+
+out struct Ssss { float f; } ssss;
diff --git a/Test/baseResults/100.frag.out b/Test/baseResults/100.frag.out
index bd7716f..dafad7d 100644
--- a/Test/baseResults/100.frag.out
+++ b/Test/baseResults/100.frag.out
@@ -66,8 +66,9 @@
 ERROR: 0:167: 'highp' : overloaded functions must have the same parameter precision qualifiers for argument 2

 ERROR: 0:170: 'multiple prototypes for same function' : not supported for this version or the enabled extensions 

 ERROR: 0:177: 'multiple prototypes for same function' : not supported for this version or the enabled extensions 

-ERROR: 0:179: '' :  syntax error

-ERROR: 61 compilation errors.  No code generated.

+ERROR: 0:179: 'fragment-shader struct input' : not supported for this version or the enabled extensions 

+ERROR: 0:181: '' :  syntax error

+ERROR: 62 compilation errors.  No code generated.

 

 

 ERROR: node is still EOpNull!

@@ -342,6 +343,7 @@
 0:?     'f123' (mediump float)

 0:?     'f124' (mediump float)

 0:?     'sCube' (uniform lowp samplerCube)

+0:?     's' (smooth in structure{f})

 

 

 Linked fragment stage:

diff --git a/Test/baseResults/100scope.vert.out b/Test/baseResults/100scope.vert.out
index 0063ec5..f155096 100644
--- a/Test/baseResults/100scope.vert.out
+++ b/Test/baseResults/100scope.vert.out
@@ -7,7 +7,8 @@
 ERROR: 0:35: 'local function declaration' : not supported with this profile: es

 ERROR: 0:54: 'z' : undeclared identifier 

 ERROR: 0:54: 'z' : redefinition 

-ERROR: 8 compilation errors.  No code generated.

+ERROR: 0:70: 'vertex-shader struct output' : not supported for this version or the enabled extensions 

+ERROR: 9 compilation errors.  No code generated.

 

 

 ERROR: node is still EOpNull!

@@ -112,6 +113,7 @@
 0:?   Linker Objects

 0:?     'b' (bool)

 0:?     'tan' (highp float)

+0:?     's' (smooth out structure{f})

 

 

 Linked vertex stage:

diff --git a/Test/baseResults/140.frag.out b/Test/baseResults/140.frag.out
index 4e963ee..7ac82bb 100644
--- a/Test/baseResults/140.frag.out
+++ b/Test/baseResults/140.frag.out
@@ -2,7 +2,8 @@
 Warning, version 140 is not yet complete; most features are present, but a few are missing.

 WARNING: 0:3: varying deprecated in version 130; may be removed in future release

 ERROR: 0:17: '#error' : GL_ES is not set  

-ERROR: 1 compilation errors.  No code generated.

+ERROR: 0:20: 'fragment-shader struct input' : not supported for this version or the enabled extensions 

+ERROR: 2 compilation errors.  No code generated.

 

 

 ERROR: node is still EOpNull!

@@ -22,6 +23,7 @@
 0:?     'o' (out 4-component vector of float)

 0:?     'gl_ClipDistance' (smooth in 5-element array of float)

 0:?     'gl_ClipDistance' (smooth in 5-element array of float)

+0:?     's' (smooth in structure{f})

 

 

 Linked fragment stage:

diff --git a/Test/baseResults/150.frag.out b/Test/baseResults/150.frag.out
index 398e38a..68d9ae0 100644
--- a/Test/baseResults/150.frag.out
+++ b/Test/baseResults/150.frag.out
@@ -21,6 +21,7 @@
 0:?     'gl_FragCoord' (gl_FragCoord 4-component vector of float)

 0:?     'gl_FragCoord' (gl_FragCoord 4-component vector of float)

 0:?     'foo' (smooth in 4-component vector of float)

+0:?     's' (smooth in structure{f})

 

 

 Linked fragment stage:

diff --git a/Test/baseResults/300.vert.out b/Test/baseResults/300.vert.out
index 156914d..e41d351 100644
--- a/Test/baseResults/300.vert.out
+++ b/Test/baseResults/300.vert.out
@@ -285,6 +285,7 @@
 0:?     's2DS' (uniform lowp sampler2DShadow)

 0:?     's2DAS' (uniform lowp sampler2DArrayShadow)

 0:?     'c2D' (in highp 2-component vector of float)

+0:?     'ssss' (smooth out structure{f})

 0:?     'gl_VertexID' (gl_VertexId highp int)

 0:?     'gl_InstanceID' (gl_InstanceId highp int)

 

diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h
index 77e51ba..32650d7 100644
--- a/glslang/Include/revision.h
+++ b/glslang/Include/revision.h
@@ -9,5 +9,5 @@
 // source have to figure out how to create revision.h just to get a build

 // going.  However, if it is not updated, it can be a version behind.

 

-#define GLSLANG_REVISION "24343"

-#define GLSLANG_DATE     "2013/12/04 12:46:19"

+#define GLSLANG_REVISION "24347"

+#define GLSLANG_DATE     "2013/12/04 13:08:16"

diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index cb74ed6..3d2d6f5 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -1651,6 +1651,20 @@
         }
     }
 
+    if (language == EShLangVertex && qualifier.storage == EvqVaryingOut) {
+        if (publicType.userDef) {
+            profileRequires(loc, EEsProfile, 300, 0, "vertex-shader struct output");
+            profileRequires(loc, ~EEsProfile, 150, 0, "vertex-shader struct output");
+        }
+    }
+
+    if (language == EShLangFragment && qualifier.storage == EvqVaryingIn) {
+        if (publicType.userDef) {
+            profileRequires(loc, EEsProfile, 300, 0, "fragment-shader struct input");
+            profileRequires(loc, ~EEsProfile, 150, 0, "fragment-shader struct input");
+        }
+    }
+
     if (publicType.basicType == EbtInt || publicType.basicType == EbtUint || publicType.basicType == EbtDouble) {
         profileRequires(loc, EEsProfile, 300, 0, "shader input/output");
         if (! qualifier.flat) {