Tessellation partial implementation (not ready for use yet), including:
authorJohn Kessenich <cepheus@frii.com>
Wed, 11 Dec 2013 18:57:40 +0000 (18:57 +0000)
committerJohn Kessenich <cepheus@frii.com>
Wed, 11 Dec 2013 18:57:40 +0000 (18:57 +0000)
 - the built-in constants
 - built-in variable declarations, some dependent on gl_MaxPatchVertices
 - layout qualifier for vertices (shared with geometry shader max_vertices)
 - layout qualifiers for vertex spacing, vertex order, point mode, and primitive type
 - link semantics for layout qualifiers

Still TBD:
 - patch qualifier and arrayed input handling
 - sizing of gl_out[]
 - additional semantic checking
 - supporting the extension on version 150

git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@24468 e7fa87d3-cd2b-0410-9028-fcbf551c1848

28 files changed:
StandAlone/StandAlone.cpp
Test/400.tesc
Test/400.tese
Test/420.vert
Test/baseResults/150.frag.out
Test/baseResults/150.geom.out
Test/baseResults/300.vert.out
Test/baseResults/400.frag.out
Test/baseResults/400.geom.out
Test/baseResults/400.tesc.out
Test/baseResults/400.tese.out
Test/baseResults/410.geom.out
Test/baseResults/420.geom.out
Test/baseResults/420.tese.out
Test/baseResults/420.vert.out
Test/baseResults/specExamples.frag.out
Test/baseResults/test.conf
Todo.txt
glslang/Include/Types.h
glslang/Include/revision.h
glslang/MachineIndependent/Initialize.cpp
glslang/MachineIndependent/ParseHelper.cpp
glslang/MachineIndependent/ShaderLang.cpp
glslang/MachineIndependent/Versions.cpp
glslang/MachineIndependent/Versions.h
glslang/MachineIndependent/intermOut.cpp
glslang/MachineIndependent/linkValidate.cpp
glslang/MachineIndependent/localintermediate.h

index ba910f8..570054f 100644 (file)
@@ -123,7 +123,7 @@ const char* DefaultConfig =
     "MaxVertexUniformComponents 4096\n"
     "MaxVaryingFloats 64\n"
     "MaxVertexTextureImageUnits 32\n"
-    "MaxCombinedTextureImageUnits 32\n"
+    "MaxCombinedTextureImageUnits 80\n"
     "MaxTextureImageUnits 32\n"
     "MaxFragmentUniformComponents 4096\n"
     "MaxDrawBuffers 32\n"
index 855361c..b426a18 100644 (file)
@@ -1,6 +1,35 @@
 #version 400 core\r
 \r
+layout(vertices = 4) out;\r
+int outa[gl_out.length()];\r
+\r
+layout(quads) in;                   // ERROR\r
+layout(ccw) out;                    // ERROR\r
+layout(fractional_even_spacing) in; // ERROR\r
+\r
+\r
 void main()\r
 {\r
     barrier();\r
+\r
+    int a = gl_MaxTessControlInputComponents +\r
+            gl_MaxTessControlOutputComponents +\r
+            gl_MaxTessControlTextureImageUnits +\r
+            gl_MaxTessControlUniformComponents +\r
+            gl_MaxTessControlTotalOutputComponents;\r
+\r
+    vec4 p = gl_in[1].gl_Position;\r
+    float ps = gl_in[1].gl_PointSize;\r
+    float cd = gl_in[1].gl_ClipDistance[2];\r
+\r
+    int pvi = gl_PatchVerticesIn;\r
+    int pid = gl_PrimitiveID;\r
+    int iid = gl_InvocationID;\r
+\r
+    gl_out[1].gl_Position = p;\r
+    gl_out[1].gl_PointSize = ps;\r
+    gl_out[1].gl_ClipDistance[1] = cd;\r
+\r
+    gl_TessLevelOuter[3] = 3.2;\r
+    gl_TessLevelInner[1] = 1.3;\r
 }\r
index e6c4e25..66b0eb1 100644 (file)
@@ -1,6 +1,42 @@
 #version 400 core\r
 \r
+layout(vertices = 4) out; // ERROR\r
+layout(quads, cw) in;\r
+layout(triangles) in;     // ERROR\r
+layout(isolines) in;      // ERROR\r
+\r
+layout(cw) in;\r
+layout(ccw) in;           // ERROR\r
+\r
+layout(fractional_odd_spacing) in;    \r
+layout(equal_spacing) in;              // ERROR\r
+layout(fractional_even_spacing) in;    // ERROR\r
+\r
+layout(point_mode) in;\r
+\r
 void main()\r
 {\r
     barrier(); // ERROR\r
+\r
+    int a = gl_MaxTessEvaluationInputComponents +\r
+            gl_MaxTessEvaluationOutputComponents +\r
+            gl_MaxTessEvaluationTextureImageUnits +\r
+            gl_MaxTessEvaluationUniformComponents +\r
+            gl_MaxTessPatchComponents +\r
+            gl_MaxPatchVertices +\r
+            gl_MaxTessGenLevel;\r
+\r
+    vec4 p = gl_in[1].gl_Position;\r
+    float ps = gl_in[1].gl_PointSize;\r
+    float cd = gl_in[1].gl_ClipDistance[2];\r
+\r
+    int pvi = gl_PatchVerticesIn;\r
+    int pid = gl_PrimitiveID;\r
+    vec3 tc = gl_TessCoord;\r
+    float tlo = gl_TessLevelOuter[3];\r
+    float tli = gl_TessLevelInner[1];\r
+\r
+    gl_Position = p;\r
+    gl_PointSize = ps;\r
+    gl_ClipDistance[2] = cd;\r
 }\r
index 5e40e26..6b94c7b 100644 (file)
@@ -71,9 +71,9 @@ layout(binding = 1) in inblock { int aoeua; };       // ERROR
 layout(binding = 100000) uniform anonblock2 { int aooeu; } ;
 layout(binding = 4) uniform sampler2D sampb1;
 layout(binding = 5) uniform sampler2D sampb2[10];
-layout(binding = 32) uniform sampler2D sampb3; // ERROR, binding too big
+layout(binding = 80) uniform sampler2D sampb3; // ERROR, binding too big
 layout(binding = 31) uniform sampler2D sampb4;
-layout(binding = 31) uniform sampler2D sampb5[2]; // ERROR, binding too big
+layout(binding = 79) uniform sampler2D sampb5[2]; // ERROR, binding too big
 
 int fgfg(float f, mediump int i);
 int fgfg(float f, highp int i);
index 68d9ae0..d6efd18 100644 (file)
@@ -27,4 +27,6 @@ ERROR: node is still EOpNull!
 Linked fragment stage:\r
 \r
 \r
+gl_FragCoord pixel center is integer\r
+gl_FragCoord origin is upper left\r
 \r
index f04a1f4..7d47594 100644 (file)
@@ -146,4 +146,8 @@ ERROR: node is still EOpNull!
 Linked geometry stage:\r
 \r
 \r
+invocations = 4\r
+max_vertices = 300\r
+input primitive = lines_adjancency\r
+output primitive = triangle_strip\r
 \r
index e41d351..5810387 100644 (file)
@@ -77,7 +77,7 @@ ERROR: node is still EOpNull!
 0:36        move second child to first child (highp int)\r
 0:36          'c5' (highp int)\r
 0:36          Constant:\r
-0:36            32 (const int)\r
+0:36            80 (const int)\r
 0:37      Sequence\r
 0:37        move second child to first child (highp int)\r
 0:37          'c6' (highp int)\r
index 936cf2b..4546c42 100644 (file)
@@ -209,4 +209,6 @@ ERROR: node is still EOpNull!
 Linked fragment stage:\r
 \r
 \r
+gl_FragCoord pixel center is integer\r
+gl_FragCoord origin is upper left\r
 \r
index 8fd9f21..48b63e9 100644 (file)
@@ -78,4 +78,8 @@ Linked geometry stage:
 \r
 ERROR: Linking geometry stage: At least one geometry shader must specify an output layout primitive\r
 \r
+invocations = 4\r
+max_vertices = 127\r
+input primitive = triangles\r
+output primitive = none\r
 \r
index e598a2c..e961449 100644 (file)
 400.tesc\r
 Warning, version 400 is not yet complete; some version-specific features are present, but many are missing.\r
+ERROR: 0:4: 'length' :  array must be declared with a size before using this method\r
+ERROR: 0:6: 'quads' : unrecognized layout identifier, or qualifier requires assignemnt (e.g., binding = 4) \r
+ERROR: 0:7: 'ccw' : unrecognized layout identifier, or qualifier requires assignemnt (e.g., binding = 4) \r
+ERROR: 0:8: 'fractional_even_spacing' : unrecognized layout identifier, or qualifier requires assignemnt (e.g., binding = 4) \r
+ERROR: 4 compilation errors.  No code generated.\r
 \r
