From 3d8da347ac491f159ed0f5602301a841c103d7b0 Mon Sep 17 00:00:00 2001 From: Lucas Stach Date: Wed, 27 Mar 2019 12:22:58 +0100 Subject: [PATCH] etnaviv: flush all pending contexts when accessing a resource with the CPU MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit When setting up a transfer to a resource, all contexts where the resource is pending must be flushed. Otherwise a write transfer might be started in the current context before all contexts that access the resource in shared (read) mode have been executed. Fixes: 64813541d575 (etnaviv: fix resource usage tracking across different pipe_context's) Signed-off-by: Lucas Stach Reviewed-by: Christian Gmeiner Tested-By: Guido Günther --- src/gallium/drivers/etnaviv/etnaviv_transfer.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/etnaviv/etnaviv_transfer.c b/src/gallium/drivers/etnaviv/etnaviv_transfer.c index 45cd31207f7..d875803bde2 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_transfer.c +++ b/src/gallium/drivers/etnaviv/etnaviv_transfer.c @@ -360,8 +360,14 @@ etna_transfer_map(struct pipe_context *pctx, struct pipe_resource *prsc, 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); + ((usage & PIPE_TRANSFER_WRITE) && rsc->status)))) { + set_foreach(rsc->pending_ctx, entry) { + struct etna_context *pend_ctx = (struct etna_context *)entry->key; + struct pipe_context *pend_pctx = &pend_ctx->base; + + pend_pctx->flush(pend_pctx, NULL, 0); + } + } mtx_unlock(&screen->lock); -- 2.30.2