mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-04-28 05:18:00 +03:00
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
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:
parent
7c538873b6
commit
cd2098fad7
3 changed files with 6 additions and 21 deletions
|
@ -836,7 +836,7 @@ void VKGSRender::emit_geometry(u32 sub_index)
|
||||||
if (m_vertex_layout_storage &&
|
if (m_vertex_layout_storage &&
|
||||||
m_vertex_layout_storage->info.buffer != m_vertex_layout_ring_info.heap->value)
|
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);
|
vk::clear_status_interrupt(vk::heap_changed);
|
||||||
|
|
|
@ -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))
|
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);
|
ensure(m_texbuffer_view_size >= m_vertex_layout_stream_info.range);
|
||||||
|
vk::get_resource_manager()->dispose(m_vertex_layout_storage);
|
||||||
if (m_vertex_layout_storage)
|
|
||||||
{
|
|
||||||
vk::get_gc()->dispose(m_vertex_layout_storage);
|
|
||||||
}
|
|
||||||
|
|
||||||
const usz alloc_addr = m_vertex_layout_stream_info.offset;
|
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;
|
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);
|
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;
|
base_offset = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -320,13 +320,13 @@ vk::vertex_upload_info VKGSRender::upload_vertex_data()
|
||||||
if (m_persistent_attribute_storage &&
|
if (m_persistent_attribute_storage &&
|
||||||
m_persistent_attribute_storage->info.buffer != m_attrib_ring_info.heap->value)
|
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 &&
|
if (m_volatile_attribute_storage &&
|
||||||
m_volatile_attribute_storage->info.buffer != m_attrib_ring_info.heap->value)
|
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);
|
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))
|
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?)"
|
ensure(m_texbuffer_view_size >= required.first); // "Incompatible driver (MacOS?)"
|
||||||
|
vk::get_resource_manager()->dispose(m_persistent_attribute_storage);
|
||||||
if (m_persistent_attribute_storage)
|
|
||||||
{
|
|
||||||
vk::get_gc()->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)
|
//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;
|
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);
|
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;
|
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))
|
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?)"
|
ensure(m_texbuffer_view_size >= required.second); // "Incompatible driver (MacOS?)"
|
||||||
|
vk::get_resource_manager()->dispose(m_volatile_attribute_storage);
|
||||||
if (m_volatile_attribute_storage)
|
|
||||||
{
|
|
||||||
vk::get_gc()->dispose(m_persistent_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;
|
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);
|
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;
|
volatile_range_base = 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue