asahi: Avoid reloads with staging blits
authorAlyssa Rosenzweig <alyssa@rosenzweig.io>
Fri, 2 Dec 2022 14:48:21 +0000 (09:48 -0500)
committerAlyssa Rosenzweig <alyssa@rosenzweig.io>
Sun, 11 Dec 2022 02:51:05 +0000 (21:51 -0500)
Noticed by inspection. Not likely to matter unless these staging blits are in a
hot path, but it's an easy win.

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20123>

src/gallium/drivers/asahi/agx_pipe.c

index 50fc31c..2143c9d 100644 (file)
@@ -891,9 +891,6 @@ agx_transfer_unmap(struct pipe_context *pctx,
    struct pipe_resource *prsrc = transfer->resource;
    struct agx_resource *rsrc = (struct agx_resource *) prsrc;
 
-   if (transfer->usage & PIPE_MAP_WRITE)
-      BITSET_SET(rsrc->data_valid, transfer->level);
-
    if (trans->staging.rsrc && (transfer->usage & PIPE_MAP_WRITE)) {
          agx_blit_from_staging(pctx, trans);
          agx_flush_readers(agx_context(pctx), agx_resource(trans->staging.rsrc),
@@ -914,6 +911,12 @@ agx_transfer_unmap(struct pipe_context *pctx,
       }
    }
 
+   /* The level we wrote is now initialized. We do this at the end so
+    * blit_from_staging can avoid reloading existing contents.
+    */
+   if (transfer->usage & PIPE_MAP_WRITE)
+      BITSET_SET(rsrc->data_valid, transfer->level);
+
    /* Free the transfer */
    free(trans->map);
    pipe_resource_reference(&transfer->resource, NULL);