[Mesa-dev] [PATCH 09/10] mesa: Array uniform names are supposed to have [0] appended
Ian Romanick
idr at freedesktop.org
Wed Jan 16 15:03:48 PST 2013
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 edb4477..15248fa 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