glsl: Demote 'type' from ir_instruction to ir_rvalue and ir_variable.
Variables have types, expression trees have types, but statements don't. Rather than have a nonsensical field that stays NULL in the base class, just move it to where it makes sense. Fix up a few places that lazily used ir_instruction even though they actually knew the particular subclass. Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Eric Anholt <eric@anholt.net> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
@@ -83,7 +83,7 @@ prototype_string(const glsl_type *return_type, const char *name,
|
||||
|
||||
const char *comma = "";
|
||||
foreach_list(node, parameters) {
|
||||
const ir_instruction *const param = (ir_instruction *) node;
|
||||
const ir_variable *const param = (ir_variable *) node;
|
||||
|
||||
ralloc_asprintf_append(&str, "%s%s", comma, param->type->name);
|
||||
comma = ", ";
|
||||
|
@@ -88,7 +88,6 @@ enum ir_node_type {
|
||||
class ir_instruction : public exec_node {
|
||||
public:
|
||||
enum ir_node_type ir_type;
|
||||
const struct glsl_type *type;
|
||||
|
||||
/** ir_print_visitor helper for debugging. */
|
||||
void print(void) const;
|
||||
@@ -127,7 +126,6 @@ protected:
|
||||
ir_instruction()
|
||||
{
|
||||
ir_type = ir_type_unset;
|
||||
type = NULL;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -137,6 +135,8 @@ protected:
|
||||
*/
|
||||
class ir_rvalue : public ir_instruction {
|
||||
public:
|
||||
const struct glsl_type *type;
|
||||
|
||||
virtual ir_rvalue *clone(void *mem_ctx, struct hash_table *) const;
|
||||
|
||||
virtual void accept(ir_visitor *v)
|
||||
@@ -320,6 +320,11 @@ public:
|
||||
*/
|
||||
glsl_interp_qualifier determine_interpolation_mode(bool flat_shade);
|
||||
|
||||
/**
|
||||
* Declared type of the variable
|
||||
*/
|
||||
const struct glsl_type *type;
|
||||
|
||||
/**
|
||||
* Delcared name of the variable
|
||||
*/
|
||||
|
@@ -59,7 +59,7 @@ parameter_lists_match(const exec_list *list_a, const exec_list *list_b)
|
||||
|
||||
|
||||
const ir_variable *const param = (ir_variable *) node_a;
|
||||
const ir_instruction *const actual = (ir_instruction *) node_b;
|
||||
const ir_rvalue *const actual = (ir_rvalue *) node_b;
|
||||
|
||||
if (param->type == actual->type)
|
||||
continue;
|
||||
|
@@ -622,7 +622,9 @@ check_node_type(ir_instruction *ir, void *data)
|
||||
printf("Instruction node with unset type\n");
|
||||
ir->print(); printf("\n");
|
||||
}
|
||||
assert(ir->type != glsl_type::error_type);
|
||||
ir_rvalue *value = ir->as_rvalue();
|
||||
if (value != NULL)
|
||||
assert(value->type != glsl_type::error_type);
|
||||
}
|
||||
|
||||
void
|
||||
|
@@ -117,7 +117,7 @@ compare_index_block(exec_list *instructions, ir_variable *index,
|
||||
}
|
||||
|
||||
static inline bool
|
||||
is_array_or_matrix(const ir_instruction *ir)
|
||||
is_array_or_matrix(const ir_rvalue *ir)
|
||||
{
|
||||
return (ir->type->is_array() || ir->type->is_matrix());
|
||||
}
|
||||
|
@@ -1415,7 +1415,7 @@ fs_visitor::visit(ir_constant *ir)
|
||||
}
|
||||
} else if (ir->type->is_record()) {
|
||||
foreach_list(node, &ir->components) {
|
||||
ir_instruction *const field = (ir_instruction *) node;
|
||||
ir_constant *const field = (ir_constant *) node;
|
||||
const unsigned size = type_size(field->type);
|
||||
|
||||
field->accept(this);
|
||||
|
Reference in New Issue
Block a user