diff options
author | bunnei <bunneidev@gmail.com> | 2023-06-02 05:07:18 +0200 |
---|---|---|
committer | bunnei <bunneidev@gmail.com> | 2023-06-03 09:06:07 +0200 |
commit | 098e2c4077f62890f83c0785e858080e9e18296c (patch) | |
tree | 1b76d9222948d49fbaa1252471774e81aae1419b /src/video_core/renderer_vulkan/vk_present_manager.cpp | |
parent | android: Fix presentation layout on foldable and tablet devices. (diff) | |
download | yuzu-098e2c4077f62890f83c0785e858080e9e18296c.tar yuzu-098e2c4077f62890f83c0785e858080e9e18296c.tar.gz yuzu-098e2c4077f62890f83c0785e858080e9e18296c.tar.bz2 yuzu-098e2c4077f62890f83c0785e858080e9e18296c.tar.lz yuzu-098e2c4077f62890f83c0785e858080e9e18296c.tar.xz yuzu-098e2c4077f62890f83c0785e858080e9e18296c.tar.zst yuzu-098e2c4077f62890f83c0785e858080e9e18296c.zip |
Diffstat (limited to '')
-rw-r--r-- | src/video_core/renderer_vulkan/vk_present_manager.cpp | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/video_core/renderer_vulkan/vk_present_manager.cpp b/src/video_core/renderer_vulkan/vk_present_manager.cpp index 77832720d..dc42982e9 100644 --- a/src/video_core/renderer_vulkan/vk_present_manager.cpp +++ b/src/video_core/renderer_vulkan/vk_present_manager.cpp @@ -291,6 +291,13 @@ void PresentManager::PresentThread(std::stop_token token) { } } +void PresentManager::NotifySurfaceChanged() { +#ifdef ANDROID + std::scoped_lock lock{recreate_surface_mutex}; + recreate_surface_cv.notify_one(); +#endif +} + void PresentManager::CopyToSwapchain(Frame* frame) { MICROPROFILE_SCOPE(Vulkan_CopyToSwapchain); @@ -299,7 +306,22 @@ void PresentManager::CopyToSwapchain(Frame* frame) { image_count = swapchain.GetImageCount(); }; + const auto needs_recreation = [&] { + if (last_render_surface != render_window.GetWindowInfo().render_surface) { + return true; + } + if (swapchain.NeedsRecreation(frame->is_srgb)) { + return true; + } + return false; + }; + #ifdef ANDROID + std::unique_lock lock{recreate_surface_mutex}; + + recreate_surface_cv.wait_for(lock, std::chrono::milliseconds(400), + [&]() { return !needs_recreation(); }); + // If the frontend recreated the surface, recreate the renderer surface and swapchain. if (last_render_surface != render_window.GetWindowInfo().render_surface) { last_render_surface = render_window.GetWindowInfo().render_surface; @@ -450,7 +472,7 @@ void PresentManager::CopyToSwapchain(Frame* frame) { // Submit the image copy/blit to the swapchain { - std::scoped_lock lock{scheduler.submit_mutex}; + std::scoped_lock submit_lock{scheduler.submit_mutex}; switch (const VkResult result = device.GetGraphicsQueue().Submit(submit_info, *frame->present_done)) { case VK_SUCCESS: |