aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan/renderer_vulkan.cpp
diff options
context:
space:
mode:
authorAlexander Orzechowski <alex@ozal.ski>2022-12-13 13:08:02 -0500
committerAlexander Orzechowski <alex@ozal.ski>2022-12-13 13:23:35 -0500
commit3cc3176ad6549c412f2370f496f00f1f6849275c (patch)
tree33c90504a36af40b42080df1822e909a8399373f /src/video_core/renderer_vulkan/renderer_vulkan.cpp
parentd5f53da79d944869eb88416494ecf10a47eee90d (diff)
video_core/vulkan: Explicity check swapchain size when deciding to recreate
Vulkan for whatever reason does not return VK_ERROR_OUT_OF_DATE_KHR when the swapchain is the wrong size. Explicity make sure the size is indeed up to date to workaround this.
Diffstat (limited to 'src/video_core/renderer_vulkan/renderer_vulkan.cpp')
-rw-r--r--src/video_core/renderer_vulkan/renderer_vulkan.cpp14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp
index 18be54729..f502a7d09 100644
--- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp
+++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp
@@ -139,23 +139,25 @@ void RendererVulkan::SwapBuffers(const Tegra::FramebufferConfig* framebuffer) {
RenderScreenshot(*framebuffer, use_accelerated);
bool has_been_recreated = false;
- const auto recreate_swapchain = [&] {
+ const auto recreate_swapchain = [&](u32 width, u32 height) {
if (!has_been_recreated) {
has_been_recreated = true;
scheduler.Finish();
}
- const Layout::FramebufferLayout layout = render_window.GetFramebufferLayout();
- swapchain.Create(layout.width, layout.height, is_srgb);
+ swapchain.Create(width, height, is_srgb);
};
- if (swapchain.NeedsRecreation(is_srgb)) {
- recreate_swapchain();
+
+ const Layout::FramebufferLayout layout = render_window.GetFramebufferLayout();
+ if (swapchain.NeedsRecreation(is_srgb) || swapchain.GetWidth() != layout.width ||
+ swapchain.GetHeight() != layout.height) {
+ recreate_swapchain(layout.width, layout.height);
}
bool is_outdated;
do {
swapchain.AcquireNextImage();
is_outdated = swapchain.IsOutDated();
if (is_outdated) {
- recreate_swapchain();
+ recreate_swapchain(layout.width, layout.height);
}
} while (is_outdated);
if (has_been_recreated) {