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)
{
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_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_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;
......@@ -2872,6 +2872,11 @@ bool Context::supportsShaderModel3() const
return mSupportsShaderModel3;
}
int Context::getMaximumVaryingVectors() const
{
return mSupportsShaderModel3 ? MAX_VARYING_VECTORS_SM3 : MAX_VARYING_VECTORS_SM2;
}
int Context::getMaxSupportedSamples() const
{
return mMaxSupportedSamples;
......
......@@ -58,7 +58,8 @@ enum
{
MAX_VERTEX_ATTRIBS = 12,
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_VERTEX_TEXTURE_IMAGE_UNITS = 0,
MAX_TEXTURE_IMAGE_UNITS = 16,
......@@ -380,6 +381,7 @@ class Context
GLenum getError();
bool supportsShaderModel3() const;
int getMaximumVaryingVectors() const;
int getMaximumRenderbufferDimension() const;
int getMaximumTextureDimension() const;
int getMaximumCubeTextureDimension() const;
......
......@@ -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
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++)
{
int n = VariableRowCount(varying->type) * varying->size;
......@@ -1007,7 +1010,7 @@ int Program::packVaryings(const Varying *packing[][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;
......@@ -1041,7 +1044,7 @@ int Program::packVaryings(const Varying *packing[][4])
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;
......@@ -1078,7 +1081,7 @@ int Program::packVaryings(const Varying *packing[][4])
{
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++)
{
......@@ -1098,7 +1101,7 @@ int Program::packVaryings(const Varying *packing[][4])
if (space[column] > n)
{
for (int r = 0; r < MAX_VARYING_VECTORS; r++)
for (int r = 0; r < maxVaryingVectors; r++)
{
if (!packing[r][column])
{
......@@ -1131,7 +1134,7 @@ int Program::packVaryings(const Varying *packing[][4])
// Return the number of used registers
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])
{
......@@ -1149,7 +1152,7 @@ bool Program::linkVaryings()
return false;
}
const Varying *packing[MAX_VARYING_VECTORS][4] = {NULL};
const Varying *packing[MAX_VARYING_VECTORS_SM3][4] = {NULL};
int registers = packVaryings(packing);
if (registers < 0)
......@@ -1157,7 +1160,11 @@ bool Program::linkVaryings()
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");
......@@ -1195,8 +1202,6 @@ bool Program::linkVaryings()
}
}
Context *context = getContext();
bool sm3 = context->supportsShaderModel3();
std::string varyingSemantic = (sm3 ? "COLOR" : "TEXCOORD");
mVertexHLSL += "struct VS_INPUT\n"
......
......@@ -36,9 +36,11 @@ Shader::Shader(ResourceManager *manager, GLuint handle) : mHandle(handle), mReso
{
ShBuiltInResources resources;
ShInitBuiltInResources(&resources);
Context *context = getContext();
resources.MaxVertexAttribs = MAX_VERTEX_ATTRIBS;
resources.MaxVertexUniformVectors = MAX_VERTEX_UNIFORM_VECTORS;
resources.MaxVaryingVectors = MAX_VARYING_VECTORS;
resources.MaxVaryingVectors = context->getMaximumVaryingVectors();
resources.MaxVertexTextureImageUnits = MAX_VERTEX_TEXTURE_IMAGE_UNITS;
resources.MaxCombinedTextureImageUnits = MAX_COMBINED_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