-0:? Sequence\r
-0:3  Function Definition: main( (void)\r
-0:3    Function Parameters: \r
-0:5    Sequence\r
-0:5      Barrier (void)\r
+\r
+vertices = 4\r
+ERROR: node is still EOpNull!\r
+0:11  Function Definition: main( (void)\r
+0:11    Function Parameters: \r
+0:13    Sequence\r
+0:13      Barrier (void)\r
+0:15      Sequence\r
+0:15        move second child to first child (int)\r
+0:15          'a' (int)\r
+0:15          Constant:\r
+0:15            5392 (const int)\r
+0:21      Sequence\r
+0:21        move second child to first child (4-component vector of float)\r
+0:21          'p' (4-component vector of float)\r
+0:21          gl_Position: direct index for structure (4-component vector of float)\r
+0:21            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})\r
+0:21              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})\r
+0:21              Constant:\r
+0:21                1 (const int)\r
+0:21            Constant:\r
+0:21              0 (const int)\r
+0:22      Sequence\r
+0:22        move second child to first child (float)\r
+0:22          'ps' (float)\r
+0:22          gl_PointSize: direct index for structure (float)\r
+0:22            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})\r
+0:22              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})\r
+0:22              Constant:\r
+0:22                1 (const int)\r
+0:22            Constant:\r
+0:22              1 (const int)\r
+0:23      Sequence\r
+0:23        move second child to first child (float)\r
+0:23          'cd' (float)\r
+0:23          direct index (float)\r
+0:23            gl_ClipDistance: direct index for structure (unsized array of float)\r
+0:23              direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})\r
+0:23                'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})\r
+0:23                Constant:\r
+0:23                  1 (const int)\r
+0:23              Constant:\r
+0:23                2 (const int)\r
+0:23            Constant:\r
+0:23              2 (const int)\r
+0:25      Sequence\r
+0:25        move second child to first child (int)\r
+0:25          'pvi' (int)\r
+0:25          'gl_PatchVerticesIn' (in int)\r
+0:26      Sequence\r
+0:26        move second child to first child (int)\r
+0:26          'pid' (int)\r
+0:26          'gl_PrimitiveID' (in int)\r
+0:27      Sequence\r
+0:27        move second child to first child (int)\r
+0:27          'iid' (int)\r
+0:27          'gl_InvocationID' (in int)\r
+0:29      move second child to first child (4-component vector of float)\r
+0:29        gl_Position: direct index for structure (4-component vector of float)\r
+0:29          direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})\r
+0:29            'gl_out' (out unsized array of block{gl_Position,gl_PointSize,gl_ClipDistance})\r
+0:29            Constant:\r
+0:29              1 (const int)\r
+0:29          Constant:\r
+0:29            0 (const int)\r
+0:29        'p' (4-component vector of float)\r
+0:30      move second child to first child (float)\r
+0:30        gl_PointSize: direct index for structure (float)\r
+0:30          direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})\r
+0:30            'gl_out' (out unsized array of block{gl_Position,gl_PointSize,gl_ClipDistance})\r
+0:30            Constant:\r
+0:30              1 (const int)\r
+0:30          Constant:\r
+0:30            1 (const int)\r
+0:30        'ps' (float)\r
+0:31      move second child to first child (float)\r
+0:31        direct index (float)\r
+0:31          gl_ClipDistance: direct index for structure (unsized array of float)\r
+0:31            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})\r
+0:31              'gl_out' (out unsized array of block{gl_Position,gl_PointSize,gl_ClipDistance})\r
+0:31              Constant:\r
+0:31                1 (const int)\r
+0:31            Constant:\r
+0:31              2 (const int)\r
+0:31          Constant:\r
+0:31            1 (const int)\r
+0:31        'cd' (float)\r
+0:33      move second child to first child (float)\r
+0:33        direct index (patch float)\r
+0:33          'gl_TessLevelOuter' (patch out 4-element array of float)\r
+0:33          Constant:\r
+0:33            3 (const int)\r
+0:33        Constant:\r
+0:33          3.200000\r
+0:34      move second child to first child (float)\r
+0:34        direct index (patch float)\r
+0:34          'gl_TessLevelInner' (patch out 2-element array of float)\r
+0:34          Constant:\r
+0:34            1 (const int)\r
+0:34        Constant:\r
+0:34          1.300000\r
 0:?   Linker Objects\r
+0:?     'outa' (1-element array of int)\r
+0:?     'gl_out' (out unsized array of block{gl_Position,gl_PointSize,gl_ClipDistance})\r
 \r
 \r
 Linked tessellation control stage:\r
 \r
 \r
+vertices = 4\r
 \r
index 918c6da..059d22e 100644 (file)
 400.tese\r
 Warning, version 400 is not yet complete; some version-specific features are present, but many are missing.\r
-ERROR: 0:5: 'barrier' : no matching overloaded function found \r
-ERROR: 1 compilation errors.  No code generated.\r
+ERROR: 0:3: 'vertices' : there is no such layout identifier for this stage taking an assigned value \r
+ERROR: 0:5: 'triangles' : cannot change previously set input primitive \r
+ERROR: 0:6: 'isolines' : cannot change previously set input primitive \r
+ERROR: 0:9: 'ccw' : cannot change previously set vertex order \r
+ERROR: 0:12: 'equal_spacing' : cannot change previously set vertex spacing \r
+ERROR: 0:13: 'fractional_even_spacing' : cannot change previously set vertex spacing \r
+ERROR: 0:19: 'barrier' : no matching overloaded function found \r
+ERROR: 7 compilation errors.  No code generated.\r
 \r
 \r
+input primitive = quads\r
+vertex spacing = fractional_odd_spacing\r
+triangle order = cw\r
+using point mode\r
 ERROR: node is still EOpNull!\r
-0:3  Function Definition: main( (void)\r
-0:3    Function Parameters: \r
-0:5    Sequence\r
-0:5      Constant:\r
-0:5        0.000000\r
+0:17  Function Definition: main( (void)\r
+0:17    Function Parameters: \r
+0:19    Sequence\r
+0:19      Constant:\r
+0:19        0.000000\r
+0:21      Sequence\r
+0:21        move second child to first child (int)\r
+0:21          'a' (int)\r
+0:21          Constant:\r
+0:21            1512 (const int)\r
+0:29      Sequence\r
+0:29        move second child to first child (4-component vector of float)\r
+0:29          'p' (4-component vector of float)\r
+0:29          gl_Position: direct index for structure (4-component vector of float)\r
+0:29            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})\r
+0:29              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})\r
+0:29              Constant:\r
+0:29                1 (const int)\r
+0:29            Constant:\r
+0:29              0 (const int)\r
+0:30      Sequence\r
+0:30        move second child to first child (float)\r
+0:30          'ps' (float)\r
+0:30          gl_PointSize: direct index for structure (float)\r
+0:30            direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})\r
+0:30              'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})\r
+0:30              Constant:\r
+0:30                1 (const int)\r
+0:30            Constant:\r
+0:30              1 (const int)\r
+0:31      Sequence\r
+0:31        move second child to first child (float)\r
+0:31          'cd' (float)\r
+0:31          direct index (float)\r
+0:31            gl_ClipDistance: direct index for structure (unsized array of float)\r
+0:31              direct index (block{gl_Position,gl_PointSize,gl_ClipDistance})\r
+0:31                'gl_in' (in 32-element array of block{gl_Position,gl_PointSize,gl_ClipDistance})\r
+0:31                Constant:\r
+0:31                  1 (const int)\r
+0:31              Constant:\r
+0:31                2 (const int)\r
+0:31            Constant:\r
+0:31              2 (const int)\r
+0:33      Sequence\r
+0:33        move second child to first child (int)\r
+0:33          'pvi' (int)\r
+0:33          'gl_PatchVerticesIn' (in int)\r
+0:34      Sequence\r
+0:34        move second child to first child (int)\r
+0:34          'pid' (int)\r
+0:34          'gl_PrimitiveID' (in int)\r
+0:35      Sequence\r
+0:35        move second child to first child (3-component vector of float)\r
+0:35          'tc' (3-component vector of float)\r
+0:35          'gl_TessCoord' (in 3-component vector of float)\r
+0:36      Sequence\r
+0:36        move second child to first child (float)\r
+0:36          'tlo' (float)\r
+0:36          direct index (patch float)\r
+0:36            'gl_TessLevelOuter' (patch in 4-element array of float)\r
+0:36            Constant:\r
+0:36              3 (const int)\r
+0:37      Sequence\r
+0:37        move second child to first child (float)\r
+0:37          'tli' (float)\r
+0:37          direct index (patch float)\r
+0:37            'gl_TessLevelInner' (patch in 2-element array of float)\r
+0:37            Constant:\r
+0:37              1 (const int)\r
+0:39      move second child to first child (4-component vector of float)\r
+0:39        gl_Position: direct index for structure (gl_Position 4-component vector of float)\r
+0:39          '__anon__1' (out block{gl_Position,gl_PointSize,gl_ClipDistance})\r
+0:39          Constant:\r
+0:39            0 (const uint)\r
+0:39        'p' (4-component vector of float)\r
+0:40      move second child to first child (float)\r
+0:40        gl_PointSize: direct index for structure (gl_PointSize float)\r
+0:40          '__anon__1' (out block{gl_Position,gl_PointSize,gl_ClipDistance})\r
+0:40          Constant:\r
+0:40            1 (const uint)\r
+0:40        'ps' (float)\r
+0:41      move second child to first child (float)\r
+0:41        direct index (float)\r
+0:41          gl_ClipDistance: direct index for structure (unsized array of float)\r
+0:41            '__anon__1' (out block{gl_Position,gl_PointSize,gl_ClipDistance})\r
+0:41            Constant:\r
+0:41              2 (const uint)\r
+0:41          Constant:\r
+0:41            2 (const int)\r
+0:41        'cd' (float)\r
 0:?   Linker Objects\r
 \r
 \r
 Linked tessellation evaluation stage:\r
 \r
 \r
+input primitive = quads\r
+vertex spacing = fractional_odd_spacing\r
+triangle order = cw\r
+using point mode\r
 \r
