[Mesa-dev] [PATCH] i965/fs: Don't rewrite texture message destinations to avoid MOVs.

Kenneth Graunke kenneth at whitecape.org
Sun Feb 12 23:29:14 PST 2012


Commit dc7f449d1ac53a66e6efb56ccf2a5953418a26ca introduced a new method
for avoiding MOVs: try to rewrite the destination of the instruction
that produced the RHS so it writes into the LHS.

Unfortunately, this is not safe for texturing operations, as they
return a set of four contiguous registers.  Consider the following:

SEND g7   ...
MOV  g15  g7
ADD  g8   1.0

Upon seeing the MOV, we would rewrite the SEND to write to g15 (and
implicitly g16, g17, and g18), causing the next instruction that
references g8 to read garbage.

The VS does not need texturing workarounds because sampler results fit
in a single register in SIMD4x2 mode.

Fixes color distortion in XBMC when using GLSL shaders.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=44333
Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
---
 src/mesa/drivers/dri/i965/brw_fs_visitor.cpp |    3 +++
 1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
index e670ba7..5d93ba5 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
@@ -605,6 +605,9 @@ fs_visitor::try_rewrite_rhs_to_dst(ir_assignment *ir,
        !src.equals(&last_rhs_inst->dst))
       return false;
 
+   if (last_rhs_inst->is_tex())
+      return false;
+
    /* Success!  Rewrite the instruction. */
    last_rhs_inst->dst = dst;
 
-- 
1.7.9



More information about the mesa-dev mailing list