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;