Refactor gl_FragCoord and gl_PointCoord usage in ProgramBinary::linkVaryings.

TRAC #22412

Signed-off-by: Nicolas Capens
Signed-off-by: Shannon Woods
Author: Jamie Madill

git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1785 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/ProgramBinary.cpp b/src/libGLESv2/ProgramBinary.cpp
index 48b83f4..6eaac91 100644
--- a/src/libGLESv2/ProgramBinary.cpp
+++ b/src/libGLESv2/ProgramBinary.cpp
@@ -1168,9 +1168,11 @@
     const int shaderModel = mRenderer->getMajorShaderModel();
     const int maxVaryingVectors = mRenderer->getMaxVaryingVectors();
 
-    if (registers == maxVaryingVectors && fragmentShader->mUsesFragCoord)
+    const int registersNeeded = registers + (fragmentShader->mUsesFragCoord ? 1 : 0) + (fragmentShader->mUsesPointCoord ? 1 : 0);
+
+    if (registersNeeded > maxVaryingVectors)
     {
-        infoLog.append("No varying registers left to support gl_FragCoord");
+        infoLog.append("No varying registers left to support gl_FragCoord/gl_PointCoord");
 
         return false;
     }
@@ -1209,9 +1211,33 @@
     }
 
     mUsesPointSize = vertexShader->mUsesPointSize;
-    std::string varyingSemantic = (mUsesPointSize && shaderModel >= 3) ? "COLOR" : "TEXCOORD";
+    std::string varyingSemantic = (mUsesPointSize && shaderModel == 3) ? "COLOR" : "TEXCOORD";
     std::string targetSemantic = (shaderModel >= 4) ? "SV_Target" : "COLOR";
-    std::string positionSemantic = (shaderModel >= 4) ? "SV_POSITION" : "POSITION";
+    std::string positionSemantic = (shaderModel >= 4) ? "SV_Position" : "POSITION";
+
+    // special varyings that use reserved registers
+    int reservedRegisterIndex = registers;
+    std::string fragCoordSemantic;
+    std::string pointCoordSemantic;
+
+    if (fragmentShader->mUsesFragCoord)
+    {
+        fragCoordSemantic = varyingSemantic + str(reservedRegisterIndex++);
+    }
+
+    if (fragmentShader->mUsesPointCoord)
+    {
+        // Shader model 3 uses a special TEXCOORD semantic for point sprite texcoords.
+        // In DX11 we compute this in the GS.
+        if (shaderModel == 3)
+        {
+            pointCoordSemantic = "TEXCOORD0";
+        }
+        else if (shaderModel >= 4)
+        {
+            pointCoordSemantic = varyingSemantic + str(reservedRegisterIndex++); 
+        }
+    }
 
     vertexHLSL += "struct VS_INPUT\n"
                   "{\n";
@@ -1250,7 +1276,7 @@
 
     if (fragmentShader->mUsesFragCoord)
     {
-        vertexHLSL += "    float4 gl_FragCoord : " + varyingSemantic + str(registers) + ";\n";
+        vertexHLSL += "    float4 gl_FragCoord : " + fragCoordSemantic + ";\n";
     }
 
     if (vertexShader->mUsesPointSize && shaderModel >= 3)
@@ -1382,7 +1408,7 @@
 
     if (fragmentShader->mUsesFragCoord)
     {
-        pixelHLSL += "    float4 gl_FragCoord : " + varyingSemantic + str(registers) + ";\n";
+        pixelHLSL += "    float4 gl_FragCoord : " + fragCoordSemantic + ";\n";
         
         if (shaderModel >= 4)
         {
@@ -1396,7 +1422,7 @@
 
     if (fragmentShader->mUsesPointCoord && shaderModel == 3)
     {
-        pixelHLSL += "    float2 gl_PointCoord : TEXCOORD0;\n";
+        pixelHLSL += "    float2 gl_PointCoord : " + pointCoordSemantic + ";\n";
     }
 
     pixelHLSL += "};\n"