diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index d7954bf79..eda2f90c7 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -262,6 +262,12 @@ Frame* RendererVulkan::PrepareFrameInternal(VideoCore::Image& image, bool is_eop } void RendererVulkan::Present(Frame* frame) { + // Recreate the swapchain if the window was resized. + if (window.getWidth() != swapchain.GetExtent().width || + window.getHeight() != swapchain.GetExtent().height) { + swapchain.Recreate(window.getWidth(), window.getHeight()); + } + ImGui::Core::NewFrame(); swapchain.AcquireNextImage(); diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp index e648b80ae..e6bf52d5a 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.cpp +++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp @@ -81,6 +81,10 @@ void Swapchain::Create(u32 width_, u32 height_, vk::SurfaceKHR surface_) { RefreshSemaphores(); } +void Swapchain::Recreate(u32 width_, u32 height_) { + Create(width_, height_, surface); +} + bool Swapchain::AcquireNextImage() { vk::Device device = instance.GetDevice(); vk::Result result = diff --git a/src/video_core/renderer_vulkan/vk_swapchain.h b/src/video_core/renderer_vulkan/vk_swapchain.h index 28ac3a9c5..a41b3ca76 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.h +++ b/src/video_core/renderer_vulkan/vk_swapchain.h @@ -25,6 +25,9 @@ public: /// Creates (or recreates) the swapchain with a given size. void Create(u32 width, u32 height, vk::SurfaceKHR surface); + /// Recreates the swapchain with a given size and current surface. + void Recreate(u32 width, u32 height); + /// Acquires the next image in the swapchain. bool AcquireNextImage();