[Mesa-dev] [PATCH] fixup! i965/fs: Optimize emit_bool_to_cond_code for logical exprs.

Matt Turner mattst88 at gmail.com
Mon Aug 18 17:01:51 PDT 2014


---
I'm going to squash this into the commit, to resolve some bools
on platforms where Const.UniformBooleanTrue == 1. Fixes some piglit
failures on GM45.

 src/mesa/drivherers/dri/i965/brw_fs_visitor.cpp | 33 +++++++++++++++++++++++-----
 1 file changed, 27 insertions(+), 6 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
index c022dc3..bb4a9be 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
@@ -2184,18 +2184,39 @@ fs_visitor::emit_bool_to_cond_code(ir_rvalue *ir)
       break;
 
    case ir_binop_logic_xor:
-      inst = emit(XOR(reg_null_d, op[0], op[1]));
-      inst->conditional_mod = BRW_CONDITIONAL_NZ;
+      if (ctx->Const.UniformBooleanTrue == 1) {
+         fs_reg dst = fs_reg(this, glsl_type::uint_type);
+         emit(XOR(dst, op[0], op[1]));
+         inst = emit(AND(reg_null_d, dst, fs_reg(1)));
+         inst->conditional_mod = BRW_CONDITIONAL_NZ;
+      } else {
+         inst = emit(XOR(reg_null_d, op[0], op[1]));
+         inst->conditional_mod = BRW_CONDITIONAL_NZ;
+      }
       break;
 
    case ir_binop_logic_or:
-      inst = emit(OR(reg_null_d, op[0], op[1]));
-      inst->conditional_mod = BRW_CONDITIONAL_NZ;
+      if (ctx->Const.UniformBooleanTrue == 1) {
+         fs_reg dst = fs_reg(this, glsl_type::uint_type);
+         emit(OR(dst, op[0], op[1]));
+         inst = emit(AND(reg_null_d, dst, fs_reg(1)));
+         inst->conditional_mod = BRW_CONDITIONAL_NZ;
+      } else {
+         inst = emit(OR(reg_null_d, op[0], op[1]));
+         inst->conditional_mod = BRW_CONDITIONAL_NZ;
+      }
       break;
 
    case ir_binop_logic_and:
-      inst = emit(AND(reg_null_d, op[0], op[1]));
-      inst->conditional_mod = BRW_CONDITIONAL_NZ;
+      if (ctx->Const.UniformBooleanTrue == 1) {
+         fs_reg dst = fs_reg(this, glsl_type::uint_type);
+         emit(AND(dst, op[0], op[1]));
+         inst = emit(AND(reg_null_d, dst, fs_reg(1)));
+         inst->conditional_mod = BRW_CONDITIONAL_NZ;
+      } else {
+         inst = emit(AND(reg_null_d, op[0], op[1]));
+         inst->conditional_mod = BRW_CONDITIONAL_NZ;
+      }
       break;
 
    case ir_unop_f2b:
-- 
1.8.5.5



More information about the mesa-dev mailing list