glsl2: Define new ir_discard instruction.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 30 Jun 2010 17:47:34 +0000 (10:47 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Wed, 30 Jun 2010 21:54:58 +0000 (14:54 -0700)
src/glsl/ir.h
src/glsl/ir_clone.cpp
src/glsl/ir_constant_expression.cpp
src/glsl/ir_constant_folding.cpp
src/glsl/ir_hierarchical_visitor.cpp
src/glsl/ir_hierarchical_visitor.h
src/glsl/ir_hv_accept.cpp
src/glsl/ir_print_visitor.cpp
src/glsl/ir_print_visitor.h
src/glsl/ir_visitor.h
src/mesa/shader/ir_to_mesa.cpp

index 65026ef1f5bd0da2c29099312beff39683b9be26..00b0076c1728321e4ef6ef70a5ead50dfe97be58 100644 (file)
@@ -793,6 +793,33 @@ private:
    /** Loop containing this break instruction. */
    ir_loop *loop;
 };
+
+/**
+ * IR instruction representing discard statements.
+ */
+class ir_discard : public ir_jump {
+public:
+   ir_discard()
+   {
+      this->condition = NULL;
+   }
+
+   ir_discard(ir_rvalue *cond)
+   {
+      this->condition = cond;
+   }
+
+   virtual ir_instruction *clone(struct hash_table *ht) const;
+
+   virtual void accept(ir_visitor *v)
+   {
+      v->visit(this);
+   }
+
+   virtual ir_visitor_status accept(ir_hierarchical_visitor *);
+
+   ir_rvalue *condition;
+};
 /*@}*/
 
 
index 01a1ce3a6d473bb4ef2188ff02f9a113b0c39d2d..74cc858bda446701e458f58e4cc9b29e5de497a0 100644 (file)
@@ -74,6 +74,18 @@ ir_return::clone(struct hash_table *ht) const
    return new(ctx) ir_return(new_value);
 }
 
+ir_instruction *
+ir_discard::clone(struct hash_table *ht) const
+{
+   void *ctx = talloc_parent(this);
+   ir_rvalue *new_condition = NULL;
+
+   if (this->condition != NULL)
+      new_condition = (ir_rvalue *) this->condition->clone(ht);
+
+   return new(ctx) ir_discard(new_condition);
+}
+
 ir_instruction *
 ir_loop_jump::clone(struct hash_table *ht) const
 {
index 3408f5256a772ae707a8159daad773039cf6bfb3..c6348ac4347fdc8ab1c814d415e3251cf66f5178 100644 (file)
@@ -75,6 +75,7 @@ public:
    virtual void visit(ir_constant *);
    virtual void visit(ir_call *);
    virtual void visit(ir_return *);
+   virtual void visit(ir_discard *);
    virtual void visit(ir_if *);
    virtual void visit(ir_loop *);
    virtual void visit(ir_loop_jump *);
@@ -647,6 +648,14 @@ ir_constant_visitor::visit(ir_return *ir)
 }
 
 
+void
+ir_constant_visitor::visit(ir_discard *ir)
+{
+   (void) ir;
+   value = NULL;
+}
+
+
 void
 ir_constant_visitor::visit(ir_if *ir)
 {
index 342d027bbe8a970ed26cd68315856d1cdf5c2985..2daa6fde38de91de34be6b72d19d037197da1e36 100644 (file)
@@ -68,6 +68,7 @@ public:
    virtual void visit(ir_constant *);
    virtual void visit(ir_call *);
    virtual void visit(ir_return *);
+   virtual void visit(ir_discard *);
    virtual void visit(ir_if *);
    virtual void visit(ir_loop *);
    virtual void visit(ir_loop_jump *);
@@ -190,6 +191,13 @@ ir_constant_folding_visitor::visit(ir_return *ir)
 }
 
 
+void
+ir_constant_folding_visitor::visit(ir_discard *ir)
+{
+   (void) ir;
+}
+
+
 void
 ir_constant_folding_visitor::visit(ir_if *ir)
 {
index 0d520b127f287500a7974a94668774bd46fa5677..9afb12a4a2bff6aab9da72c80b8657141d99d5e4 100644 (file)
@@ -242,6 +242,22 @@ ir_hierarchical_visitor::visit_leave(ir_return *ir)
    return visit_continue;
 }
 
