From 05fefdbf57817aa0c6dd840813f52ed2c49fceef Mon Sep 17 00:00:00 2001 From: Cathy Park Date: Fri, 15 Oct 2021 17:35:26 +0900 Subject: [PATCH] client: Add waitForFrameSync for Vulkan Frames are processed by mFrameQueue in Qtwayand. However, in vulkan backend, frames are sent by handleUpdate() but waitForFrameSync() is not called which should handle frames in mFrameQueue. For the current vulkan backend, frames are only handled by drivers like mesa. So in the current vulkan backend, some particular animations don't run or are slow because frames sent by qtwayland are not being handled. Fixes: QTBUG-96222 Change-Id: Ifbab385ca619ef9461104eb8bd778f17093a56b5 Reviewed-by: Eskil Abrahamsen Blomfeldt Reviewed-by: YoungSun Park --- .../platforms/wayland/qwaylandvulkaninstance.cpp | 10 ++++++++++ .../platforms/wayland/qwaylandvulkaninstance_p.h | 1 + 2 files changed, 11 insertions(+) diff --git a/src/plugins/platforms/wayland/qwaylandvulkaninstance.cpp b/src/plugins/platforms/wayland/qwaylandvulkaninstance.cpp index 5edbd4757d6..51802257490 100644 --- a/src/plugins/platforms/wayland/qwaylandvulkaninstance.cpp +++ b/src/plugins/platforms/wayland/qwaylandvulkaninstance.cpp @@ -124,6 +124,16 @@ void QWaylandVulkanInstance::presentAboutToBeQueued(QWindow *window) qWarning() << "Attempted to call presentAboutToBeQueued() without a valid platform window"; return; } + + bool ok; + int frameCallbackTimeout = qEnvironmentVariableIntValue("QT_WAYLAND_FRAME_CALLBACK_TIMEOUT", &ok); + + if (ok) + mFrameCallbackTimeout = frameCallbackTimeout; + + if (w->format().swapInterval() > 0) + w->waitForFrameSync(mFrameCallbackTimeout); + w->handleUpdate(); } diff --git a/src/plugins/platforms/wayland/qwaylandvulkaninstance_p.h b/src/plugins/platforms/wayland/qwaylandvulkaninstance_p.h index 08246c4dcc7..f46ba3f7569 100644 --- a/src/plugins/platforms/wayland/qwaylandvulkaninstance_p.h +++ b/src/plugins/platforms/wayland/qwaylandvulkaninstance_p.h @@ -82,6 +82,7 @@ private: QVulkanInstance *m_instance = nullptr; PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR m_getPhysDevPresSupport = nullptr; PFN_vkCreateWaylandSurfaceKHR m_createSurface = nullptr; + int mFrameCallbackTimeout = 100; }; } // namespace QtWaylandClient