From ad54b24fba9f6fbd7c8ae076d79cc666d2683dec Mon Sep 17 00:00:00 2001
From: John Kessenich <cepheus@frii.com>
Date: Fri, 17 Oct 2014 20:01:27 +0000
Subject: [PATCH] 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
---
 Test/150.geom                             | 14 ++++++++
 Test/baseResults/150.geom.out             | 37 ++++++++++++++++++++-
 glslang/MachineIndependent/Initialize.cpp | 39 +++++++++++++----------
 glslang/MachineIndependent/Versions.cpp   |  4 ++-
 glslang/MachineIndependent/Versions.h     |  1 +
 5 files changed, 76 insertions(+), 19 deletions(-)

diff --git a/Test/150.geom b/Test/150.geom
index f76c6504d..d5b3c9b3d 100644
--- a/Test/150.geom
+++ b/Test/150.geom
@@ -123,3 +123,17 @@ float summ = gl_MaxVertexAttribs +
              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 b2dc89147..adb5b112a 100644
--- a/Test/baseResults/150.geom.out
+++ b/Test/baseResults/150.geom.out
@@ -31,10 +31,14 @@ ERROR: 0:88: 'triangles_adjacency' : cannot change previously set input primitiv
 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 @@ ERROR: node is still EOpNull!
 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 @@ ERROR: node is still EOpNull!
 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 @@ ERROR: node is still EOpNull!
 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 @@ ERROR: node is still EOpNull!
 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 b9c13446e..07e38b490 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -871,7 +871,7 @@ void TBuiltIns::initialize(int version, EProfile profile)
     // 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 @@ void TBuiltIns::initialize(int version, EProfile profile)
             "\n");
     }
 
-	stageBuiltins[EShLangFragment].append(
+    stageBuiltins[EShLangFragment].append(
         "float dFdx(float p);"
         "vec2  dFdx(vec2  p);"
         "vec3  dFdx(vec3  p);"
@@ -1137,7 +1137,7 @@ void TBuiltIns::initialize(int version, EProfile profile)
 
     // 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 @@ void TBuiltIns::initialize(int version, EProfile profile)
             
             "\n");
 
-	    stageBuiltins[EShLangFragment].append(
+        stageBuiltins[EShLangFragment].append(
             "float dFdxCoarse(float p);"
             "vec2  dFdxCoarse(vec2  p);"
             "vec3  dFdxCoarse(vec3  p);"
@@ -1444,11 +1444,11 @@ void TBuiltIns::initialize(int version, EProfile profile)
         }
         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 @@ void TBuiltIns::initialize(int version, EProfile profile)
                 );
         } 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 @@ void TBuiltIns::initialize(int version, EProfile profile)
             "};"
 
             "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 @@ void TBuiltIns::initialize(int version, EProfile profile)
             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 @@ void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProf
     //============================================================================
 
     TString& s = commonBuiltins;
-	const int maxSize = 80;
+    const int maxSize = 80;
     char builtInConstant[maxSize];
 
     //
@@ -2462,7 +2463,7 @@ void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProf
             }
         }
 
-        if (version >= 410) {
+        if (version >= 150) {
             snprintf(builtInConstant, maxSize, "const int gl_MaxViewports = %d;", resources.maxViewports);
             s.append(builtInConstant);
         }
@@ -2631,6 +2632,8 @@ void IdentifyBuiltIns(int version, EProfile profile, EShLanguage language, TSymb
         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 @@ void IdentifyBuiltIns(int version, EProfile profile, EShLanguage language, TSymb
         symbolTable.relateToOperator("groupMemoryBarrier",  EOpGroupMemoryBarrier);
         break;
 
-	default:
+    default:
         assert(false && "Language not supported");
     }
 }
@@ -2878,6 +2881,8 @@ void IdentifyBuiltIns(int version, EProfile profile, EShLanguage language, TSymb
         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 @@ void IdentifyBuiltIns(int version, EProfile profile, EShLanguage language, TSymb
         }
         break;
 
-	default:
+    default:
         break;
     }
 }
diff --git a/glslang/MachineIndependent/Versions.cpp b/glslang/MachineIndependent/Versions.cpp
index ba1a3e648..691722c0b 100644
--- a/glslang/MachineIndependent/Versions.cpp
+++ b/glslang/MachineIndependent/Versions.cpp
@@ -170,7 +170,8 @@ void TParseContext::initializeExtensionBehavior()
     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 @@ const char* TParseContext::getPreamble()
             "#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 773956757..6d0e63bd4 100644
--- a/glslang/MachineIndependent/Versions.h
+++ b/glslang/MachineIndependent/Versions.h
@@ -94,6 +94,7 @@ const char* const GL_ARB_shader_image_load_store      = "GL_ARB_shader_image_loa
 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
-- 
GitLab