diff options
| author | 2021-04-11 08:46:28 +0100 | |
|---|---|---|
| committer | 2021-04-11 09:27:50 +0100 | |
| commit | bcf58c82108c32aa3e2118be152bdc728bf4744e (patch) | |
| tree | 0c607a634db7077157101f9f703a6f77c0a48d86 /src | |
| parent | Merge pull request #6167 from Morph1984/time-fix (diff) | |
| download | yuzu-bcf58c82108c32aa3e2118be152bdc728bf4744e.tar.gz yuzu-bcf58c82108c32aa3e2118be152bdc728bf4744e.tar.xz yuzu-bcf58c82108c32aa3e2118be152bdc728bf4744e.zip | |
renderer_vulkan: Check return value of AcquireNextImage
We can get into a really bad state by ignoring this
leading to device loss and using incorrect resources.
Diffstat (limited to 'src')
| -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) { | |||
| 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 | ||
| 85 | void VKSwapchain::AcquireNextImage() { | 85 | bool 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 | ||
| 92 | bool VKSwapchain::Present(VkSemaphore render_semaphore) { | 94 | 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: | |||
| 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. |