diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index 0e01f64d4..438698498 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -962,7 +962,6 @@ void RendererVulkan::SwapBuffers() { } void RendererVulkan::NotifySurfaceChanged() { - scheduler.Finish(); vk::SurfaceKHR new_surface = CreateSurface(instance.GetInstance(), render_window); swapchain.Create(new_surface); } diff --git a/src/video_core/renderer_vulkan/vk_instance.cpp b/src/video_core/renderer_vulkan/vk_instance.cpp index 81d30b75c..25c67cc10 100644 --- a/src/video_core/renderer_vulkan/vk_instance.cpp +++ b/src/video_core/renderer_vulkan/vk_instance.cpp @@ -255,7 +255,6 @@ Instance::~Instance() { if (device) { vmaDestroyAllocator(allocator); device.destroy(); - instance.destroySurfaceKHR(surface); if (debug_messenger) { instance.destroyDebugUtilsMessengerEXT(debug_messenger); diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp index 082f3dda5..75e5e3a03 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.cpp +++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp @@ -38,12 +38,15 @@ Swapchain::~Swapchain() { for (const vk::Semaphore semaphore : present_ready) { device.destroySemaphore(semaphore); } + + instance.GetInstance().destroySurfaceKHR(surface); } void Swapchain::Create(vk::SurfaceKHR new_surface) { is_outdated = false; is_suboptimal = false; if (new_surface) { + instance.GetInstance().destroySurfaceKHR(surface); surface = new_surface; } @@ -73,24 +76,21 @@ void Swapchain::Create(vk::SurfaceKHR new_surface) { .compositeAlpha = composite_alpha, .presentMode = present_mode, .clipped = true, - .oldSwapchain = swapchain, + .oldSwapchain = nullptr, }; vk::Device device = instance.GetDevice(); - vk::SwapchainKHR new_swapchain{}; + device.waitIdle(); + Destroy(); + try { - new_swapchain = device.createSwapchainKHR(swapchain_info); - device.waitIdle(); + swapchain = device.createSwapchainKHR(swapchain_info); } catch (vk::SystemError& err) { LOG_CRITICAL(Render_Vulkan, "{}", err.what()); UNREACHABLE(); } - Destroy(); - - swapchain = new_swapchain; SetupImages(); - resource_ticks.clear(); resource_ticks.resize(image_count); }