[Mesa-dev] [PATCH 33/53] st/nine: Fix CALLNZ implementation

Axel Davy axel.davy at ens.fr
Wed Jan 7 08:36:43 PST 2015


Nothing seems to indicates the negation modifier would be stored in the
instruction flags instead of the source modifier. tx_src_param has
already handled it if it is in the source modifier.

In addition,
when the card supports native integers, the boolean
are stored in 32 bits int and are equal to
0 or 0xFFFFFFFF.

Given 0xFFFFFFFF is NaN if it was a float, better use
UIF than IF.

Signed-off-by: Axel Davy <axel.davy at ens.fr>
---
 src/gallium/state_trackers/nine/nine_shader.c | 13 ++++---------
 1 file changed, 4 insertions(+), 9 deletions(-)

diff --git a/src/gallium/state_trackers/nine/nine_shader.c b/src/gallium/state_trackers/nine/nine_shader.c
index fb01408..899aee8 100644
--- a/src/gallium/state_trackers/nine/nine_shader.c
+++ b/src/gallium/state_trackers/nine/nine_shader.c
@@ -1431,17 +1431,12 @@ DECL_SPECIAL(CALL)
 DECL_SPECIAL(CALLNZ)
 {
     struct ureg_program *ureg = tx->ureg;
-    struct ureg_dst tmp = tx_scratch_scalar(tx);
     struct ureg_src src = tx_src_param(tx, &tx->insn.src[1]);
 
-    /* NOTE: source should be const bool, so we can use NOT/SUB instead of [U]SNE 0 */
-    if (!tx->insn.flags) {
-        if (tx->native_integers)
-            ureg_NOT(ureg, tmp, src);
-        else
-            ureg_SUB(ureg, tmp, ureg_imm1f(ureg, 1.0f), src);
-    }
-    ureg_IF(ureg, tx->insn.flags ? src : tx_src_scalar(tmp), tx_cond(tx));
+    if (!tx->native_integers)
+        ureg_IF(ureg, src, tx_cond(tx));
+    else
+        ureg_UIF(ureg, src, tx_cond(tx));
     ureg_CAL(ureg, &tx->inst_labels[tx->insn.src[0].idx]);
     tx_endcond(tx);
     ureg_ENDIF(ureg);
-- 
2.1.3



More information about the mesa-dev mailing list