r600g/sb: implement r600 gpr index workaround. (v3.1)
authorDave Airlie <airlied@redhat.com>
Tue, 9 Dec 2014 06:46:55 +0000 (16:46 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 16 Dec 2014 02:44:45 +0000 (12:44 +1000)
commit3c8ef3a74b51d5c79bbbc3e73244085efd89206b
tree921bad2764da78a9da886b4caea8c97778e4b2c1
parentde0fd375f6de8f3357d05decc4a7dc231c679645
r600g/sb: implement r600 gpr index workaround. (v3.1)

r600, rv610 and rv630 all have a bug in their GPR indexing
and how the hw inserts access to PV.

If the base index for the src is the same as the dst gpr
in a previous group, then it will use PV instead of using
the indexed gpr correctly.

The workaround is to insert a NOP when you detect this.

v2: add second part of fix detecting DST rel writes followed
by same src base index reads.

v3: forget adding stuff to structs, just iterate over the
previous node group again, makes it more obvious.
v3.1: drop local_nop.

Fixes ~200 piglit regressions on rv635 since SB was introduced.

Reviewed-By: Glenn Kennard <glenn.kennard@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/r600/sb/sb_bc.h
src/gallium/drivers/r600/sb/sb_bc_finalize.cpp
src/gallium/drivers/r600/sb/sb_context.cpp
src/gallium/drivers/r600/sb/sb_pass.h