Consider the following code:

MOV A.x, B.x
MOV B.x, C.x

After the first line, cur_value[A][0] == B, indicating that A.x's
current value came from register B.

When processing the second line, we update cur_value[B][0] to C.
However, for drect copies, we fail to reset cur_value[A][0] to NULL.
This is necessary because the value of A is no longer the value of B.

This new code is cut and pasted from the non-direct-copy case in order
to make a smaller, more readable patch.  The next commit refactors it.

Fixes Counter-Strike: Source in Wine (where the menu rendered completely
black in DX9 mode), and hopefully the white textures in Civilization V.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=42032
Cc: Eric Anholt <e...@anholt.net>
Cc: Matt Turner <matts...@gmail.com>
Cc: Christopher James Halse Rogers <chalserog...@gmail.com>
Signed-off-by: Kenneth Graunke <kenn...@whitecape.org>
---
 .../drivers/dri/i965/brw_vec4_copy_propagation.cpp |   14 ++++++++++++++
 1 files changed, 14 insertions(+), 0 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp 
b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
index 95aa306..3e24903 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp
@@ -304,6 +304,20 @@ vec4_visitor::opt_copy_propagation()
               cur_value[reg][i] = &inst->src[0];
            }
         }
+
+        /* For any updated channels, clear tracking of them as a source. */
+        for (int i = 0; i < virtual_grf_reg_count; i++) {
+           for (int j = 0; j < 4; j++) {
+              if (inst->dst.writemask & (1 << j) &&
+                  cur_value[i][j] &&
+                  cur_value[i][j]->file == GRF &&
+                  cur_value[i][j]->reg == inst->dst.reg &&
+                  cur_value[i][j]->reg_offset == inst->dst.reg_offset) {
+                 cur_value[i][j] = NULL;
+              }
+           }
+        }
+
         continue;
       }
 
-- 
1.7.7.3

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to