vk: Fix copypasta causing incorrect buffer to be released by GC
Some checks are pending
Generate Translation Template / Generate Translation Template (push) Waiting to run
Build RPCS3 / RPCS3 Linux ubuntu-24.04 gcc (push) Waiting to run
Build RPCS3 / RPCS3 Linux ubuntu-24.04-arm clang (push) Waiting to run
Build RPCS3 / RPCS3 Linux ubuntu-24.04 clang (push) Waiting to run
Build RPCS3 / RPCS3 Windows (push) Waiting to run

This commit is contained in:
kd-11 2025-04-25 03:27:00 +03:00 committed by kd-11
parent 7c538873b6
commit cd2098fad7
3 changed files with 6 additions and 21 deletions

View file

@ -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);

View file

@ -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<vk::buffer_view>(*m_device, m_vertex_layout_ring_info.heap->value, VK_FORMAT_R32G32_UINT, alloc_addr, view_size);
base_offset = 0;
}

View file

@ -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<vk::buffer_view>(*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<vk::buffer_view>(*m_device, m_attrib_ring_info.heap->value, VK_FORMAT_R8_UINT, volatile_range_base, view_size);
volatile_range_base = 0;
}