+ir_visitor_status
+ir_hierarchical_visitor::visit_enter(ir_discard *ir)
+{
+   if (this->callback != NULL)
+      this->callback(ir, this->data);
+
+   return visit_continue;
+}
+
+ir_visitor_status
+ir_hierarchical_visitor::visit_leave(ir_discard *ir)
+{
+   (void) ir;
+   return visit_continue;
+}
+
 ir_visitor_status
 ir_hierarchical_visitor::visit_enter(ir_if *ir)
 {
index 8b9e49dab13b707a0c1ad55f251687876446eddf..2c4590d4b10de2f6f02e2d0a9ad5fbf1dde18ea9 100644 (file)
@@ -129,6 +129,8 @@ public:
    virtual ir_visitor_status visit_leave(class ir_call *);
    virtual ir_visitor_status visit_enter(class ir_return *);
    virtual ir_visitor_status visit_leave(class ir_return *);
+   virtual ir_visitor_status visit_enter(class ir_discard *);
+   virtual ir_visitor_status visit_leave(class ir_discard *);
    virtual ir_visitor_status visit_enter(class ir_if *);
    virtual ir_visitor_status visit_leave(class ir_if *);
    /*@}*/
index f936b3500ebd719596861e20b6a73c9f600bff16..7b5cc5234c50b1809f0010fd99b2a0927f170957 100644 (file)
@@ -321,6 +321,23 @@ ir_return::accept(ir_hierarchical_visitor *v)
 }
 
 
+ir_visitor_status
+ir_discard::accept(ir_hierarchical_visitor *v)
+{
+   ir_visitor_status s = v->visit_enter(this);
+   if (s != visit_continue)
+      return (s == visit_continue_with_parent) ? visit_continue : s;
+
+   if (this->condition != NULL) {
+      s = this->condition->accept(v);
+      if (s != visit_continue)
+        return (s == visit_continue_with_parent) ? visit_continue : s;
+   }
+
+   return v->visit_leave(this);
+}
+
+
 ir_visitor_status
 ir_if::accept(ir_hierarchical_visitor *v)
 {
index be5a843f67deeff0f75002e38f875efbecb4d898..6f867e32532896a1c7c6e3e606737249a7894f2d 100644 (file)
@@ -314,6 +314,20 @@ ir_print_visitor::visit(ir_return *ir)
 }
 
 
+void
+ir_print_visitor::visit(ir_discard *ir)
+{
+   printf("(discard ");
+
+   if (ir->condition != NULL) {
+      printf(" ");
+      ir->condition->accept(this);
+   }
+
+   printf(")");
+}
+
+
 void
 ir_print_visitor::visit(ir_if *ir)
 {
index e97b823522a3ceedf647b4f45d67de07737c7e7c..3db42e24ca38c75f7a8fc7a72e9e3d98ea9474cd 100644 (file)
@@ -69,6 +69,7 @@ public:
    virtual void visit(ir_constant *);
    virtual void visit(ir_call *);
    virtual void visit(ir_return *);
+   virtual void visit(ir_discard *);
    virtual void visit(ir_if *);
    virtual void visit(ir_loop *);
    virtual void visit(ir_loop_jump *);
index a6f9d2b7ee33f9b371a71e27399de516c0b5ccca..b87d737318080fd0d163f7b0261c0c66e7302bca 100644 (file)
@@ -57,6 +57,7 @@ public:
    virtual void visit(class ir_constant *) = 0;
    virtual void visit(class ir_call *) = 0;
    virtual void visit(class ir_return *) = 0;
+   virtual void visit(class ir_discard *) = 0;
    virtual void visit(class ir_if *) = 0;
    virtual void visit(class ir_loop *) = 0;
    virtual void visit(class ir_loop_jump *) = 0;
index ef9a96e2f529642869d49e4113a9a7b851ba2b0a..8c074a8bd9a22f3d1ffd381e99fb371b84f0495e 100644 (file)
@@ -134,6 +134,7 @@ public:
    virtual void visit(ir_constant *);
    virtual void visit(ir_call *);
    virtual void visit(ir_return *);
+   virtual void visit(ir_discard *);
    virtual void visit(ir_texture *);
    virtual void visit(ir_if *);
    /*@}*/
@@ -1321,6 +1322,13 @@ ir_to_mesa_visitor::visit(ir_return *ir)
    ir->get_value()->accept(this);
 }
 
+void
+ir_to_mesa_visitor::visit(ir_discard *ir)
+{
+   assert(0);
+
+   ir->condition->accept(this);
+}
 
 void
 ir_to_mesa_visitor::visit(ir_if *ir)