diff --git a/src/video_core/renderer_vulkan/vk_presenter.cpp b/src/video_core/renderer_vulkan/vk_presenter.cpp index bc55cde2309..061abbe4a90 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.cpp +++ b/src/video_core/renderer_vulkan/vk_presenter.cpp @@ -628,15 +628,22 @@ Frame* Presenter::PrepareFrameInternal(VideoCore::ImageId image_id, bool is_eop) } void Presenter::Present(Frame* frame) { - // Recreate the swapchain if the window was resized. - if (window.GetWidth() != swapchain.GetExtent().width || - window.GetHeight() != swapchain.GetExtent().height) { + if (swapchain.AcquireNextImage()) { + PresentInternal(frame); + } else { swapchain.Recreate(window.GetWidth(), window.GetHeight()); } + // Free the frame for reuse + std::scoped_lock fl{free_mutex}; + free_queue.push(frame); + free_cv.notify_one(); - if (!swapchain.AcquireNextImage()) { - swapchain.Recreate(window.GetWidth(), window.GetHeight()); - } + DebugState.IncFlipFrameNum(); +} + +void Presenter::PresentInternal(Frame* frame) { + // Reset fence for queue submission. + instance.GetDevice().resetFences(frame->present_done); ImGui::Core::NewFrame(); @@ -736,13 +743,6 @@ void Presenter::Present(Frame* frame) { if (!swapchain.Present()) { swapchain.Recreate(window.GetWidth(), window.GetHeight()); } - - // Free the frame for reuse - std::scoped_lock fl{free_mutex}; - free_queue.push(frame); - free_cv.notify_one(); - - DebugState.IncFlipFrameNum(); } Frame* Presenter::GetRenderFrame() { @@ -776,9 +776,6 @@ Frame* Presenter::GetRenderFrame() { } } - // Reset fence for next queue submission. - device.resetFences(frame->present_done); - // If the window dimensions changed, recreate this frame if (frame->width != window.GetWidth() || frame->height != window.GetHeight()) { RecreateFrame(frame, window.GetWidth(), window.GetHeight()); diff --git a/src/video_core/renderer_vulkan/vk_presenter.h b/src/video_core/renderer_vulkan/vk_presenter.h index 4c29af0f0d6..cc9d3934c79 100644 --- a/src/video_core/renderer_vulkan/vk_presenter.h +++ b/src/video_core/renderer_vulkan/vk_presenter.h @@ -100,6 +100,7 @@ class Presenter { private: void CreatePostProcessPipeline(); + void PresentInternal(Frame *frame); Frame* PrepareFrameInternal(VideoCore::ImageId image_id, bool is_eop = true); Frame* GetRenderFrame(); diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp index 380660a2f06..7ae6dc59b8d 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.cpp +++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp @@ -84,6 +84,7 @@ void Swapchain::Create(u32 width_, u32 height_, vk::SurfaceKHR surface_) { } void Swapchain::Recreate(u32 width_, u32 height_) { + LOG_DEBUG(Render_Vulkan, "width={} height={}", width_, height_); Create(width_, height_, surface); }