Validate the number of uniform vectors.

TRAC #22571
Signed-off-by: Geoff Lang
Signed-off-by: Shannon Woods
Author: Nicolas Capens

git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1928 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/renderer/Renderer.h b/src/libGLESv2/renderer/Renderer.h
index a5acd4e..a1efc3f 100644
--- a/src/libGLESv2/renderer/Renderer.h
+++ b/src/libGLESv2/renderer/Renderer.h
@@ -161,9 +161,11 @@
     bool getVertexTextureSupport() const { return getMaxVertexTextureImageUnits() > 0; }
     virtual unsigned int getMaxVertexTextureImageUnits() const = 0;
     virtual unsigned int getMaxCombinedTextureImageUnits() const = 0;
-    virtual int getMaxVertexUniformVectors() const = 0;
-    virtual int getMaxFragmentUniformVectors() const = 0;
-    virtual int getMaxVaryingVectors() const = 0;
+    virtual unsigned int getReservedVertexUniformVectors() const = 0;
+    virtual unsigned int getReservedFragmentUniformVectors() const = 0;
+    virtual unsigned int getMaxVertexUniformVectors() const = 0;
+    virtual unsigned int getMaxFragmentUniformVectors() const = 0;
+    virtual unsigned 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 84d9cbb..66a2838 100644
--- a/src/libGLESv2/renderer/Renderer11.cpp
+++ b/src/libGLESv2/renderer/Renderer11.cpp
@@ -2086,21 +2086,31 @@
     return gl::MAX_TEXTURE_IMAGE_UNITS + getMaxVertexTextureImageUnits();
 }
 
-int Renderer11::getMaxVertexUniformVectors() const
+unsigned int Renderer11::getReservedVertexUniformVectors() const
+{
+	return 0;   // Driver uniforms are stored in a separate constant buffer
+}
+
+unsigned int Renderer11::getReservedFragmentUniformVectors() const
+{
+	return 0;   // Driver uniforms are stored in a separate constant buffer
+}
+
+unsigned int Renderer11::getMaxVertexUniformVectors() const
 {
     META_ASSERT(MAX_VERTEX_UNIFORM_VECTORS_D3D11 <= D3D10_REQ_CONSTANT_BUFFER_ELEMENT_COUNT);
     ASSERT(mFeatureLevel >= D3D_FEATURE_LEVEL_10_0);
     return MAX_VERTEX_UNIFORM_VECTORS_D3D11;
 }
 
-int Renderer11::getMaxFragmentUniformVectors() const
+unsigned int Renderer11::getMaxFragmentUniformVectors() const
 {
     META_ASSERT(MAX_FRAGMENT_UNIFORM_VECTORS_D3D11 <= D3D10_REQ_CONSTANT_BUFFER_ELEMENT_COUNT);
     ASSERT(mFeatureLevel >= D3D_FEATURE_LEVEL_10_0);
     return MAX_FRAGMENT_UNIFORM_VECTORS_D3D11;
 }
 
