From f75c2d53146ea14f8dfedcc5b7a4704278ba0792 Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Tue, 20 Sep 2011 17:58:45 -0700 Subject: [PATCH] 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 Reviewed-by: Eric Anholt Reviewed-by: Ian Romanick --- src/glsl/ast_function.cpp | 2 +- src/glsl/ir.h | 9 +++++++-- src/glsl/ir_function.cpp | 2 +- src/glsl/ir_validate.cpp | 4 +++- src/glsl/lower_variable_index_to_cond_assign.cpp | 2 +- src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 2 +- 6 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/glsl/ast_function.cpp b/src/glsl/ast_function.cpp index dfdbc55..3940101 100644 --- a/src/glsl/ast_function.cpp +++ b/src/glsl/ast_function.cpp @@ -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 = ", "; diff --git a/src/glsl/ir.h b/src/glsl/ir.h index 6adfaa3..b1ae6db 100644 --- a/src/glsl/ir.h +++ b/src/glsl/ir.h @@ -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) @@ -321,6 +321,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 */ const char *name; diff --git a/src/glsl/ir_function.cpp b/src/glsl/ir_function.cpp index b34a500..a525693 100644 --- a/src/glsl/ir_function.cpp +++ b/src/glsl/ir_function.cpp @@ -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; diff --git a/src/glsl/ir_validate.cpp b/src/glsl/ir_validate.cpp index a7c8201..7efb434 100644 --- a/src/glsl/ir_validate.cpp +++ b/src/glsl/ir_validate.cpp @@ -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 diff --git a/src/glsl/lower_variable_index_to_cond_assign.cpp b/src/glsl/lower_variable_index_to_cond_assign.cpp index f8e4a1d..5777107 100644 --- a/src/glsl/lower_variable_index_to_cond_assign.cpp +++ b/src/glsl/lower_variable_index_to_cond_assign.cpp @@ -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()); } diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp index a672ee6..0052428 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp @@ -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); -- 2.7.4