r600g: add PS_PARTIAL_FLUSH flag
authorAlex Deucher <alexander.deucher@amd.com>
Fri, 22 Feb 2013 22:02:54 +0000 (17:02 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 22 Feb 2013 23:23:31 +0000 (18:23 -0500)
PS_PARTIAL flushes seems to be required in certain
cases to prevent hangs, especially on r6xx.

Note: this is a candidate for the 9.1 branch.

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
src/gallium/drivers/r600/r600.h
src/gallium/drivers/r600/r600_hw_context.c

index 08b77e4feddd714bcb48703a29b471386670a9a7..11dbb3bad377dc0b82ae4125eca2669c8be99d5b 100644 (file)
@@ -151,6 +151,7 @@ struct r600_so_target {
 #define R600_CONTEXT_WAIT_CP_DMA_IDLE          (1 << 3)
 #define R600_CONTEXT_FLUSH_AND_INV             (1 << 4)
 #define R600_CONTEXT_FLUSH_AND_INV_CB_META     (1 << 5)
+#define R600_CONTEXT_PS_PARTIAL_FLUSH          (1 << 6)
 
 struct r600_context;
 struct r600_screen;
index f6dc418746d8080aebcbe1f80d6da354abd1f7e0..09dc98bdc9eb8c66a30b0a348c8773a217c29ed0 100644 (file)
@@ -624,6 +624,11 @@ void r600_flush_emit(struct r600_context *rctx)
                return;
        }
 
+       if (rctx->flags & R600_CONTEXT_PS_PARTIAL_FLUSH) {
+               cs->buf[cs->cdw++] = PKT3(PKT3_EVENT_WRITE, 0, 0);
+               cs->buf[cs->cdw++] = EVENT_TYPE(EVENT_TYPE_PS_PARTIAL_FLUSH) | EVENT_INDEX(4);
+       }
+
        if (rctx->flags & R600_CONTEXT_WAIT_3D_IDLE) {
                wait_until |= S_008040_WAIT_3D_IDLE(1);
        }