From 3a65359d59285f95ddc18a532a4f47e87ed71bb9 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 15 Jun 2025 15:01:45 +0300 Subject: [PATCH] vk: Fix clang build and resource leak on exit --- rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp | 3 ++- rpcs3/Emu/RSX/VK/VKGSRender.cpp | 4 ++++ rpcs3/Emu/RSX/VK/VKProgramPipeline.cpp | 5 ++++- rpcs3/Emu/RSX/VK/vkutils/descriptors.cpp | 13 +++++++++++++ rpcs3/Emu/RSX/VK/vkutils/descriptors.h | 3 ++- 5 files changed, 25 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp b/rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp index 1191561625..790421e474 100644 --- a/rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp +++ b/rpcs3/Emu/RSX/VK/VKCommonDecompiler.cpp @@ -46,9 +46,10 @@ namespace vk #define IS_DIGIT(x) (x >= '0' && x <= '9') constexpr int max_index_length = 2; + const int name_length = static_cast(name.length()); std::string index; - for (int char_idx = name.length() - max_index_length; char_idx < name.length(); ++char_idx) + for (int char_idx = name_length - max_index_length; char_idx < name_length; ++char_idx) { if (IS_DIGIT(name[char_idx])) { diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index c1d560a637..4506c870ec 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -1,3 +1,4 @@ +#include "Emu/RSX/VK/vkutils/descriptors.h" #include "stdafx.h" #include "../Overlays/overlay_compile_notification.h" #include "../Overlays/Shaders/shader_loading_dialog_native.h" @@ -854,6 +855,9 @@ VKGSRender::~VKGSRender() m_command_buffer_pool.destroy(); m_secondary_command_buffer_pool.destroy(); + // Descriptors + vk::descriptors::flush(); + // Global resources vk::destroy_global_resources(); diff --git a/rpcs3/Emu/RSX/VK/VKProgramPipeline.cpp b/rpcs3/Emu/RSX/VK/VKProgramPipeline.cpp index d7bdfcbb36..b5bc7642ba 100644 --- a/rpcs3/Emu/RSX/VK/VKProgramPipeline.cpp +++ b/rpcs3/Emu/RSX/VK/VKProgramPipeline.cpp @@ -420,7 +420,10 @@ namespace vk } vkDestroyDescriptorSetLayout(m_device, m_descriptor_set_layout, nullptr); - vk::get_resource_manager()->dispose(m_descriptor_pool); + m_descriptor_pool->destroy(); + + m_descriptor_pool.reset(); + m_device = VK_NULL_HANDLE; } void descriptor_table_t::init(VkDevice dev) diff --git a/rpcs3/Emu/RSX/VK/vkutils/descriptors.cpp b/rpcs3/Emu/RSX/VK/vkutils/descriptors.cpp index a49dc66301..9e5880a7ee 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/descriptors.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/descriptors.cpp @@ -40,6 +40,12 @@ namespace vk // rsx_log.notice("[descriptor_manager::deregister] Now monitoring %u descriptor sets", m_notification_list.size()); } + void destroy() + { + std::lock_guard lock(m_notifications_lock); + m_notification_list.clear(); + } + dispatch_manager() = default; private: @@ -60,6 +66,11 @@ namespace vk g_fxo->get().flush_all(); } + void destroy() + { + g_fxo->get().destroy(); + } + VkDescriptorSetLayout create_layout(const rsx::simple_array& bindings) { VkDescriptorSetLayoutCreateInfo infos = {}; @@ -414,11 +425,13 @@ namespace vk { m_push_type_mask |= type_mask; +#if !defined(__clang__) || (__clang_major__ >= 16) if (m_pending_writes.empty()) [[unlikely]] { m_pending_writes = std::move(write_cmds); } else +#endif { const auto old_size = m_pending_writes.size(); const auto new_size = write_cmds.size() + old_size; diff --git a/rpcs3/Emu/RSX/VK/vkutils/descriptors.h b/rpcs3/Emu/RSX/VK/vkutils/descriptors.h index 556fe5d0b9..c2cf5deb20 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/descriptors.h +++ b/rpcs3/Emu/RSX/VK/vkutils/descriptors.h @@ -122,7 +122,7 @@ namespace vk rsx::simple_array m_image_info_pool; rsx::simple_array m_dynamic_offsets; -#ifdef __clang__ +#if defined(__clang__) && (__clang_major__ < 16) // Clang (pre 16.x) does not support LWG 2089, std::construct_at for POD types struct WriteDescriptorSetT : public VkWriteDescriptorSet { @@ -162,6 +162,7 @@ namespace vk { void init(); void flush(); + void destroy(); VkDescriptorSetLayout create_layout(const rsx::simple_array& bindings); }