diff --git a/src/gallium/drivers/r600/r600.h b/src/gallium/drivers/r600/r600.h index 08b77e4..11dbb3b 100644 --- a/src/gallium/drivers/r600/r600.h +++ b/src/gallium/drivers/r600/r600.h @@ -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; diff --git a/src/gallium/drivers/r600/r600_hw_context.c b/src/gallium/drivers/r600/r600_hw_context.c index f6dc418..7020c78 100644 --- a/src/gallium/drivers/r600/r600_hw_context.c +++ b/src/gallium/drivers/r600/r600_hw_context.c @@ -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); } @@ -1161,7 +1166,7 @@ void r600_cp_dma_copy_buffer(struct r600_context *rctx, } /* Invalidate the read caches. */ - rctx->flags |= R600_CONTEXT_INVAL_READ_CACHES; + rctx->flags |= R600_CONTEXT_INVAL_READ_CACHES | R600_CONTEXT_PS_PARTIAL_FLUSH; } void r600_need_dma_space(struct r600_context *ctx, unsigned num_dw)