Mesa (master): etnaviv: flush all pending contexts when accessing a resource with the CPU

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Apr 3 10:54:43 UTC 2019


Module: Mesa
Branch: master
Commit: 3d8da347ac491f159ed0f5602301a841c103d7b0
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=3d8da347ac491f159ed0f5602301a841c103d7b0

Author: Lucas Stach <l.stach at pengutronix.de>
Date:   Wed Mar 27 12:22:58 2019 +0100

etnaviv: flush all pending contexts when accessing a resource with the CPU

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 <l.stach at pengutronix.de>
Reviewed-by: Christian Gmeiner <christian.gmeiner at gmail.com>
Tested-By: Guido Günther <agx at sigxcpu.org>

---

 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);
 




More information about the mesa-commit mailing list