From 56cd5f5557fbec291a9d44f6f26fb76b5c34adae Mon Sep 17 00:00:00 2001 From: Erik Kurzinger Date: Wed, 19 Jun 2019 07:56:42 -0700 Subject: [PATCH] [platforms/X11] Disable VSync for QtQuick Windows Summary: QtQuick windows created by KWin currently use the default swap interval of 1, meaning buffer swaps will block until vblank. However, this results in a problematic interaction on hybrid graphics systems running the proprietary NVIDIA driver. VSync on such setups relies on a system called "PRIME synchronization", where the xf86-video-modesetting driver controlling the display will signal the NVIDIA driver when vblank has occurred. The issue is that it will only do so if there has been damage to the screen. So, when KWin creates a QtQuick window, compositing will stop waiting on the window to render, therefore no damage to the screen will occur. But this means that no vblank notifications will be delivered to the NVIDIA driver, so the glXSwapBuffers call by the QtQuick window will block perpetually. The end result is a freeze of the desktop. To get around this, we can simply disable vsync for QtQuick windows by setting the swap interval for the default QSurfaceFormat to 0. Since they are redirected, this shouldn't cause any tearing. BUG: 406180 FIXED-IN: 5.16.2 Test Plan: Using the proprietary NVIDIA driver on a hybrid graphics system, with PRIME synchronization enabled (see https://devtalk.nvidia.com/default/topic/957814/linux/prime-and-prime-synchronization/), perform any action causing a QtQuick window to be created by KWin, for example, triggering the application switcher dialogue with alt + tab. Ensure the desktop does not temporarily freeze. Note, this required a Qt build that includes commit https://code.qt.io/cgit/qt/qtbase.git/commit/?id=0c1831178540462da31fd7a4b6d2e446bc84498b resolving a bug that prevented the changing the swap interval. Reviewers: #kwin, davidedmundson, zzag Reviewed By: #kwin, davidedmundson, zzag Subscribers: zzag, romangg, alexeymin, kwin Tags: #kwin Differential Revision: https://phabricator.kde.org/D21808 --- main_x11.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/main_x11.cpp b/main_x11.cpp index c83b8240b9..1219337b67 100644 --- a/main_x11.cpp +++ b/main_x11.cpp @@ -43,6 +43,7 @@ along with this program. If not, see . #include #include #include +#include #include #include @@ -417,6 +418,11 @@ KWIN_EXPORT int kdemain(int argc, char * argv[]) KWin::Application::createAboutData(); KQuickAddons::QtQuickSettings::init(); + // disables vsync for any QtQuick windows we create (BUG 406180) + QSurfaceFormat format = QSurfaceFormat::defaultFormat(); + format.setSwapInterval(0); + QSurfaceFormat::setDefaultFormat(format); + QCommandLineOption replaceOption(QStringLiteral("replace"), i18n("Replace already-running ICCCM2.0-compliant window manager")); QCommandLineParser parser;