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;