Mesa (main): zink: split mem unmap logic for images and buffers

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Aug 17 19:59:56 UTC 2021


Module: Mesa
Branch: main
Commit: 89e2591e8d0c2af0f3861c9f44f8782fe696e0e6
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=89e2591e8d0c2af0f3861c9f44f8782fe696e0e6

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Thu Jul 29 13:31:38 2021 -0400

zink: split mem unmap logic for images and buffers

buffers should only be unmapped if they're explicitly marked for unmap,
but images should only be unmapped when running in 32bit, in which case
they need to always be unmapped

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12410>

---

 src/gallium/drivers/zink/zink_resource.c | 28 +++++++++++++++++++---------
 src/gallium/drivers/zink/zink_resource.h |  1 -
 2 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c
index 36782c1f9f3..ead20b3f1de 100644
--- a/src/gallium/drivers/zink/zink_resource.c
+++ b/src/gallium/drivers/zink/zink_resource.c
@@ -1320,16 +1320,13 @@ zink_transfer_map(struct pipe_context *pctx,
             vkFlushMappedMemoryRanges(screen->dev, 1, &range);
          }
          ptr = ((uint8_t *)base) + offset;
-         if (sizeof(void*) == 4)
-            trans->base.b.usage |= ZINK_MAP_TEMPORARY;
       }
+      if (sizeof(void*) == 4)
+         trans->base.b.usage |= ZINK_MAP_TEMPORARY;
    }
    if ((usage & PIPE_MAP_PERSISTENT) && !(usage & PIPE_MAP_COHERENT))
       res->obj->persistent_maps++;
 
-   if (trans->base.b.usage & (PIPE_MAP_ONCE | ZINK_MAP_TEMPORARY))
-      p_atomic_inc(&res->obj->map_count);
-
    *transfer = &trans->base.b;
    return ptr;
 }
@@ -1378,7 +1375,6 @@ static void
 transfer_unmap(struct pipe_context *pctx, struct pipe_transfer *ptrans)
 {
    struct zink_context *ctx = zink_context(pctx);
-   struct zink_screen *screen = zink_screen(pctx->screen);
    struct zink_resource *res = zink_resource(ptrans->resource);
    struct zink_transfer *trans = (struct zink_transfer *)ptrans;
 
@@ -1386,9 +1382,6 @@ transfer_unmap(struct pipe_context *pctx, struct pipe_transfer *ptrans)
       zink_transfer_flush_region(pctx, ptrans, &ptrans->box);
    }
 
-   if ((trans->base.b.usage & PIPE_MAP_ONCE && !trans->staging_res && !screen->threaded) ||
-       (trans->base.b.usage & ZINK_MAP_TEMPORARY && !p_atomic_dec_return(&res->obj->map_count)))
-      unmap_resource(screen, res);
    if ((trans->base.b.usage & PIPE_MAP_PERSISTENT) && !(trans->base.b.usage & PIPE_MAP_COHERENT))
       res->obj->persistent_maps--;
 
@@ -1406,15 +1399,32 @@ transfer_unmap(struct pipe_context *pctx, struct pipe_transfer *ptrans)
    }
 }
 
+static void
+do_transfer_unmap(struct zink_screen *screen, struct zink_transfer *trans)
+{
+   struct zink_resource *res = zink_resource(trans->staging_res);
+   if (!res)
+      res = zink_resource(trans->base.b.resource);
+   unmap_resource(screen, res);
+}
+
 static void
 zink_buffer_unmap(struct pipe_context *pctx, struct pipe_transfer *ptrans)
 {
+   struct zink_screen *screen = zink_screen(pctx->screen);
+   struct zink_transfer *trans = (struct zink_transfer *)ptrans;
+   if (trans->base.b.usage & PIPE_MAP_ONCE && !trans->staging_res)
+      do_transfer_unmap(screen, trans);
    transfer_unmap(pctx, ptrans);
 }
 
 static void
 zink_image_unmap(struct pipe_context *pctx, struct pipe_transfer *ptrans)
 {
+   struct zink_screen *screen = zink_screen(pctx->screen);
+   struct zink_transfer *trans = (struct zink_transfer *)ptrans;
+   if (sizeof(void*) == 4)
+      do_transfer_unmap(screen, trans);
    transfer_unmap(pctx, ptrans);
 }
 
diff --git a/src/gallium/drivers/zink/zink_resource.h b/src/gallium/drivers/zink/zink_resource.h
index ceed23ea5e8..2a80db2d47e 100644
--- a/src/gallium/drivers/zink/zink_resource.h
+++ b/src/gallium/drivers/zink/zink_resource.h
@@ -61,7 +61,6 @@ struct zink_resource_object {
    struct zink_batch_usage *reads;
    struct zink_batch_usage *writes;
    void *map;
-   unsigned map_count;
 
    struct util_dynarray tmp;
 



More information about the mesa-commit mailing list