etnaviv: don't flush own context when updating resource use
authorLucas Stach <l.stach@pengutronix.de>
Wed, 27 Mar 2019 11:22:57 +0000 (12:22 +0100)
committerLucas Stach <l.stach@pengutronix.de>
Wed, 3 Apr 2019 10:54:09 +0000 (12:54 +0200)
The context is self synchronizing at the GPU side, as commands are
executed in order. We must not flush our own context when updating the
resource use, as that leads to excessive flushing on effectively every
draw call, causing huge CPU overhead.

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>
src/gallium/drivers/etnaviv/etnaviv_resource.c

index ab40414fbe2cf76e35ec5899f65d82d53bcaee17..c7eedab74187cd3644b0d4b21d6b31ddd3ef434e 100644 (file)
@@ -666,9 +666,18 @@ etna_resource_used(struct etna_context *ctx, struct pipe_resource *prsc,
          struct etna_context *extctx = (struct etna_context *)entry->key;
          struct pipe_context *pctx = &extctx->base;
 
          struct etna_context *extctx = (struct etna_context *)entry->key;
          struct pipe_context *pctx = &extctx->base;
 
+         if (extctx == ctx)
+            continue;
+
          pctx->flush(pctx, NULL, 0);
          pctx->flush(pctx, NULL, 0);
+         /* It's safe to clear the status here. If we need to flush it means
+          * either another context had the resource in exclusive (write) use,
+          * or we transition the resource to exclusive use in our context.
+          * In both cases the new status accurately reflects the resource use
+          * after the flush.
+          */
+         rsc->status = 0;
       }
       }
-      rsc->status = 0;
    }
 
    rsc->status |= status;
    }
 
    rsc->status |= status;