[Mesa-dev] [PATCH] i965: Fix bitcast operations with negate (ceil)

Iago Toral Quiroga itoral at igalia.com
Wed Dec 17 01:24:04 PST 2014


Commit 0ae9ca12a8 put source modifiers out of the bitcast operations
by adding a MOV operation that would handle them separately. It missed
the case of ceil though, which negates both its source and destination
operands.

Fixes the following 42 dEQP tests:
dEQP-GLES3.functional.shaders.builtin_functions.common.ceil.*_vertex
dEQP-GLES3.functional.shaders.builtin_functions.common.ceil.*_fragment
dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil._*vertex.*
dEQP-GLES3.functional.shaders.builtin_functions.precision.ceil._*fragment.*
---
 src/mesa/drivers/dri/i965/brw_fs_visitor.cpp   | 12 ++++++++----
 src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 12 ++++++++----
 2 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
index b4f8f37..4526b75 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
@@ -889,10 +889,14 @@ fs_visitor::visit(ir_expression *ir)
    case ir_unop_trunc:
       emit(RNDZ(this->result, op[0]));
       break;
-   case ir_unop_ceil:
-      op[0].negate = !op[0].negate;
-      emit(RNDD(this->result, op[0]));
-      this->result.negate = true;
+   case ir_unop_ceil: {
+         fs_reg tmp = fs_reg(this, ir->type);
+         op[0].negate = !op[0].negate;
+         emit(MOV(tmp, op[0]));
+         emit(RNDD(tmp, tmp));
+         tmp.negate = true;
+         emit(MOV(this->result, tmp));
+      }
       break;
    case ir_unop_floor:
       emit(RNDD(this->result, op[0]));
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
index 73fff75..7c4a3e1 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
@@ -1649,10 +1649,14 @@ vec4_visitor::visit(ir_expression *ir)
    case ir_unop_trunc:
       emit(RNDZ(result_dst, op[0]));
       break;
-   case ir_unop_ceil:
-      op[0].negate = !op[0].negate;
-      inst = emit(RNDD(result_dst, op[0]));
-      this->result.negate = true;
+   case ir_unop_ceil: {
+         src_reg tmp = src_reg(this, ir->type);
+         op[0].negate = !op[0].negate;
+         emit(MOV(dst_reg(tmp), op[0]));
+         emit(RNDD(dst_reg(tmp), tmp));
+         tmp.negate = true;
+         emit(MOV(result_dst, tmp));
+      }
       break;
    case ir_unop_floor:
       inst = emit(RNDD(result_dst, op[0]));
-- 
1.9.1



More information about the mesa-dev mailing list