From 3942a464fe6f09bd964b37f98e49f1d5af826886 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 20 Jan 2022 00:04:40 +0300 Subject: [PATCH] vk: Avoid leaking descriptor copies --- rpcs3/Emu/RSX/VK/VKDraw.cpp | 1 + rpcs3/Emu/RSX/VK/vkutils/descriptors.cpp | 4 +++- rpcs3/Emu/RSX/VK/vkutils/descriptors.h | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index c0869ddce6..fc8564cb2a 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -829,6 +829,7 @@ void VKGSRender::emit_geometry(u32 sub_index) { // Need to update descriptors; make a copy for the next draw VkDescriptorSet previous_set = m_current_frame->descriptor_set.value(); + m_current_frame->descriptor_set.flush(); m_current_frame->descriptor_set = allocate_descriptor_set(); rsx::simple_array copy_cmds(binding_table.total_descriptor_bindings); diff --git a/rpcs3/Emu/RSX/VK/vkutils/descriptors.cpp b/rpcs3/Emu/RSX/VK/vkutils/descriptors.cpp index 76b6950414..6c7826d8b1 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/descriptors.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/descriptors.cpp @@ -346,8 +346,10 @@ namespace vk vkUpdateDescriptorSets(*g_render_device, 1, &writer, 0, nullptr); } - void descriptor_set::push(rsx::simple_array& copy_cmd) + void descriptor_set::push(rsx::simple_array& copy_cmd, u32 type_mask) { + m_push_type_mask |= type_mask; + if (m_pending_copies.empty()) [[likely]] { m_pending_copies = std::move(copy_cmd); diff --git a/rpcs3/Emu/RSX/VK/vkutils/descriptors.h b/rpcs3/Emu/RSX/VK/vkutils/descriptors.h index 8ff4080830..19dc46f085 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/descriptors.h +++ b/rpcs3/Emu/RSX/VK/vkutils/descriptors.h @@ -65,7 +65,7 @@ namespace vk void push(const VkDescriptorBufferInfo& buffer_info, VkDescriptorType type, u32 binding); void push(const VkDescriptorImageInfo& image_info, VkDescriptorType type, u32 binding); void push(const VkDescriptorImageInfo* image_info, u32 count, VkDescriptorType type, u32 binding); - void push(rsx::simple_array& copy_cmd); + void push(rsx::simple_array& copy_cmd, u32 type_mask = umax); void bind(VkCommandBuffer cmd, VkPipelineBindPoint bind_point, VkPipelineLayout layout); void bind(const command_buffer& cmd, VkPipelineBindPoint bind_point, VkPipelineLayout layout);