Mesa (master): glsl: Fix broken LRP algebraic optimization.

Kenneth Graunke kwg at kemper.freedesktop.org
Sun Mar 2 21:36:17 UTC 2014


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

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Fri Feb 28 23:15:49 2014 -0800

glsl: Fix broken LRP algebraic optimization.

opt_algebraic was translating lrp(x, 0, a) into add(x, -mul(x, a)).

Unfortunately, this references "x" twice, which is invalid in the IR,
leading to assertion failures in the validator.

Normally, cloning IR solves this.  However, "x" could actually be an
arbitrary expression tree, so copying it could result in huge piles
of wasted computation.  This is why we avoid reusing subexpressions.

Instead, transform it into mul(x, add(1.0, -a)), which is equivalent
but doesn't need two references to "x".

Fixes a regression since d5fa8a95621169, which isn't in any stable
branches.  Fixes 18 shaders in shader-db (bastion and yofrankie).

Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
Reviewed-by: Matt Turner <mattst88 at gmail.com>

---

 src/glsl/opt_algebraic.cpp |    4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/glsl/opt_algebraic.cpp b/src/glsl/opt_algebraic.cpp
index 778638c..5c49a78 100644
--- a/src/glsl/opt_algebraic.cpp
+++ b/src/glsl/opt_algebraic.cpp
@@ -571,7 +571,9 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)
       } else if (is_vec_zero(op_const[0])) {
          return mul(ir->operands[1], ir->operands[2]);
       } else if (is_vec_zero(op_const[1])) {
-         return add(ir->operands[0], neg(mul(ir->operands[0], ir->operands[2])));
+         unsigned op2_components = ir->operands[2]->type->vector_elements;
+         ir_constant *one = new(mem_ctx) ir_constant(1.0f, op2_components);
+         return mul(ir->operands[0], add(one, neg(ir->operands[2])));
       }
       break;
 




More information about the mesa-commit mailing list