Mesa (master): i965/fs: Avoid register coalescing away gen6 MATH workarounds.

Kenneth Graunke kwg at kemper.freedesktop.org
Tue Feb 22 10:54:51 PST 2011


Module: Mesa
Branch: master
Commit: 2c2686b912de19a430aba9f5ea5fa679eabdc5c6
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=2c2686b912de19a430aba9f5ea5fa679eabdc5c6

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Sat Feb 19 01:05:11 2011 -0800

i965/fs: Avoid register coalescing away gen6 MATH workarounds.

The code that generates MATH instructions attempts to work around
the hardware ignoring source modifiers (abs and negate) by emitting
moves into temporaries.  Unfortunately, this pass coalesced those
registers, restoring the original problem.  Avoid doing that.

Fixes several OpenGL ES2 conformance failures on Sandybridge.

NOTE: This is a candidate for the 7.10 branch.

Reviewed-by: Eric Anholt <eric at anholt.net>

---

 src/mesa/drivers/dri/i965/brw_fs.cpp |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index 66bbdbe..ed973f4 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -3059,6 +3059,8 @@ fs_visitor::register_coalesce()
 	  inst->dst.type != inst->src[0].type)
 	 continue;
 
+      bool has_source_modifiers = inst->src[0].abs || inst->src[0].negate;
+
       /* Found a move of a GRF to a GRF.  Let's see if we can coalesce
        * them: check for no writes to either one until the exit of the
        * program.
@@ -3083,6 +3085,14 @@ fs_visitor::register_coalesce()
 	       break;
 	    }
 	 }
+
+	 /* The gen6 MATH instruction can't handle source modifiers, so avoid
+	  * coalescing those for now.  We should do something more specific.
+	  */
+	 if (intel->gen == 6 && scan_inst->is_math() && has_source_modifiers) {
+	    interfered = true;
+	    break;
+	 }
       }
       if (interfered) {
 	 continue;



More information about the mesa-commit mailing list