From 29cb4f59bd3f75ca63575d84a278b48220ab6fe5 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 25 Jan 2026 19:26:42 +0300 Subject: [PATCH] vk: Invalidate renderpass key in post-cyclic-z barrier - Post-Z renderpass split is crucial due to loss of writes. The failure to invalidate the renderpass key was an oversight. --- rpcs3/Emu/RSX/VK/VKDraw.cpp | 21 +++++++++++++++------ rpcs3/Emu/RSX/VK/VKGSRender.h | 1 + 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKDraw.cpp b/rpcs3/Emu/RSX/VK/VKDraw.cpp index 739253cc03..59f9bfb40a 100644 --- a/rpcs3/Emu/RSX/VK/VKDraw.cpp +++ b/rpcs3/Emu/RSX/VK/VKDraw.cpp @@ -143,6 +143,17 @@ VkRenderPass VKGSRender::get_render_pass() return m_cached_renderpass; } +void VKGSRender::invalidate_render_pass() +{ + // Regenerate renderpass key for the next draw call + if (const auto key = vk::get_renderpass_key(m_fbo_images, m_current_renderpass_key); + key != m_current_renderpass_key) + { + m_current_renderpass_key = key; + m_cached_renderpass = VK_NULL_HANDLE; + } +} + void VKGSRender::update_draw_state() { m_profiler.start(); @@ -514,12 +525,7 @@ void VKGSRender::load_texture_env() if (check_for_cyclic_refs) { // Regenerate renderpass key - if (const auto key = vk::get_renderpass_key(m_fbo_images, m_current_renderpass_key); - key != m_current_renderpass_key) - { - m_current_renderpass_key = key; - m_cached_renderpass = VK_NULL_HANDLE; - } + invalidate_render_pass(); } if (backend_config.supports_asynchronous_compute) @@ -1069,6 +1075,9 @@ void VKGSRender::end() // Since we're ending the subpass, might as well restore DCC/HiZ for extra performance ds->change_layout(*m_current_command_buffer, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); ds->reset_surface_counters(); + + // Regenerate render pass key + invalidate_render_pass(); } } diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.h b/rpcs3/Emu/RSX/VK/VKGSRender.h index b0edaa48f6..aa62df2122 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.h +++ b/rpcs3/Emu/RSX/VK/VKGSRender.h @@ -227,6 +227,7 @@ private: void begin_render_pass(); void close_render_pass(); VkRenderPass get_render_pass(); + void invalidate_render_pass(); void update_draw_state(); void check_present_status();