From ad54b24fba9f6fbd7c8ae076d79cc666d2683dec Mon Sep 17 00:00:00 2001 From: John Kessenich 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