From 0d2dc06761fd0f5636cf88f06f5dec554d0f7fdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sun, 17 Oct 2021 12:23:17 -0400 Subject: [PATCH] radeonsi: don't sync before clear_buffer and copy_buffer if the buffer is idle Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/gallium/drivers/radeonsi/si_compute_blit.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/gallium/drivers/radeonsi/si_compute_blit.c b/src/gallium/drivers/radeonsi/si_compute_blit.c index be3f47da6ab..b499b766654 100644 --- a/src/gallium/drivers/radeonsi/si_compute_blit.c +++ b/src/gallium/drivers/radeonsi/si_compute_blit.c @@ -59,12 +59,27 @@ unsigned si_get_flush_flags(struct si_context *sctx, enum si_coherency coher, } } +static bool si_is_buffer_idle(struct si_context *sctx, struct si_resource *buf, + enum radeon_bo_usage usage) +{ + return !si_cs_is_buffer_referenced(sctx, buf->buf, usage) && + sctx->ws->buffer_wait(sctx->ws, buf->buf, 0, usage); +} + static void si_improve_sync_flags(struct si_context *sctx, struct pipe_resource *dst, struct pipe_resource *src, unsigned *flags) { if (dst->target != PIPE_BUFFER || (src && src->target != PIPE_BUFFER)) return; + if (si_is_buffer_idle(sctx, si_resource(dst), RADEON_USAGE_READWRITE) && + (!src || si_is_buffer_idle(sctx, si_resource(src), RADEON_USAGE_WRITE))) { + /* Idle buffers don't have to sync. */ + *flags &= ~(SI_OP_SYNC_GE_BEFORE | SI_OP_SYNC_PS_BEFORE | SI_OP_SYNC_CS_BEFORE | + SI_OP_SYNC_CPDMA_BEFORE); + return; + } + const unsigned cs_mask = SI_BIND_CONSTANT_BUFFER(PIPE_SHADER_COMPUTE) | SI_BIND_SHADER_BUFFER(PIPE_SHADER_COMPUTE) | SI_BIND_IMAGE_BUFFER(PIPE_SHADER_COMPUTE) |