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