[Mesa-dev] [PATCH] i965/fs: Fix conversions float->bool, int->bool

Kenneth Graunke kenneth at whitecape.org
Thu Jun 21 11:35:03 PDT 2012


From: Chad Versace <chad.versace at linux.intel.com>

Fixes gles2conform GL.equal.equal_bvec2_frag.

This fixes brw_fs_visitor's translation of ir_unop_f2b.  It used CMP to
convert the float to one of 0 or ~0. However, the convention in the
compiler is that true is represented by 1, not ~0. This patch adds an AND
to convert ~0 to 1.

By inspection, a similar problem existed with ir_unop_i2b, with a similar
fix.

[v2 kayden]: eliminate extra temporary register.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=49621
Signed-off-by: Chad Versace <chad.versace at linux.intel.com>
---
 src/mesa/drivers/dri/i965/brw_fs_visitor.cpp |   14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
index 4b9330b..9bd1e67 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
@@ -477,16 +477,16 @@ fs_visitor::visit(ir_expression *ir)
       break;
 
    case ir_unop_f2b:
+      inst = emit(BRW_OPCODE_CMP, this->result, op[0], fs_reg(0.0f));
+      inst->conditional_mod = BRW_CONDITIONAL_NZ;
+      emit(BRW_OPCODE_AND, this->result, this->result, fs_reg(1));
+      break;
    case ir_unop_i2b:
-      temp = this->result;
-      /* original gen4 does implicit conversion before comparison. */
-      if (intel->gen < 5)
-	 temp.type = op[0].type;
-
-      resolve_ud_negate(&op[0]);
+      assert(op[0].type == BRW_REGISTER_TYPE_D);
 
-      inst = emit(BRW_OPCODE_CMP, temp, op[0], fs_reg(0.0f));
+      inst = emit(BRW_OPCODE_CMP, this->result, op[0], fs_reg(0));
       inst->conditional_mod = BRW_CONDITIONAL_NZ;
+      emit(BRW_OPCODE_AND, this->result, this->result, fs_reg(1));
       break;
 
    case ir_unop_trunc:
-- 
1.7.10.4



More information about the mesa-dev mailing list