From 9e62012c30812091e5400d449869f5022ac945ca Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Thu, 26 May 2016 17:18:13 +0200 Subject: [PATCH] r600g: only do necessary cache flushes in cp_dma_clear_buffer MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The main impact is that fast color clear doesn't flush TC, CONST, DB. Reviewed-by: Alex Deucher Tested-by: Grazvydas Ignotas Tested-by: Dieter Nützel --- src/gallium/drivers/r600/evergreen_hw_context.c | 15 +-------------- src/gallium/drivers/r600/r600_pipe.h | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/gallium/drivers/r600/evergreen_hw_context.c b/src/gallium/drivers/r600/evergreen_hw_context.c index 2feb8015082..06f03482341 100644 --- a/src/gallium/drivers/r600/evergreen_hw_context.c +++ b/src/gallium/drivers/r600/evergreen_hw_context.c @@ -102,15 +102,7 @@ void evergreen_cp_dma_clear_buffer(struct r600_context *rctx, offset += r600_resource(dst)->gpu_address; /* Flush the cache where the resource is bound. */ - rctx->b.flags |= R600_CONTEXT_INV_CONST_CACHE | - R600_CONTEXT_INV_VERTEX_CACHE | - R600_CONTEXT_INV_TEX_CACHE | - R600_CONTEXT_FLUSH_AND_INV | - R600_CONTEXT_FLUSH_AND_INV_CB | - R600_CONTEXT_FLUSH_AND_INV_DB | - R600_CONTEXT_FLUSH_AND_INV_CB_META | - R600_CONTEXT_FLUSH_AND_INV_DB_META | - R600_CONTEXT_STREAMOUT_FLUSH | + rctx->b.flags |= r600_get_flush_flags(coher) | R600_CONTEXT_WAIT_3D_IDLE; while (size) { @@ -158,9 +150,4 @@ void evergreen_cp_dma_clear_buffer(struct r600_context *rctx, */ if (coher == R600_COHERENCY_SHADER) r600_emit_pfp_sync_me(rctx); - - /* Invalidate the read caches. */ - rctx->b.flags |= R600_CONTEXT_INV_CONST_CACHE | - R600_CONTEXT_INV_VERTEX_CACHE | - R600_CONTEXT_INV_TEX_CACHE; } diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h index 313bf69c314..9677bb64387 100644 --- a/src/gallium/drivers/r600/r600_pipe.h +++ b/src/gallium/drivers/r600/r600_pipe.h @@ -932,6 +932,23 @@ static inline bool r600_can_read_depth(struct r600_texture *rtex) rtex->resource.b.b.format == PIPE_FORMAT_Z32_FLOAT); } +static inline unsigned r600_get_flush_flags(enum r600_coherency coher) +{ + switch (coher) { + default: + case R600_COHERENCY_NONE: + return 0; + case R600_COHERENCY_SHADER: + return R600_CONTEXT_INV_CONST_CACHE | + R600_CONTEXT_INV_VERTEX_CACHE | + R600_CONTEXT_INV_TEX_CACHE | + R600_CONTEXT_STREAMOUT_FLUSH; + case R600_COHERENCY_CB_META: + return R600_CONTEXT_FLUSH_AND_INV_CB | + R600_CONTEXT_FLUSH_AND_INV_CB_META; + } +} + #define V_028A6C_OUTPRIM_TYPE_POINTLIST 0 #define V_028A6C_OUTPRIM_TYPE_LINESTRIP 1 #define V_028A6C_OUTPRIM_TYPE_TRISTRIP 2 -- 2.30.2