r600g: r6xx deadlock workaround (v6)
authorAlex Deucher <alexander.deucher@amd.com>
Fri, 22 Feb 2013 22:04:43 +0000 (17:04 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 22 Feb 2013 23:23:46 +0000 (18:23 -0500)
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 <alexander.deucher@amd.com>
src/gallium/drivers/r600/r600_state_common.c

index c4bd758d79617774ef22d7903b3974d35609e31e..1654233b7565514dfee5f7fb9224078b7d832acf 100644 (file)
@@ -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);