We have to actually convert the values on the way out. Fixes piglit ARB_shader_objects/getuniform. --- src/mesa/main/uniforms.c | 32 ++++++++++++++++++++++++++++---- 1 files changed, 28 insertions(+), 4 deletions(-)
diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c index cda840f..fbaa810 100644 --- a/src/mesa/main/uniforms.c +++ b/src/mesa/main/uniforms.c @@ -55,13 +55,11 @@ static GLenum base_uniform_type(GLenum type) { switch (type) { -#if 0 /* not needed, for now */ case GL_BOOL: case GL_BOOL_VEC2: case GL_BOOL_VEC3: case GL_BOOL_VEC4: return GL_BOOL; -#endif case GL_FLOAT: case GL_FLOAT_VEC2: case GL_FLOAT_VEC3: @@ -408,8 +406,12 @@ get_uniform(struct gl_context *ctx, GLuint program, GLint location, else { const struct gl_program_parameter *p = &prog->Parameters->Parameters[paramPos]; + gl_constant_value (*values)[4]; GLint rows, cols, i, j, k; GLsizei numBytes; + GLenum storage_type; + + values = prog->Parameters->ParameterValues + paramPos + offset; get_uniform_rows_cols(p, &rows, &cols); @@ -421,15 +423,37 @@ get_uniform(struct gl_context *ctx, GLuint program, GLint location, return; } + if (ctx->Const.NativeIntegers) { + storage_type = base_uniform_type(p->DataType); + } else { + storage_type = GL_FLOAT; + } + switch (returnType) { case GL_FLOAT: { GLfloat *params = (GLfloat *) paramsOut; k = 0; for (i = 0; i < rows; i++) { - const int base = paramPos + offset + i; for (j = 0; j < cols; j++ ) { - params[k++] = prog->Parameters->ParameterValues[base][j].f; + switch (storage_type) { + case GL_FLOAT: + params[k++] = values[i][j].f; + break; + case GL_INT: + params[k++] = values[i][j].i; + break; + case GL_UNSIGNED_INT: + params[k++] = values[i][j].u; + break; + case GL_BOOL: + params[k++] = values[i][j].b; + break; + default: + _mesa_problem(ctx, "Invalid type in glGetUniform()"); + params[k++] = 0.0; + break; + } } } } -- 1.7.5.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev