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