i965: Reimplement all the PIPE_CONTROL rules.
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 17 Nov 2017 07:47:43 +0000 (23:47 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 12 Mar 2019 02:32:40 +0000 (19:32 -0700)
commit1467deb5432a512845fb646ed7b44a2e2d36dbd6
treefaa3d73f7c37d3482345ea555f43cc692598c752
parentc6af96d1bc18cc5af733ca80b11f4a23c414abe1
i965: Reimplement all the PIPE_CONTROL rules.

This implements virtually all documented PIPE_CONTROL restrictions
in a centralized helper.  You now simply ask for the operations you
want, and the pipe control "brain" will figure out exactly what pipe
controls to emit to make that happen without tanking your system.

The hope is that this will fix some intermittent flushing issues as
well as GPU hangs.  However, it also has a high risk of causing GPU
hangs and other regressions, as this is a particularly sensitive
area and poking the bear isn't always advisable.

Mark Janes noted that this patch helps with some GPU hangs on Icelake.

This does re-enable the VF Invalidate => Write Immediate workaround
on Gen8, which had been disabled (bug 103787) due to GPU hangs.  The
old code did this workaround after another which would have added CS
stall bits, so it missed a workaround.  The new code orders them
properly and appears to work.

v4: Don't pass "bo, offset, imm" to a recursive CS stall (caught by
    Topi Pohjolainen), drop Gen10 workarounds that are unnecessary for
    production hardware.

Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
src/mesa/drivers/dri/i965/genX_pipe_control.c