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
parent a4ba59c6
...@@ -2088,6 +2088,24 @@ bool ProgramBinary::defineUniform(GLenum shader, const sh::Uniform &constant, In ...@@ -2088,6 +2088,24 @@ bool ProgramBinary::defineUniform(GLenum shader, const sh::Uniform &constant, In
mUniformIndex.push_back(UniformLocation(constant.name, i, uniformIndex)); mUniformIndex.push_back(UniformLocation(constant.name, i, uniformIndex));
} }
if (shader == GL_VERTEX_SHADER)
{
if (constant.registerIndex + uniform->registerCount > mRenderer->getReservedVertexUniformVectors() + mRenderer->getMaxVertexUniformVectors())
{
infoLog.append("Vertex shader active uniforms exceed GL_MAX_VERTEX_UNIFORM_VECTORS (%u)", mRenderer->getMaxVertexUniformVectors());
return false;
}
}
else if (shader == GL_FRAGMENT_SHADER)
{
if (constant.registerIndex + uniform->registerCount > mRenderer->getReservedFragmentUniformVectors() + mRenderer->getMaxFragmentUniformVectors())
{
infoLog.append("Fragment shader active uniforms exceed GL_MAX_FRAGMENT_UNIFORM_VECTORS (%u)", mRenderer->getMaxFragmentUniformVectors());
return false;
}
}
else UNREACHABLE();
return true; return true;
} }
......
...@@ -161,9 +161,11 @@ class Renderer ...@@ -161,9 +161,11 @@ class Renderer
bool getVertexTextureSupport() const { return getMaxVertexTextureImageUnits() > 0; } bool getVertexTextureSupport() const { return getMaxVertexTextureImageUnits() > 0; }
virtual unsigned int getMaxVertexTextureImageUnits() const = 0; virtual unsigned int getMaxVertexTextureImageUnits() const = 0;
virtual unsigned int getMaxCombinedTextureImageUnits() const = 0; virtual unsigned int getMaxCombinedTextureImageUnits() const = 0;
virtual int getMaxVertexUniformVectors() const = 0; virtual unsigned int getReservedVertexUniformVectors() const = 0;
virtual int getMaxFragmentUniformVectors() const = 0; virtual unsigned int getReservedFragmentUniformVectors() const = 0;
virtual int getMaxVaryingVectors() 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 getNonPower2TextureSupport() const = 0;
virtual bool getDepthTextureSupport() const = 0; virtual bool getDepthTextureSupport() const = 0;
virtual bool getOcclusionQuerySupport() const = 0; virtual bool getOcclusionQuerySupport() const = 0;
......
...@@ -2086,21 +2086,31 @@ unsigned int Renderer11::getMaxCombinedTextureImageUnits() const ...@@ -2086,21 +2086,31 @@ unsigned int Renderer11::getMaxCombinedTextureImageUnits() const
return gl::MAX_TEXTURE_IMAGE_UNITS + getMaxVertexTextureImageUnits(); 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); META_ASSERT(MAX_VERTEX_UNIFORM_VECTORS_D3D11 <= D3D10_REQ_CONSTANT_BUFFER_ELEMENT_COUNT);
ASSERT(mFeatureLevel >= D3D_FEATURE_LEVEL_10_0); ASSERT(mFeatureLevel >= D3D_FEATURE_LEVEL_10_0);
return MAX_VERTEX_UNIFORM_VECTORS_D3D11; 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); META_ASSERT(MAX_FRAGMENT_UNIFORM_VECTORS_D3D11 <= D3D10_REQ_CONSTANT_BUFFER_ELEMENT_COUNT);
ASSERT(mFeatureLevel >= D3D_FEATURE_LEVEL_10_0); ASSERT(mFeatureLevel >= D3D_FEATURE_LEVEL_10_0);
return MAX_FRAGMENT_UNIFORM_VECTORS_D3D11; 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); META_ASSERT(gl::IMPLEMENTATION_MAX_VARYING_VECTORS == D3D11_VS_OUTPUT_REGISTER_COUNT);
switch (mFeatureLevel) switch (mFeatureLevel)
......
...@@ -107,9 +107,11 @@ class Renderer11 : public Renderer ...@@ -107,9 +107,11 @@ class Renderer11 : public Renderer
virtual bool getLuminanceAlphaTextureSupport(); virtual bool getLuminanceAlphaTextureSupport();
virtual unsigned int getMaxVertexTextureImageUnits() const; virtual unsigned int getMaxVertexTextureImageUnits() const;
virtual unsigned int getMaxCombinedTextureImageUnits() const; virtual unsigned int getMaxCombinedTextureImageUnits() const;
virtual int getMaxVertexUniformVectors() const; virtual unsigned int getReservedVertexUniformVectors() const;
virtual int getMaxFragmentUniformVectors() const; virtual unsigned int getReservedFragmentUniformVectors() const;
virtual int getMaxVaryingVectors() const; virtual unsigned int getMaxVertexUniformVectors() const;
virtual unsigned int getMaxFragmentUniformVectors() const;
virtual unsigned int getMaxVaryingVectors() const;
virtual bool getNonPower2TextureSupport() const; virtual bool getNonPower2TextureSupport() const;
virtual bool getDepthTextureSupport() const; virtual bool getDepthTextureSupport() const;
virtual bool getOcclusionQuerySupport() const; virtual bool getOcclusionQuerySupport() const;
......
...@@ -78,6 +78,12 @@ static const D3DFORMAT DepthStencilFormats[] = ...@@ -78,6 +78,12 @@ static const D3DFORMAT DepthStencilFormats[] =
enum 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 MAX_TEXTURE_IMAGE_UNITS_VTF_SM3 = 4
}; };
...@@ -1701,8 +1707,8 @@ void Renderer9::applyUniformnfv(gl::Uniform *targetUniform, const GLfloat *v) ...@@ -1701,8 +1707,8 @@ void Renderer9::applyUniformnfv(gl::Uniform *targetUniform, const GLfloat *v)
void Renderer9::applyUniformniv(gl::Uniform *targetUniform, const GLint *v) void Renderer9::applyUniformniv(gl::Uniform *targetUniform, const GLint *v)
{ {
ASSERT(targetUniform->registerCount <= D3D9_MAX_FLOAT_CONSTANTS); ASSERT(targetUniform->registerCount <= MAX_VERTEX_CONSTANT_VECTORS_D3D9);
GLfloat vector[D3D9_MAX_FLOAT_CONSTANTS][4]; GLfloat vector[MAX_VERTEX_CONSTANT_VECTORS_D3D9][4];
for (unsigned int i = 0; i < targetUniform->registerCount; i++) for (unsigned int i = 0; i < targetUniform->registerCount; i++)
{ {
...@@ -1717,8 +1723,8 @@ void Renderer9::applyUniformniv(gl::Uniform *targetUniform, const GLint *v) ...@@ -1717,8 +1723,8 @@ void Renderer9::applyUniformniv(gl::Uniform *targetUniform, const GLint *v)
void Renderer9::applyUniformnbv(gl::Uniform *targetUniform, const GLint *v) void Renderer9::applyUniformnbv(gl::Uniform *targetUniform, const GLint *v)
{ {
ASSERT(targetUniform->registerCount <= D3D9_MAX_FLOAT_CONSTANTS); ASSERT(targetUniform->registerCount <= MAX_VERTEX_CONSTANT_VECTORS_D3D9);
GLfloat vector[D3D9_MAX_FLOAT_CONSTANTS][4]; GLfloat vector[MAX_VERTEX_CONSTANT_VECTORS_D3D9][4];
for (unsigned int i = 0; i < targetUniform->registerCount; i++) for (unsigned int i = 0; i < targetUniform->registerCount; i++)
{ {
...@@ -2235,19 +2241,31 @@ unsigned int Renderer9::getMaxCombinedTextureImageUnits() const ...@@ -2235,19 +2241,31 @@ unsigned int Renderer9::getMaxCombinedTextureImageUnits() const
return gl::MAX_TEXTURE_IMAGE_UNITS + getMaxVertexTextureImageUnits(); return gl::MAX_TEXTURE_IMAGE_UNITS + getMaxVertexTextureImageUnits();
} }
int Renderer9::getMaxVertexUniformVectors() const unsigned int Renderer9::getReservedVertexUniformVectors() const
{
return 2; // dx_HalfPixelSize and dx_DepthRange.
}
unsigned int Renderer9::getReservedFragmentUniformVectors() const
{ {
return MAX_VERTEX_UNIFORM_VECTORS; return 3; // dx_ViewCoords, dx_DepthFront and dx_DepthRange.
} }
int Renderer9::getMaxFragmentUniformVectors() const unsigned int Renderer9::getMaxVertexUniformVectors() const
{ {
return getMajorShaderModel() >= 3 ? MAX_FRAGMENT_UNIFORM_VECTORS_SM3 : MAX_FRAGMENT_UNIFORM_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();
} }
int Renderer9::getMaxVaryingVectors() const unsigned int Renderer9::getMaxVaryingVectors() const
{ {
return getMajorShaderModel() >= 3 ? MAX_VARYING_VECTORS_SM3 : MAX_VARYING_VECTORS_SM2; return (getMajorShaderModel() >= 3) ? MAX_VARYING_VECTORS_SM3 : MAX_VARYING_VECTORS_SM2;
} }
bool Renderer9::getNonPower2TextureSupport() const bool Renderer9::getNonPower2TextureSupport() const
......
...@@ -36,16 +36,6 @@ class VertexDataManager; ...@@ -36,16 +36,6 @@ class VertexDataManager;
class StreamingIndexBufferInterface; class StreamingIndexBufferInterface;
struct TranslatedAttribute; 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 class Renderer9 : public Renderer
{ {
public: public:
...@@ -136,9 +126,11 @@ class Renderer9 : public Renderer ...@@ -136,9 +126,11 @@ class Renderer9 : public Renderer
virtual bool getLuminanceAlphaTextureSupport(); virtual bool getLuminanceAlphaTextureSupport();
virtual unsigned int getMaxVertexTextureImageUnits() const; virtual unsigned int getMaxVertexTextureImageUnits() const;
virtual unsigned int getMaxCombinedTextureImageUnits() const; virtual unsigned int getMaxCombinedTextureImageUnits() const;
virtual int getMaxVertexUniformVectors() const; virtual unsigned int getReservedVertexUniformVectors() const;
virtual int getMaxFragmentUniformVectors() const; virtual unsigned int getReservedFragmentUniformVectors() const;
virtual int getMaxVaryingVectors() const; virtual unsigned int getMaxVertexUniformVectors() const;
virtual unsigned int getMaxFragmentUniformVectors() const;
virtual unsigned int getMaxVaryingVectors() const;
virtual bool getNonPower2TextureSupport() const; virtual bool getNonPower2TextureSupport() const;
virtual bool getDepthTextureSupport() const; virtual bool getDepthTextureSupport() const;
virtual bool getOcclusionQuerySupport() const; virtual bool getOcclusionQuerySupport() const;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment