i965: Fix computation of abs(-x) in FS
authorPaul Berry <stereotype441@gmail.com>
Fri, 7 Oct 2011 03:58:18 +0000 (20:58 -0700)
committerPaul Berry <stereotype441@gmail.com>
Tue, 11 Oct 2011 18:08:13 +0000 (11:08 -0700)
When updating a register reference to reflect the fact that we were
taking its absolute value, the fragment shader back-end failed to
clear the negate flag, resulting in abs(-x) getting computed as
-abs(x).

I also found (and fixed) a similar problem in brw_eu.h, but I'm not
aware of an actual manifestation of that problem.

Fixes piglit test glsl-fs-abs-neg-with-intermediate.

src/mesa/drivers/dri/i965/brw_eu.h
src/mesa/drivers/dri/i965/brw_fs.cpp

index 8b2222b4f57edaf6012f6062ab7e04da88f0b543..adc09f81630e845507bf7a3cb79b9f8daae072e1 100644 (file)
@@ -698,6 +698,7 @@ static INLINE struct brw_reg negate( struct brw_reg reg )
 static INLINE struct brw_reg brw_abs( struct brw_reg reg )
 {
    reg.abs = 1;
+   reg.negate = 0;
    return reg;
 }
 
index 6d17839df95e2287afbba8489c0639238dd05e26..f73166274d1dd7f4924c31ffdab3f4ea83dae04e 100644 (file)
@@ -1363,8 +1363,11 @@ fs_visitor::register_coalesce()
                scan_inst->src[i].reg == inst->dst.reg &&
                scan_inst->src[i].reg_offset == inst->dst.reg_offset) {
               fs_reg new_src = inst->src[0];
+               if (scan_inst->src[i].abs) {
+                  new_src.negate = 0;
+                  new_src.abs = 1;
+               }
               new_src.negate ^= scan_inst->src[i].negate;
-              new_src.abs |= scan_inst->src[i].abs;
               scan_inst->src[i] = new_src;
            }
         }