Mesa (main): zink: attempt to handle some resource unmap cases in 32bit envs

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jun 30 13:23:44 UTC 2021


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Fri May  7 19:08:18 2021 -0400

zink: attempt to handle some resource unmap cases in 32bit envs

address space is limited here, so in some cases it's worthwhile to
unmap resources

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

---

 src/gallium/drivers/zink/zink_resource.c | 15 ++++++++++++++-
 src/gallium/drivers/zink/zink_resource.h |  3 +++
 src/gallium/drivers/zink/zink_screen.h   |  2 ++
 3 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c
index 419f66572cf..060f54babf0 100644
--- a/src/gallium/drivers/zink/zink_resource.c
+++ b/src/gallium/drivers/zink/zink_resource.c
@@ -116,6 +116,11 @@ cache_or_free_mem(struct zink_screen *screen, struct zink_resource_object *obj)
       mkey->seen_count--;
       if (util_dynarray_num_elements(array, struct mem_cache_entry) < seen) {
          struct mem_cache_entry mc = { obj->mem, obj->map };
+         screen->mem_cache_size += obj->size;
+         if (sizeof(void*) == 4 && obj->map) {
+            vkUnmapMemory(screen->dev, obj->mem);
+            mc.map = NULL;
+         }
          util_dynarray_append(array, struct mem_cache_entry, mc);
          simple_mtx_unlock(&screen->mem_cache_mtx);
          return;
@@ -548,6 +553,8 @@ resource_object_create(struct zink_screen *screen, const struct pipe_resource *t
             struct mem_cache_entry mc = util_dynarray_pop(array, struct mem_cache_entry);
             obj->mem = mc.mem;
             obj->map = mc.map;
+            screen->mem_cache_size -= reqs.size;
+            screen->mem_cache_count--;
          }
       } else {
          mkey = ralloc(screen->resource_mem_cache, struct mem_key);
@@ -1086,11 +1093,16 @@ 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 ((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;
 }
@@ -1148,7 +1160,8 @@ zink_transfer_unmap(struct pipe_context *pctx,
       zink_transfer_flush_region(pctx, ptrans, &ptrans->box);
    }
 
-   if (trans->base.b.usage & PIPE_MAP_ONCE && !trans->staging_res && !screen->threaded)
+   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--;
diff --git a/src/gallium/drivers/zink/zink_resource.h b/src/gallium/drivers/zink/zink_resource.h
index bb00ffe6f77..0db91aedce1 100644
--- a/src/gallium/drivers/zink/zink_resource.h
+++ b/src/gallium/drivers/zink/zink_resource.h
@@ -42,6 +42,8 @@ struct zink_context;
 
 #include <vulkan/vulkan.h>
 
+#define ZINK_MAP_TEMPORARY (PIPE_MAP_DRV_PRV << 0)
+
 enum zink_resource_access {
    ZINK_RESOURCE_ACCESS_READ = 1,
    ZINK_RESOURCE_ACCESS_WRITE = 32,
@@ -81,6 +83,7 @@ struct zink_resource_object {
    struct zink_batch_usage *reads;
    struct zink_batch_usage *writes;
    void *map;
+   unsigned map_count;
    bool is_buffer;
    bool host_visible;
    bool coherent;
diff --git a/src/gallium/drivers/zink/zink_screen.h b/src/gallium/drivers/zink/zink_screen.h
index ef786898b35..6b10c32215d 100644
--- a/src/gallium/drivers/zink/zink_screen.h
+++ b/src/gallium/drivers/zink/zink_screen.h
@@ -90,6 +90,8 @@ struct zink_screen {
 
    simple_mtx_t mem_cache_mtx;
    struct hash_table *resource_mem_cache;
+   uint64_t mem_cache_size;
+   unsigned mem_cache_count;
 
    unsigned shader_id;
 



More information about the mesa-commit mailing list