gl_VertexID implementation This cl implements support for gl_VertexID. Passes the functional.shaders.builtin_variable.vertex_id test. Change-Id: I5550e3ecba30e29f1e38ace608d730833a1e9598 Reviewed-on: https://swiftshader-review.googlesource.com/10958 Tested-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/compiler/BaseTypes.h b/src/OpenGL/compiler/BaseTypes.h index 58c0856..01f9948 100644 --- a/src/OpenGL/compiler/BaseTypes.h +++ b/src/OpenGL/compiler/BaseTypes.h
@@ -369,6 +369,7 @@ EvqPosition, EvqPointSize, EvqInstanceID, + EvqVertexID, // built-ins read by fragment shader EvqFragCoord, @@ -446,6 +447,7 @@ case EvqPosition: return "Position"; break; case EvqPointSize: return "PointSize"; break; case EvqInstanceID: return "InstanceID"; break; + case EvqVertexID: return "VertexID"; break; case EvqFragCoord: return "FragCoord"; break; case EvqFrontFacing: return "FrontFacing"; break; case EvqFragColor: return "FragColor"; break;
diff --git a/src/OpenGL/compiler/Initialize.cpp b/src/OpenGL/compiler/Initialize.cpp index 1948a57..c374531 100644 --- a/src/OpenGL/compiler/Initialize.cpp +++ b/src/OpenGL/compiler/Initialize.cpp
@@ -471,6 +471,7 @@ symbolTable.insert(COMMON_BUILTINS, *new TVariable(NewPoolTString("gl_Position"), TType(EbtFloat, EbpHigh, EvqPosition, 4))); symbolTable.insert(COMMON_BUILTINS, *new TVariable(NewPoolTString("gl_PointSize"), TType(EbtFloat, EbpMedium, EvqPointSize, 1))); symbolTable.insert(ESSL3_BUILTINS, *new TVariable(NewPoolTString("gl_InstanceID"), TType(EbtInt, EbpHigh, EvqInstanceID, 1))); + symbolTable.insert(ESSL3_BUILTINS, *new TVariable(NewPoolTString("gl_VertexID"), TType(EbtInt, EbpHigh, EvqVertexID, 1))); break; default: assert(false && "Language not supported"); }
diff --git a/src/OpenGL/compiler/OutputASM.cpp b/src/OpenGL/compiler/OutputASM.cpp index 8a84692..2c8222e 100644 --- a/src/OpenGL/compiler/OutputASM.cpp +++ b/src/OpenGL/compiler/OutputASM.cpp
@@ -2554,6 +2554,7 @@ case EvqPosition: return sw::Shader::PARAMETER_OUTPUT; case EvqPointSize: return sw::Shader::PARAMETER_OUTPUT; case EvqInstanceID: return sw::Shader::PARAMETER_MISCTYPE; + case EvqVertexID: return sw::Shader::PARAMETER_MISCTYPE; case EvqFragCoord: return sw::Shader::PARAMETER_MISCTYPE; case EvqFrontFacing: return sw::Shader::PARAMETER_MISCTYPE; case EvqPointCoord: return sw::Shader::PARAMETER_INPUT; @@ -2606,9 +2607,10 @@ case EvqConstReadOnly: return temporaryRegister(operand); case EvqPosition: return varyingRegister(operand); case EvqPointSize: return varyingRegister(operand); - case EvqInstanceID: vertexShader->declareInstanceId(); return 0; - case EvqFragCoord: pixelShader->declareVPos(); return 0; - case EvqFrontFacing: pixelShader->declareVFace(); return 1; + case EvqInstanceID: vertexShader->declareInstanceId(); return sw::Shader::InstanceIDIndex; + case EvqVertexID: vertexShader->declareVertexId(); return sw::Shader::VertexIDIndex; + case EvqFragCoord: pixelShader->declareVPos(); return sw::Shader::VPosIndex; + case EvqFrontFacing: pixelShader->declareVFace(); return sw::Shader::VFaceIndex; case EvqPointCoord: return varyingRegister(operand); case EvqFragColor: return 0; case EvqFragData: return fragmentOutputRegister(operand);
diff --git a/src/OpenGL/compiler/ParseHelper.cpp b/src/OpenGL/compiler/ParseHelper.cpp index 83f58ce..7cca42c 100644 --- a/src/OpenGL/compiler/ParseHelper.cpp +++ b/src/OpenGL/compiler/ParseHelper.cpp
@@ -406,6 +406,7 @@ case EvqFrontFacing: message = "can't modify gl_FrontFacing"; break; case EvqPointCoord: message = "can't modify gl_PointCoord"; break; case EvqInstanceID: message = "can't modify gl_InstanceID"; break; + case EvqVertexID: message = "can't modify gl_VertexID"; break; default: //