Mesa (main): zink: split mem cache per type

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jul 22 00:44:06 UTC 2021


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Wed May 12 08:27:12 2021 -0400

zink: split mem cache per type

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

---

 src/gallium/drivers/zink/zink_resource.c | 33 +++++++++++++++++++-------------
 src/gallium/drivers/zink/zink_screen.c   | 13 ++++++++-----
 src/gallium/drivers/zink/zink_screen.h   | 14 ++++++++------
 3 files changed, 36 insertions(+), 24 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c
index 345ee8a64ff..f0ae8ba9bb5 100644
--- a/src/gallium/drivers/zink/zink_resource.c
+++ b/src/gallium/drivers/zink/zink_resource.c
@@ -110,8 +110,8 @@ static void
 cache_or_free_mem(struct zink_screen *screen, struct zink_resource_object *obj)
 {
    if (obj->mkey.key.heap_index != UINT32_MAX) {
-      simple_mtx_lock(&screen->mem.mem_cache_mtx);
-      struct hash_entry *he = _mesa_hash_table_search_pre_hashed(&screen->mem.resource_mem_cache, obj->mem_hash, &obj->mkey);
+      simple_mtx_lock(&screen->mem[obj->mkey.key.heap_index].mem_cache_mtx);
+      struct hash_entry *he = _mesa_hash_table_search_pre_hashed(&screen->mem[obj->mkey.key.heap_index].resource_mem_cache, obj->mem_hash, &obj->mkey);
       assert(he);
       struct util_dynarray *array = he->data;
       struct mem_key *mkey = (void*)he->key;
@@ -120,16 +120,16 @@ 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.mem_cache_size += obj->size;
+         screen->mem[obj->mkey.key.heap_index].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.mem_cache_mtx);
+         simple_mtx_unlock(&screen->mem[obj->mkey.key.heap_index].mem_cache_mtx);
          return;
       }
-      simple_mtx_unlock(&screen->mem.mem_cache_mtx);
+      simple_mtx_unlock(&screen->mem[obj->mkey.key.heap_index].mem_cache_mtx);
    }
    vkFreeMemory(screen->dev, obj->mem, NULL);
 }
@@ -712,9 +712,9 @@ resource_object_create(struct zink_screen *screen, const struct pipe_resource *t
       obj->mkey.key.reqs = reqs;
       obj->mkey.key.heap_index = mai.memoryTypeIndex;
       obj->mem_hash = mem_hash(&obj->mkey);
-      simple_mtx_lock(&screen->mem.mem_cache_mtx);
+      simple_mtx_lock(&screen->mem[mai.memoryTypeIndex].mem_cache_mtx);
 
-      struct hash_entry *he = _mesa_hash_table_search_pre_hashed(&screen->mem.resource_mem_cache, obj->mem_hash, &obj->mkey);
+      struct hash_entry *he = _mesa_hash_table_search_pre_hashed(&screen->mem[mai.memoryTypeIndex].resource_mem_cache, obj->mem_hash, &obj->mkey);
       struct mem_key *mkey;
       if (he) {
          struct util_dynarray *array = he->data;
@@ -723,8 +723,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.mem_cache_size -= reqs.size;
-            screen->mem.mem_cache_count--;
+            screen->mem[mai.memoryTypeIndex].mem_cache_size -= reqs.size;
+            screen->mem[mai.memoryTypeIndex].mem_cache_count--;
          }
       } else {
          mkey = ralloc(screen, struct mem_key);
@@ -732,10 +732,10 @@ resource_object_create(struct zink_screen *screen, const struct pipe_resource *t
          mkey->seen_count = 0;
          struct util_dynarray *array = rzalloc(screen, struct util_dynarray);
          util_dynarray_init(array, screen);
-         _mesa_hash_table_insert_pre_hashed(&screen->mem.resource_mem_cache, obj->mem_hash, mkey, array);
+         _mesa_hash_table_insert_pre_hashed(&screen->mem[mai.memoryTypeIndex].resource_mem_cache, obj->mem_hash, mkey, array);
       }
       mkey->seen_count++;
-      simple_mtx_unlock(&screen->mem.mem_cache_mtx);
+      simple_mtx_unlock(&screen->mem[mai.memoryTypeIndex].mem_cache_mtx);
    } else
       obj->mkey.key.heap_index = UINT32_MAX;
 
