mesa: refactor active attrib queries for glGetProgramiv

Main motivation here is to get rid of iterating IR and
encapsulate queries within program resources.
No functional changes.

Piglit tests calling the modified functionality:

   - gl-get-active-attrib-returns-all-inputs
   - glsl-1.50-get-active-attrib-array
   - getactiveattrib

Signed-off-by: Tapani Pälli <tapani.palli@intel.com>
Reviewed-by: Martin Peres <martin.peres@linux.intel.com>
This commit is contained in:
Tapani Pälli
2015-04-23 11:13:17 +03:00
parent d5a15a89f0
commit a563689a40

View File

@@ -291,7 +291,6 @@ _mesa_GetAttribLocation(GLhandleARB program, const GLcharARB * name)
return (loc >= 0) ? loc : -1;
}
unsigned
_mesa_count_active_attribs(struct gl_shader_program *shProg)
{
@@ -300,19 +299,13 @@ _mesa_count_active_attribs(struct gl_shader_program *shProg)
return 0;
}
exec_list *const ir = shProg->_LinkedShaders[MESA_SHADER_VERTEX]->ir;
unsigned i = 0;
foreach_in_list(ir_instruction, node, ir) {
const ir_variable *const var = node->as_variable();
if (!is_active_attrib(var))
continue;
i++;
struct gl_program_resource *res = shProg->ProgramResourceList;
unsigned count = 0;
for (unsigned j = 0; j < shProg->NumProgramResourceList; j++, res++) {
if (is_active_attrib(RESOURCE_VAR(res)))
count++;
}
return i;
return count;
}
@@ -324,20 +317,16 @@ _mesa_longest_attribute_name_length(struct gl_shader_program *shProg)
return 0;
}
exec_list *const ir = shProg->_LinkedShaders[MESA_SHADER_VERTEX]->ir;
struct gl_program_resource *res = shProg->ProgramResourceList;
size_t longest = 0;
for (unsigned j = 0; j < shProg->NumProgramResourceList; j++, res++) {
if (res->Type == GL_PROGRAM_INPUT &&
res->StageReferences & (1 << MESA_SHADER_VERTEX)) {
foreach_in_list(ir_instruction, node, ir) {
const ir_variable *const var = node->as_variable();
if (var == NULL
|| var->data.mode != ir_var_shader_in
|| var->data.location == -1)
continue;
const size_t len = strlen(var->name);
if (len >= longest)
longest = len + 1;
const size_t length = strlen(RESOURCE_VAR(res)->name);
if (length >= longest)
longest = length + 1;
}
}
return longest;