-int Renderer11::getMaxVaryingVectors() const
+unsigned int Renderer11::getMaxVaryingVectors() const
 {
     META_ASSERT(gl::IMPLEMENTATION_MAX_VARYING_VECTORS == D3D11_VS_OUTPUT_REGISTER_COUNT);
     switch (mFeatureLevel)
diff --git a/src/libGLESv2/renderer/Renderer11.h b/src/libGLESv2/renderer/Renderer11.h
index 4287ea8..00190da 100644
--- a/src/libGLESv2/renderer/Renderer11.h
+++ b/src/libGLESv2/renderer/Renderer11.h
@@ -107,9 +107,11 @@
     virtual bool getLuminanceAlphaTextureSupport();
     virtual unsigned int getMaxVertexTextureImageUnits() const;
     virtual unsigned int getMaxCombinedTextureImageUnits() const;
-    virtual int getMaxVertexUniformVectors() const;
-    virtual int getMaxFragmentUniformVectors() const;
-    virtual int getMaxVaryingVectors() const;
+    virtual unsigned int getReservedVertexUniformVectors() const;
+    virtual unsigned int getReservedFragmentUniformVectors() const;
+    virtual unsigned int getMaxVertexUniformVectors() const;
+    virtual unsigned int getMaxFragmentUniformVectors() const;
+    virtual unsigned 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 4ddef4f..d399288 100644
--- a/src/libGLESv2/renderer/Renderer9.cpp
+++ b/src/libGLESv2/renderer/Renderer9.cpp
@@ -78,6 +78,12 @@
 
 enum
 {
+    MAX_VERTEX_CONSTANT_VECTORS_D3D9 = 256,
+    MAX_PIXEL_CONSTANT_VECTORS_SM2 = 32,
+    MAX_PIXEL_CONSTANT_VECTORS_SM3 = 224,
+    MAX_VARYING_VECTORS_SM2 = 8,
+    MAX_VARYING_VECTORS_SM3 = 10,
+
     MAX_TEXTURE_IMAGE_UNITS_VTF_SM3 = 4
 };
 
@@ -1701,8 +1707,8 @@
 
 void Renderer9::applyUniformniv(gl::Uniform *targetUniform, const GLint *v)
 {
-    ASSERT(targetUniform->registerCount <= D3D9_MAX_FLOAT_CONSTANTS);
-    GLfloat vector[D3D9_MAX_FLOAT_CONSTANTS][4];
+    ASSERT(targetUniform->registerCount <= MAX_VERTEX_CONSTANT_VECTORS_D3D9);
+    GLfloat vector[MAX_VERTEX_CONSTANT_VECTORS_D3D9][4];
 
     for (unsigned int i = 0; i < targetUniform->registerCount; i++)
     {
@@ -1717,8 +1723,8 @@
 
 void Renderer9::applyUniformnbv(gl::Uniform *targetUniform, const GLint *v)
 {
-    ASSERT(targetUniform->registerCount <= D3D9_MAX_FLOAT_CONSTANTS);
-    GLfloat vector[D3D9_MAX_FLOAT_CONSTANTS][4];
+    ASSERT(targetUniform->registerCount <= MAX_VERTEX_CONSTANT_VECTORS_D3D9);
+    GLfloat vector[MAX_VERTEX_CONSTANT_VECTORS_D3D9][4];
 
     for (unsigned int i = 0; i < targetUniform->registerCount; i++)
     {
@@ -2235,19 +2241,31 @@
     return gl::MAX_TEXTURE_IMAGE_UNITS + getMaxVertexTextureImageUnits();
 }
 
-int Renderer9::getMaxVertexUniformVectors() const
+unsigned int Renderer9::getReservedVertexUniformVectors() const
 {
-    return MAX_VERTEX_UNIFORM_VECTORS;
+	return 2;   // dx_HalfPixelSize and dx_DepthRange.
 }
 
-int Renderer9::getMaxFragmentUniformVectors() const
+unsigned int Renderer9::getReservedFragmentUniformVectors() const
 {
-    return getMajorShaderModel() >= 3 ? MAX_FRAGMENT_UNIFORM_VECTORS_SM3 : MAX_FRAGMENT_UNIFORM_VECTORS_SM2;
+	return 3;   // dx_ViewCoords, dx_DepthFront and dx_DepthRange.
 }
 
-int Renderer9::getMaxVaryingVectors() const
+unsigned int Renderer9::getMaxVertexUniformVectors() const
 {
-    return getMajorShaderModel() >= 3 ? MAX_VARYING_VECTORS_SM3 : MAX_VARYING_VECTORS_SM2;
+    return MAX_VERTEX_CONSTANT_VECTORS_D3D9 - getReservedVertexUniformVectors();
+}
+
+unsigned int Renderer9::getMaxFragmentUniformVectors() const
+{
+    const int maxPixelConstantVectors = (getMajorShaderModel() >= 3) ? MAX_PIXEL_CONSTANT_VECTORS_SM3 : MAX_PIXEL_CONSTANT_VECTORS_SM2;
+
+    return maxPixelConstantVectors - getReservedFragmentUniformVectors();
+}
+
+unsigned int Renderer9::getMaxVaryingVectors() const
+{
+    return (getMajorShaderModel() >= 3) ? MAX_VARYING_VECTORS_SM3 : MAX_VARYING_VECTORS_SM2;
 }
 
 bool Renderer9::getNonPower2TextureSupport() const
diff --git a/src/libGLESv2/renderer/Renderer9.h b/src/libGLESv2/renderer/Renderer9.h
index 3b375d9..c36ab4a 100644
--- a/src/libGLESv2/renderer/Renderer9.h
+++ b/src/libGLESv2/renderer/Renderer9.h
@@ -36,16 +36,6 @@
 class StreamingIndexBufferInterface;
 struct TranslatedAttribute;
 
-enum
-{
-    D3D9_MAX_FLOAT_CONSTANTS = 256,
-    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_ViewCoords, 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
 {
   public:
@@ -136,9 +126,11 @@
     virtual bool getLuminanceAlphaTextureSupport();
     virtual unsigned int getMaxVertexTextureImageUnits() const;
     virtual unsigned int getMaxCombinedTextureImageUnits() const;
-    virtual int getMaxVertexUniformVectors() const;
-    virtual int getMaxFragmentUniformVectors() const;
-    virtual int getMaxVaryingVectors() const;
+    virtual unsigned int getReservedVertexUniformVectors() const;
+    virtual unsigned int getReservedFragmentUniformVectors() const;
+    virtual unsigned int getMaxVertexUniformVectors() const;
+    virtual unsigned int getMaxFragmentUniformVectors() const;
+    virtual unsigned int getMaxVaryingVectors() const;
     virtual bool getNonPower2TextureSupport() const;
     virtual bool getDepthTextureSupport() const;
     virtual bool getOcclusionQuerySupport() const;