From 175aa510c89a145ab2dc0fe31f6ac35a41275815 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 28 Mar 2024 01:16:07 +0300 Subject: [PATCH] rsx: Make overlay manager default lock-state exclusive --- rpcs3/Emu/RSX/GL/GLPresent.cpp | 4 ++-- rpcs3/Emu/RSX/Overlays/overlay_manager.cpp | 17 +++++++++++++---- rpcs3/Emu/RSX/Overlays/overlay_manager.h | 10 ++++++++-- rpcs3/Emu/RSX/VK/VKPresent.cpp | 4 ++-- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/rpcs3/Emu/RSX/GL/GLPresent.cpp b/rpcs3/Emu/RSX/GL/GLPresent.cpp index 90780452ce..92ccb4c13c 100644 --- a/rpcs3/Emu/RSX/GL/GLPresent.cpp +++ b/rpcs3/Emu/RSX/GL/GLPresent.cpp @@ -350,7 +350,7 @@ void GLGSRender::flip(const rsx::display_flip_info_t& info) { if (m_overlay_manager->has_dirty()) { - m_overlay_manager->lock(); + m_overlay_manager->lock_shared(); std::vector uids_to_dispose; uids_to_dispose.reserve(m_overlay_manager->get_dirty().size()); @@ -361,7 +361,7 @@ void GLGSRender::flip(const rsx::display_flip_info_t& info) uids_to_dispose.push_back(view->uid); } - m_overlay_manager->unlock(); + m_overlay_manager->unlock_shared(); m_overlay_manager->dispose(uids_to_dispose); } diff --git a/rpcs3/Emu/RSX/Overlays/overlay_manager.cpp b/rpcs3/Emu/RSX/Overlays/overlay_manager.cpp index a4181bcc3d..485a59443e 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_manager.cpp +++ b/rpcs3/Emu/RSX/Overlays/overlay_manager.cpp @@ -45,18 +45,27 @@ namespace rsx void display_manager::lock() { - m_list_mutex.lock_shared(); + m_list_mutex.lock(); } void display_manager::unlock() { - m_list_mutex.unlock_shared(); - if (m_pending_removals_count > 0) { - std::lock_guard lock(m_list_mutex); cleanup_internal(); } + + m_list_mutex.unlock(); + } + + void display_manager::lock_shared() + { + m_list_mutex.lock_shared(); + } + + void display_manager::unlock_shared() + { + m_list_mutex.unlock_shared(); } std::shared_ptr display_manager::get(u32 uid) diff --git a/rpcs3/Emu/RSX/Overlays/overlay_manager.h b/rpcs3/Emu/RSX/Overlays/overlay_manager.h index e746d25c0d..18359b7cec 100644 --- a/rpcs3/Emu/RSX/Overlays/overlay_manager.h +++ b/rpcs3/Emu/RSX/Overlays/overlay_manager.h @@ -150,12 +150,18 @@ namespace rsx return {}; } - // Lock for read-only access (BasicLockable) + // Lock for exclusive access (BasicLockable) void lock(); - // Release read-only lock (BasicLockable). May perform internal cleanup before returning + // Release lock (BasicLockable). May perform internal cleanup before returning void unlock(); + // Lock for shared access (reader-lock) + void lock_shared(); + + // Unlock for shared access (reader-lock) + void unlock_shared(); + // Enable input thread attach to the specified interface void attach_thread_input( u32 uid, // The input target diff --git a/rpcs3/Emu/RSX/VK/VKPresent.cpp b/rpcs3/Emu/RSX/VK/VKPresent.cpp index 94efc1de0b..3471773f2b 100644 --- a/rpcs3/Emu/RSX/VK/VKPresent.cpp +++ b/rpcs3/Emu/RSX/VK/VKPresent.cpp @@ -220,7 +220,7 @@ void VKGSRender::frame_context_cleanup(vk::frame_context_t *ctx) if (m_overlay_manager && m_overlay_manager->has_dirty()) { auto ui_renderer = vk::get_overlay_pass(); - m_overlay_manager->lock(); + m_overlay_manager->lock_shared(); std::vector uids_to_dispose; uids_to_dispose.reserve(m_overlay_manager->get_dirty().size()); @@ -231,7 +231,7 @@ void VKGSRender::frame_context_cleanup(vk::frame_context_t *ctx) uids_to_dispose.push_back(view->uid); } - m_overlay_manager->unlock(); + m_overlay_manager->unlock_shared(); m_overlay_manager->dispose(uids_to_dispose); }