Mesa (master): glsl: fix optimization of discard nested multiple levels

Nicolai Hähnle nh at kemper.freedesktop.org
Thu Jul 28 10:03:29 UTC 2016


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

Author: Nicolai Hähnle <nicolai.haehnle at amd.com>
Date:   Tue Jul 26 10:04:57 2016 +0200

glsl: fix optimization of discard nested multiple levels

The order of optimizations can lead to the conditional discard optimization
being applied twice to the same discard statement. In this case, we must
ensure that both conditions are applied.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=96762
Cc: mesa-stable at lists.freedesktop.org
Tested-by: Kai Wasserbäch <kai at dev.carbon-project.org>
Reviewed-by: Tapani Pälli <tapani.palli at intel.com>
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

---

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

diff --git a/src/compiler/glsl/opt_conditional_discard.cpp b/src/compiler/glsl/opt_conditional_discard.cpp
index 03665c3..6d8a234 100644
--- a/src/compiler/glsl/opt_conditional_discard.cpp
+++ b/src/compiler/glsl/opt_conditional_discard.cpp
@@ -72,7 +72,14 @@ opt_conditional_discard_visitor::visit_leave(ir_if *ir)
 
    /* Move the condition and replace the ir_if with the ir_discard. */
    ir_discard *discard = (ir_discard *) ir->then_instructions.get_head_raw();
-   discard->condition = ir->condition;
+   if (!discard->condition)
+      discard->condition = ir->condition;
+   else {
+      void *ctx = ralloc_parent(ir);
+      discard->condition = new(ctx) ir_expression(ir_binop_logic_and,
+                                                  ir->condition,
+                                                  discard->condition);
+   }
    ir->replace_with(discard);
 
    progress = true;




More information about the mesa-commit mailing list