mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 19:30:11 +01:00
i965: Apply a homebrew workaround for GPU hang in OGLC api-texcoord.
The behavior of flushes in the hardware is a maze of twisty passages, and strangely the VS constants appear to be loaded during a pipeline flush instead of at the time of the packet emit according to the simulator. On moving the STATE_BASE_ADDRESS packet to where it really needed to live (in order for data loads by other packets to be correct), we sometimes no longer got a flush between those packets where we apparently needed it. This replicates the flushes implied by a STATE_BASE_ADDRESS update, fixing the GPU hangs in OGLC and the "engine" demo. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=36821 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=39257 Tested-by: Keith Packard <keithp@keithp.com> (bzflag and etracer fixed) Acked-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
407785d0e9
commit
3e5d36267d
1 changed files with 26 additions and 0 deletions
|
|
@ -160,6 +160,32 @@ upload_vs_state(struct brw_context *brw)
|
|||
GEN6_VS_STATISTICS_ENABLE |
|
||||
GEN6_VS_ENABLE);
|
||||
ADVANCE_BATCH();
|
||||
|
||||
/* Based on my reading of the simulator, the VS constants don't get
|
||||
* pulled into the VS FF unit until an appropriate pipeline flush
|
||||
* happens, and instead the 3DSTATE_CONSTANT_VS packet just adds
|
||||
* references to them into a little FIFO. The flushes are common,
|
||||
* but don't reliably happen between this and a 3DPRIMITIVE, causing
|
||||
* the primitive to use the wrong constants. Then the FIFO
|
||||
* containing the constant setup gets added to again on the next
|
||||
* constants change, and eventually when a flush does happen the
|
||||
* unit is overwhelmed by constant changes and dies.
|
||||
*
|
||||
* To avoid this, send a PIPE_CONTROL down the line that will
|
||||
* update the unit immediately loading the constants. The flush
|
||||
* type bits here were those set by the STATE_BASE_ADDRESS whose
|
||||
* move in a82a43e8d99e1715dd11c9c091b5ab734079b6a6 triggered the
|
||||
* bug reports that led to this workaround, and may be more than
|
||||
* what is strictly required to avoid the issue.
|
||||
*/
|
||||
BEGIN_BATCH(4);
|
||||
OUT_BATCH(_3DSTATE_PIPE_CONTROL);
|
||||
OUT_BATCH(PIPE_CONTROL_DEPTH_STALL |
|
||||
PIPE_CONTROL_INSTRUCTION_FLUSH |
|
||||
PIPE_CONTROL_STATE_CACHE_INVALIDATE);
|
||||
OUT_BATCH(0); /* address */
|
||||
OUT_BATCH(0); /* write data */
|
||||
ADVANCE_BATCH();
|
||||
}
|
||||
|
||||
const struct brw_tracked_state gen6_vs_state = {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue