Implements glGetUniform
TRAC #11647
Signed-off-by: Andrew Lewycky
Signed-off-by: Daniel Koch
Author: Shannon Woods
git-svn-id: https://angleproject.googlecode.com/svn/trunk@123 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Program.cpp b/src/libGLESv2/Program.cpp
index 5919c41..e886a86 100644
--- a/src/libGLESv2/Program.cpp
+++ b/src/libGLESv2/Program.cpp
@@ -692,6 +692,117 @@
return true;
}
+bool Program::getUniformfv(GLint location, GLfloat *params)
+{
+ if (location < 0 || location >= (int)mUniforms.size())
+ {
+ return false;
+ }
+
+ unsigned int count = 0;
+
+ switch (mUniforms[location]->type)
+ {
+ case GL_FLOAT:
+ case GL_BOOL:
+ count = 1;
+ break;
+ case GL_FLOAT_VEC2:
+ case GL_BOOL_VEC2:
+ count = 2;
+ break;
+ case GL_FLOAT_VEC3:
+ case GL_BOOL_VEC3:
+ count = 3;
+ break;
+ case GL_FLOAT_VEC4:
+ case GL_BOOL_VEC4:
+ case GL_FLOAT_MAT2:
+ count = 4;
+ break;
+ case GL_FLOAT_MAT3:
+ count = 9;
+ break;
+ case GL_FLOAT_MAT4:
+ count = 16;
+ break;
+ default:
+ return false;
+ }
+
+ if (mUniforms[location]->type == GL_BOOL || mUniforms[location]->type == GL_BOOL_VEC2 ||
+ mUniforms[location]->type == GL_BOOL_VEC3 || mUniforms[location]->type == GL_BOOL_VEC4)
+ {
+ GLboolean *boolParams = mUniforms[location]->data;
+
+ for (unsigned int i = 0; i < count; ++i)
+ {
+ if (boolParams[i] == GL_FALSE)
+ params[i] = 0.0f;
+ else
+ params[i] = 1.0f;
+ }
+ }
+ else
+ {
+ memcpy(params, mUniforms[location]->data, count * sizeof(GLfloat));
+ }
+
+ return true;
+}
+
+bool Program::getUniformiv(GLint location, GLint *params)
+{
+ if (location < 0 || location >= (int)mUniforms.size())
+ {
+ return false;
+ }
+
+ unsigned int count = 0;
+
+ switch (mUniforms[location]->type)
+ {
+ case GL_INT:
+ case GL_BOOL:
+ count = 1;
+ break;
+ case GL_INT_VEC2:
+ case GL_BOOL_VEC2:
+ count = 2;
+ break;
+ case GL_INT_VEC3:
+ case GL_BOOL_VEC3:
+ count = 3;
+ break;
+ case GL_INT_VEC4:
+ case GL_BOOL_VEC4:
+ count = 4;
+ break;
+ default:
+ return false;
+ }
+
+ if (mUniforms[location]->type == GL_BOOL || mUniforms[location]->type == GL_BOOL_VEC2 ||
+ mUniforms[location]->type == GL_BOOL_VEC3 || mUniforms[location]->type == GL_BOOL_VEC4)
+ {
+ GLboolean *boolParams = mUniforms[location]->data;
+
+ for (unsigned int i = 0; i < count; ++i)
+ {
+ if (boolParams[i] == GL_FALSE)
+ params[i] = 0;
+ else
+ params[i] = 1;
+ }
+ }
+ else
+ {
+ memcpy(params, mUniforms[location]->data, count * sizeof(GLint));
+ }
+
+ return true;
+}
+
// Applies all the uniforms set for this program object to the Direct3D 9 device
void Program::applyUniforms()
{