Implement GL_ARB_viewport_array extension.


git-svn-id: https://cvs.khronos.org/svn/repos/ogl/trunk/ecosystem/public/sdk/tools/glslang@28653 e7fa87d3-cd2b-0410-9028-fcbf551c1848
diff --git a/Test/150.geom b/Test/150.geom
index f76c650..d5b3c9b 100644
--- a/Test/150.geom
+++ b/Test/150.geom
@@ -123,3 +123,17 @@
              gl_MaxGeometryTotalOutputComponents  +

              gl_MaxGeometryUniformComponents  +

              gl_MaxGeometryVaryingComponents;

+

+void fooe1()

+{

+    gl_ViewportIndex = gl_MaxViewports - 1;

+}

+

+#extension GL_ARB_viewport_array : enable

+

+void fooe2()

+{

+    gl_ViewportIndex = gl_MaxViewports - 1;

+}

+

+out int gl_ViewportIndex;

diff --git a/Test/baseResults/150.geom.out b/Test/baseResults/150.geom.out
index b2dc891..adb5b11 100644
--- a/Test/baseResults/150.geom.out
+++ b/Test/baseResults/150.geom.out
@@ -31,10 +31,14 @@
 ERROR: 0:89: 'invocations' : not supported for this version or the enabled extensions 

 ERROR: 0:92: 'stream' : member cannot contradict block 

 ERROR: 0:92: 'stream' : can only be used on an output 

-ERROR: 32 compilation errors.  No code generated.

+ERROR: 0:129: 'gl_ViewportIndex' : required extension not requested: GL_ARB_viewport_array

+ERROR: 0:129: 'gl_MaxViewports' : required extension not requested: GL_ARB_viewport_array

+ERROR: 0:139: 'gl_ViewportIndex' : identifiers starting with "gl_" are reserved 

+ERROR: 35 compilation errors.  No code generated.

 

 

 Shader version: 150

+Requested GL_ARB_viewport_array

 invocations = 4

 max_vertices = 200

 input primitive = lines_adjacency

@@ -129,6 +133,20 @@
 0:107      'summ' (float)

 0:107      Constant:

 0:107        11332.000000

