etnaviv: flush all pending contexts when accessing a resource with the CPU
[mesa.git] / src / gallium / drivers / etnaviv / etnaviv_transfer.c
index 45cd31207f700dc4b41965b449dde3dce4a27832..d875803bde26e90fd07abc68c6fb375253c1f6f0 100644 (file)
@@ -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);