[Mesa-dev] [PATCH 2/2] mesa: Array uniform names are supposed to have [0] appended

Ian Romanick idr at freedesktop.org
Fri Dec 14 17:00:03 PST 2012


From: Ian Romanick <ian.d.romanick at intel.com>

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 <ian.d.romanick at intel.com>
---
 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 6409fc0..293ee9d 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;
+   }
 }
-- 
1.7.11.7



More information about the mesa-dev mailing list