summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_vulkan/renderer_vulkan.cpp5
-rw-r--r--src/video_core/renderer_vulkan/vk_swapchain.cpp8
-rw-r--r--src/video_core/renderer_vulkan/vk_swapchain.h2
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) {
143 143
144 scheduler.WaitWorker(); 144 scheduler.WaitWorker();
145 145
146 swapchain.AcquireNextImage(); 146 while (!swapchain.AcquireNextImage()) {
147 swapchain.Create(layout.width, layout.height, is_srgb);
148 blit_screen.Recreate();
149 }
147 const VkSemaphore render_semaphore = blit_screen.Draw(*framebuffer, use_accelerated); 150 const VkSemaphore render_semaphore = blit_screen.Draw(*framebuffer, use_accelerated);
148 151
149 scheduler.Flush(render_semaphore); 152 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) {
82 resource_ticks.resize(image_count); 82 resource_ticks.resize(image_count);
83} 83}
84 84
85void VKSwapchain::AcquireNextImage() { 85bool VKSwapchain::AcquireNextImage() {
86 device.GetLogical().AcquireNextImageKHR(*swapchain, std::numeric_limits<u64>::max(), 86 const VkResult result =
87 *present_semaphores[frame_index], {}, &image_index); 87 device.GetLogical().AcquireNextImageKHR(*swapchain, std::numeric_limits<u64>::max(),
88 *present_semaphores[frame_index], {}, &image_index);
88 89
89 scheduler.Wait(resource_ticks[image_index]); 90 scheduler.Wait(resource_ticks[image_index]);
91 return result == VK_SUCCESS || result == VK_SUBOPTIMAL_KHR;
90} 92}
91 93
92bool VKSwapchain::Present(VkSemaphore render_semaphore) { 94bool 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:
28 void Create(u32 width, u32 height, bool srgb); 28 void Create(u32 width, u32 height, bool srgb);
29 29
30 /// Acquires the next image in the swapchain, waits as needed. 30 /// Acquires the next image in the swapchain, waits as needed.
31 void AcquireNextImage(); 31 bool AcquireNextImage();
32 32
33 /// Presents the rendered image to the swapchain. Returns true when the swapchains had to be 33 /// Presents the rendered image to the swapchain. Returns true when the swapchains had to be
34 /// recreated. Takes responsability for the ownership of fence. 34 /// recreated. Takes responsability for the ownership of fence.