summaryrefslogtreecommitdiffstats
path: root/src/video_core/renderer_vulkan/vk_present_manager.cpp
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2023-06-02 05:07:18 +0200
committerbunnei <bunneidev@gmail.com>2023-06-03 09:06:07 +0200
commit098e2c4077f62890f83c0785e858080e9e18296c (patch)
tree1b76d9222948d49fbaa1252471774e81aae1419b /src/video_core/renderer_vulkan/vk_present_manager.cpp
parentandroid: Fix presentation layout on foldable and tablet devices. (diff)
downloadyuzu-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.cpp24
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: