parent
c22c09b2de
commit
a54ca5a1c1
@ -0,0 +1,81 @@
|
|||||||
|
From 0124b1ef191fcafe0d0f89287be66b36833586e6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Erik Kurzinger <ekurzinger@nvidia.com>
|
||||||
|
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 c83b8240b..1219337b6 100644
|
||||||
|
--- a/main_x11.cpp
|
||||||
|
+++ b/main_x11.cpp
|
||||||
|
@@ -43,6 +43,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#include <QFile>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QPushButton>
|
||||||
|
+#include <QSurfaceFormat>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include <QX11Info>
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
--
|
||||||
|
2.21.0
|
||||||
|
|
Loading…
Reference in new issue