panfrost: Only copy resources when they are in a pending batch
authorIcecream95 <ixn@keemail.me>
Thu, 25 Jun 2020 07:51:37 +0000 (19:51 +1200)
committerMarge Bot <eric+marge@anholt.net>
Fri, 26 Jun 2020 06:32:34 +0000 (06:32 +0000)
Fixes a performance regression in alacritty, and rendering is still
fine in GLQuake ports.

Fixes: 361fb38662f ("panfrost: Copy resources when mapping to avoid waiting for readers")
Reviewed-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5642>

src/gallium/drivers/panfrost/pan_resource.c

index 9d1905d6c71bda88a836b10c96350457b6f6978e..303c4a8da553aeb7339d65291ef417e4c24eca74 100644 (file)
@@ -604,10 +604,14 @@ panfrost_transfer_map(struct pipe_context *pctx,
             !(usage & PIPE_TRANSFER_UNSYNCHRONIZED) &&
             (usage & PIPE_TRANSFER_WRITE) &&
             !(resource->target == PIPE_BUFFER
-              && !util_ranges_intersect(&rsrc->valid_buffer_range, box->x, box->x + box->width))) {
+              && !util_ranges_intersect(&rsrc->valid_buffer_range, box->x, box->x + box->width)) &&
+            panfrost_pending_batches_access_bo(ctx, bo)) {
 
-                /* It is often faster to copy the whole resource than to flush
-                 * readers */
+                /* When a resource to be modified is already being used by a
+                 * pending batch, it is often faster to copy the whole BO than
+                 * to flush and split the frame in two. This also mostly
+                 * mitigates broken depth reload.
+                 */
 
                 panfrost_flush_batches_accessing_bo(ctx, bo, PAN_BO_ACCESS_WRITE);
                 panfrost_bo_wait(bo, INT64_MAX, PAN_BO_ACCESS_WRITE);