mesa: refactor GetActiveAttrib
Instead of iterating IR, retrieve required information through the new program resource functions. Signed-off-by: Tapani Pälli <tapani.palli@intel.com> Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
@@ -147,45 +147,41 @@ _mesa_GetActiveAttrib(GLhandleARB program, GLuint desired_index,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
exec_list *const ir = shProg->_LinkedShaders[MESA_SHADER_VERTEX]->ir;
|
struct gl_program_resource *res =
|
||||||
unsigned current_index = 0;
|
_mesa_program_resource_find_index(shProg, GL_PROGRAM_INPUT,
|
||||||
|
desired_index);
|
||||||
|
|
||||||
foreach_in_list(ir_instruction, node, ir) {
|
/* User asked for index that does not exist. */
|
||||||
const ir_variable *const var = node->as_variable();
|
if (!res) {
|
||||||
|
_mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttrib(index)");
|
||||||
if (!is_active_attrib(var))
|
return;
|
||||||
continue;
|
|
||||||
|
|
||||||
if (current_index == desired_index) {
|
|
||||||
const char *var_name = var->name;
|
|
||||||
|
|
||||||
/* Since gl_VertexID may be lowered to gl_VertexIDMESA, we need to
|
|
||||||
* consider gl_VertexIDMESA as gl_VertexID for purposes of checking
|
|
||||||
* active attributes.
|
|
||||||
*/
|
|
||||||
if (var->data.mode == ir_var_system_value &&
|
|
||||||
var->data.location == SYSTEM_VALUE_VERTEX_ID_ZERO_BASE) {
|
|
||||||
var_name = "gl_VertexID";
|
|
||||||
}
|
|
||||||
|
|
||||||
_mesa_copy_string(name, maxLength, length, var_name);
|
|
||||||
|
|
||||||
if (size)
|
|
||||||
*size = (var->type->is_array()) ? var->type->length : 1;
|
|
||||||
|
|
||||||
if (type)
|
|
||||||
*type = var->type->gl_type;
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
current_index++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If the loop did not return early, the caller must have asked for
|
const ir_variable *const var = RESOURCE_VAR(res);
|
||||||
* an index that did not exit. Set an error.
|
|
||||||
|
if (!is_active_attrib(var))
|
||||||
|
return;
|
||||||
|
|
||||||
|
const char *var_name = var->name;
|
||||||
|
|
||||||
|
/* Since gl_VertexID may be lowered to gl_VertexIDMESA, we need to
|
||||||
|
* consider gl_VertexIDMESA as gl_VertexID for purposes of checking
|
||||||
|
* active attributes.
|
||||||
*/
|
*/
|
||||||
_mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttrib(index)");
|
if (var->data.mode == ir_var_system_value &&
|
||||||
|
var->data.location == SYSTEM_VALUE_VERTEX_ID_ZERO_BASE) {
|
||||||
|
var_name = "gl_VertexID";
|
||||||
|
}
|
||||||
|
|
||||||
|
_mesa_copy_string(name, maxLength, length, var_name);
|
||||||
|
|
||||||
|
if (size)
|
||||||
|
_mesa_program_resource_prop(shProg, res, desired_index, GL_ARRAY_SIZE,
|
||||||
|
size, "glGetActiveAttrib");
|
||||||
|
|
||||||
|
if (type)
|
||||||
|
_mesa_program_resource_prop(shProg, res, desired_index, GL_TYPE,
|
||||||
|
(GLint *) type, "glGetActiveAttrib");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Locations associated with shader variables (array or non-array) can be
|
/* Locations associated with shader variables (array or non-array) can be
|
||||||
|
Reference in New Issue
Block a user