TexCoords and MultiTexCoords implementations for shaders Change-Id: I693151e3ea0849eed27d118cf90ff4ef12446e63 Reviewed-on: https://swiftshader-review.googlesource.com/3723 Reviewed-by: Maxime Grégoire <mgregoire@google.com> Tested-by: Maxime Grégoire <mgregoire@google.com>
diff --git a/src/OpenGL/compiler/BaseTypes.h b/src/OpenGL/compiler/BaseTypes.h index 7e25c40..eccb25e 100644 --- a/src/OpenGL/compiler/BaseTypes.h +++ b/src/OpenGL/compiler/BaseTypes.h
@@ -129,10 +129,21 @@ EvqInOut, EvqConstReadOnly, - // built-ins written by vertex shader + // built-ins read by vertex shader + EvqMultiTexCoord0, + EvqMultiTexCoord1, + EvqMultiTexCoord2, + EvqMultiTexCoord3, + EvqMultiTexCoord4, + EvqMultiTexCoord5, + EvqMultiTexCoord6, + EvqMultiTexCoord7, + + // built-ins written by vertex shader EvqPosition, EvqPointSize, EvqInstanceID, + EvqTexCoords, // built-ins read by fragment shader EvqFragCoord, @@ -202,6 +213,15 @@ case EvqPointSize: return "PointSize"; break; case EvqInstanceID: return "InstanceID"; break; case EvqFragCoord: return "FragCoord"; break; + case EvqMultiTexCoord0: return "MultiTexCoord0"; break; + case EvqMultiTexCoord1: return "MultiTexCoord1"; break; + case EvqMultiTexCoord2: return "MultiTexCoord2"; break; + case EvqMultiTexCoord3: return "MultiTexCoord3"; break; + case EvqMultiTexCoord4: return "MultiTexCoord4"; break; + case EvqMultiTexCoord5: return "MultiTexCoord5"; break; + case EvqMultiTexCoord6: return "MultiTexCoord6"; break; + case EvqMultiTexCoord7: return "MultiTexCoord7"; break; + case EvqTexCoords: return "TexCoords"; break; case EvqFrontFacing: return "FrontFacing"; break; case EvqFragColor: return "FragColor"; break; case EvqFragData: return "FragData"; break;
diff --git a/src/OpenGL/compiler/Compiler.cpp b/src/OpenGL/compiler/Compiler.cpp index 207f842..36b5f7b 100644 --- a/src/OpenGL/compiler/Compiler.cpp +++ b/src/OpenGL/compiler/Compiler.cpp
@@ -45,6 +45,7 @@ MaxVertexTextureImageUnits = 0; MaxCombinedTextureImageUnits = 8; MaxTextureImageUnits = 8; + MaxTextureCoords = 8; MaxFragmentUniformVectors = 16; MaxDrawBuffers = 1; MaxVertexOutputVectors = 16; @@ -174,6 +175,7 @@ { case GL_FRAGMENT_SHADER: symbolTable.setDefaultPrecision(integer, EbpMedium); + symbolTable.setDefaultPrecision(floatingPoint, EbpHigh); break; case GL_VERTEX_SHADER: symbolTable.setDefaultPrecision(integer, EbpHigh);
diff --git a/src/OpenGL/compiler/Compiler.h b/src/OpenGL/compiler/Compiler.h index 9c0814e..5ae1519 100644 --- a/src/OpenGL/compiler/Compiler.h +++ b/src/OpenGL/compiler/Compiler.h
@@ -37,6 +37,7 @@ int MaxVertexTextureImageUnits; int MaxCombinedTextureImageUnits; int MaxTextureImageUnits; + int MaxTextureCoords; int MaxFragmentUniformVectors; int MaxDrawBuffers; int MaxVertexOutputVectors;
diff --git a/src/OpenGL/compiler/Initialize.cpp b/src/OpenGL/compiler/Initialize.cpp index 31a7c7f..dd6562d 100644 --- a/src/OpenGL/compiler/Initialize.cpp +++ b/src/OpenGL/compiler/Initialize.cpp
@@ -344,13 +344,26 @@ symbolTable.insert(ESSL1_BUILTINS, *new TVariable(NewPoolTString("gl_FragData[gl_MaxDrawBuffers]"), TType(EbtFloat, EbpMedium, EvqFragData, 4))); break; case GL_VERTEX_SHADER: - symbolTable.insert(COMMON_BUILTINS, *new TVariable(NewPoolTString("gl_Position"), TType(EbtFloat, EbpHigh, EvqPosition, 4))); + symbolTable.insert(COMMON_BUILTINS, *new TVariable(NewPoolTString("gl_MultiTexCoord0"), TType(EbtFloat, EbpMedium, EvqMultiTexCoord0, 4))); + symbolTable.insert(COMMON_BUILTINS, *new TVariable(NewPoolTString("gl_MultiTexCoord1"), TType(EbtFloat, EbpMedium, EvqMultiTexCoord1, 4))); + symbolTable.insert(COMMON_BUILTINS, *new TVariable(NewPoolTString("gl_MultiTexCoord2"), TType(EbtFloat, EbpMedium, EvqMultiTexCoord2, 4))); + symbolTable.insert(COMMON_BUILTINS, *new TVariable(NewPoolTString("gl_MultiTexCoord3"), TType(EbtFloat, EbpMedium, EvqMultiTexCoord3, 4))); + symbolTable.insert(COMMON_BUILTINS, *new TVariable(NewPoolTString("gl_MultiTexCoord4"), TType(EbtFloat, EbpMedium, EvqMultiTexCoord4, 4))); + symbolTable.insert(COMMON_BUILTINS, *new TVariable(NewPoolTString("gl_MultiTexCoord5"), TType(EbtFloat, EbpMedium, EvqMultiTexCoord5, 4))); + symbolTable.insert(COMMON_BUILTINS, *new TVariable(NewPoolTString("gl_MultiTexCoord6"), TType(EbtFloat, EbpMedium, EvqMultiTexCoord6, 4))); + symbolTable.insert(COMMON_BUILTINS, *new TVariable(NewPoolTString("gl_MultiTexCoord7"), TType(EbtFloat, EbpMedium, EvqMultiTexCoord7, 4))); + symbolTable.insert(COMMON_BUILTINS, *new TVariable(NewPoolTString("gl_Position"), TType(EbtFloat, EbpMedium, 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))); break; default: assert(false && "Language not supported"); } + // Set up gl_TexCoord + TType texCoord(EbtFloat, EbpMedium, EvqTexCoords, 4, 1, true); + texCoord.setArraySize(resources.MaxTextureCoords); + symbolTable.insert(ESSL1_BUILTINS, *new TVariable(NewPoolTString("gl_TexCoord"), texCoord)); + // Finally add resource-specific variables. switch(shaderType) {
diff --git a/src/OpenGL/compiler/ParseHelper.cpp b/src/OpenGL/compiler/ParseHelper.cpp index 4fda827..ac08b05 100644 --- a/src/OpenGL/compiler/ParseHelper.cpp +++ b/src/OpenGL/compiler/ParseHelper.cpp
@@ -311,19 +311,27 @@ const char* message = 0; switch (node->getQualifier()) { - case EvqConstExpr: message = "can't modify a const"; break; - case EvqConstReadOnly: message = "can't modify a const"; break; - case EvqAttribute: message = "can't modify an attribute"; break; - case EvqUniform: message = "can't modify a uniform"; break; + case EvqConstExpr: message = "can't modify a const"; break; + case EvqConstReadOnly: message = "can't modify a const"; break; + case EvqAttribute: message = "can't modify an attribute"; break; + case EvqUniform: message = "can't modify a uniform"; break; case EvqSmoothIn: case EvqFlatIn: case EvqCentroidIn: - case EvqVaryingIn: message = "can't modify a varying"; break; - case EvqInput: message = "can't modify an input"; break; - case EvqFragCoord: message = "can't modify gl_FragCoord"; break; - 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 EvqVaryingIn: message = "can't modify a varying"; break; + case EvqMultiTexCoord0: message = "can't modify gl_MultiTexCoord0"; break; + case EvqMultiTexCoord1: message = "can't modify gl_MultiTexCoord1"; break; + case EvqMultiTexCoord2: message = "can't modify gl_MultiTexCoord2"; break; + case EvqMultiTexCoord3: message = "can't modify gl_MultiTexCoord3"; break; + case EvqMultiTexCoord4: message = "can't modify gl_MultiTexCoord4"; break; + case EvqMultiTexCoord5: message = "can't modify gl_MultiTexCoord5"; break; + case EvqMultiTexCoord6: message = "can't modify gl_MultiTexCoord6"; break; + case EvqMultiTexCoord7: message = "can't modify gl_MultiTexCoord7"; break; + case EvqInput: message = "can't modify an input"; break; + case EvqFragCoord: message = "can't modify gl_FragCoord"; break; + 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; default: //
diff --git a/src/OpenGL/libGL/Context.h b/src/OpenGL/libGL/Context.h index 6a9e42c..7d74fc5 100644 --- a/src/OpenGL/libGL/Context.h +++ b/src/OpenGL/libGL/Context.h
@@ -309,6 +309,7 @@ enum { + MAX_TEXTURE_COORDS = 8, MAX_VERTEX_ATTRIBS = 9, MAX_UNIFORM_VECTORS = 256, // Device limit MAX_VERTEX_UNIFORM_VECTORS = 256 - 3, // Reserve space for gl_DepthRange
diff --git a/src/OpenGL/libGL/Shader.cpp b/src/OpenGL/libGL/Shader.cpp index bb574a3..9c63adf 100644 --- a/src/OpenGL/libGL/Shader.cpp +++ b/src/OpenGL/libGL/Shader.cpp
@@ -167,6 +167,7 @@ resources.MaxVertexTextureImageUnits = MAX_VERTEX_TEXTURE_IMAGE_UNITS; resources.MaxCombinedTextureImageUnits = MAX_COMBINED_TEXTURE_IMAGE_UNITS; resources.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS; + resources.MaxTextureCoords = MAX_TEXTURE_COORDS; resources.MaxFragmentUniformVectors = MAX_FRAGMENT_UNIFORM_VECTORS; resources.MaxDrawBuffers = MAX_DRAW_BUFFERS; resources.OES_standard_derivatives = 1;