summaryrefslogtreecommitdiffstats
path: root/src/glsl
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2011-09-20 17:58:45 -0700
committerKenneth Graunke <[email protected]>2012-04-02 14:15:46 -0700
commitf75c2d53146ea14f8dfedcc5b7a4704278ba0792 (patch)
tree512d5cda78998a6b5b80d3f6ec90ba92dcb47b8c /src/glsl
parent82065fa20ee3f2880a070f1f4f75509b910cedde (diff)
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 <[email protected]> Reviewed-by: Eric Anholt <[email protected]> Reviewed-by: Ian Romanick <[email protected]>
Diffstat (limited to 'src/glsl')
-rw-r--r--src/glsl/ast_function.cpp2
-rw-r--r--src/glsl/ir.h9
-rw-r--r--src/glsl/ir_function.cpp2
-rw-r--r--src/glsl/ir_validate.cpp4
-rw-r--r--src/glsl/lower_variable_index_to_cond_assign.cpp2
5 files changed, 13 insertions, 6 deletions
diff --git a/src/glsl/ast_function.cpp b/src/glsl/ast_function.cpp
index dfdbc55c575..39401017b81 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 6adfaa38e06..b1ae6db7416 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 b34a5008168..a525693ed96 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 a7c82010b18..7efb4347799 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 f8e4a1de428..57771074a8c 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());
}