Module: Mesa Branch: master Commit: d06cc42c3c85382600176d118d8bf492b4de6a55 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d06cc42c3c85382600176d118d8bf492b4de6a55
Author: Paul Berry <stereotype...@gmail.com> Date: Thu Oct 6 20:58:18 2011 -0700 i965: Fix computation of abs(-x) in FS 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 | 1 + src/mesa/drivers/dri/i965/brw_fs.cpp | 5 ++++- 2 files changed, 5 insertions(+), 1 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_eu.h b/src/mesa/drivers/dri/i965/brw_eu.h index 8b2222b..adc09f8 100644 --- a/src/mesa/drivers/dri/i965/brw_eu.h +++ b/src/mesa/drivers/dri/i965/brw_eu.h @@ -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; } diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index 6d17839..f731662 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -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; } } _______________________________________________ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit