diff options
author | Morph <39850852+Morph1984@users.noreply.github.com> | 2021-04-11 11:08:32 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-11 11:08:32 +0200 |
commit | 9bd71f40644a8108bc158777deefa8c8302f44d3 (patch) | |
tree | 0c607a634db7077157101f9f703a6f77c0a48d86 | |
parent | Merge pull request #6167 from Morph1984/time-fix (diff) | |
parent | renderer_vulkan: Check return value of AcquireNextImage (diff) | |
download | yuzu-9bd71f40644a8108bc158777deefa8c8302f44d3.tar yuzu-9bd71f40644a8108bc158777deefa8c8302f44d3.tar.gz yuzu-9bd71f40644a8108bc158777deefa8c8302f44d3.tar.bz2 yuzu-9bd71f40644a8108bc158777deefa8c8302f44d3.tar.lz yuzu-9bd71f40644a8108bc158777deefa8c8302f44d3.tar.xz yuzu-9bd71f40644a8108bc158777deefa8c8302f44d3.tar.zst yuzu-9bd71f40644a8108bc158777deefa8c8302f44d3.zip |
-rw-r--r-- | src/video_core/renderer_vulkan/renderer_vulkan.cpp | 5 | ||||
-rw-r--r-- | src/video_core/renderer_vulkan/vk_swapchain.cpp | 8 | ||||
-rw-r--r-- | src/video_core/renderer_vulkan/vk_swapchain.h | 2 |
3 files changed, 10 insertions, 5 deletions
diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index 1cc720ddd..14e5f36e2 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -143,7 +143,10 @@ void RendererVulkan::SwapBuffers(const Tegra::FramebufferConfig* framebuffer) { scheduler.WaitWorker(); - swapchain.AcquireNextImage(); + while (!swapchain.AcquireNextImage()) { + swapchain.Create(layout.width, layout.height, is_srgb); + blit_screen.Recreate(); + } const VkSemaphore render_semaphore = blit_screen.Draw(*framebuffer, use_accelerated); scheduler.Flush(render_semaphore); diff --git a/src/video_core/renderer_vulkan/vk_swapchain.cpp b/src/video_core/renderer_vulkan/vk_swapchain.cpp index 0b63bd6c8..dfd5c65ba 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.cpp +++ b/src/video_core/renderer_vulkan/vk_swapchain.cpp @@ -82,11 +82,13 @@ void VKSwapchain::Create(u32 width, u32 height, bool srgb) { resource_ticks.resize(image_count); } -void VKSwapchain::AcquireNextImage() { - device.GetLogical().AcquireNextImageKHR(*swapchain, std::numeric_limits<u64>::max(), - *present_semaphores[frame_index], {}, &image_index); +bool VKSwapchain::AcquireNextImage() { + const VkResult result = + device.GetLogical().AcquireNextImageKHR(*swapchain, std::numeric_limits<u64>::max(), + *present_semaphores[frame_index], {}, &image_index); scheduler.Wait(resource_ticks[image_index]); + return result == VK_SUCCESS || result == VK_SUBOPTIMAL_KHR; } bool VKSwapchain::Present(VkSemaphore render_semaphore) { diff --git a/src/video_core/renderer_vulkan/vk_swapchain.h b/src/video_core/renderer_vulkan/vk_swapchain.h index a728511e0..adc8d27cf 100644 --- a/src/video_core/renderer_vulkan/vk_swapchain.h +++ b/src/video_core/renderer_vulkan/vk_swapchain.h @@ -28,7 +28,7 @@ public: void Create(u32 width, u32 height, bool srgb); /// Acquires the next image in the swapchain, waits as needed. - void AcquireNextImage(); + bool AcquireNextImage(); /// Presents the rendered image to the swapchain. Returns true when the swapchains had to be /// recreated. Takes responsability for the ownership of fence. |