tgsi: handle SOA dependencies for MOV/SWZ
authorBrian Paul <brianp@vmware.com>
Thu, 20 Aug 2009 16:28:22 +0000 (10:28 -0600)
committerBrian Paul <brianp@vmware.com>
Thu, 20 Aug 2009 16:28:22 +0000 (10:28 -0600)
commit4c7c294ffff2a66f4585faa41ea9810527ea1e92
tree2c7ff318e6fcdaa79df8a1cef830e246e8913a22
parent5e6d21afa4efe033e27b980cc26266c3db6d9021
tgsi: handle SOA dependencies for MOV/SWZ

SOA dependencies can happen when a register is used both as a source and
destination and the source is swizzled.  For example:

MOV T, T.yxwz; would expand into:

  MOV t0, t1;
  MOV t1, t0;
  MOV t2, t3;
  MOV t3, t2;

The second instruction will produce the wrong result since we wrote to t0
in the first instruction.  We need to use an intermediate temporary to fix
this.

This will take more work to fix for all TGSI instructions.  This seems to
happen with MOV instructions more than anything else so fix that case now
and warn on others.

Fixes piglit glsl-vs-loop test (when not using SSE). See bug 23317.
src/gallium/auxiliary/tgsi/tgsi_exec.c
src/gallium/auxiliary/tgsi/tgsi_exec.h