Increase the varying register count to what the feature level supports.

TRAC #22243
Signed-off-by: Jamie Madill
Signed-off-by: Daniel Koch
Author: Nicolas Capens

git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1775 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp
index 0008c28..342b19e 100644
--- a/src/libGLESv2/Context.cpp
+++ b/src/libGLESv2/Context.cpp
@@ -2128,7 +2128,7 @@
 
 int Context::getMaximumVaryingVectors() const
 {
-    return mMajorShaderModel >= 3 ? MAX_VARYING_VECTORS_SM3 : MAX_VARYING_VECTORS_SM2;
+    return mRenderer->getMaxVaryingVectors();
 }
 
 unsigned int Context::getMaximumCombinedTextureImageUnits() const
diff --git a/src/libGLESv2/Context.h b/src/libGLESv2/Context.h
index 2ce9943..8d97a0a 100644
--- a/src/libGLESv2/Context.h
+++ b/src/libGLESv2/Context.h
@@ -58,17 +58,16 @@
 
 enum
 {
+    MAX_DRAW_BUFFERS = 1,
+
     MAX_VERTEX_ATTRIBS = 16,
-    MAX_VARYING_VECTORS_SM2 = 8,
-    MAX_VARYING_VECTORS_SM3 = 10,
     MAX_TEXTURE_IMAGE_UNITS = 16,
 
-    // Implementation upper limit, for devices supporting vertex texture fetch. 
-    // Real limit depends on the shader model
+    // Implementation upper limits, real maximums depend on the hardware
     IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS = 16,
     IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS = MAX_TEXTURE_IMAGE_UNITS + IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS,    
 
-    MAX_DRAW_BUFFERS = 1
+    IMPLEMENTATION_MAX_VARYING_VECTORS = 32
 };
 
 enum QueryType
diff --git a/src/libGLESv2/ProgramBinary.cpp b/src/libGLESv2/ProgramBinary.cpp
index 0ea120a..c5e021c 100644
--- a/src/libGLESv2/ProgramBinary.cpp
+++ b/src/libGLESv2/ProgramBinary.cpp
@@ -1174,7 +1174,7 @@
     }
 
     // Map the varyings to the register file
-    const Varying *packing[MAX_VARYING_VECTORS_SM3][4] = {NULL};
+    const Varying *packing[IMPLEMENTATION_MAX_VARYING_VECTORS][4] = {NULL};
     int registers = packVaryings(infoLog, packing, fragmentShader);
 
     if (registers < 0)
diff --git a/src/libGLESv2/renderer/Renderer.h b/src/libGLESv2/renderer/Renderer.h
index f0d6ef9..287b23e 100644
--- a/src/libGLESv2/renderer/Renderer.h
+++ b/src/libGLESv2/renderer/Renderer.h
@@ -147,6 +147,7 @@
     virtual unsigned int getMaxVertexTextureImageUnits() const = 0;
     virtual int getMaxVertexUniformVectors() const = 0;
     virtual int getMaxFragmentUniformVectors() const = 0;
+    virtual int getMaxVaryingVectors() const = 0;
     virtual bool getNonPower2TextureSupport() const = 0;
     virtual bool getDepthTextureSupport() const = 0;
     virtual bool getOcclusionQuerySupport() const = 0;
diff --git a/src/libGLESv2/renderer/Renderer11.cpp b/src/libGLESv2/renderer/Renderer11.cpp
index fe19655..5e5cfd0 100644
--- a/src/libGLESv2/renderer/Renderer11.cpp
+++ b/src/libGLESv2/renderer/Renderer11.cpp
@@ -1884,6 +1884,21 @@
     return MAX_FRAGMENT_UNIFORM_VECTORS_D3D11;
 }
 
+int Renderer11::getMaxVaryingVectors() const
+{
+    META_ASSERT(gl::IMPLEMENTATION_MAX_VARYING_VECTORS == D3D11_VS_OUTPUT_REGISTER_COUNT);
+    switch (mFeatureLevel)
+    {
+      case D3D_FEATURE_LEVEL_11_0:
+        return D3D11_VS_OUTPUT_REGISTER_COUNT;
+      case D3D_FEATURE_LEVEL_10_1:
+      case D3D_FEATURE_LEVEL_10_0:
+        return D3D10_VS_OUTPUT_REGISTER_COUNT;
+      default: UNREACHABLE();
+        return 0;
+    }
+}
+
 bool Renderer11::getNonPower2TextureSupport() const
 {
     // TODO
diff --git a/src/libGLESv2/renderer/Renderer11.h b/src/libGLESv2/renderer/Renderer11.h
index 8f37e6e..097d4c4 100644
--- a/src/libGLESv2/renderer/Renderer11.h
+++ b/src/libGLESv2/renderer/Renderer11.h
@@ -107,6 +107,7 @@
     virtual unsigned int getMaxVertexTextureImageUnits() const;
     virtual int getMaxVertexUniformVectors() const;
     virtual int getMaxFragmentUniformVectors() const;
+    virtual int getMaxVaryingVectors() const;
     virtual bool getNonPower2TextureSupport() const;
     virtual bool getDepthTextureSupport() const;
     virtual bool getOcclusionQuerySupport() const;
diff --git a/src/libGLESv2/renderer/Renderer9.cpp b/src/libGLESv2/renderer/Renderer9.cpp
index 107d8f2..312c0cc 100644
--- a/src/libGLESv2/renderer/Renderer9.cpp
+++ b/src/libGLESv2/renderer/Renderer9.cpp
@@ -2250,6 +2250,11 @@
     return getMajorShaderModel() >= 3 ? MAX_FRAGMENT_UNIFORM_VECTORS_SM3 : MAX_FRAGMENT_UNIFORM_VECTORS_SM2;
 }
 
+int Renderer9::getMaxVaryingVectors() const
+{
+    return getMajorShaderModel() >= 3 ? MAX_VARYING_VECTORS_SM3 : MAX_VARYING_VECTORS_SM2;
+}
+
 bool Renderer9::getNonPower2TextureSupport() const
 {
     return mSupportsNonPower2Textures;
diff --git a/src/libGLESv2/renderer/Renderer9.h b/src/libGLESv2/renderer/Renderer9.h
index df026bf..9714b3e 100644
--- a/src/libGLESv2/renderer/Renderer9.h
+++ b/src/libGLESv2/renderer/Renderer9.h
@@ -41,6 +41,8 @@
     MAX_VERTEX_UNIFORM_VECTORS = D3D9_MAX_FLOAT_CONSTANTS - 2,   // Reserve space for dx_HalfPixelSize and dx_DepthRange.
     MAX_FRAGMENT_UNIFORM_VECTORS_SM2 = 32 - 3,    // Reserve space for dx_Coord, dx_DepthFront and dx_DepthRange.
     MAX_FRAGMENT_UNIFORM_VECTORS_SM3 = 224 - 3,
+    MAX_VARYING_VECTORS_SM2 = 8,
+    MAX_VARYING_VECTORS_SM3 = 10
 };
 
 class Renderer9 : public Renderer
@@ -134,6 +136,7 @@
     virtual unsigned int getMaxVertexTextureImageUnits() const;
     virtual int getMaxVertexUniformVectors() const;
     virtual int getMaxFragmentUniformVectors() const;
+    virtual int getMaxVaryingVectors() const;
     virtual bool getNonPower2TextureSupport() const;
     virtual bool getDepthTextureSupport() const;
     virtual bool getOcclusionQuerySupport() const;