Mesa (master): glsl: Handle conditional discards in lower_discard_flow().

Kenneth Graunke kwg at kemper.freedesktop.org
Tue Feb 24 23:28:19 UTC 2015


Module: Mesa
Branch: master
Commit: d77b186871389be10a68546da0e3ada8134ae539
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=d77b186871389be10a68546da0e3ada8134ae539

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Mon Feb 23 23:12:39 2015 -0800

glsl: Handle conditional discards in lower_discard_flow().

This pass wasn't prepared to handle conditional discards.

Instead of initializing the "discarded" temporary to "true", set it to
the condition.  Then, refer to the variable for the condition, to avoid
duplicating the expression tree.

Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
Reviewed-by: Connor Abbott <cwabbott0 at gmail.com>
Reviewed-by: Matt Turner <mattst88 at gmail.com>
Reviewed-by: Eric Anholt <eric at anholt.net>

---

 src/glsl/lower_discard_flow.cpp |    9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/glsl/lower_discard_flow.cpp b/src/glsl/lower_discard_flow.cpp
index 1bc56d7..ee45bf2 100644
--- a/src/glsl/lower_discard_flow.cpp
+++ b/src/glsl/lower_discard_flow.cpp
@@ -90,7 +90,14 @@ ir_visitor_status
 lower_discard_flow_visitor::visit_enter(ir_discard *ir)
 {
    ir_dereference *lhs = new(mem_ctx) ir_dereference_variable(discarded);
-   ir_rvalue *rhs = new(mem_ctx) ir_constant(true);
+   ir_rvalue *rhs;
+   if (ir->condition) {
+      /* discarded <- condition, use (var_ref discarded) as the condition */
+      rhs = ir->condition;
+      ir->condition = new(mem_ctx) ir_dereference_variable(discarded);
+   } else {
+      rhs = new(mem_ctx) ir_constant(true);
+   }
    ir_assignment *assign = new(mem_ctx) ir_assignment(lhs, rhs);
    ir->insert_before(assign);
 




More information about the mesa-commit mailing list