From a59275de0f871896e6f0a7f961d9744e5fe2152f Mon Sep 17 00:00:00 2001 From: "Pierre-Loup A. Griffais" Date: Thu, 15 Aug 2019 23:12:04 -0700 Subject: [PATCH] vk: don't die on VK_SUBOPTIMAL_KHR in AcquireNextImage, and recreate swapchain vkAcquireNextImageKHR can also return VK_SUBOPTIMAL_KHR and is non-fatal. However, it's a good idea to still recreate the swap chain later to maintain optimal presentation paths after temporary occlusion. --- rpcs3/Emu/RSX/VK/VKGSRender.cpp | 7 ++++++- rpcs3/Emu/RSX/VK/VKGSRender.h | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index 84fc6f63729d..16509a9d78da 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -2230,6 +2230,7 @@ void VKGSRender::present(frame_context_t *ctx) case VK_SUCCESS: break; case VK_SUBOPTIMAL_KHR: + should_reinitialize_swapchain = true; break; case VK_ERROR_OUT_OF_DATE_KHR: swapchain_unavailable = true; @@ -3110,6 +3111,7 @@ void VKGSRender::reinitialize_swapchain() open_command_buffer(); swapchain_unavailable = false; + should_reinitialize_swapchain = false; } void VKGSRender::flip(int buffer, bool emu_flip) @@ -3124,7 +3126,7 @@ void VKGSRender::flip(int buffer, bool emu_flip) } } - if (swapchain_unavailable) + if (swapchain_unavailable || should_reinitialize_swapchain) { reinitialize_swapchain(); } @@ -3249,6 +3251,9 @@ void VKGSRender::flip(int buffer, bool emu_flip) check_present_status(); continue; } + case VK_SUBOPTIMAL_KHR: + should_reinitialize_swapchain = true; + break; case VK_ERROR_OUT_OF_DATE_KHR: LOG_WARNING(RSX, "vkAcquireNextImageKHR failed with VK_ERROR_OUT_OF_DATE_KHR. Flip request ignored until surface is recreated."); swapchain_unavailable = true; diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.h b/rpcs3/Emu/RSX/VK/VKGSRender.h index 4d65be19c771..328c1ff27f9c 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.h +++ b/rpcs3/Emu/RSX/VK/VKGSRender.h @@ -359,6 +359,7 @@ class VKGSRender : public GSRender, public ::rsx::reports::ZCULL_control sizeu m_swapchain_dims{}; bool swapchain_unavailable = false; + bool should_reinitialize_swapchain = false; u64 m_last_heap_sync_time = 0; u32 m_texbuffer_view_size = 0;