From bc71c318426b2939aae839a356f1ab4aef1e5ada Mon Sep 17 00:00:00 2001 From: "Wladimir J. van der Laan" Date: Sat, 28 Oct 2017 16:01:49 +0200 Subject: [PATCH] etnaviv: Don't flush on transfer when UNSYNCHRONIZED Structure code to only flush when we will potentially call cpu_prep. This prevents spurious flushes in applications that heavily rely on u_uploader. Signed-off-by: Wladimir J. van der Laan Reviewed-by: Lucas Stach Signed-off-by: Lucas Stach --- .../drivers/etnaviv/etnaviv_transfer.c | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/gallium/drivers/etnaviv/etnaviv_transfer.c b/src/gallium/drivers/etnaviv/etnaviv_transfer.c index 08ec1987d8f..c3899207098 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_transfer.c +++ b/src/gallium/drivers/etnaviv/etnaviv_transfer.c @@ -243,18 +243,6 @@ etna_transfer_map(struct pipe_context *pctx, struct pipe_resource *prsc, struct etna_resource_level *res_level = &rsc->levels[level]; - /* - * Always flush if we have the temporary resource and have a copy to this - * outstanding. Otherwise infer flush requirement from resource access and - * current GPU usage (reads must wait for GPU writes, writes must have - * exclusive access to the buffer). - */ - if ((trans->rsc && (etna_resource(trans->rsc)->status & ETNA_PENDING_WRITE)) || - (!trans->rsc && - (((usage & PIPE_TRANSFER_READ) && (rsc->status & ETNA_PENDING_WRITE)) || - ((usage & PIPE_TRANSFER_WRITE) && rsc->status)))) - pctx->flush(pctx, NULL, 0); - /* XXX we don't handle PIPE_TRANSFER_FLUSH_EXPLICIT; this flag can be ignored * when mapping in-place, * but when not in place we need to fire off the copy operation in @@ -312,6 +300,18 @@ etna_transfer_map(struct pipe_context *pctx, struct pipe_resource *prsc, if (trans->rsc || !(usage & PIPE_TRANSFER_UNSYNCHRONIZED)) { uint32_t prep_flags = 0; + /* + * Always flush if we have the temporary resource and have a copy to this + * outstanding. Otherwise infer flush requirement from resource access and + * current GPU usage (reads must wait for GPU writes, writes must have + * exclusive access to the buffer). + */ + if ((trans->rsc && (etna_resource(trans->rsc)->status & ETNA_PENDING_WRITE)) || + (!trans->rsc && + (((usage & PIPE_TRANSFER_READ) && (rsc->status & ETNA_PENDING_WRITE)) || + ((usage & PIPE_TRANSFER_WRITE) && rsc->status)))) + pctx->flush(pctx, NULL, 0); + if (usage & PIPE_TRANSFER_READ) prep_flags |= DRM_ETNA_PREP_READ; if (usage & PIPE_TRANSFER_WRITE)