Module: Mesa
Branch: staging/21.0
Commit: ceea05eaa7c35f4bed9d94fbb8a9525e9b35fd64
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=ceea05eaa7c35f4bed9d94fbb8a9525e9b35fd64

Author: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl>
Date:   Wed Mar 17 14:25:58 2021 +0100

radv: Dedupe winsyses per device.

The heap usage/budget needs to be tracked per process instead
of per device.

Fixes: 7bef1920182 ("radv: add support for VK_EXT_memory_budget")
Reviewed-by: Samuel Pitoiset <samuel.pitoi...@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10174>

---

 src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c | 52 ++++++++++++++++++++++-
 src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h |  2 +
 2 files changed, 53 insertions(+), 1 deletion(-)

diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c 
b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c
index cbceefb7894..c65e15f9719 100644
--- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c
+++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.c
@@ -38,6 +38,7 @@
 #include "radv_amdgpu_cs.h"
 #include "radv_amdgpu_bo.h"
 #include "radv_amdgpu_surface.h"
+#include "util/simple_mtx.h"
 
 static bool
 do_winsys_init(struct radv_amdgpu_winsys *ws, int fd)
@@ -158,9 +159,30 @@ static const char *radv_amdgpu_winsys_get_chip_name(struct 
radeon_winsys *rws)
        return amdgpu_get_marketing_name(dev);
 }
 
+static simple_mtx_t winsys_creation_mutex = _SIMPLE_MTX_INITIALIZER_NP;
+static struct hash_table *winsyses = NULL;
+
 static void radv_amdgpu_winsys_destroy(struct radeon_winsys *rws)
 {
        struct radv_amdgpu_winsys *ws = (struct radv_amdgpu_winsys*)rws;
+       bool destroy = false;
+
+       simple_mtx_lock(&winsys_creation_mutex);
+       if (!--ws->refcount) {
+               _mesa_hash_table_remove_key(winsyses, ws->dev);
+
+               /* Clean the hashtable up if empty, though there is no
+                * empty function. */
+               if (_mesa_hash_table_num_entries(winsyses) == 0) {
+                       _mesa_hash_table_destroy(winsyses, NULL);
+                       winsyses = NULL;
+               }
+
+               destroy = true;
+       }
+       simple_mtx_unlock(&winsys_creation_mutex);
+       if (!destroy)
+               return;
 
        for (unsigned i = 0; i < ws->syncobj_count; ++i)
                amdgpu_cs_destroy_syncobj(ws->dev, ws->syncobj[i]);
@@ -179,16 +201,36 @@ radv_amdgpu_winsys_create(int fd, uint64_t debug_flags, 
uint64_t perftest_flags)
 {
        uint32_t drm_major, drm_minor, r;
        amdgpu_device_handle dev;
-       struct radv_amdgpu_winsys *ws;
+       struct radv_amdgpu_winsys *ws = NULL;
 
        r = amdgpu_device_initialize(fd, &drm_major, &drm_minor, &dev);
        if (r)
                return NULL;
 
+       /* We have to keep this lock till insertion. */
+       simple_mtx_lock(&winsys_creation_mutex);
+       if (!winsyses)
+               winsyses = _mesa_pointer_hash_table_create(NULL);
+       if (!winsyses)
+               goto fail;
+
+       struct hash_entry *entry = _mesa_hash_table_search(winsyses, dev);
+       if (entry) {
+               ws = (struct radv_amdgpu_winsys *)entry->data;
+               ++ws->refcount;
+       }
+
+       if (ws) {
+               simple_mtx_unlock(&winsys_creation_mutex);
+               amdgpu_device_deinitialize(dev);
+               return &ws->base;
+       }
+
        ws = calloc(1, sizeof(struct radv_amdgpu_winsys));
        if (!ws)
                goto fail;
 
+       ws->refcount = 1;
        ws->dev = dev;
        ws->info.drm_major = drm_major;
        ws->info.drm_minor = drm_minor;
@@ -218,11 +260,19 @@ radv_amdgpu_winsys_create(int fd, uint64_t debug_flags, 
uint64_t perftest_flags)
        radv_amdgpu_cs_init_functions(ws);
        radv_amdgpu_surface_init_functions(ws);
 
+       _mesa_hash_table_insert(winsyses, dev, ws);
+       simple_mtx_unlock(&winsys_creation_mutex);
+
        return &ws->base;
 
 winsys_fail:
        free(ws);
 fail:
+       if (winsyses && _mesa_hash_table_num_entries(winsyses) == 0) {
+               _mesa_hash_table_destroy(winsyses, NULL);
+               winsyses = NULL;
+       }
+       simple_mtx_unlock(&winsys_creation_mutex);
        amdgpu_device_deinitialize(dev);
        return NULL;
 }
diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h 
b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h
index 55f932b879c..8d1d8b5ea0d 100644
--- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h
+++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_winsys.h
@@ -67,6 +67,8 @@ struct radv_amdgpu_winsys {
        /* BO log */
        struct u_rwlock log_bo_list_lock;
        struct list_head log_bo_list;
+
+       uint32_t refcount;
 };
 
 static inline struct radv_amdgpu_winsys *

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to