+0:127  Function Definition: fooe1( (void)

+0:127    Function Parameters: 

+0:129    Sequence

+0:129      move second child to first child (int)

+0:129        'gl_ViewportIndex' (layout(stream=0 ) out int)

+0:129        Constant:

+0:129          15 (const int)

+0:134  Function Definition: fooe2( (void)

+0:134    Function Parameters: 

+0:136    Sequence

+0:136      move second child to first child (int)

+0:136        'gl_ViewportIndex' (layout(stream=0 ) out int)

+0:136        Constant:

+0:136          15 (const int)

 0:?   Linker Objects

 0:?     'fromV' (in 4-element array of block{in 3-component vector of float color})

 0:?     'toF' (layout(stream=0 ) out block{layout(stream=0 ) out 3-component vector of float color})

@@ -154,12 +172,14 @@
 0:?     'anon@3' (layout(stream=3 ) out block{layout(stream=3 ) out float f15})

 0:?     'anon@4' (layout(column_major shared ) uniform block{layout(column_major shared ) uniform bool b15})

 0:?     'summ' (float)

+0:?     'gl_ViewportIndex' (layout(stream=3 ) out int)

 

 

 Linked geometry stage:

 

 

 Shader version: 150

+Requested GL_ARB_viewport_array

 invocations = 4

 max_vertices = 200

 input primitive = lines_adjacency

@@ -254,6 +274,20 @@
 0:107      'summ' (float)

 0:107      Constant:

 0:107        11332.000000

+0:127  Function Definition: fooe1( (void)

+0:127    Function Parameters: 

+0:129    Sequence

+0:129      move second child to first child (int)

+0:129        'gl_ViewportIndex' (layout(stream=0 ) out int)

+0:129        Constant:

+0:129          15 (const int)

+0:134  Function Definition: fooe2( (void)

+0:134    Function Parameters: 

+0:136    Sequence

+0:136      move second child to first child (int)

+0:136        'gl_ViewportIndex' (layout(stream=0 ) out int)

+0:136        Constant:

+0:136          15 (const int)

 0:?   Linker Objects

 0:?     'fromV' (in 4-element array of block{in 3-component vector of float color})

 0:?     'toF' (layout(stream=0 ) out block{layout(stream=0 ) out 3-component vector of float color})

@@ -279,4 +313,5 @@
 0:?     'anon@3' (layout(stream=3 ) out block{layout(stream=3 ) out float f15})

 0:?     'anon@4' (layout(column_major shared ) uniform block{layout(column_major shared ) uniform bool b15})

 0:?     'summ' (float)

+0:?     'gl_ViewportIndex' (layout(stream=3 ) out int)

 

diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index b9c1344..07e38b4 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -871,7 +871,7 @@
     // Bitfield
     if ((profile == EEsProfile && version >= 310) ||
         (profile != EEsProfile && version >= 400)) {
-	    commonBuiltins.append(
+        commonBuiltins.append(
             " uint uaddCarry( uint,  uint, out  uint carry);"
             "uvec2 uaddCarry(uvec2, uvec2, out uvec2 carry);"
             "uvec3 uaddCarry(uvec3, uvec3, out uvec3 carry);"
@@ -1117,7 +1117,7 @@
             "\n");
     }
 
-	stageBuiltins[EShLangFragment].append(
+    stageBuiltins[EShLangFragment].append(
         "float dFdx(float p);"
         "vec2  dFdx(vec2  p);"
         "vec3  dFdx(vec3  p);"
@@ -1137,7 +1137,7 @@
 
     // GL_ARB_derivative_control
     if (profile != EEsProfile && version >= 400) {
-	    stageBuiltins[EShLangFragment].append(
+        stageBuiltins[EShLangFragment].append(
             "float dFdxFine(float p);"
             "vec2  dFdxFine(vec2  p);"
             "vec3  dFdxFine(vec3  p);"
@@ -1155,7 +1155,7 @@
             
             "\n");
 
-	    stageBuiltins[EShLangFragment].append(
+        stageBuiltins[EShLangFragment].append(
             "float dFdxCoarse(float p);"
             "vec2  dFdxCoarse(vec2  p);"
             "vec3  dFdxCoarse(vec3  p);"
@@ -1444,11 +1444,11 @@
         }
         if (version >= 130)
             stageBuiltins[EShLangVertex].append(
-                "int gl_VertexID;"     // needs qualifier fixed later
+                "int gl_VertexID;"            // needs qualifier fixed later
                 );
         if (version >= 140)
             stageBuiltins[EShLangVertex].append(
-                "int gl_InstanceID;"   // needs qualifier fixed later
+                "int gl_InstanceID;"          // needs qualifier fixed later
                 );
     } else {
         // ES profile
@@ -1459,11 +1459,11 @@
                 );
         } else {
             stageBuiltins[EShLangVertex].append(
-                "highp int gl_VertexID;"     // needs qualifier fixed later
-                "highp int gl_InstanceID;"   // needs qualifier fixed later
+                "highp int gl_VertexID;"      // needs qualifier fixed later
+                "highp int gl_InstanceID;"    // needs qualifier fixed later
 
-                "highp vec4  gl_Position;"   // needs qualifier fixed later
-                "highp float gl_PointSize;"  // needs qualifier fixed later
+                "highp vec4  gl_Position;"    // needs qualifier fixed later
+                "highp float gl_PointSize;"   // needs qualifier fixed later
                 );
         }
     }
@@ -1522,8 +1522,7 @@
             "};"
 
             "out int gl_PrimitiveID;"
-            "out int gl_Layer;"
-            "\n");
+            "out int gl_Layer;");
 
         if (version < 400 && profile == ECompatibilityProfile)
             stageBuiltins[EShLangGeometry].append(
@@ -1534,10 +1533,12 @@
             stageBuiltins[EShLangGeometry].append(
             "in int gl_InvocationID;"
             );
-        if (version >= 410 && profile != EEsProfile)
+        // GL_ARB_viewport_array
+        if (version >= 150 && profile != EEsProfile)
             stageBuiltins[EShLangGeometry].append(
             "out int gl_ViewportIndex;"
             );
+        stageBuiltins[EShLangGeometry].append("\n");
     }
 
     //============================================================================
@@ -2230,7 +2231,7 @@
     //============================================================================
 
     TString& s = commonBuiltins;
-	const int maxSize = 80;
+    const int maxSize = 80;
     char builtInConstant[maxSize];
 
     //
@@ -2462,7 +2463,7 @@
             }
         }
 
-        if (version >= 410) {
+        if (version >= 150) {
             snprintf(builtInConstant, maxSize, "const int gl_MaxViewports = %d;", resources.maxViewports);
             s.append(builtInConstant);
         }
@@ -2631,6 +2632,8 @@
         SpecialQualifier("gl_ClipVertex", EvqClipVertex, symbolTable);
         SpecialQualifier("gl_VertexID",   EvqVertexId, symbolTable);
         SpecialQualifier("gl_InstanceID", EvqInstanceId, symbolTable);
+        if (version < 410)
+            symbolTable.setVariableExtensions("gl_ViewportIndex", 1, &GL_ARB_viewport_array);
         break;
 
     case EShLangFragment:
@@ -2854,7 +2857,7 @@
         symbolTable.relateToOperator("groupMemoryBarrier",  EOpGroupMemoryBarrier);
         break;
 
-	default:
+    default:
         assert(false && "Language not supported");
     }
 }
@@ -2878,6 +2881,8 @@
         symbolTable.setVariableExtensions("gl_MinProgramTexelOffset", 1, &GL_ARB_shading_language_420pack);
         symbolTable.setVariableExtensions("gl_MaxProgramTexelOffset", 1, &GL_ARB_shading_language_420pack);
     }
+    if (profile != EEsProfile && version >= 150 && version < 410)
+        symbolTable.setVariableExtensions("gl_MaxViewports", 1, &GL_ARB_viewport_array);
 
     switch(language) {
     case EShLangFragment:
@@ -2892,7 +2897,7 @@
         }
         break;
 
-	default:
+    default:
         break;
     }
 }
