glsl2: Define new ir_discard instruction.
This commit is contained in:

committed by
Ian Romanick

parent
88c20c46b8
commit
16efab1c4d
@@ -793,6 +793,33 @@ private:
|
|||||||
/** Loop containing this break instruction. */
|
/** Loop containing this break instruction. */
|
||||||
ir_loop *loop;
|
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;
|
||||||
|
};
|
||||||
/*@}*/
|
/*@}*/
|
||||||
|
|
||||||
|
|
||||||
|
@@ -74,6 +74,18 @@ ir_return::clone(struct hash_table *ht) const
|
|||||||
return new(ctx) ir_return(new_value);
|
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_instruction *
|
||||||
ir_loop_jump::clone(struct hash_table *ht) const
|
ir_loop_jump::clone(struct hash_table *ht) const
|
||||||
{
|
{
|
||||||
|
@@ -75,6 +75,7 @@ public:
|
|||||||
virtual void visit(ir_constant *);
|
virtual void visit(ir_constant *);
|
||||||
virtual void visit(ir_call *);
|
virtual void visit(ir_call *);
|
||||||
virtual void visit(ir_return *);
|
virtual void visit(ir_return *);
|
||||||
|
virtual void visit(ir_discard *);
|
||||||
virtual void visit(ir_if *);
|
virtual void visit(ir_if *);
|
||||||
virtual void visit(ir_loop *);
|
virtual void visit(ir_loop *);
|
||||||
virtual void visit(ir_loop_jump *);
|
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
|
void
|
||||||
ir_constant_visitor::visit(ir_if *ir)
|
ir_constant_visitor::visit(ir_if *ir)
|
||||||
{
|
{
|
||||||
|
@@ -68,6 +68,7 @@ public:
|
|||||||
virtual void visit(ir_constant *);
|
virtual void visit(ir_constant *);
|
||||||
virtual void visit(ir_call *);
|
virtual void visit(ir_call *);
|
||||||
virtual void visit(ir_return *);
|
virtual void visit(ir_return *);
|
||||||
|
virtual void visit(ir_discard *);
|
||||||
virtual void visit(ir_if *);
|
virtual void visit(ir_if *);
|
||||||
virtual void visit(ir_loop *);
|
virtual void visit(ir_loop *);
|
||||||
virtual void visit(ir_loop_jump *);
|
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
|
void
|
||||||
ir_constant_folding_visitor::visit(ir_if *ir)
|
ir_constant_folding_visitor::visit(ir_if *ir)
|
||||||
{
|
{
|
||||||
|
@@ -242,6 +242,22 @@ ir_hierarchical_visitor::visit_leave(ir_return *ir)
|
|||||||
return visit_continue;
|
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_visitor_status
|
||||||
ir_hierarchical_visitor::visit_enter(ir_if *ir)
|
ir_hierarchical_visitor::visit_enter(ir_if *ir)
|
||||||
{
|
{
|
||||||
|
@@ -129,6 +129,8 @@ public:
|
|||||||
virtual ir_visitor_status visit_leave(class ir_call *);
|
virtual ir_visitor_status visit_leave(class ir_call *);
|
||||||
virtual ir_visitor_status visit_enter(class ir_return *);
|
virtual ir_visitor_status visit_enter(class ir_return *);
|
||||||
virtual ir_visitor_status visit_leave(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_enter(class ir_if *);
|
||||||
virtual ir_visitor_status visit_leave(class ir_if *);
|
virtual ir_visitor_status visit_leave(class ir_if *);
|
||||||
/*@}*/
|
/*@}*/
|
||||||
|
@@ -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_visitor_status
|
||||||
ir_if::accept(ir_hierarchical_visitor *v)
|
ir_if::accept(ir_hierarchical_visitor *v)
|
||||||
{
|
{
|
||||||
|
@@ -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
|
void
|
||||||
ir_print_visitor::visit(ir_if *ir)
|
ir_print_visitor::visit(ir_if *ir)
|
||||||
{
|
{
|
||||||
|
@@ -69,6 +69,7 @@ public:
|
|||||||
virtual void visit(ir_constant *);
|
virtual void visit(ir_constant *);
|
||||||
virtual void visit(ir_call *);
|
virtual void visit(ir_call *);
|
||||||
virtual void visit(ir_return *);
|
virtual void visit(ir_return *);
|
||||||
|
virtual void visit(ir_discard *);
|
||||||
virtual void visit(ir_if *);
|
virtual void visit(ir_if *);
|
||||||
virtual void visit(ir_loop *);
|
virtual void visit(ir_loop *);
|
||||||
virtual void visit(ir_loop_jump *);
|
virtual void visit(ir_loop_jump *);
|
||||||
|
@@ -57,6 +57,7 @@ public:
|
|||||||
virtual void visit(class ir_constant *) = 0;
|
virtual void visit(class ir_constant *) = 0;
|
||||||
virtual void visit(class ir_call *) = 0;
|
virtual void visit(class ir_call *) = 0;
|
||||||
virtual void visit(class ir_return *) = 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_if *) = 0;
|
||||||
virtual void visit(class ir_loop *) = 0;
|
virtual void visit(class ir_loop *) = 0;
|
||||||
virtual void visit(class ir_loop_jump *) = 0;
|
virtual void visit(class ir_loop_jump *) = 0;
|
||||||
|
@@ -134,6 +134,7 @@ public:
|
|||||||
virtual void visit(ir_constant *);
|
virtual void visit(ir_constant *);
|
||||||
virtual void visit(ir_call *);
|
virtual void visit(ir_call *);
|
||||||
virtual void visit(ir_return *);
|
virtual void visit(ir_return *);
|
||||||
|
virtual void visit(ir_discard *);
|
||||||
virtual void visit(ir_texture *);
|
virtual void visit(ir_texture *);
|
||||||
virtual void visit(ir_if *);
|
virtual void visit(ir_if *);
|
||||||
/*@}*/
|
/*@}*/
|
||||||
@@ -1321,6 +1322,13 @@ ir_to_mesa_visitor::visit(ir_return *ir)
|
|||||||
ir->get_value()->accept(this);
|
ir->get_value()->accept(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ir_to_mesa_visitor::visit(ir_discard *ir)
|
||||||
|
{
|
||||||
|
assert(0);
|
||||||
|
|
||||||
|
ir->condition->accept(this);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ir_to_mesa_visitor::visit(ir_if *ir)
|
ir_to_mesa_visitor::visit(ir_if *ir)
|
||||||
|
Reference in New Issue
Block a user