From cd2098fad72391b897f77ccda0ebce3280df6c07 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Fri, 25 Apr 2025 03:27:00 +0300 Subject: [PATCH] vk: Fix copypasta causing incorrect buffer to be released by GC --- rpcs3/Emu/RSX/VK/VKDraw.cpp | 2 +- rpcs3/Emu/RSX/VK/VKGSRender.cpp | 7 +------ rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp | 18 ++++-------------- 3 files changed, 6 insertions(+), 21 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index 4a34d45fbf..5fb1064f60 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -836,7 +836,7 @@ void VKGSRender::emit_geometry(u32 sub_index) if (m_vertex_layout_storage && m_vertex_layout_storage->info.buffer != m_vertex_layout_ring_info.heap->value) { - vk::get_gc()->dispose(m_vertex_layout_storage); + vk::get_resource_manager()->dispose(m_vertex_layout_storage); } vk::clear_status_interrupt(vk::heap_changed); diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index 4dc4dd9451..638a5cc58f 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -2187,15 +2187,10 @@ void VKGSRender::update_vertex_env(u32 id, const vk::vertex_upload_info& vertex_ if (!m_vertex_layout_storage || !m_vertex_layout_storage->in_range(offset32, range32, base_offset)) { ensure(m_texbuffer_view_size >= m_vertex_layout_stream_info.range); - - if (m_vertex_layout_storage) - { - vk::get_gc()->dispose(m_vertex_layout_storage); - } + vk::get_resource_manager()->dispose(m_vertex_layout_storage); const usz alloc_addr = m_vertex_layout_stream_info.offset; const usz view_size = (alloc_addr + m_texbuffer_view_size) > m_vertex_layout_ring_info.size() ? m_vertex_layout_ring_info.size() - alloc_addr : m_texbuffer_view_size; - vk::get_resource_manager()->dispose(m_vertex_layout_storage); m_vertex_layout_storage = std::make_unique(*m_device, m_vertex_layout_ring_info.heap->value, VK_FORMAT_R32G32_UINT, alloc_addr, view_size); base_offset = 0; } diff --git a/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp b/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp index 19ee78a6ba..2c4717de0e 100644 --- a/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp +++ b/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp @@ -320,13 +320,13 @@ vk::vertex_upload_info VKGSRender::upload_vertex_data() if (m_persistent_attribute_storage && m_persistent_attribute_storage->info.buffer != m_attrib_ring_info.heap->value) { - vk::get_gc()->dispose(m_persistent_attribute_storage); + vk::get_resource_manager()->dispose(m_persistent_attribute_storage); } if (m_volatile_attribute_storage && m_volatile_attribute_storage->info.buffer != m_attrib_ring_info.heap->value) { - vk::get_gc()->dispose(m_volatile_attribute_storage); + vk::get_resource_manager()->dispose(m_volatile_attribute_storage); } vk::clear_status_interrupt(vk::heap_changed); @@ -337,15 +337,10 @@ vk::vertex_upload_info VKGSRender::upload_vertex_data() if (!m_persistent_attribute_storage || !m_persistent_attribute_storage->in_range(persistent_range_base, required.first, persistent_range_base)) { ensure(m_texbuffer_view_size >= required.first); // "Incompatible driver (MacOS?)" - - if (m_persistent_attribute_storage) - { - vk::get_gc()->dispose(m_persistent_attribute_storage); - } + vk::get_resource_manager()->dispose(m_persistent_attribute_storage); //View 64M blocks at a time (different drivers will only allow a fixed viewable heap size, 64M should be safe) const usz view_size = (persistent_range_base + m_texbuffer_view_size) > m_attrib_ring_info.size() ? m_attrib_ring_info.size() - persistent_range_base : m_texbuffer_view_size; - vk::get_resource_manager()->dispose(m_persistent_attribute_storage); m_persistent_attribute_storage = std::make_unique(*m_device, m_attrib_ring_info.heap->value, VK_FORMAT_R8_UINT, persistent_range_base, view_size); persistent_range_base = 0; } @@ -356,14 +351,9 @@ vk::vertex_upload_info VKGSRender::upload_vertex_data() if (!m_volatile_attribute_storage || !m_volatile_attribute_storage->in_range(volatile_range_base, required.second, volatile_range_base)) { ensure(m_texbuffer_view_size >= required.second); // "Incompatible driver (MacOS?)" - - if (m_volatile_attribute_storage) - { - vk::get_gc()->dispose(m_persistent_attribute_storage); - } + vk::get_resource_manager()->dispose(m_volatile_attribute_storage); const usz view_size = (volatile_range_base + m_texbuffer_view_size) > m_attrib_ring_info.size() ? m_attrib_ring_info.size() - volatile_range_base : m_texbuffer_view_size; - vk::get_resource_manager()->dispose(m_volatile_attribute_storage); m_volatile_attribute_storage = std::make_unique(*m_device, m_attrib_ring_info.heap->value, VK_FORMAT_R8_UINT, volatile_range_base, view_size); volatile_range_base = 0; }