From a603413eb8a8ad4e3e5dacd7360100c4225cb9b3 Mon Sep 17 00:00:00 2001 From: Lucas Stach Date: Fri, 9 Jun 2023 12:26:14 +0200 Subject: [PATCH] etnaviv: optimize transfer flushes Context flushes that are triggered by a pending write to the resource don't need to realize visibility of the resource changes outside of the context. Skip implicit resource flushes in those cases. Signed-off-by: Lucas Stach Reviewed-by: Christian Gmeiner Part-of: --- src/gallium/drivers/etnaviv/etnaviv_context.c | 2 +- src/gallium/drivers/etnaviv/etnaviv_context.h | 4 ++++ src/gallium/drivers/etnaviv/etnaviv_rs.c | 2 +- src/gallium/drivers/etnaviv/etnaviv_transfer.c | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/etnaviv/etnaviv_context.c b/src/gallium/drivers/etnaviv/etnaviv_context.c index f9d718a9f14..9797bf3a0a8 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_context.c +++ b/src/gallium/drivers/etnaviv/etnaviv_context.c @@ -506,7 +506,7 @@ etna_reset_gpu_state(struct etna_context *ctx) ctx->dirty_sampler_views = ~0L; } -static void +void etna_flush(struct pipe_context *pctx, struct pipe_fence_handle **fence, enum pipe_flush_flags flags, bool internal) { diff --git a/src/gallium/drivers/etnaviv/etnaviv_context.h b/src/gallium/drivers/etnaviv/etnaviv_context.h index e10f9f35296..2b61369d743 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_context.h +++ b/src/gallium/drivers/etnaviv/etnaviv_context.h @@ -220,4 +220,8 @@ void etna_context_add_flush_resource(struct etna_context *ctx, struct pipe_resource *rsc); +void +etna_flush(struct pipe_context *pctx, struct pipe_fence_handle **fence, + enum pipe_flush_flags flags, bool internal); + #endif diff --git a/src/gallium/drivers/etnaviv/etnaviv_rs.c b/src/gallium/drivers/etnaviv/etnaviv_rs.c index 4399db053cb..0dd58a9ed14 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_rs.c +++ b/src/gallium/drivers/etnaviv/etnaviv_rs.c @@ -822,7 +822,7 @@ manual: if (src->layout == ETNA_LAYOUT_TILED && dst->layout == ETNA_LAYOUT_TILED) { if ((etna_resource_status(ctx, src) & ETNA_PENDING_WRITE) || (etna_resource_status(ctx, dst) & ETNA_PENDING_WRITE)) - pctx->flush(pctx, NULL, 0); + etna_flush(pctx, NULL, 0, true); return etna_manual_blit(dst, dst_lev, dst_offset, src, src_lev, src_offset, blit_info); } diff --git a/src/gallium/drivers/etnaviv/etnaviv_transfer.c b/src/gallium/drivers/etnaviv/etnaviv_transfer.c index e24d22892ff..b77cd4b9531 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_transfer.c +++ b/src/gallium/drivers/etnaviv/etnaviv_transfer.c @@ -390,7 +390,7 @@ etna_transfer_map(struct pipe_context *pctx, struct pipe_resource *prsc, (!trans->rsc && (((usage & PIPE_MAP_READ) && (status & ETNA_PENDING_WRITE)) || ((usage & PIPE_MAP_WRITE) && status)))) { - pctx->flush(pctx, NULL, 0); + etna_flush(pctx, NULL, 0, true); } if (usage & PIPE_MAP_READ)