glsl: Demote 'type' from ir_instruction to ir_rvalue and ir_variable.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 21 Sep 2011 00:58:45 +0000 (17:58 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 2 Apr 2012 21:15:46 +0000 (14:15 -0700)
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>
src/glsl/ast_function.cpp
src/glsl/ir.h
src/glsl/ir_function.cpp
src/glsl/ir_validate.cpp
src/glsl/lower_variable_index_to_cond_assign.cpp
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp

index dfdbc55c575fc7abd56c6b51a05da2c239116adc..39401017b81439ca71111b9abcb97b734c02334f 100644 (file)
@@ -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 = ", ";
index 6adfaa38e066d89519b67cb00d0cf86bd832a776..b1ae6db74167095af3aafa31a53294e8e241d9e0 100644 (file)
@@ -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
     */
index b34a50081682e795bc9f537d2d6a89087ac77d3f..a525693ed96502f10cb2a0adf6ea86df52273e83 100644 (file)
@@ -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;
index a7c82010b18879be7f8ce4cbb59fe33df360bf59..7efb4347799525f3ad212a0dea361c9d22d877e2 100644 (file)
@@ -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
index f8e4a1de428a1566bb90d2921d318adc3798df01..57771074a8c71b061f7e37b34d219323199b3f0e 100644 (file)
@@ -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());
 }
index a672ee624b2bab1557d866a28746ed64487dc1e4..00524288f6dad3c517474120db0858e5e2b69190 100644 (file)
@@ -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);