Refactor getUniform for matrix types to use a single shared internal method.

TRAC #22845 Signed-off-by: Geoff Lang Signed-off-by: Shanon Woods Author: Jamie Madill git-svn-id: https://angleproject.googlecode.com/svn/branches/es3proto@2146 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 02e11f3a
...@@ -590,49 +590,43 @@ bool ProgramBinary::getUniformfv(GLint location, GLsizei *bufSize, GLfloat *para ...@@ -590,49 +590,43 @@ bool ProgramBinary::getUniformfv(GLint location, GLsizei *bufSize, GLfloat *para
} }
} }
switch (targetUniform->type) if (IsMatrixType(targetUniform->type))
{ {
case GL_FLOAT_MAT2: const int rows = VariableRowCount(targetUniform->type);
transposeMatrix<GLfloat>(params, (GLfloat*)targetUniform->data + mUniformIndex[location].element * 8, 2, 2, 4, 2); const int cols = VariableColumnCount(targetUniform->type);
break; transposeMatrix(params, (GLfloat*)targetUniform->data + mUniformIndex[location].element * 4 * rows, cols, rows, 4, rows);
case GL_FLOAT_MAT3: }
transposeMatrix<GLfloat>(params, (GLfloat*)targetUniform->data + mUniformIndex[location].element * 12, 3, 3, 4, 3); else
break; {
case GL_FLOAT_MAT4: unsigned int size = UniformComponentCount(targetUniform->type);
transposeMatrix<GLfloat>(params, (GLfloat*)targetUniform->data + mUniformIndex[location].element * 16, 4, 4, 4, 4);
break;
default:
{
unsigned int size = UniformComponentCount(targetUniform->type);
switch (UniformComponentType(targetUniform->type)) switch (UniformComponentType(targetUniform->type))
{
case GL_BOOL:
{ {
case GL_BOOL: GLint *boolParams = (GLint*)targetUniform->data + mUniformIndex[location].element * 4;
{
GLint *boolParams = (GLint*)targetUniform->data + mUniformIndex[location].element * 4;
for (unsigned int i = 0; i < size; i++) for (unsigned int i = 0; i < size; i++)
{
params[i] = (boolParams[i] == GL_FALSE) ? 0.0f : 1.0f;
}
}
break;
case GL_FLOAT:
memcpy(params, targetUniform->data + mUniformIndex[location].element * 4 * sizeof(GLfloat),
size * sizeof(GLfloat));
break;
case GL_INT:
{ {
GLint *intParams = (GLint*)targetUniform->data + mUniformIndex[location].element * 4; params[i] = (boolParams[i] == GL_FALSE) ? 0.0f : 1.0f;
}
}
break;
case GL_FLOAT:
memcpy(params, targetUniform->data + mUniformIndex[location].element * 4 * sizeof(GLfloat),
size * sizeof(GLfloat));
break;
case GL_INT:
{
GLint *intParams = (GLint*)targetUniform->data + mUniformIndex[location].element * 4;
for (unsigned int i = 0; i < size; i++) for (unsigned int i = 0; i < size; i++)
{ {
params[i] = (float)intParams[i]; params[i] = (float)intParams[i];
}
} }
break;
default: UNREACHABLE();
} }
break;
default: UNREACHABLE();
} }
} }
...@@ -658,49 +652,43 @@ bool ProgramBinary::getUniformiv(GLint location, GLsizei *bufSize, GLint *params ...@@ -658,49 +652,43 @@ bool ProgramBinary::getUniformiv(GLint location, GLsizei *bufSize, GLint *params
} }
} }
switch (targetUniform->type) if (IsMatrixType(targetUniform->type))
{ {
case GL_FLOAT_MAT2: const int rows = VariableRowCount(targetUniform->type);
transposeMatrix<GLint>(params, (GLfloat*)targetUniform->data + mUniformIndex[location].element * 8, 2, 2, 4, 2); const int cols = VariableColumnCount(targetUniform->type);
break; transposeMatrix(params, (GLfloat*)targetUniform->data + mUniformIndex[location].element * 4 * rows, cols, rows, 4, rows);
case GL_FLOAT_MAT3: }
transposeMatrix<GLint>(params, (GLfloat*)targetUniform->data + mUniformIndex[location].element * 12, 3, 3, 4, 3); else
break; {
case GL_FLOAT_MAT4: unsigned int size = VariableColumnCount(targetUniform->type);
transposeMatrix<GLint>(params, (GLfloat*)targetUniform->data + mUniformIndex[location].element * 16, 4, 4, 4, 4);
break;
default:
{
unsigned int size = VariableColumnCount(targetUniform->type);
switch (UniformComponentType(targetUniform->type)) switch (UniformComponentType(targetUniform->type))
{
case GL_BOOL:
{ {
case GL_BOOL: GLint *boolParams = (GLint*)targetUniform->data + mUniformIndex[location].element * 4;
{
GLint *boolParams = (GLint*)targetUniform->data + mUniformIndex[location].element * 4;
for (unsigned int i = 0; i < size; i++) for (unsigned int i = 0; i < size; i++)
{
params[i] = boolParams[i];
}
}
break;
case GL_FLOAT:
{ {
GLfloat *floatParams = (GLfloat*)targetUniform->data + mUniformIndex[location].element * 4; params[i] = boolParams[i];
}
}
break;
case GL_FLOAT:
{
GLfloat *floatParams = (GLfloat*)targetUniform->data + mUniformIndex[location].element * 4;
for (unsigned int i = 0; i < size; i++) for (unsigned int i = 0; i < size; i++)
{ {
params[i] = (GLint)floatParams[i]; params[i] = (GLint)floatParams[i];
}
} }
break;
case GL_INT:
memcpy(params, targetUniform->data + mUniformIndex[location].element * 4 * sizeof(GLint),
size * sizeof(GLint));
break;
default: UNREACHABLE();
} }
break;
case GL_INT:
memcpy(params, targetUniform->data + mUniformIndex[location].element * 4 * sizeof(GLint),
size * sizeof(GLint));
break;
default: UNREACHABLE();
} }
} }
......
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