summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Morph2021-04-11 05:08:32 -0400
committerGravatar GitHub2021-04-11 05:08:32 -0400
commit9bd71f40644a8108bc158777deefa8c8302f44d3 (patch)
tree0c607a634db7077157101f9f703a6f77c0a48d86 /src
parentMerge pull request #6167 from Morph1984/time-fix (diff)
parentrenderer_vulkan: Check return value of AcquireNextImage (diff)
downloadyuzu-9bd71f40644a8108bc158777deefa8c8302f44d3.tar.gz
yuzu-9bd71f40644a8108bc158777deefa8c8302f44d3.tar.xz
yuzu-9bd71f40644a8108bc158777deefa8c8302f44d3.zip
Merge pull request #6180 from Joshua-Ashton/device_loss_fix
renderer_vulkan: Check return value of AcquireNextImage
Diffstat (limited to '')
-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.