From 369d1859d7bc4a6213f128718f8affc8e4f06006 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Wed, 11 Feb 2009 08:16:14 -0700 Subject: [PATCH] glsl: fix incorrect size returned by glGetActiveUniform() for array elements. Fixes one of the issues in bug 20056. --- src/mesa/shader/shader_api.c | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/src/mesa/shader/shader_api.c b/src/mesa/shader/shader_api.c index a5cf1ca1d44..44c28c44225 100644 --- a/src/mesa/shader/shader_api.c +++ b/src/mesa/shader/shader_api.c @@ -892,6 +892,7 @@ _mesa_get_active_uniform(GLcontext *ctx, GLuint program, GLuint index, { const struct gl_shader_program *shProg; const struct gl_program *prog; + const struct gl_program_parameter *param; GLint progPos; shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetActiveUniform"); @@ -917,14 +918,30 @@ _mesa_get_active_uniform(GLcontext *ctx, GLuint program, GLuint index, if (!prog || progPos < 0) return; /* should never happen */ - if (nameOut) - copy_string(nameOut, maxLength, length, - prog->Parameters->Parameters[progPos].Name); - if (size) - *size = prog->Parameters->Parameters[progPos].Size - / sizeof_glsl_type(prog->Parameters->Parameters[progPos].DataType); - if (type) - *type = prog->Parameters->Parameters[progPos].DataType; + ASSERT(progPos < prog->Parameters->NumParameters); + param = &prog->Parameters->Parameters[progPos]; + + if (nameOut) { + copy_string(nameOut, maxLength, length, param->Name); + } + + if (size) { + GLint typeSize = sizeof_glsl_type(param->DataType); + if (param->Size > typeSize) { + /* This is an array. + * Array elements are placed on vector[4] boundaries so they're + * a multiple of four floats. We round typeSize up to next multiple + * of four to get the right size below. + */ + typeSize = (typeSize + 3) & ~3; + } + /* Note that the returned size is in units of the , not bytes */ + *size = param->Size / typeSize; + } + + if (type) { + *type = param->DataType; + } } -- 2.30.2