index f1c1d0a..1a4c580 100644 (file)
@@ -56,4 +56,8 @@ ERROR: Linking geometry stage: At least one geometry shader must specify an inpu
 ERROR: Linking geometry stage: At least one geometry shader must specify an output layout primitive\r
 ERROR: Linking geometry stage: At least one geometry shader must specify a layout(max_vertices = value)\r
 \r
+invocations = 0\r
+max_vertices = 0\r
+input primitive = none\r
+output primitive = none\r
 \r
index 2246a11..10af913 100644 (file)
@@ -126,4 +126,8 @@ ERROR: Linking geometry stage: Missing entry point: Each stage requires one "voi
 ERROR: Linking geometry stage: At least one geometry shader must specify an output layout primitive\r
 ERROR: Linking geometry stage: At least one geometry shader must specify a layout(max_vertices = value)\r
 \r
+invocations = 0\r
+max_vertices = 0\r
+input primitive = triangles\r
+output primitive = none\r
 \r
index 950517e..2df4c15 100644 (file)
@@ -16,6 +16,9 @@ ERROR: 0:58: 'initializer list' : wrong number of structure members
 ERROR: 13 compilation errors.  No code generated.\r
 \r
 \r
+input primitive = none\r
+vertex spacing = none\r
+triangle order = none\r
 ERROR: node is still EOpNull!\r
 0:4  Sequence\r
 0:4    move second child to first child (2X2 matrix of float)\r
@@ -160,5 +163,9 @@ ERROR: node is still EOpNull!
 \r
 Linked tessellation evaluation stage:\r
 \r
+ERROR: Linking tessellation evaluation stage: At least one tessellation shader must specify an input layout primitive\r
 \r
+input primitive = none\r
+vertex spacing = equal_spacing\r
+triangle order = ccw\r
 \r
index b7f239e..740b22c 100644 (file)
@@ -127,9 +127,9 @@ ERROR: node is still EOpNull!
 0:?     '__anon__2' (layout(column_major shared ) uniform block{aooeu})\r
 0:?     'sampb1' (layout(binding=4 ) uniform sampler2D)\r
 0:?     'sampb2' (layout(binding=5 ) uniform 10-element array of sampler2D)\r
-0:?     'sampb3' (layout(binding=32 ) uniform sampler2D)\r
+0:?     'sampb3' (layout(binding=80 ) uniform sampler2D)\r
 0:?     'sampb4' (layout(binding=31 ) uniform sampler2D)\r
-0:?     'sampb5' (layout(binding=31 ) uniform 2-element array of sampler2D)\r
+0:?     'sampb5' (layout(binding=79 ) uniform 2-element array of sampler2D)\r
 0:?     '__anon__3' (out block{gl_ClipDistance,})\r
 0:?     'gl_VertexID' (gl_VertexId int)\r
 0:?     'gl_InstanceID' (gl_InstanceId int)\r
index 2629e78..95be7c9 100644 (file)
@@ -302,4 +302,6 @@ ERROR: node is still EOpNull!
 Linked fragment stage:\r
 \r
 \r
+gl_FragCoord pixel center is integer\r
+gl_FragCoord origin is upper left\r
 \r
index 11d9896..d77c9cc 100644 (file)
@@ -6,7 +6,7 @@ MaxVertexAttribs 64
 MaxVertexUniformComponents 4096\r
 MaxVaryingFloats 64\r
 MaxVertexTextureImageUnits 32\r
-MaxCombinedTextureImageUnits 32\r
+MaxCombinedTextureImageUnits 80\r
 MaxTextureImageUnits 32\r
 MaxFragmentUniformComponents 4096\r
 MaxDrawBuffers 32\r
index 16b1306..c3b9413 100644 (file)
--- a/Todo.txt
+++ b/Todo.txt
@@ -110,8 +110,8 @@ Shader Functionality to Implement/Finish
         - patch in, patch out
         - input/output arrays
           - unsized array sizing to gl_MaxPatchVertices, including gl_in/gl_out
-        - built-in variables, functions, and constants verification
-        - layout qualifiers for primitive types
+        + built-in variables, functions, and constants verification
+        + layout qualifiers for primitive types
       - Polymorphic functions: Run-time selection of what function gets called, through the new keyword subroutine.
       - 64bit floating point numbers with the new type keyword double.  Built-in functions extended for doubles, and new function matching rules are added to both allow implicit conversions when calling a function and preserve most existing function matching once doubles are included. 
       + More implicit conversions
@@ -143,7 +143,7 @@ Shader Functionality to Implement/Finish
       + Add streams out from geometry shader. Output can be directed to streams through
          + EmitStreamVertex() and EndStreamPrimitive().
     GLSL 4.1
-      - Support for partitioning shaders into multiple programs to provide light-weight mixing of different shader stages.
+      + Support for partitioning shaders into multiple programs to provide light-weight mixing of different shader stages.
             (GL_ARB_separate_shader_objects)
         - layout qualifiers
         - redeclaration of input/output blocks
index c5b7bad..cf246c9 100644 (file)
@@ -221,6 +221,19 @@ enum TLayoutGeometry {
     ElgIsolines,
 };
 
+enum TVertexSpacing {
+    EvsNone,
+    EvsEqual,
+    EvsFractionalEven,
+    EvsFractionalOdd
+};
+
+enum TVertexOrder {
+    EvoNone,
+    EvoCw,
+    EvoCcw
+};
+
 class TQualifier {
 public:
     void clear()
@@ -232,7 +245,7 @@ public:
         smooth    = false;
         flat      = false;
         nopersp   = false;
-        patch     = false;
+        patch     = false;  // TODO 4.0 tessellation: implement semantics of patch (all of 4.3 stuff...), including arrayed inputs
         sample    = false;
         shared    = false;
         coherent  = false;
@@ -405,6 +418,23 @@ public:
         default:                    return "none";
         }
     }