diff --git a/glslang/MachineIndependent/Versions.cpp b/glslang/MachineIndependent/Versions.cpp
index ba1a3e6..691722c 100644
--- a/glslang/MachineIndependent/Versions.cpp
+++ b/glslang/MachineIndependent/Versions.cpp
@@ -170,7 +170,8 @@
     extensionBehavior[GL_ARB_shader_atomic_counters]       = EBhDisable;
     extensionBehavior[GL_ARB_derivative_control]           = EBhDisable;
     extensionBehavior[GL_ARB_shader_texture_image_samples] = EBhDisable;
-//    extensionBehavior[GL_ARB_cull_distance]            = EBhDisable;    // present for 4.5, but need extension control over block members
+    extensionBehavior[GL_ARB_viewport_array]               = EBhDisable;
+//    extensionBehavior[GL_ARB_cull_distance]                = EBhDisable;    // present for 4.5, but need extension control over block members
 }
 
 // Get code that is not part of a shared symbol table, is specific to this shader,
@@ -204,6 +205,7 @@
             "#define GL_ARB_shader_atomic_counters 1\n"
             "#define GL_ARB_derivative_control 1\n"
             "#define GL_ARB_shader_texture_image_samples 1\n"
+            "#define GL_ARB_viewport_array 1\n"
 //            "#define GL_ARB_cull_distance 1\n"    // present for 4.5, but need extension control over block members
             ;
     }
diff --git a/glslang/MachineIndependent/Versions.h b/glslang/MachineIndependent/Versions.h
index 7739567..6d0e63b 100644
--- a/glslang/MachineIndependent/Versions.h
+++ b/glslang/MachineIndependent/Versions.h
@@ -94,6 +94,7 @@
 const char* const GL_ARB_shader_atomic_counters       = "GL_ARB_shader_atomic_counters";
 const char* const GL_ARB_derivative_control           = "GL_ARB_derivative_control";
 const char* const GL_ARB_shader_texture_image_samples = "GL_ARB_shader_texture_image_samples";
+const char* const GL_ARB_viewport_array               = "GL_ARB_viewport_array";
 //const char* const GL_ARB_cull_distance            = "GL_ARB_cull_distance";  // present for 4.5, but need extension control over block members
 
 } // end namespace glslang