@@ -1684,8 +1684,15 @@ zink_screen_resource_init(struct pipe_screen *pscreen)
       pscreen->resource_from_handle = zink_resource_from_handle;
    }
    pscreen->resource_get_param = zink_resource_get_param;
-   simple_mtx_init(&screen->mem.mem_cache_mtx, mtx_plain);
-   return _mesa_hash_table_init(&screen->mem.resource_mem_cache, screen, mem_hash, mem_equals);
+
+   screen->mem = rzalloc_array(screen, struct zink_mem_cache, screen->info.mem_props.memoryTypeCount);
+   if (!screen->mem)
+      return false;
+   for (uint32_t i = 0; i < screen->info.mem_props.memoryTypeCount; ++i) {
+      simple_mtx_init(&screen->mem[i].mem_cache_mtx, mtx_plain);
+      _mesa_hash_table_init(&screen->mem[i].resource_mem_cache, screen, mem_hash, mem_equals);
+   }
+   return true;
 }
 
 void
diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c
index 25db59c3d55..19893ddeefa 100644
--- a/src/gallium/drivers/zink/zink_screen.c
+++ b/src/gallium/drivers/zink/zink_screen.c
@@ -1084,11 +1084,14 @@ zink_destroy_screen(struct pipe_screen *pscreen)
    }
 #endif
    disk_cache_destroy(screen->disk_cache);
-   simple_mtx_lock(&screen->mem.mem_cache_mtx);
-   hash_table_foreach(&screen->mem.resource_mem_cache, he)
-      resource_cache_entry_destroy(screen, he);
-   simple_mtx_unlock(&screen->mem.mem_cache_mtx);
-   simple_mtx_destroy(&screen->mem.mem_cache_mtx);
+
+   for (uint32_t i = 0; i < screen->info.mem_props.memoryHeapCount; ++i) {
+      simple_mtx_lock(&screen->mem[i].mem_cache_mtx);
+      hash_table_foreach(&screen->mem[i].resource_mem_cache, he)
+         resource_cache_entry_destroy(screen, he);
+      simple_mtx_unlock(&screen->mem[i].mem_cache_mtx);
+      simple_mtx_destroy(&screen->mem[i].mem_cache_mtx);
+   }
 
    util_live_shader_cache_deinit(&screen->shaders);
 
diff --git a/src/gallium/drivers/zink/zink_screen.h b/src/gallium/drivers/zink/zink_screen.h
index 71ead89e334..8a42e4d54cb 100644
--- a/src/gallium/drivers/zink/zink_screen.h
+++ b/src/gallium/drivers/zink/zink_screen.h
@@ -66,6 +66,13 @@ struct zink_modifier_prop {
     VkDrmFormatModifierPropertiesEXT*    pDrmFormatModifierProperties;
 };
 
+struct zink_mem_cache {
+   simple_mtx_t mem_cache_mtx;
+   struct hash_table resource_mem_cache;
+   uint64_t mem_cache_size;
+   unsigned mem_cache_count;
+};
+
 struct zink_screen {
    struct pipe_screen base;
    bool threaded;
@@ -92,12 +99,7 @@ struct zink_screen {
 
    struct util_live_shader_cache shaders;
 
-   struct {
-      simple_mtx_t mem_cache_mtx;
-      struct hash_table resource_mem_cache;
-      uint64_t mem_cache_size;
-      unsigned mem_cache_count;
-   } mem;
+   struct zink_mem_cache *mem;
 
    uint64_t total_video_mem;
    uint64_t clamp_video_mem;



More information about the mesa-commit mailing list