summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLucas Stach <l.stach@pengutronix.de>2019-03-27 12:22:58 +0100
committerLucas Stach <l.stach@pengutronix.de>2019-04-03 12:54:09 +0200
commit3d8da347ac491f159ed0f5602301a841c103d7b0 (patch)
tree8e832735041ab48049e2f7ff9b63f677afcdf42e
parentf317ee1aff4365df5b8d183565eeee535ebc6576 (diff)
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@pengutronix.de> Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com> Tested-By: Guido Günther <agx@sigxcpu.org>
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_transfer.c10
1 files 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);