mesa: fix program resource queries for atomic counter buffers

gl_active_atomic_buffer contains index to UniformStorage, we need to
calculate resource index for that gl_uniform_storage.

Fixes following CTS tests:
   ES31-CTS.program_interface_query.atomic-counters
   ES31-CTS.program_interface_query.atomic-counters-one-buffer

No Piglit regressions.

Signed-off-by: Tapani Pälli <tapani.palli@intel.com>
Reviewed-by: Marta Lofstedt <marta.lofstedt@intel.com>
This commit is contained in:
Tapani Pälli 2015-10-30 12:02:51 +02:00
parent c2c124f891
commit efb333acb7
1 changed files with 26 additions and 2 deletions

View File

@ -669,6 +669,20 @@ _mesa_program_resource_index(struct gl_shader_program *shProg,
}
}
/**
* Find a program resource that points to given data.
*/
static struct gl_program_resource*
program_resource_find_data(struct gl_shader_program *shProg, void *data)
{
struct gl_program_resource *res = shProg->ProgramResourceList;
for (unsigned i = 0; i < shProg->NumProgramResourceList; i++, res++) {
if (res->Data == data)
return res;
}
return NULL;
}
/* Find a program resource with specific index in given interface.
*/
struct gl_program_resource *
@ -1066,8 +1080,18 @@ get_buffer_property(struct gl_shader_program *shProg,
*val = RESOURCE_ATC(res)->NumUniforms;
return 1;
case GL_ACTIVE_VARIABLES:
for (unsigned i = 0; i < RESOURCE_ATC(res)->NumUniforms; i++)
*val++ = RESOURCE_ATC(res)->Uniforms[i];
for (unsigned i = 0; i < RESOURCE_ATC(res)->NumUniforms; i++) {
/* Active atomic buffer contains index to UniformStorage. Find
* out gl_program_resource via data pointer and then calculate
* index of that uniform.
*/
unsigned idx = RESOURCE_ATC(res)->Uniforms[i];
struct gl_program_resource *uni =
program_resource_find_data(shProg,
&shProg->UniformStorage[idx]);
assert(uni);
*val++ = _mesa_program_resource_index(shProg, uni);
}
return RESOURCE_ATC(res)->NumUniforms;
}
}