+    static const char* getVertexSpacingString(TVertexSpacing spacing)
+    {
+        switch (spacing) {
+        case EvsEqual:              return "equal_spacing";
+        case EvsFractionalEven:     return "fractional_even_spacing";
+        case EvsFractionalOdd:      return "fractional_odd_spacing";
+        default:                    return "none";
+        }
+    }
+    static const char* getVertexOrderString(TVertexOrder order)
+    {
+        switch (order) {
+        case EvoCw:                 return "cw";
+        case EvoCcw:                return "ccw";
+        default:                    return "none";
+        }
+    }
     static int mapGeometryToSize(TLayoutGeometry geometry)
     {
         switch (geometry) {
@@ -421,11 +451,14 @@ public:
 // Qualifiers that don't need to be keep per object.  They have shader scope, not object scope.
 // So, they will not be part of TType, TQualifier, etc.
 struct TShaderQualifiers {
-    TLayoutGeometry geometry; // geometry shader in/out primitives
+    TLayoutGeometry geometry; // geometry/tessellation shader in/out primitives
     bool pixelCenterInteger;  // fragment shader
     bool originUpperLeft;     // fragment shader
     int invocations;          // 0 means no declaration
-    int maxVertices;
+    int vertices;             // both for tessellation "vertices" and geometry "max_vertices"
+    TVertexSpacing spacing;
+    TVertexOrder order;
+    bool pointMode;
 
     void init()
     {
@@ -433,7 +466,10 @@ struct TShaderQualifiers {
         originUpperLeft = false;
         pixelCenterInteger = false;
         invocations = 0;        // 0 means no declaration
-        maxVertices = 0;
+        vertices = 0;
+        spacing = EvsNone;
+        order = EvoNone;
+        pointMode = false;
     }
 };
 
index f974ed0..2a38808 100644 (file)
@@ -9,5 +9,5 @@
 // source have to figure out how to create revision.h just to get a build\r
 // going.  However, if it is not updated, it can be a version behind.\r
 \r
-#define GLSLANG_REVISION "24406"\r
-#define GLSLANG_DATE     "2013/12/08 17:37:46"\r
+#define GLSLANG_REVISION "24420"\r
+#define GLSLANG_DATE     "2013/12/09 17:25:14"\r
index 9a11835..7e071e8 100644 (file)
@@ -1256,30 +1256,10 @@ void TBuiltIns::initialize(int version, EProfile profile)
     //============================================================================
 
     if (version >= 400) {
-        // TODO: 4.0 tessellation: gl_MaxPatchVertices below needs to move to resources mechanism
-        stageBuiltins[EShLangTessControl].append(
-            "const int gl_MaxPatchVertices = 32;"
-            );
+        // Note:  "in gl_PerVertex {...} gl_in[gl_MaxPatchVertices];" is declared in initialize() below,
+        // as it depends on the resource sizing of gl_MaxPatchVertices.
 
         stageBuiltins[EShLangTessControl].append(
-            "in gl_PerVertex {"
-                "vec4 gl_Position;"
-                "float gl_PointSize;"
-                "float gl_ClipDistance[];"
-                );
-        if (profile == ECompatibilityProfile)
-            stageBuiltins[EShLangTessControl].append(
-                "vec4 gl_ClipVertex;"
-                "vec4 gl_FrontColor;"
-                "vec4 gl_BackColor;"
-                "vec4 gl_FrontSecondaryColor;"
-                "vec4 gl_BackSecondaryColor;"
-                "vec4 gl_TexCoord[];"
-                "float gl_FogFragCoord;"
-                );
-        stageBuiltins[EShLangTessControl].append(
-            "} gl_in[gl_MaxPatchVertices];"
-
             "in int gl_PatchVerticesIn;"
             "in int gl_PrimitiveID;"
             "in int gl_InvocationID;"
@@ -1305,6 +1285,8 @@ void TBuiltIns::initialize(int version, EProfile profile)
             "patch out float gl_TessLevelOuter[4];"
             "patch out float gl_TessLevelInner[2];"
             "\n");
+
+        // TODO 4.0 tessellation: do we also need to support the gl_VerticesOut mentioned in the extension specification?
     }
 
     //============================================================================
@@ -1314,30 +1296,10 @@ void TBuiltIns::initialize(int version, EProfile profile)
     //============================================================================
 
     if (version >= 400) {
-        // TODO: 4.0 tessellation: gl_MaxPatchVertices below needs to move to resources mechanism
-        stageBuiltins[EShLangTessEvaluation].append(
-            "const int gl_MaxPatchVertices = 32;"
-            );
+        // Note:  "in gl_PerVertex {...} gl_in[gl_MaxPatchVertices];" is declared in initialize() below,
+        // as it depends on the resource sizing of gl_MaxPatchVertices.
 
         stageBuiltins[EShLangTessEvaluation].append(
-            "in gl_PerVertex {"
-                "vec4 gl_Position;"
-                "float gl_PointSize;"
-                "float gl_ClipDistance[];"
-            );
-        if (version >= 400 && profile == ECompatibilityProfile)
-            stageBuiltins[EShLangTessEvaluation].append(
-                "vec4 gl_ClipVertex;"
-                "vec4 gl_FrontColor;"
-                "vec4 gl_BackColor;"
-                "vec4 gl_FrontSecondaryColor;"
-                "vec4 gl_BackSecondaryColor;"
-                "vec4 gl_TexCoord[];"
-                "float gl_FogFragCoord;"
-                );
-        stageBuiltins[EShLangTessEvaluation].append(
-            "} gl_in[gl_MaxPatchVertices];"
-     
             "in int gl_PatchVerticesIn;"
             "in int gl_PrimitiveID;"
             "in vec3 gl_TessCoord;"
@@ -1858,266 +1820,302 @@ void TBuiltIns::addGatherFunctions(TSampler sampler, TString& typeName, int vers
 
 //
 // Add context-dependent built-in functions and variables that are present
-// for the given version and profile.  Share common ones across stages, otherwise
-// make stage-specific entries.
+// for the given version and profile.  All the results are put into just the
+// commonBuiltins, because it is called for just a specific stage.  So,
+// add stage-specific entries to the commonBuiltins, and only if that stage
+// was requested.
 //
 void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProfile profile, EShLanguage language)
 {
     //
     // Initialize the context-dependent (resource-dependent) built-in strings for parsing.
     //
-    {
-        //============================================================================
-        //
-        // Standard Uniforms
-        //
-        //============================================================================
 
-        TString& s = commonBuiltins;
-               const int maxSize = 80;
-        char builtInConstant[maxSize];
+    //============================================================================
+    //
+    // Standard Uniforms
+    //
+    //============================================================================
 
-        //
-        // Build string of implementation dependent constants.
-        //
+    TString& s = commonBuiltins;
+       const int maxSize = 80;
+    char builtInConstant[maxSize];
 
-        if (profile == EEsProfile) {
-            snprintf(builtInConstant, maxSize, "const mediump int  gl_MaxVertexAttribs = %d;", resources.maxVertexAttribs);
-            s.append(builtInConstant);
+    //
+    // Build string of implementation dependent constants.
+    //
 
-            snprintf(builtInConstant, maxSize, "const mediump int  gl_MaxVertexUniformVectors = %d;", resources.maxVertexUniformVectors);
-            s.append(builtInConstant);
+    if (profile == EEsProfile) {
+        snprintf(builtInConstant, maxSize, "const mediump int  gl_MaxVertexAttribs = %d;", resources.maxVertexAttribs);
+        s.append(builtInConstant);
 
-            snprintf(builtInConstant, maxSize, "const mediump int  gl_MaxVertexTextureImageUnits = %d;", resources.maxVertexTextureImageUnits);
-            s.append(builtInConstant);
+        snprintf(builtInConstant, maxSize, "const mediump int  gl_MaxVertexUniformVectors = %d;", resources.maxVertexUniformVectors);
+        s.append(builtInConstant);
+
+        snprintf(builtInConstant, maxSize, "const mediump int  gl_MaxVertexTextureImageUnits = %d;", resources.maxVertexTextureImageUnits);
+        s.append(builtInConstant);
+
+        snprintf(builtInConstant, maxSize, "const mediump int  gl_MaxCombinedTextureImageUnits = %d;", resources.maxCombinedTextureImageUnits);
+        s.append(builtInConstant);
 
-            snprintf(builtInConstant, maxSize, "const mediump int  gl_MaxCombinedTextureImageUnits = %d;", resources.maxCombinedTextureImageUnits);
+        snprintf(builtInConstant, maxSize, "const mediump int  gl_MaxTextureImageUnits = %d;", resources.maxTextureImageUnits);
+        s.append(builtInConstant);
+
+        snprintf(builtInConstant, maxSize, "const mediump int  gl_MaxFragmentUniformVectors = %d;", resources.maxFragmentUniformVectors);
+        s.append(builtInConstant);
+
+        snprintf(builtInConstant, maxSize, "const mediump int  gl_MaxDrawBuffers = %d;", resources.maxDrawBuffers);
+        s.append(builtInConstant);
+
+        if (version == 100) {
+            snprintf(builtInConstant, maxSize, "const mediump int  gl_MaxVaryingVectors = %d;", resources.maxVaryingVectors);
+            s.append(builtInConstant);
+        } else {
+            snprintf(builtInConstant, maxSize, "const mediump int  gl_MaxVertexOutputVectors = %d;", resources.maxVertexOutputVectors);
             s.append(builtInConstant);
 
-            snprintf(builtInConstant, maxSize, "const mediump int  gl_MaxTextureImageUnits = %d;", resources.maxTextureImageUnits);
+            snprintf(builtInConstant, maxSize, "const mediump int  gl_MaxFragmentInputVectors = %d;", resources.maxFragmentInputVectors);
             s.append(builtInConstant);
 
-            snprintf(builtInConstant, maxSize, "const mediump int  gl_MaxFragmentUniformVectors = %d;", resources.maxFragmentUniformVectors);
+            snprintf(builtInConstant, maxSize, "const mediump int  gl_MinProgramTexelOffset = %d;", resources.minProgramTexelOffset);
             s.append(builtInConstant);
 
-            snprintf(builtInConstant, maxSize, "const mediump int  gl_MaxDrawBuffers = %d;", resources.maxDrawBuffers);
+            snprintf(builtInConstant, maxSize, "const mediump int  gl_MaxProgramTexelOffset = %d;", resources.maxProgramTexelOffset);
             s.append(builtInConstant);
+        }
+    } else {
+        snprintf(builtInConstant, maxSize, "const int  gl_MaxVertexAttribs = %d;", resources.maxVertexAttribs);
+        s.append(builtInConstant);
 
-            if (version == 100) {
-                snprintf(builtInConstant, maxSize, "const mediump int  gl_MaxVaryingVectors = %d;", resources.maxVaryingVectors);
-                s.append(builtInConstant);
-            } else {
-                snprintf(builtInConstant, maxSize, "const mediump int  gl_MaxVertexOutputVectors = %d;", resources.maxVertexOutputVectors);
-                s.append(builtInConstant);
+        snprintf(builtInConstant, maxSize, "const int  gl_MaxVertexTextureImageUnits = %d;", resources.maxVertexTextureImageUnits);
+        s.append(builtInConstant);
 
-                snprintf(builtInConstant, maxSize, "const mediump int  gl_MaxFragmentInputVectors = %d;", resources.maxFragmentInputVectors);
-                s.append(builtInConstant);
+        snprintf(builtInConstant, maxSize, "const int  gl_MaxCombinedTextureImageUnits = %d;", resources.maxCombinedTextureImageUnits);
+        s.append(builtInConstant);
 
-                snprintf(builtInConstant, maxSize, "const mediump int  gl_MinProgramTexelOffset = %d;", resources.minProgramTexelOffset);
-                s.append(builtInConstant);
+        snprintf(builtInConstant, maxSize, "const int  gl_MaxTextureImageUnits = %d;", resources.maxTextureImageUnits);
+        s.append(builtInConstant);
 
-                snprintf(builtInConstant, maxSize, "const mediump int  gl_MaxProgramTexelOffset = %d;", resources.maxProgramTexelOffset);
-                s.append(builtInConstant);
-            }
-        } else {
-            snprintf(builtInConstant, maxSize, "const int  gl_MaxVertexAttribs = %d;", resources.maxVertexAttribs);
-            s.append(builtInConstant);
+        snprintf(builtInConstant, maxSize, "const int  gl_MaxDrawBuffers = %d;", resources.maxDrawBuffers);
+        s.append(builtInConstant);
 
-            snprintf(builtInConstant, maxSize, "const int  gl_MaxVertexTextureImageUnits = %d;", resources.maxVertexTextureImageUnits);
-            s.append(builtInConstant);
+        snprintf(builtInConstant, maxSize, "const int  gl_MaxLights = %d;", resources.maxLights);
+        s.append(builtInConstant);
 
-            snprintf(builtInConstant, maxSize, "const int  gl_MaxCombinedTextureImageUnits = %d;", resources.maxCombinedTextureImageUnits);
-            s.append(builtInConstant);
+        snprintf(builtInConstant, maxSize, "const int  gl_MaxClipPlanes = %d;", resources.maxClipPlanes);
+        s.append(builtInConstant);
 
-            snprintf(builtInConstant, maxSize, "const int  gl_MaxTextureImageUnits = %d;", resources.maxTextureImageUnits);
-            s.append(builtInConstant);
+        snprintf(builtInConstant, maxSize, "const int  gl_MaxTextureUnits = %d;", resources.maxTextureUnits);
+        s.append(builtInConstant);
 
-            snprintf(builtInConstant, maxSize, "const int  gl_MaxDrawBuffers = %d;", resources.maxDrawBuffers);
-            s.append(builtInConstant);
+        snprintf(builtInConstant, maxSize, "const int  gl_MaxTextureCoords = %d;", resources.maxTextureCoords);
+        s.append(builtInConstant);
 
-            snprintf(builtInConstant, maxSize, "const int  gl_MaxLights = %d;", resources.maxLights);
-            s.append(builtInConstant);
+        snprintf(builtInConstant, maxSize, "const int  gl_MaxVertexUniformComponents = %d;", resources.maxVertexUniformComponents);
+        s.append(builtInConstant);
 
-            snprintf(builtInConstant, maxSize, "const int  gl_MaxClipPlanes = %d;", resources.maxClipPlanes);
-            s.append(builtInConstant);
+        snprintf(builtInConstant, maxSize, "const int  gl_MaxVaryingFloats = %d;", resources.maxVaryingFloats);
+        s.append(builtInConstant);
 
-            snprintf(builtInConstant, maxSize, "const int  gl_MaxTextureUnits = %d;", resources.maxTextureUnits);
-            s.append(builtInConstant);
+        snprintf(builtInConstant, maxSize, "const int  gl_MaxFragmentUniformComponents = %d;", resources.maxFragmentUniformComponents);
+        s.append(builtInConstant);
 
-            snprintf(builtInConstant, maxSize, "const int  gl_MaxTextureCoords = %d;", resources.maxTextureCoords);
-            s.append(builtInConstant);
+        if (IncludeLegacy(version, profile)) {
+            //
+            // OpenGL'uniform' state.  Page numbers are in reference to version
+            // 1.4 of the OpenGL specification.
+            //
 
-            snprintf(builtInConstant, maxSize, "const int  gl_MaxVertexUniformComponents = %d;", resources.maxVertexUniformComponents);
-            s.append(builtInConstant);
+            //
+            // Matrix state. p. 31, 32, 37, 39, 40.
+            //
+            s.append("uniform mat4  gl_TextureMatrix[gl_MaxTextureCoords];"
 
-            snprintf(builtInConstant, maxSize, "const int  gl_MaxVaryingFloats = %d;", resources.maxVaryingFloats);
-            s.append(builtInConstant);
+            //
+            // Derived matrix state that provides inverse and transposed versions
+            // of the matrices above.
+            //
+                        "uniform mat4  gl_TextureMatrixInverse[gl_MaxTextureCoords];"
 
-            snprintf(builtInConstant, maxSize, "const int  gl_MaxFragmentUniformComponents = %d;", resources.maxFragmentUniformComponents);
-            s.append(builtInConstant);
+                        "uniform mat4  gl_TextureMatrixTranspose[gl_MaxTextureCoords];"
 
-            if (IncludeLegacy(version, profile)) {
-                //
-                // OpenGL'uniform' state.  Page numbers are in reference to version
-                // 1.4 of the OpenGL specification.
-                //
-
-                //
-                // Matrix state. p. 31, 32, 37, 39, 40.
-                //
-                s.append("uniform mat4  gl_TextureMatrix[gl_MaxTextureCoords];"
-
-                //
-                // Derived matrix state that provides inverse and transposed versions
-                // of the matrices above.
-                //
-                         "uniform mat4  gl_TextureMatrixInverse[gl_MaxTextureCoords];"
-
-                         "uniform mat4  gl_TextureMatrixTranspose[gl_MaxTextureCoords];"
-
-                         "uniform mat4  gl_TextureMatrixInverseTranspose[gl_MaxTextureCoords];"
-
-                //
-                // Clip planes p. 42.
-                //
-                         "uniform vec4  gl_ClipPlane[gl_MaxClipPlanes];"
-
-                //
-                // Light State p 50, 53, 55.
-                //
-                         "uniform gl_LightSourceParameters  gl_LightSource[gl_MaxLights];"
-
-                //
-                // Derived state from products of light.
-                //
-                         "uniform gl_LightProducts gl_FrontLightProduct[gl_MaxLights];"
-                         "uniform gl_LightProducts gl_BackLightProduct[gl_MaxLights];"
-
-                //
-                // Texture Environment and Generation, p. 152, p. 40-42.
-                //
-                         "uniform vec4  gl_TextureEnvColor[gl_MaxTextureImageUnits];"
-                         "uniform vec4  gl_EyePlaneS[gl_MaxTextureCoords];"
-                         "uniform vec4  gl_EyePlaneT[gl_MaxTextureCoords];"
-                         "uniform vec4  gl_EyePlaneR[gl_MaxTextureCoords];"
-                         "uniform vec4  gl_EyePlaneQ[gl_MaxTextureCoords];"
-                         "uniform vec4  gl_ObjectPlaneS[gl_MaxTextureCoords];"
-                         "uniform vec4  gl_ObjectPlaneT[gl_MaxTextureCoords];"
-                         "uniform vec4  gl_ObjectPlaneR[gl_MaxTextureCoords];"
-                         "uniform vec4  gl_ObjectPlaneQ[gl_MaxTextureCoords];");
-            }
+                        "uniform mat4  gl_TextureMatrixInverseTranspose[gl_MaxTextureCoords];"
 
-            if (version >= 130) {
-                snprintf(builtInConstant, maxSize, "const int gl_MaxClipDistances = %d;", resources.maxClipDistances);
-                s.append(builtInConstant);
-                snprintf(builtInConstant, maxSize, "const int gl_MaxVaryingComponents = %d;", resources.maxVaryingComponents);
-                s.append(builtInConstant);
-            }
+            //
+            // Clip planes p. 42.
+            //
+                        "uniform vec4  gl_ClipPlane[gl_MaxClipPlanes];"
 
-            // geometry
-            if (version >= 150) {
-                snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryInputComponents = %d;", resources.maxGeometryInputComponents);
-                s.append(builtInConstant);
-                snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryOutputComponents = %d;", resources.maxGeometryOutputComponents);
-                s.append(builtInConstant);
-                snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryOutputVertices = %d;", resources.maxGeometryOutputVertices);
-                s.append(builtInConstant);
-                snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryTotalOutputComponents = %d;", resources.maxGeometryTotalOutputComponents);
-                s.append(builtInConstant);
-                snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryUniformComponents = %d;", resources.maxGeometryUniformComponents);
-                s.append(builtInConstant);
-                snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryVaryingComponents = %d;", resources.maxGeometryVaryingComponents);
-                s.append(builtInConstant);
+            //
+            // Light State p 50, 53, 55.
+            //
+                        "uniform gl_LightSourceParameters  gl_LightSource[gl_MaxLights];"
 
-            }
+            //
+            // Derived state from products of light.
+            //
+                        "uniform gl_LightProducts gl_FrontLightProduct[gl_MaxLights];"
+                        "uniform gl_LightProducts gl_BackLightProduct[gl_MaxLights];"
 
-            if (version >= 150) {
-                snprintf(builtInConstant, maxSize, "const int gl_MaxVertexOutputComponents = %d;", resources.maxVertexOutputComponents);
-                s.append(builtInConstant);
-                snprintf(builtInConstant, maxSize, "const int gl_MaxFragmentInputComponents = %d;", resources.maxFragmentInputComponents);
-                s.append(builtInConstant);
-            }
+            //
+            // Texture Environment and Generation, p. 152, p. 40-42.
+            //
+                        "uniform vec4  gl_TextureEnvColor[gl_MaxTextureImageUnits];"
+                        "uniform vec4  gl_EyePlaneS[gl_MaxTextureCoords];"
+                        "uniform vec4  gl_EyePlaneT[gl_MaxTextureCoords];"
+                        "uniform vec4  gl_EyePlaneR[gl_MaxTextureCoords];"
+                        "uniform vec4  gl_EyePlaneQ[gl_MaxTextureCoords];"
+                        "uniform vec4  gl_ObjectPlaneS[gl_MaxTextureCoords];"
+                        "uniform vec4  gl_ObjectPlaneT[gl_MaxTextureCoords];"
+                        "uniform vec4  gl_ObjectPlaneR[gl_MaxTextureCoords];"
+                        "uniform vec4  gl_ObjectPlaneQ[gl_MaxTextureCoords];");
+        }
 
-            // tessellation
-            if (version >= 400) {
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlInputComponents = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlOutputComponents = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlUniformComponents = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlTotalOutputComponents = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationInputComponents = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationOutputComponents = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationUniformComponents = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxTessPatchComponents = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxTessGenLevel = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxPatchVertices = %d;", resources.);
+        if (version >= 130) {
+            snprintf(builtInConstant, maxSize, "const int gl_MaxClipDistances = %d;", resources.maxClipDistances);
+            s.append(builtInConstant);
+            snprintf(builtInConstant, maxSize, "const int gl_MaxVaryingComponents = %d;", resources.maxVaryingComponents);
+            s.append(builtInConstant);
+        }
 
-            }
+        // geometry
+        if (version >= 150) {
+            snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryInputComponents = %d;", resources.maxGeometryInputComponents);
+            s.append(builtInConstant);
+            snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryOutputComponents = %d;", resources.maxGeometryOutputComponents);
+            s.append(builtInConstant);
+            snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryOutputVertices = %d;", resources.maxGeometryOutputVertices);
+            s.append(builtInConstant);
+            snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryTotalOutputComponents = %d;", resources.maxGeometryTotalOutputComponents);
+            s.append(builtInConstant);
+            snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryUniformComponents = %d;", resources.maxGeometryUniformComponents);
+            s.append(builtInConstant);
+            snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryVaryingComponents = %d;", resources.maxGeometryVaryingComponents);
+            s.append(builtInConstant);
 
-            if (version >= 410) {
-                snprintf(builtInConstant, maxSize, "const int gl_MaxViewports = %d;", resources.maxViewports);
-                s.append(builtInConstant);
-            }
+        }
 
-            // atomic counters
-            if (version >= 420) {
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxVertexAtomicCounters = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlAtomicCounters = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationAtomicCounters = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryAtomicCounters = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxFragmentAtomicCounters = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxCombinedAtomicCounters = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxAtomicCounterBindings = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxVertexAtomicCounterBuffers = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlAtomicCounterBuffers = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationAtomicCounterBuffers = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryAtomicCounterBuffers = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxFragmentAtomicCounterBuffers = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxCombinedAtomicCounterBuffers = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxAtomicCounterBufferSize = %d;", resources.);
-            }
+        if (version >= 150) {
+            snprintf(builtInConstant, maxSize, "const int gl_MaxVertexOutputComponents = %d;", resources.maxVertexOutputComponents);
+            s.append(builtInConstant);
+            snprintf(builtInConstant, maxSize, "const int gl_MaxFragmentInputComponents = %d;", resources.maxFragmentInputComponents);
+            s.append(builtInConstant);
+        }
 
-            // images
-            if (version >= 420) {
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryImageUniforms = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryTextureImageUnits = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlImageUniforms = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationImageUniforms = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlTextureImageUnits = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationTextureImageUnits = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxImageUnits = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxCombinedImageUnitsAndFragmentOutputs = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxImageSamples = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxVertexImageUniforms = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxFragmentImageUniforms = %d;", resources.);
-                //snprintf(builtInConstant, maxSize, "const int gl_MaxCombinedImageUniforms = %d;", resources.);
-            }
+        // tessellation
+        if (version >= 400) {
+            snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlInputComponents = %d;", resources.maxTessControlInputComponents);
+            s.append(builtInConstant);
+            snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlOutputComponents = %d;", resources.maxTessControlOutputComponents);
+            s.append(builtInConstant);
+            snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlTextureImageUnits = %d;", resources.maxTessControlTextureImageUnits);
+            s.append(builtInConstant);
+            snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlUniformComponents = %d;", resources.maxTessControlUniformComponents);
+            s.append(builtInConstant);
+            snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlTotalOutputComponents = %d;", resources.maxTessControlTotalOutputComponents);
+            s.append(builtInConstant);
+                
+            snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationInputComponents = %d;", resources.maxTessEvaluationInputComponents);
+            s.append(builtInConstant);
+            snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationOutputComponents = %d;", resources.maxTessEvaluationOutputComponents);
+            s.append(builtInConstant);
+            snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationTextureImageUnits = %d;", resources.maxTessEvaluationTextureImageUnits);
+            s.append(builtInConstant);
+            snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationUniformComponents = %d;", resources.maxTessEvaluationUniformComponents);
+            s.append(builtInConstant);
+                
+            snprintf(builtInConstant, maxSize, "const int gl_MaxTessPatchComponents = %d;", resources.maxTessPatchComponents);
+            s.append(builtInConstant);
+            snprintf(builtInConstant, maxSize, "const int gl_MaxTessGenLevel = %d;", resources.maxTessGenLevel);
+            s.append(builtInConstant);
+            snprintf(builtInConstant, maxSize, "const int gl_MaxPatchVertices = %d;", resources.maxPatchVertices);
+            s.append(builtInConstant);
 
-            // compute
-            if (version >= 430) {
-                snprintf(builtInConstant, maxSize, "const ivec3 gl_MaxComputeWorkGroupCount = {%d,%d,%d};", resources.maxComputeWorkGroupCountX,
-                                                                                                            resources.maxComputeWorkGroupCountY,
-                                                                                                            resources.maxComputeWorkGroupCountZ);                
-                s.append(builtInConstant);
-                snprintf(builtInConstant, maxSize, "const ivec3 gl_MaxComputeWorkGroupSize = {%d,%d,%d};", resources.maxComputeWorkGroupSizeX,
-                                                                                                           resources.maxComputeWorkGroupSizeY,
-                                                                                                           resources.maxComputeWorkGroupSizeZ);
-                s.append(builtInConstant);
-
-                snprintf(builtInConstant, maxSize, "const int gl_MaxComputeUniformComponents = %d;", resources.maxComputeUniformComponents);
-                s.append(builtInConstant);
-                snprintf(builtInConstant, maxSize, "const int gl_MaxComputeTextureImageUnits = %d;", resources.maxComputeTextureImageUnits);
-                s.append(builtInConstant);
-                snprintf(builtInConstant, maxSize, "const int gl_MaxComputeImageUniforms = %d;", resources.maxComputeImageUniforms);
-                s.append(builtInConstant);
-                snprintf(builtInConstant, maxSize, "const int gl_MaxComputeAtomicCounters = %d;", resources.maxComputeAtomicCounters);
-                s.append(builtInConstant);
-                snprintf(builtInConstant, maxSize, "const int gl_MaxComputeAtomicCounterBuffers = %d;", resources.maxComputeAtomicCounterBuffers);
-                s.append(builtInConstant);
+            if (language == EShLangTessControl || language == EShLangTessEvaluation) {
+                s.append(
+                    "in gl_PerVertex {"
+                        "vec4 gl_Position;"
+                        "float gl_PointSize;"
+                        "float gl_ClipDistance[];"
+                    );
+                if (profile == ECompatibilityProfile)
+                    s.append(
+                        "vec4 gl_ClipVertex;"
+                        "vec4 gl_FrontColor;"
+                        "vec4 gl_BackColor;"
+                        "vec4 gl_FrontSecondaryColor;"
+                        "vec4 gl_BackSecondaryColor;"
+                        "vec4 gl_TexCoord[];"
+                        "float gl_FogFragCoord;"
+                        );
+                s.append(
+                    "} gl_in[gl_MaxPatchVertices];"
+                    "\n");
             }
         }
 
-        s.append("\n");
+        if (version >= 410) {
+            snprintf(builtInConstant, maxSize, "const int gl_MaxViewports = %d;", resources.maxViewports);
+            s.append(builtInConstant);
+        }
+
+        // atomic counters
+        if (version >= 420) {
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxVertexAtomicCounters = %d;", resources.);
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlAtomicCounters = %d;", resources.);
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationAtomicCounters = %d;", resources.);
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryAtomicCounters = %d;", resources.);
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxFragmentAtomicCounters = %d;", resources.);
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxCombinedAtomicCounters = %d;", resources.);
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxAtomicCounterBindings = %d;", resources.);
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxVertexAtomicCounterBuffers = %d;", resources.);
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlAtomicCounterBuffers = %d;", resources.);
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationAtomicCounterBuffers = %d;", resources.);
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryAtomicCounterBuffers = %d;", resources.);
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxFragmentAtomicCounterBuffers = %d;", resources.);
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxCombinedAtomicCounterBuffers = %d;", resources.);
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxAtomicCounterBufferSize = %d;", resources.);
+        }
+
+        // images
+        if (version >= 420) {
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryImageUniforms = %d;", resources.);
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryTextureImageUnits = %d;", resources.);
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlImageUniforms = %d;", resources.);
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationImageUniforms = %d;", resources.);
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxImageUnits = %d;", resources.);
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxCombinedImageUnitsAndFragmentOutputs = %d;", resources.);
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxImageSamples = %d;", resources.);
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxVertexImageUniforms = %d;", resources.);
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxFragmentImageUniforms = %d;", resources.);
+            //snprintf(builtInConstant, maxSize, "const int gl_MaxCombinedImageUniforms = %d;", resources.);
+        }
+
+        // compute
+        if (version >= 430) {
+            snprintf(builtInConstant, maxSize, "const ivec3 gl_MaxComputeWorkGroupCount = {%d,%d,%d};", resources.maxComputeWorkGroupCountX,
+                                                                                                        resources.maxComputeWorkGroupCountY,
+                                                                                                        resources.maxComputeWorkGroupCountZ);                
+            s.append(builtInConstant);
+            snprintf(builtInConstant, maxSize, "const ivec3 gl_MaxComputeWorkGroupSize = {%d,%d,%d};", resources.maxComputeWorkGroupSizeX,
+                                                                                                        resources.maxComputeWorkGroupSizeY,
+                                                                                                        resources.maxComputeWorkGroupSizeZ);
+            s.append(builtInConstant);
+
+            snprintf(builtInConstant, maxSize, "const int gl_MaxComputeUniformComponents = %d;", resources.maxComputeUniformComponents);
+            s.append(builtInConstant);
+            snprintf(builtInConstant, maxSize, "const int gl_MaxComputeTextureImageUnits = %d;", resources.maxComputeTextureImageUnits);
+            s.append(builtInConstant);
+            snprintf(builtInConstant, maxSize, "const int gl_MaxComputeImageUniforms = %d;", resources.maxComputeImageUniforms);
+            s.append(builtInConstant);
+            snprintf(builtInConstant, maxSize, "const int gl_MaxComputeAtomicCounters = %d;", resources.maxComputeAtomicCounters);
+            s.append(builtInConstant);
+            snprintf(builtInConstant, maxSize, "const int gl_MaxComputeAtomicCounterBuffers = %d;", resources.maxComputeAtomicCounterBuffers);
+            s.append(builtInConstant);
+        }
     }
+
+    s.append("\n");
 }
 
 //
index e102b51..7fe1129 100644 (file)
@@ -2061,7 +2061,7 @@ void TParseContext::nonInitConstCheck(TSourceLoc loc, TString& identifier, TType
 //
 TSymbol* TParseContext::redeclareBuiltinVariable(TSourceLoc loc, const TString& identifier, const TQualifier& qualifier, const TShaderQualifiers& publicType, bool& newDeclaration)
 {
-    if (profile == EEsProfile || ! builtInName(identifier) || symbolTable.atBuiltInLevel())
+    if (profile == EEsProfile || ! builtInName(identifier) || symbolTable.atBuiltInLevel() || ! symbolTable.atGlobalLevel())
         return 0;
 
     // Potentially redeclaring a built-in variable...
@@ -2589,7 +2589,52 @@ void TParseContext::setLayoutQualifier(TSourceLoc loc, TPublicType& publicType,
                 return;
             }
         } else {
-            // TODO: 4.0 tessellation evaluation
+            // tessellation evaluation
+            // TODO: tessellation: semantic check these are on the in qualifier only
+
+            // input primitive
+            if (id == TQualifier::getGeometryString(ElgTriangles)) {
+                publicType.shaderQualifiers.geometry = ElgTriangles;
+                return;
+            }
+            if (id == TQualifier::getGeometryString(ElgQuads)) {
+                publicType.shaderQualifiers.geometry = ElgQuads;
+                return;
+            }
+            if (id == TQualifier::getGeometryString(ElgIsolines)) {
+                publicType.shaderQualifiers.geometry = ElgIsolines;
+                return;
+            }
+
+            // vertex spacing
+            if (id == TQualifier::getVertexSpacingString(EvsEqual)) {
+                publicType.shaderQualifiers.spacing = EvsEqual;
+                return;
+            }
+            if (id == TQualifier::getVertexSpacingString(EvsFractionalEven)) {
+                publicType.shaderQualifiers.spacing = EvsFractionalEven;
+                return;
+            }
+            if (id == TQualifier::getVertexSpacingString(EvsFractionalOdd)) {
+                publicType.shaderQualifiers.spacing = EvsFractionalOdd;
+                return;
+            }
+
+            // triangle order
+            if (id == TQualifier::getVertexOrderString(EvoCw)) {
+                publicType.shaderQualifiers.order = EvoCw;
+                return;
+            }
+            if (id == TQualifier::getVertexOrderString(EvoCcw)) {
+                publicType.shaderQualifiers.order = EvoCcw;
+                return;
+            }
+
+            // point mode
+            if (id == "point_mode") {
+                publicType.shaderQualifiers.pointMode = true;
+                return;
+            }
         }
     }
     if (language == EShLangFragment) {
@@ -2636,14 +2681,30 @@ void TParseContext::setLayoutQualifier(TSourceLoc loc, TPublicType& publicType,
             publicType.qualifier.layoutBinding = value;
         return;
     }
-    if (language == EShLangGeometry) {
+    switch (language) {
+    case EShLangVertex:
+        break;
+
+    case EShLangTessControl:
+        if (id == "vertices") {
+            // TODO: tessellation: implement gl_out[] array sizing based on this
+            // TODO: tessellation: semantic check this is on the out qualifier only
+            publicType.shaderQualifiers.vertices = value;
+            return;
+        }
+        break;
+
+    case EShLangTessEvaluation:
+        break;
+
+    case EShLangGeometry:
         if (id == "invocations") {
             profileRequires(loc, ECompatibilityProfile | ECoreProfile, 400, 0, "invocations");
             publicType.shaderQualifiers.invocations = value;
             return;
         }
         if (id == "max_vertices") {
-            publicType.shaderQualifiers.maxVertices = value;
+            publicType.shaderQualifiers.vertices = value;
             if (value > resources.maxGeometryOutputVertices)
                 error(loc, "too large, must be less than gl_MaxGeometryOutputVertices", "max_vertices", "");
             return;
@@ -2652,7 +2713,18 @@ void TParseContext::setLayoutQualifier(TSourceLoc loc, TPublicType& publicType,
             publicType.qualifier.layoutStream = value;
             return;
         }
+        break;
+
+    case EShLangFragment:
+        break;
+
+    case EShLangCompute:
+        break;
+
+       default:
+        break;
     }
+
     error(loc, "there is no such layout identifier for this stage taking an assigned value", id.c_str(), "");
 }
 
@@ -2666,8 +2738,8 @@ void TParseContext::mergeShaderLayoutQualifiers(TSourceLoc loc, TShaderQualifier
         dst.geometry = src.geometry;
     if (src.invocations != 0)
         dst.invocations = src.invocations;
-    if (src.maxVertices != 0)
-        dst.maxVertices = src.maxVertices;
+    if (src.vertices != 0)
+        dst.vertices = src.vertices;
     if (src.pixelCenterInteger)
         dst.pixelCenterInteger = src.pixelCenterInteger;
     if (src.originUpperLeft)
@@ -2819,7 +2891,7 @@ void TParseContext::checkNoShaderLayouts(TSourceLoc loc, const TShaderQualifiers
         error(loc, message, TQualifier::getGeometryString(shaderQualifiers.geometry), "");
     if (shaderQualifiers.invocations > 0)
         error(loc, message, "invocations", "");
-    if (shaderQualifiers.maxVertices > 0)
+    if (shaderQualifiers.vertices > 0)
         error(loc, message, "max_vertices", "");
 }
 
@@ -3604,9 +3676,13 @@ void TParseContext::invariantCheck(TSourceLoc loc, const TType& type, const TStr
 //
 void TParseContext::updateStandaloneQualifierDefaults(TSourceLoc loc, const TPublicType& publicType)
 {
-    if (publicType.shaderQualifiers.maxVertices) {
-        if (! intermediate.setMaxVertices(publicType.shaderQualifiers.maxVertices))
-            error(loc, "cannot change previously set layout value", "max_vertices", "");
+    if (publicType.shaderQualifiers.vertices) {
+        if (! intermediate.setVertices(publicType.shaderQualifiers.vertices)) {            
+            if (language == EShLangGeometry)
+                error(loc, "cannot change previously set layout value", "max_vertices", "");
+            else
+                error(loc, "cannot change previously set layout value", "vertices", "");
+        }
     }
     if (publicType.shaderQualifiers.invocations) {
         if (! intermediate.setInvocations(publicType.shaderQualifiers.invocations))
@@ -3620,6 +3696,8 @@ void TParseContext::updateStandaloneQualifierDefaults(TSourceLoc loc, const TPub
             case ElgLinesAdjacency:
             case ElgTriangles:
             case ElgTrianglesAdjacency:
+            case ElgQuads:
+            case ElgIsolines:
                 if (intermediate.setInputPrimitive(publicType.shaderQualifiers.geometry))
                     checkInputArrayConsistency(loc);
                 else
@@ -3642,6 +3720,16 @@ void TParseContext::updateStandaloneQualifierDefaults(TSourceLoc loc, const TPub
         } else
             error(loc, "cannot be used here", TQualifier::getGeometryString(publicType.shaderQualifiers.geometry), "");
     }
+    if (publicType.shaderQualifiers.spacing != EvsNone) {
+        if (! intermediate.setVertexSpacing(publicType.shaderQualifiers.spacing))
+            error(loc, "cannot change previously set vertex spacing", TQualifier::getVertexSpacingString(publicType.shaderQualifiers.spacing), "");
+    }
+    if (publicType.shaderQualifiers.order != EvoNone) {
+        if (! intermediate.setVertexOrder(publicType.shaderQualifiers.order))
+            error(loc, "cannot change previously set vertex order", TQualifier::getVertexOrderString(publicType.shaderQualifiers.order), "");
+    }
+    if (publicType.shaderQualifiers.pointMode)
+        intermediate.setPointMode();
 
     const TQualifier& qualifier = publicType.qualifier;
 
index 7b5a01c..c7a0aa9 100644 (file)
@@ -523,7 +523,7 @@ bool CompileDeferred(
     }
 
     if (messages & EShMsgAST)
-        intermediate.outputTree(parseContext.infoSink);
+        intermediate.output(parseContext.infoSink, true);
 
     delete [] lengths;
     delete [] strings;
@@ -1057,12 +1057,12 @@ bool TProgram::linkStage(EShLanguage stage, EShMessages messages)
         std::list<TShader*>::const_iterator it;
         for (it = stages[stage].begin(); it != stages[stage].end(); ++it)
             intermediate[stage]->merge(*infoSink, *(*it)->intermediate);
-
-        if (messages & EShMsgAST)
-            intermediate[stage]->outputTree(*infoSink);
     }
 
-    intermediate[stage]->errorCheck(*infoSink);
+    intermediate[stage]->finalCheck(*infoSink);
+
+    if (messages & EShMsgAST)
+        intermediate[stage]->output(*infoSink, stages[stage].size() > 1);
 
     return intermediate[stage]->getNumErrors() == 0;
 }
index 2735e95..f42c595 100644 (file)
@@ -161,6 +161,7 @@ void TParseContext::initializeExtensionBehavior()
     extensionBehavior[GL_ARB_texture_gather]           = EBhDisable;
     extensionBehavior[GL_ARB_gpu_shader5]              = EBhDisablePartial;
     extensionBehavior[GL_ARB_separate_shader_objects]  = EBhDisable;
+    extensionBehavior[GL_ARB_tessellation_shader]      = EBhDisable;
 }
 
 // Get code that is not part of a shared symbol table, is specific to this shader,
@@ -183,6 +184,7 @@ const char* TParseContext::getPreamble()
             "#define GL_ARB_texture_gather 1\n"
             "#define GL_ARB_gpu_shader5 1\n"
             "#define GL_ARB_separate_shader_objects 1\n";
+            "#define GL_ARB_tessellation_shader 1\n";
     }
 }
 
index e84d69b..758f8d6 100644 (file)
@@ -85,6 +85,7 @@ const char* const GL_ARB_shading_language_420pack = "GL_ARB_shading_language_420
 const char* const GL_ARB_texture_gather           = "GL_ARB_texture_gather";
 const char* const GL_ARB_gpu_shader5              = "GL_ARB_gpu_shader5";
 const char* const GL_ARB_separate_shader_objects  = "GL_ARB_separate_shader_objects";
+const char* const GL_ARB_tessellation_shader      = "GL_ARB_tessellation_shader";       // TODO: tessellation: make this extension work on version 150 and above shaders
 
 } // end namespace glslang
 
index e5543c9..0a99753 100644 (file)
@@ -577,22 +577,46 @@ bool OutputSwitch(bool /* preVisit */, TIntermSwitch* node, TIntermTraverser* it
 // Individual functions can be initialized to 0 to skip processing of that
 // type of node.  It's children will still be processed.
 //
-void TIntermediate::outputTree(TInfoSink& infoSink)
+void TIntermediate::output(TInfoSink& infoSink, bool tree)
 {
-    if (language == EShLangGeometry) {
+    switch (language) {
+    case EShLangVertex:
+        break;
+
+    case EShLangTessControl:
+        infoSink.debug << "vertices = " << vertices << "\n";
+        break;
+
+    case EShLangTessEvaluation:
+        infoSink.debug << "input primitive = " << TQualifier::getGeometryString(inputPrimitive) << "\n";
+        infoSink.debug << "vertex spacing = " << TQualifier::getVertexSpacingString(vertexSpacing) << "\n";
+        infoSink.debug << "triangle order = " << TQualifier::getVertexOrderString(vertexOrder) << "\n";
+        if (pointMode)
+            infoSink.debug << "using point mode\n";
+        break;
+
+    case EShLangGeometry:
         infoSink.debug << "invocations = " << invocations << "\n";
-        infoSink.debug << "max_vertices = " << maxVertices << "\n";
+        infoSink.debug << "max_vertices = " << vertices << "\n";
         infoSink.debug << "input primitive = " << TQualifier::getGeometryString(inputPrimitive) << "\n";
         infoSink.debug << "output primitive = " << TQualifier::getGeometryString(outputPrimitive) << "\n";
-    }
-    if (language == EShLangFragment) {
+        break;
+
+    case EShLangFragment:
         if (pixelCenterInteger)
             infoSink.debug << "gl_FragCoord pixel center is integer\n";
         if (originUpperLeft)
             infoSink.debug << "gl_FragCoord origin is upper left\n";
+        break;
+
+    case EShLangCompute:
+        break;
+
+       default:
+        break;
     }
 
-    if (treeRoot == 0)
+    if (treeRoot == 0 || ! tree)
         return;
 
     TOutputTraverser it(infoSink);
index f005728..e3c13eb 100644 (file)
@@ -80,15 +80,30 @@ void TIntermediate::merge(TInfoSink& infoSink, TIntermediate& unit)
         inputPrimitive = unit.inputPrimitive;\r
     else if (inputPrimitive != unit.inputPrimitive)\r
         error(infoSink, "Contradictory input layout primitives");\r
+    \r
     if (outputPrimitive == ElgNone)\r
         outputPrimitive = unit.outputPrimitive;\r
     else if (outputPrimitive != unit.outputPrimitive)\r
         error(infoSink, "Contradictory output layout primitives");\r
-    if (maxVertices == 0)\r
-        maxVertices = unit.maxVertices;\r
-    else if (maxVertices != unit.maxVertices)\r
+    \r
+    if (vertices == 0)\r
+        vertices = unit.vertices;\r
+    else if (vertices != unit.vertices)\r
         error(infoSink, "Contradictory layout max_vertices values");\r
 \r
+    if (vertexSpacing == ElgNone)\r
+        vertexSpacing = unit.vertexSpacing;\r
+    else if (vertexSpacing != unit.vertexSpacing)\r
+        error(infoSink, "Contradictory input vertex spacing");\r
+\r
+    if (vertexOrder == EvoNone)\r
+        vertexOrder = unit.vertexOrder;\r
+    else if (vertexOrder != unit.vertexOrder)\r
+        error(infoSink, "Contradictory triangle ordering");\r
+\r
+    if (unit.pointMode)\r
+        pointMode = true;\r
+\r
     if (unit.treeRoot == 0)\r
         return;\r
 \r
@@ -259,7 +274,9 @@ void TIntermediate::mergeErrorCheck(TInfoSink& infoSink, const TIntermSymbol& sy
 // Do final link-time error checking of a complete (merged) intermediate representation.\r
 // (Much error checking was done during merging).\r
 //\r
-void TIntermediate::errorCheck(TInfoSink& infoSink)\r
+// Also, lock in defaults of things not set.\r
+//\r
+void TIntermediate::finalCheck(TInfoSink& infoSink)\r
 {   \r
     if (numMains < 1)\r
         error(infoSink, "Missing entry point: Each stage requires one \"void main()\" entry point");\r
@@ -281,14 +298,21 @@ void TIntermediate::errorCheck(TInfoSink& infoSink)
     switch (language) {\r
     case EShLangVertex:\r
     case EShLangTessControl:\r
+        break;\r
     case EShLangTessEvaluation:\r
+        if (inputPrimitive == ElgNone)\r
+            error(infoSink, "At least one tessellation shader must specify an input layout primitive");\r
+        if (vertexSpacing == EvsNone)\r
+            vertexSpacing = EvsEqual;\r
+        if (vertexOrder == EvoNone)\r
+            vertexOrder = EvoCcw;\r
         break;\r
     case EShLangGeometry:\r
         if (inputPrimitive == ElgNone)\r
             error(infoSink, "At least one geometry shader must specify an input layout primitive");\r
         if (outputPrimitive == ElgNone)\r
             error(infoSink, "At least one geometry shader must specify an output layout primitive");\r
-        if (maxVertices == 0)\r
+        if (vertices == 0)\r
             error(infoSink, "At least one geometry shader must specify a layout(max_vertices = value)");\r
         break;\r
     case EShLangFragment:\r
index 52a4aa6..b9b51c3 100644 (file)
@@ -61,9 +61,10 @@ class TIntermediate {
 public:
     explicit TIntermediate(EShLanguage l, int v = 0, EProfile p = ENoProfile) : language(l), treeRoot(0), profile(p), version(v), 
         numMains(0), numErrors(0), recursive(false),
-        invocations(0), maxVertices(0), inputPrimitive(ElgNone), outputPrimitive(ElgNone), pixelCenterInteger(false), originUpperLeft(false) { }
+        invocations(0), vertices(0), inputPrimitive(ElgNone), outputPrimitive(ElgNone), pixelCenterInteger(false), originUpperLeft(false),
+        vertexSpacing(EvsNone), vertexOrder(EvoNone), pointMode(false) { }
     bool postProcess(TIntermNode*, EShLanguage);
-    void outputTree(TInfoSink&);
+    void output(TInfoSink&, bool tree);
        void removeTree();
 
     void setVersion(int v) { version = v; }
@@ -121,11 +122,11 @@ public:
         invocations = i;
         return true;
     }
-    bool setMaxVertices(int m)
+    bool setVertices(int m)
     {
-        if (maxVertices > 0)
-            return maxVertices == m;
-        maxVertices = m;
+        if (vertices > 0)
+            return vertices == m;
+        vertices = m;
         return true;
     }
     bool setInputPrimitive(TLayoutGeometry p)
@@ -135,7 +136,22 @@ public:
         inputPrimitive = p;
         return true;
     }
-    TLayoutGeometry getInputPrimitive() { return inputPrimitive; }
+    TLayoutGeometry getInputPrimitive() const { return inputPrimitive; }
+    bool setVertexSpacing(TVertexSpacing s)
+    {
+        if (vertexSpacing != EvsNone)
+            return vertexSpacing == s;
+        vertexSpacing = s;
+        return true;
+    }
+    bool setVertexOrder(TVertexOrder o)
+    {
+        if (vertexOrder != EvoNone)
+            return vertexOrder == o;
+        vertexOrder = o;
+        return true;
+    }
+    void setPointMode() { pointMode = true; }
     bool setOutputPrimitive(TLayoutGeometry p)
     {
         if (outputPrimitive != ElgNone)
@@ -150,7 +166,7 @@ public:
 
     void addToCallGraph(TInfoSink&, const TString& caller, const TString& callee);
     void merge(TInfoSink&, TIntermediate&);
-    void errorCheck(TInfoSink&);
+    void finalCheck(TInfoSink&);
 
     void addIoAccessed(const TString& name) { ioAccessed.insert(name); }
     bool inIoAccessed(const TString& name) const { return ioAccessed.find(name) != ioAccessed.end(); }
@@ -177,11 +193,14 @@ protected:
     int numErrors;
     bool recursive;
     int invocations;
-    int maxVertices;
+    int vertices;
     TLayoutGeometry inputPrimitive;
     TLayoutGeometry outputPrimitive;
     bool pixelCenterInteger;
     bool originUpperLeft;
+    TVertexSpacing vertexSpacing;
+    TVertexOrder vertexOrder;
+    bool pointMode;
 
     // for detecting recursion:  pair is <caller, callee>
     struct TCall {