Refactor the ProgramBinary::getUniform family of calls to use a private generic 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@2147 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent f4895619
...@@ -571,7 +571,8 @@ bool ProgramBinary::setUniform4uiv(GLint location, GLsizei count, const GLuint * ...@@ -571,7 +571,8 @@ bool ProgramBinary::setUniform4uiv(GLint location, GLsizei count, const GLuint *
return setUniform(location, count, v, GL_UNSIGNED_INT_VEC4); return setUniform(location, count, v, GL_UNSIGNED_INT_VEC4);
} }
bool ProgramBinary::getUniformfv(GLint location, GLsizei *bufSize, GLfloat *params) template <typename T>
bool ProgramBinary::getUniformv(GLint location, GLsizei *bufSize, T *params, GLenum uniformType)
{ {
if (location < 0 || location >= (int)mUniformIndex.size()) if (location < 0 || location >= (int)mUniformIndex.size())
{ {
...@@ -596,10 +597,15 @@ bool ProgramBinary::getUniformfv(GLint location, GLsizei *bufSize, GLfloat *para ...@@ -596,10 +597,15 @@ bool ProgramBinary::getUniformfv(GLint location, GLsizei *bufSize, GLfloat *para
const int cols = VariableColumnCount(targetUniform->type); const int cols = VariableColumnCount(targetUniform->type);
transposeMatrix(params, (GLfloat*)targetUniform->data + mUniformIndex[location].element * 4 * rows, cols, rows, 4, rows); transposeMatrix(params, (GLfloat*)targetUniform->data + mUniformIndex[location].element * 4 * rows, cols, rows, 4, rows);
} }
else if (uniformType == UniformComponentType(targetUniform->type))
{
unsigned int size = UniformComponentCount(targetUniform->type);
memcpy(params, targetUniform->data + mUniformIndex[location].element * 4 * sizeof(T),
size * sizeof(T));
}
else else
{ {
unsigned int size = UniformComponentCount(targetUniform->type); unsigned int size = UniformComponentCount(targetUniform->type);
switch (UniformComponentType(targetUniform->type)) switch (UniformComponentType(targetUniform->type))
{ {
case GL_BOOL: case GL_BOOL:
...@@ -608,86 +614,33 @@ bool ProgramBinary::getUniformfv(GLint location, GLsizei *bufSize, GLfloat *para ...@@ -608,86 +614,33 @@ bool ProgramBinary::getUniformfv(GLint location, GLsizei *bufSize, GLfloat *para
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; params[i] = (boolParams[i] == GL_FALSE) ? static_cast<T>(0) : static_cast<T>(1);
} }
} }
break; break;
case GL_FLOAT: 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; 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] = (float)intParams[i]; params[i] = static_cast<T>(floatParams[i]);
} }
} }
break; break;
default: UNREACHABLE();
}
}
return true; case GL_INT:
}
bool ProgramBinary::getUniformiv(GLint location, GLsizei *bufSize, GLint *params)
{
if (location < 0 || location >= (int)mUniformIndex.size())
{
return false;
}
Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
// sized queries -- ensure the provided buffer is large enough
if (bufSize)
{
int requiredBytes = UniformExternalSize(targetUniform->type);
if (*bufSize < requiredBytes)
{
return false;
}
}
if (IsMatrixType(targetUniform->type))
{
const int rows = VariableRowCount(targetUniform->type);
const int cols = VariableColumnCount(targetUniform->type);
transposeMatrix(params, (GLfloat*)targetUniform->data + mUniformIndex[location].element * 4 * rows, cols, rows, 4, rows);
}
else
{
unsigned int size = VariableColumnCount(targetUniform->type);
switch (UniformComponentType(targetUniform->type))
{
case GL_BOOL:
{ {
GLint *boolParams = (GLint*)targetUniform->data + mUniformIndex[location].element * 4; 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] = boolParams[i]; params[i] = static_cast<T>(intParams[i]);
} }
} }
break; break;
case GL_FLOAT:
{
GLfloat *floatParams = (GLfloat*)targetUniform->data + mUniformIndex[location].element * 4;
for (unsigned int i = 0; i < size; 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(); default: UNREACHABLE();
} }
} }
...@@ -695,6 +648,16 @@ bool ProgramBinary::getUniformiv(GLint location, GLsizei *bufSize, GLint *params ...@@ -695,6 +648,16 @@ bool ProgramBinary::getUniformiv(GLint location, GLsizei *bufSize, GLint *params
return true; return true;
} }
bool ProgramBinary::getUniformfv(GLint location, GLsizei *bufSize, GLfloat *params)
{
return getUniformv(location, bufSize, params, GL_FLOAT);
}
bool ProgramBinary::getUniformiv(GLint location, GLsizei *bufSize, GLint *params)
{
return getUniformv(location, bufSize, params, GL_INT);
}
void ProgramBinary::dirtyAllUniforms() void ProgramBinary::dirtyAllUniforms()
{ {
unsigned int numUniforms = mUniforms.size(); unsigned int numUniforms = mUniforms.size();
......
...@@ -152,6 +152,9 @@ class ProgramBinary : public RefCountObject ...@@ -152,6 +152,9 @@ class ProgramBinary : public RefCountObject
template <int cols, int rows> template <int cols, int rows>
bool setUniformMatrixfv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value, GLenum targetUniformType); bool setUniformMatrixfv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value, GLenum targetUniformType);
template <typename T>
bool getUniformv(GLint location, GLsizei *bufSize, T *params, GLenum uniformType);
rx::Renderer *const mRenderer; rx::Renderer *const mRenderer;
rx::ShaderExecutable *mPixelExecutable; rx::ShaderExecutable *mPixelExecutable;
......
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