From 8ef3c83ffe538d09380baaac5c3cd86a9f97ca47 Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Fri, 14 Dec 2012 15:01:48 -0800 Subject: [PATCH] mesa: Array uniform names are supposed to have [0] appended This is required by OpenGL ES 3.0 and desktop OpenGL 4.2. Previous version were ambiguous. This also matches the behavior of NVIDIA's closed-source driver (version 304.64). Fixed gles3conformance test uniform_buffer_object_getactiveuniform. Several piglit tests expect glGetActiveUniform to *not* include the [0] on the end. These tests were already failing on NVIDIA, and this change regresses them on Mesa. Patches have been sent to the piglit mailing list to fix the tests. Signed-off-by: Ian Romanick Reviewed-by: Kenneth Graunke --- src/mesa/main/uniforms.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c index edb44777f6b..15248fa1b5b 100644 --- a/src/mesa/main/uniforms.c +++ b/src/mesa/main/uniforms.c @@ -805,5 +805,36 @@ _mesa_get_uniform_name(const struct gl_uniform_storage *uni, GLsizei maxLength, GLsizei *length, GLchar *nameOut) { + GLsizei localLength; + + if (length == NULL) + length = &localLength; + _mesa_copy_string(nameOut, maxLength, length, uni->name); + + /* Page 61 (page 73 of the PDF) in section 2.11 of the OpenGL ES 3.0 + * spec says: + * + * "If the active uniform is an array, the uniform name returned in + * name will always be the name of the uniform array appended with + * "[0]"." + * + * The same text also appears in the OpenGL 4.2 spec. It does not, + * however, appear in any previous spec. Previous specifications are + * ambiguous in this regard. However, either name can later be passed + * to glGetUniformLocation (and related APIs), so there shouldn't be any + * harm in always appending "[0]" to uniform array names. + */ + if (uni->array_elements != 0) { + unsigned i; + + /* The comparison is strange because *length does *NOT* include the + * terminating NUL, but maxLength does. + */ + for (i = 0; i < 3 && (*length + i + 1) < maxLength; i++) + nameOut[*length + i] = "[0]"[i]; + + nameOut[*length + i] = '\0'; + *length += i; + } } -- 2.30.2