From: Alex Deucher Date: Fri, 22 Feb 2013 22:04:43 +0000 (-0500) Subject: r600g: r6xx deadlock workaround (v6) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8442b67f5f3aedbfdb4446164dd09d4eaeda4888;p=mesa.git r600g: r6xx deadlock workaround (v6) Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=50655 https://bugs.freedesktop.org/show_bug.cgi?id=47116 v2: flush along with workaround. v3: just need a flush v4: try WAIT_UNTIL v5: switch to PS partial flush v6: rework patch Note: this is a candidate for the 9.1 branch. Signed-off-by: Alex Deucher --- diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c index c4bd758d796..1654233b756 100644 --- a/src/gallium/drivers/r600/r600_state_common.c +++ b/src/gallium/drivers/r600/r600_state_common.c @@ -1360,6 +1360,12 @@ static void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info rctx->vgt_state.atom.dirty = true; } + /* Workaround for hardware deadlock on certain R600 ASICs: write into a CB register. */ + if (rctx->chip_class == R600) { + rctx->flags |= R600_CONTEXT_PS_PARTIAL_FLUSH; + rctx->cb_misc_state.atom.dirty = true; + } + /* Emit states. */ r600_need_cs_space(rctx, ib.user_buffer ? 5 : 0, TRUE); r600_flush_emit(rctx);