Increase the number of varying vectors to 10 on Shader Model 3.0 devices.

TRAC #14503 Signed-off-by: Daniel Koch Author: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@492 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent b59a778c
...@@ -1191,7 +1191,7 @@ bool Context::getIntegerv(GLenum pname, GLint *params) ...@@ -1191,7 +1191,7 @@ bool Context::getIntegerv(GLenum pname, GLint *params)
{ {
case GL_MAX_VERTEX_ATTRIBS: *params = gl::MAX_VERTEX_ATTRIBS; break; case GL_MAX_VERTEX_ATTRIBS: *params = gl::MAX_VERTEX_ATTRIBS; break;
case GL_MAX_VERTEX_UNIFORM_VECTORS: *params = gl::MAX_VERTEX_UNIFORM_VECTORS; break; case GL_MAX_VERTEX_UNIFORM_VECTORS: *params = gl::MAX_VERTEX_UNIFORM_VECTORS; break;
case GL_MAX_VARYING_VECTORS: *params = gl::MAX_VARYING_VECTORS; break; case GL_MAX_VARYING_VECTORS: *params = getMaximumVaryingVectors(); break;
case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: *params = gl::MAX_COMBINED_TEXTURE_IMAGE_UNITS; break; case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: *params = gl::MAX_COMBINED_TEXTURE_IMAGE_UNITS; break;
case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: *params = gl::MAX_VERTEX_TEXTURE_IMAGE_UNITS; break; case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: *params = gl::MAX_VERTEX_TEXTURE_IMAGE_UNITS; break;
case GL_MAX_TEXTURE_IMAGE_UNITS: *params = gl::MAX_TEXTURE_IMAGE_UNITS; break; case GL_MAX_TEXTURE_IMAGE_UNITS: *params = gl::MAX_TEXTURE_IMAGE_UNITS; break;
...@@ -2872,6 +2872,11 @@ bool Context::supportsShaderModel3() const ...@@ -2872,6 +2872,11 @@ bool Context::supportsShaderModel3() const
return mSupportsShaderModel3; return mSupportsShaderModel3;
} }
int Context::getMaximumVaryingVectors() const
{
return mSupportsShaderModel3 ? MAX_VARYING_VECTORS_SM3 : MAX_VARYING_VECTORS_SM2;
}
int Context::getMaxSupportedSamples() const int Context::getMaxSupportedSamples() const
{ {
return mMaxSupportedSamples; return mMaxSupportedSamples;
......
...@@ -58,7 +58,8 @@ enum ...@@ -58,7 +58,8 @@ enum
{ {
MAX_VERTEX_ATTRIBS = 12, MAX_VERTEX_ATTRIBS = 12,
MAX_VERTEX_UNIFORM_VECTORS = 128, MAX_VERTEX_UNIFORM_VECTORS = 128,
MAX_VARYING_VECTORS = 8, MAX_VARYING_VECTORS_SM2 = 8,
MAX_VARYING_VECTORS_SM3 = 10,
MAX_COMBINED_TEXTURE_IMAGE_UNITS = 16, MAX_COMBINED_TEXTURE_IMAGE_UNITS = 16,
MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0, MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0,
MAX_TEXTURE_IMAGE_UNITS = 16, MAX_TEXTURE_IMAGE_UNITS = 16,
...@@ -380,6 +381,7 @@ class Context ...@@ -380,6 +381,7 @@ class Context
GLenum getError(); GLenum getError();
bool supportsShaderModel3() const; bool supportsShaderModel3() const;
int getMaximumVaryingVectors() const;
int getMaximumRenderbufferDimension() const; int getMaximumRenderbufferDimension() const;
int getMaximumTextureDimension() const; int getMaximumTextureDimension() const;
int getMaximumCubeTextureDimension() const; int getMaximumCubeTextureDimension() const;
......
...@@ -999,6 +999,9 @@ ID3DXBuffer *Program::compileToBinary(const char *hlsl, const char *profile, ID3 ...@@ -999,6 +999,9 @@ ID3DXBuffer *Program::compileToBinary(const char *hlsl, const char *profile, ID3
// Returns the number of used varying registers, or -1 if unsuccesful // Returns the number of used varying registers, or -1 if unsuccesful
int Program::packVaryings(const Varying *packing[][4]) int Program::packVaryings(const Varying *packing[][4])
{ {
Context *context = getContext();
const int maxVaryingVectors = context->getMaximumVaryingVectors();
for (VaryingList::iterator varying = mFragmentShader->varyings.begin(); varying != mFragmentShader->varyings.end(); varying++) for (VaryingList::iterator varying = mFragmentShader->varyings.begin(); varying != mFragmentShader->varyings.end(); varying++)
{ {
int n = VariableRowCount(varying->type) * varying->size; int n = VariableRowCount(varying->type) * varying->size;
...@@ -1007,7 +1010,7 @@ int Program::packVaryings(const Varying *packing[][4]) ...@@ -1007,7 +1010,7 @@ int Program::packVaryings(const Varying *packing[][4])
if (m == 2 || m == 3 || m == 4) if (m == 2 || m == 3 || m == 4)
{ {
for (int r = 0; r <= MAX_VARYING_VECTORS - n && !success; r++) for (int r = 0; r <= maxVaryingVectors - n && !success; r++)
{ {
bool available = true; bool available = true;
...@@ -1041,7 +1044,7 @@ int Program::packVaryings(const Varying *packing[][4]) ...@@ -1041,7 +1044,7 @@ int Program::packVaryings(const Varying *packing[][4])
if (!success && m == 2) if (!success && m == 2)
{ {
for (int r = MAX_VARYING_VECTORS - n; r >= 0 && !success; r--) for (int r = maxVaryingVectors - n; r >= 0 && !success; r--)
{ {
bool available = true; bool available = true;
...@@ -1078,7 +1081,7 @@ int Program::packVaryings(const Varying *packing[][4]) ...@@ -1078,7 +1081,7 @@ int Program::packVaryings(const Varying *packing[][4])
{ {
int space[4] = {0}; int space[4] = {0};
for (int y = 0; y < MAX_VARYING_VECTORS; y++) for (int y = 0; y < maxVaryingVectors; y++)
{ {
for (int x = 0; x < 4; x++) for (int x = 0; x < 4; x++)
{ {
...@@ -1098,7 +1101,7 @@ int Program::packVaryings(const Varying *packing[][4]) ...@@ -1098,7 +1101,7 @@ int Program::packVaryings(const Varying *packing[][4])
if (space[column] > n) if (space[column] > n)
{ {
for (int r = 0; r < MAX_VARYING_VECTORS; r++) for (int r = 0; r < maxVaryingVectors; r++)
{ {
if (!packing[r][column]) if (!packing[r][column])
{ {
...@@ -1131,7 +1134,7 @@ int Program::packVaryings(const Varying *packing[][4]) ...@@ -1131,7 +1134,7 @@ int Program::packVaryings(const Varying *packing[][4])
// Return the number of used registers // Return the number of used registers
int registers = 0; int registers = 0;
for (int r = 0; r < MAX_VARYING_VECTORS; r++) for (int r = 0; r < maxVaryingVectors; r++)
{ {
if (packing[r][0] || packing[r][1] || packing[r][2] || packing[r][3]) if (packing[r][0] || packing[r][1] || packing[r][2] || packing[r][3])
{ {
...@@ -1149,7 +1152,7 @@ bool Program::linkVaryings() ...@@ -1149,7 +1152,7 @@ bool Program::linkVaryings()
return false; return false;
} }
const Varying *packing[MAX_VARYING_VECTORS][4] = {NULL}; const Varying *packing[MAX_VARYING_VECTORS_SM3][4] = {NULL};
int registers = packVaryings(packing); int registers = packVaryings(packing);
if (registers < 0) if (registers < 0)
...@@ -1157,7 +1160,11 @@ bool Program::linkVaryings() ...@@ -1157,7 +1160,11 @@ bool Program::linkVaryings()
return false; return false;
} }
if (registers == MAX_VARYING_VECTORS && mFragmentShader->mUsesFragCoord) Context *context = getContext();
const bool sm3 = context->supportsShaderModel3();
const int maxVaryingVectors = context->getMaximumVaryingVectors();
if (registers == maxVaryingVectors && mFragmentShader->mUsesFragCoord)
{ {
appendToInfoLog("No varying registers left to support gl_FragCoord"); appendToInfoLog("No varying registers left to support gl_FragCoord");
...@@ -1195,8 +1202,6 @@ bool Program::linkVaryings() ...@@ -1195,8 +1202,6 @@ bool Program::linkVaryings()
} }
} }
Context *context = getContext();
bool sm3 = context->supportsShaderModel3();
std::string varyingSemantic = (sm3 ? "COLOR" : "TEXCOORD"); std::string varyingSemantic = (sm3 ? "COLOR" : "TEXCOORD");
mVertexHLSL += "struct VS_INPUT\n" mVertexHLSL += "struct VS_INPUT\n"
......
...@@ -36,9 +36,11 @@ Shader::Shader(ResourceManager *manager, GLuint handle) : mHandle(handle), mReso ...@@ -36,9 +36,11 @@ Shader::Shader(ResourceManager *manager, GLuint handle) : mHandle(handle), mReso
{ {
ShBuiltInResources resources; ShBuiltInResources resources;
ShInitBuiltInResources(&resources); ShInitBuiltInResources(&resources);
Context *context = getContext();
resources.MaxVertexAttribs = MAX_VERTEX_ATTRIBS; resources.MaxVertexAttribs = MAX_VERTEX_ATTRIBS;
resources.MaxVertexUniformVectors = MAX_VERTEX_UNIFORM_VECTORS; resources.MaxVertexUniformVectors = MAX_VERTEX_UNIFORM_VECTORS;
resources.MaxVaryingVectors = MAX_VARYING_VECTORS; resources.MaxVaryingVectors = context->getMaximumVaryingVectors();
resources.MaxVertexTextureImageUnits = MAX_VERTEX_TEXTURE_IMAGE_UNITS; resources.MaxVertexTextureImageUnits = MAX_VERTEX_TEXTURE_IMAGE_UNITS;
resources.MaxCombinedTextureImageUnits = MAX_COMBINED_TEXTURE_IMAGE_UNITS; resources.MaxCombinedTextureImageUnits = MAX_COMBINED_TEXTURE_IMAGE_UNITS;
resources.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS; resources.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS;
......
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