glsl2: Remove ir_program bong hits.
[mesa.git] / src / glsl / ir.h
index c19bd417c331a926bf2302833801042c4909870a..790173ed6befaf3998806b1e8a185eaa4656f143 100644 (file)
@@ -41,10 +41,6 @@ extern "C" {
 #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
 #endif
 
-struct ir_program {
-   void *bong_hits;
-};
-
 /**
  * Base class of all IR instructions
  */
@@ -74,6 +70,7 @@ public:
    virtual class ir_dereference *       as_dereference()      { return NULL; }
    virtual class ir_dereference_array *        as_dereference_array() { return NULL; }
    virtual class ir_dereference_variable *as_dereference_variable() { return NULL; }
+   virtual class ir_expression *        as_expression()       { return NULL; }
    virtual class ir_rvalue *            as_rvalue()           { return NULL; }
    virtual class ir_loop *              as_loop()             { return NULL; }
    virtual class ir_assignment *        as_assignment()       { return NULL; }
@@ -94,6 +91,8 @@ protected:
 
 class ir_rvalue : public ir_instruction {
 public:
+   virtual ir_rvalue *clone(struct hash_table *) const = 0;
+
    virtual ir_rvalue * as_rvalue()
    {
       return this;
@@ -154,7 +153,7 @@ class ir_variable : public ir_instruction {
 public:
    ir_variable(const struct glsl_type *, const char *);
 
-   virtual ir_instruction *clone(struct hash_table *ht) const;
+   virtual ir_variable *clone(struct hash_table *ht) const;
 
    virtual ir_variable *as_variable()
    {
@@ -258,7 +257,7 @@ class ir_function_signature : public ir_instruction {
 public:
    ir_function_signature(const glsl_type *return_type);
 
-   virtual ir_instruction *clone(struct hash_table *ht) const;
+   virtual ir_function_signature *clone(struct hash_table *ht) const;
 
    virtual void accept(ir_visitor *v)
    {
@@ -272,6 +271,23 @@ public:
     */
    const char *function_name() const;
 
+   /**
+    * Get a handle to the function for which this is a signature
+    *
+    * There is no setter function, this function returns a \c const pointer,
+    * and \c ir_function_signature::_function is private for a reason.  The
+    * only way to make a connection between a function and function signature
+    * is via \c ir_function::add_signature.  This helps ensure that certain
+    * invariants (i.e., a function signature is in the list of signatures for
+    * its \c _function) are met.
+    *
+    * \sa ir_function::add_signature
+    */
+   inline const class ir_function *function() const
+   {
+      return this->_function;
+   }
+
    /**
     * Check whether the qualifiers match between this signature's parameters
     * and the supplied parameter list.  If not, returns the name of the first
@@ -304,12 +320,15 @@ public:
    /** Whether or not this function has a body (which may be empty). */
    unsigned is_defined:1;
 
+   /** Whether or not this function signature is a built-in. */
+   unsigned is_built_in:1;
+
    /** Body of instructions in the function. */
    struct exec_list body;
 
 private:
    /** Function of which this signature is one overload. */
-   class ir_function *function;
+   class ir_function *_function;
 
    friend class ir_function;
 };
@@ -324,7 +343,7 @@ class ir_function : public ir_instruction {
 public:
    ir_function(const char *name);
 
-   virtual ir_instruction *clone(struct hash_table *ht) const;
+   virtual ir_function *clone(struct hash_table *ht) const;
 
    virtual ir_function *as_function()
    {
@@ -340,8 +359,8 @@ public:
 
    void add_signature(ir_function_signature *sig)
    {
-      sig->function = this;
-      signatures.push_tail(sig);
+      sig->_function = this;
+      this->signatures.push_tail(sig);
    }
 
    /**
@@ -356,7 +375,7 @@ public:
     * Find a signature that matches a set of actual parameters, taking implicit
     * conversions into account.
     */
-   const ir_function_signature *matching_signature(exec_list *actual_param);
+   ir_function_signature *matching_signature(exec_list *actual_param);
 
    /**
     * Find a signature that exactly matches a set of actual parameters without
@@ -378,7 +397,7 @@ private:
 
 inline const char *ir_function_signature::function_name() const
 {
-   return function->name;
+   return this->_function->name;
 }
 /*@}*/
 
@@ -394,7 +413,7 @@ public:
       /* empty */
    }
 
-   virtual ir_instruction *clone(struct hash_table *ht) const;
+   virtual ir_if *clone(struct hash_table *ht) const;
 
    virtual ir_if *as_if()
    {
@@ -426,7 +445,7 @@ public:
       /* empty */
    }
 
-   virtual ir_instruction *clone(struct hash_table *ht) const;
+   virtual ir_loop *clone(struct hash_table *ht) const;
 
    virtual void accept(ir_visitor *v)
    {
@@ -467,7 +486,7 @@ class ir_assignment : public ir_rvalue {
 public:
    ir_assignment(ir_rvalue *lhs, ir_rvalue *rhs, ir_rvalue *condition);
 
-   virtual ir_instruction *clone(struct hash_table *ht) const;
+   virtual ir_assignment *clone(struct hash_table *ht) const;
 
    virtual void accept(ir_visitor *v)
    {
@@ -601,7 +620,12 @@ public:
    ir_expression(int op, const struct glsl_type *type,
                 ir_rvalue *, ir_rvalue *);
 
-   virtual ir_instruction *clone(struct hash_table *ht) const;
+   virtual ir_expression *as_expression()
+   {
+      return this;
+   }
+
+   virtual ir_expression *clone(struct hash_table *ht) const;
 
    static unsigned int get_num_operands(ir_expression_operation);
    unsigned int get_num_operands() const
@@ -644,7 +668,7 @@ public:
       actual_parameters->move_nodes_to(& this->actual_parameters);
    }
 
-   virtual ir_instruction *clone(struct hash_table *ht) const;
+   virtual ir_call *clone(struct hash_table *ht) const;
 
    virtual ir_call *as_call()
    {
@@ -686,6 +710,11 @@ public:
       return callee;
    }
 
+   /**
+    * Set the function call target
+    */
+   void set_callee(const ir_function_signature *sig);
+
    /**
     * Generates an inline version of the function before @ir,
     * returning the return value of the function.
@@ -734,7 +763,7 @@ public:
       /* empty */
    }
 
-   virtual ir_instruction *clone(struct hash_table *) const;
+   virtual ir_return *clone(struct hash_table *) const;
 
    virtual ir_return *as_return()
    {
@@ -778,7 +807,7 @@ public:
       this->loop = loop;
    }
 
-   virtual ir_instruction *clone(struct hash_table *) const;
+   virtual ir_loop_jump *clone(struct hash_table *) const;
 
    virtual void accept(ir_visitor *v)
    {
@@ -819,7 +848,7 @@ public:
       this->condition = cond;
    }
 
-   virtual ir_instruction *clone(struct hash_table *ht) const;
+   virtual ir_discard *clone(struct hash_table *ht) const;
 
    virtual void accept(ir_visitor *v)
    {
@@ -871,7 +900,7 @@ public:
       /* empty */
    }
 
-   virtual ir_instruction *clone(struct hash_table *) const;
+   virtual ir_texture *clone(struct hash_table *) const;
 
    virtual void accept(ir_visitor *v)
    {
@@ -961,7 +990,7 @@ public:
 
    ir_swizzle(ir_rvalue *val, ir_swizzle_mask mask);
 
-   virtual ir_instruction *clone(struct hash_table *) const;
+   virtual ir_swizzle *clone(struct hash_table *) const;
 
    virtual ir_swizzle *as_swizzle()
    {
@@ -1005,6 +1034,8 @@ private:
 
 class ir_dereference : public ir_rvalue {
 public:
+   virtual ir_dereference *clone(struct hash_table *) const = 0;
+
    virtual ir_dereference *as_dereference()
    {
       return this;
@@ -1023,7 +1054,7 @@ class ir_dereference_variable : public ir_dereference {
 public:
    ir_dereference_variable(ir_variable *var);
 
-   virtual ir_instruction *clone(struct hash_table *) const;
+   virtual ir_dereference_variable *clone(struct hash_table *) const;
 
    virtual ir_dereference_variable *as_dereference_variable()
    {
@@ -1069,7 +1100,7 @@ public:
 
    ir_dereference_array(ir_variable *var, ir_rvalue *array_index);
 
-   virtual ir_instruction *clone(struct hash_table *) const;
+   virtual ir_dereference_array *clone(struct hash_table *) const;
 
    virtual ir_dereference_array *as_dereference_array()
    {
@@ -1105,7 +1136,7 @@ public:
 
    ir_dereference_record(ir_variable *var, const char *field);
 
-   virtual ir_instruction *clone(struct hash_table *) const;
+   virtual ir_dereference_record *clone(struct hash_table *) const;
 
    /**
     * Get the variable that is ultimately referenced by an r-value
@@ -1163,7 +1194,7 @@ public:
     */
    ir_constant(const ir_constant *c, unsigned i);
 
-   virtual ir_instruction *clone(struct hash_table *) const;
+   virtual ir_constant *clone(struct hash_table *) const;
 
    virtual ir_constant *as_constant()
    {
@@ -1221,6 +1252,15 @@ visit_exec_list(exec_list *list, ir_visitor *visitor);
 
 void validate_ir_tree(exec_list *instructions);
 
+/**
+ * Make a clone of each IR instruction in a list
+ *
+ * \param in   List of IR instructions that are to be cloned
+ * \param out  List to hold the cloned instructions
+ */
+void
+clone_ir_list(exec_list *out, const exec_list *in);
+
 extern void
 _mesa_glsl_initialize_variables(exec_list *instructions,
                                struct _mesa_glsl_parse_state *state);