summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArthur Huillet <ahuillet@nvidia.com>2015-03-04 10:53:43 +0100
committerIlia Mirkin <imirkin@alum.mit.edu>2015-03-04 21:59:16 -0500
commit2b94faec18dc1f8f0d9241ec731408959320cd7c (patch)
treedba43f364c03084eb3dfb9a5b636d1ebb3f9afdd
parent8deab389459e4bad017146f63d4e886cdf0e6669 (diff)
shader_runner: fix uniform array name lookups
Don't look up uniform names for non-zero array elements, as this is illegal per GL4.5. >From the discussion of GetProgramResourceIndex in the GL4.5 spec: If name exactly matches the name string of one of the active resources for programInterface, the index of the matched resource is returned. Additionally, if name would exactly match the name string of an active resource if "[0]" were appended to name, the index of the matched resource is returned. Otherwise, name is considered not to be the name of an active resource, and INVALID_INDEX is returned. Note that if an interface enumerates a single active resource list entry for an array variable (e.g., "a[0]"), a name identifying any array element other than the first (e.g., "a[1]") is not considered to match. Instead, strip the "[xxx]" part of the name for the lookup. The NVIDIA proprietary driver enforces this rule of the specification, while Mesa is more permissive. Piglit shouldn't rely on the implementation being lax. Signed-off-by: Arthur Huillet <ahuillet@nvidia.com> Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu> Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
-rw-r--r--tests/shaders/shader_runner.c33
1 files changed, 26 insertions, 7 deletions
diff --git a/tests/shaders/shader_runner.c b/tests/shaders/shader_runner.c
index c193de9d6..b3624df5b 100644
--- a/tests/shaders/shader_runner.c
+++ b/tests/shaders/shader_runner.c
@@ -1227,11 +1227,12 @@ check_double_support(void)
* the data. If the uniform is not in a uniform block, returns false.
*/
bool
-set_ubo_uniform(const char *name, const char *type, const char *line, int ubo_array_index)
+set_ubo_uniform(char *name, const char *type, const char *line, int ubo_array_index)
{
GLuint uniform_index;
GLint block_index;
GLint offset;
+ GLint array_index;
char *data;
float f[16];
double d[16];
@@ -1242,7 +1243,29 @@ set_ubo_uniform(const char *name, const char *type, const char *line, int ubo_ar
if (!num_uniform_blocks)
return false;
- glGetUniformIndices(prog, 1, &name, &uniform_index);
+ /* if the uniform is an array, strip the index, as GL
+ prevents non-zero indexes from matching a name */
+ if (name[name_len - 1] == ']') {
+ int i;
+
+ for (i = name_len - 1; (i > 0) && isdigit(name[i-1]); --i)
+ /* empty */;
+
+ array_index = strtol(&name[i], NULL, 0);
+
+ if (i) {
+ i--;
+ if (name[i] != '[') {
+ printf("cannot parse uniform \"%s\"\n", name);
+ piglit_report_result(PIGLIT_FAIL);
+ }
+ name[i] = 0;
+ }
+
+ }
+
+
+ glGetUniformIndices(prog, 1, (const char **)&name, &uniform_index);
if (uniform_index == GL_INVALID_INDEX) {
printf("cannot get index of uniform \"%s\"\n", name);
piglit_report_result(PIGLIT_FAIL);
@@ -1265,14 +1288,10 @@ set_ubo_uniform(const char *name, const char *type, const char *line, int ubo_ar
if (name[name_len - 1] == ']') {
GLint stride;
- int i;
-
- for (i = name_len - 1; (i > 0) && isdigit(name[i-1]); --i)
- /* empty */;
glGetActiveUniformsiv(prog, 1, &uniform_index,
GL_UNIFORM_ARRAY_STRIDE, &stride);
- offset += stride * strtol(&name[i], NULL, 0);
+ offset += stride * array_index;
}
glBindBuffer(GL_UNIFORM_BUFFER,