aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBhushan Shah <bhush94@gmail.com>2019-12-10 23:24:34 +0530
committerLeo <thinkabit.ukim@gmail.com>2019-12-12 19:01:49 +0100
commit2234df6b707a6db49b2d927a9c38e0afeb77d6e5 (patch)
tree2d0dfa2bd9910a5efeb672700182a2e36f8290d0
parent5185d2e34bf149ecac298c2b2b97cf349f054356 (diff)
downloadaports-2234df6b707a6db49b2d927a9c38e0afeb77d6e5.tar.gz
aports-2234df6b707a6db49b2d927a9c38e0afeb77d6e5.tar.bz2
aports-2234df6b707a6db49b2d927a9c38e0afeb77d6e5.tar.xz
community/qt5-qtwayland: backport patch for performance improvement
-rw-r--r--community/qt5-qtwayland/03e8c91fc28b77c4f027b6c6d582b85878efae41.patch135
-rw-r--r--community/qt5-qtwayland/APKBUILD8
2 files changed, 140 insertions, 3 deletions
diff --git a/community/qt5-qtwayland/03e8c91fc28b77c4f027b6c6d582b85878efae41.patch b/community/qt5-qtwayland/03e8c91fc28b77c4f027b6c6d582b85878efae41.patch
new file mode 100644
index 0000000000..7bcd572024
--- /dev/null
+++ b/community/qt5-qtwayland/03e8c91fc28b77c4f027b6c6d582b85878efae41.patch
@@ -0,0 +1,135 @@
+From 03e8c91fc28b77c4f027b6c6d582b85878efae41 Mon Sep 17 00:00:00 2001
+From: Johan Klokkhammer Helsing <johan.helsing@qt.io>
+Date: Tue, 15 Oct 2019 09:51:43 +0200
+Subject: [PATCH] Client: Fix 100ms freeze when applications do not swap after
+ deliverUpdateRequest
+
+[ChangeLog][QPA plugin] Fixed a 100 ms freeze that would occur if applications
+did not draw after receiving a deliverUpdateRequest().
+
+QtQuick does this at the start of animations. This should get rid of those
+backingstore warnings (and also remove a 100ms freeze before animations start
+in those instances).
+
+Fixes: QTBUG-76813
+Change-Id: Id366bf4a14f402fa44530ae46e7b66d9988c14f6
+Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
+Reviewed-by: John Brooks <john.brooks@qt.io>
+(cherry picked from commit 9f5b96225885f927727a57b6123d8550d6c373bb)
+---
+ src/client/qwaylandwindow.cpp | 46 +++++++++----------------------------------
+ src/client/qwaylandwindow_p.h | 1 -
+ 2 files changed, 9 insertions(+), 38 deletions(-)
+
+diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
+index 3cd7892a7..109110aef 100644
+--- a/src/client/qwaylandwindow.cpp
++++ b/src/client/qwaylandwindow.cpp
+@@ -1097,25 +1097,6 @@ QVariant QWaylandWindow::property(const QString &name, const QVariant &defaultVa
+
+ void QWaylandWindow::timerEvent(QTimerEvent *event)
+ {
+- if (event->timerId() == mFallbackUpdateTimerId) {
+- killTimer(mFallbackUpdateTimerId);
+- mFallbackUpdateTimerId = -1;
+- qCDebug(lcWaylandBackingstore) << "mFallbackUpdateTimer timed out";
+-
+- if (!isExposed()) {
+- qCDebug(lcWaylandBackingstore) << "Fallback update timer: Window not exposed,"
+- << "not delivering update request.";
+- return;
+- }
+-
+- if (mWaitingForUpdate && hasPendingUpdateRequest() && !mWaitingForFrameCallback) {
+- qCWarning(lcWaylandBackingstore) << "Delivering update request through fallback timer,"
+- << "may not be in sync with display";
+- deliverUpdateRequest();
+- }
+- }
+-
+-
+ if (mFrameCallbackTimerId.testAndSetOrdered(event->timerId(), -1)) {
+ killTimer(event->timerId());
+ qCDebug(lcWaylandBackingstore) << "Didn't receive frame callback in time, window should now be inexposed";
+@@ -1127,6 +1108,7 @@ void QWaylandWindow::timerEvent(QTimerEvent *event)
+
+ void QWaylandWindow::requestUpdate()
+ {
++ qCDebug(lcWaylandBackingstore) << "requestUpdate";
+ Q_ASSERT(hasPendingUpdateRequest()); // should be set by QPA
+
+ // If we have a frame callback all is good and will be taken care of there
+@@ -1134,20 +1116,17 @@ void QWaylandWindow::requestUpdate()
+ return;
+
+ // If we've already called deliverUpdateRequest(), but haven't seen any attach+commit/swap yet
+- if (mWaitingForUpdate) {
+- // Ideally, we should just have returned here, but we're not guaranteed that the client
+- // will actually update, so start this timer to deliver another request update after a while
+- // *IF* the client doesn't update.
+- int fallbackTimeout = 100;
+- mFallbackUpdateTimerId = startTimer(fallbackTimeout);
+- return;
+- }
++ // This is a somewhat redundant behavior and might indicate a bug in the calling code, so log
++ // here so we can get this information when debugging update/frame callback issues.
++ // Continue as nothing happened, though.
++ if (mWaitingForUpdate)
++ qCDebug(lcWaylandBackingstore) << "requestUpdate called twice without committing anything";
+
+ // Some applications (such as Qt Quick) depend on updates being delivered asynchronously,
+ // so use invokeMethod to delay the delivery a bit.
+ QMetaObject::invokeMethod(this, [this] {
+ // Things might have changed in the meantime
+- if (hasPendingUpdateRequest() && !mWaitingForUpdate && !mWaitingForFrameCallback)
++ if (hasPendingUpdateRequest() && !mWaitingForFrameCallback)
+ deliverUpdateRequest();
+ }, Qt::QueuedConnection);
+ }
+@@ -1157,6 +1136,7 @@ void QWaylandWindow::requestUpdate()
+ // Can be called from the render thread (without locking anything) so make sure to not make races in this method.
+ void QWaylandWindow::handleUpdate()
+ {
++ qCDebug(lcWaylandBackingstore) << "handleUpdate" << QThread::currentThread();
+ // TODO: Should sync subsurfaces avoid requesting frame callbacks?
+ QReadLocker lock(&mSurfaceLock);
+ if (!isInitialized())
+@@ -1167,15 +1147,6 @@ void QWaylandWindow::handleUpdate()
+ mFrameCallback = nullptr;
+ }
+
+- if (mFallbackUpdateTimerId != -1) {
+- // Ideally, we would stop the fallback timer here, but since we're on another thread,
+- // it's not allowed. Instead we set mFallbackUpdateTimer to -1 here, so we'll just
+- // ignore it if it times out before it's cleaned up by the invokeMethod call.
+- int id = mFallbackUpdateTimerId;
+- mFallbackUpdateTimerId = -1;
+- QMetaObject::invokeMethod(this, [this, id] { killTimer(id); }, Qt::QueuedConnection);
+- }
+-
+ mFrameCallback = frame();
+ wl_callback_add_listener(mFrameCallback, &QWaylandWindow::callbackListener, this);
+ mWaitingForFrameCallback = true;
+@@ -1195,6 +1166,7 @@ void QWaylandWindow::handleUpdate()
+
+ void QWaylandWindow::deliverUpdateRequest()
+ {
++ qCDebug(lcWaylandBackingstore) << "deliverUpdateRequest";
+ mWaitingForUpdate = true;
+ QPlatformWindow::deliverUpdateRequest();
+ }
+diff --git a/src/client/qwaylandwindow_p.h b/src/client/qwaylandwindow_p.h
+index 717709938..0369bd0c2 100644
+--- a/src/client/qwaylandwindow_p.h
++++ b/src/client/qwaylandwindow_p.h
+@@ -229,7 +229,6 @@ protected:
+
+ // True when we have called deliverRequestUpdate, but the client has not yet attached a new buffer
+ bool mWaitingForUpdate = false;
+- int mFallbackUpdateTimerId = -1; // Started when waiting for app to commit
+
+ QMutex mResizeLock;
+ bool mWaitingToApplyConfigure = false;
+--
+2.16.3
+
diff --git a/community/qt5-qtwayland/APKBUILD b/community/qt5-qtwayland/APKBUILD
index c90b5bf831..235d789a0c 100644
--- a/community/qt5-qtwayland/APKBUILD
+++ b/community/qt5-qtwayland/APKBUILD
@@ -3,7 +3,7 @@
pkgname=qt5-qtwayland
_pkgname="${pkgname/qt5-/}-everywhere-src"
pkgver=5.12.5
-pkgrel=0
+pkgrel=1
arch="all"
url="http://qt-project.org/"
license="LGPL-2.0 with exceptions or GPL-3.0 with exceptions"
@@ -18,7 +18,8 @@ case $pkgver in
*) _rel=official_releases;;
esac
-source="http://download.qt.io/$_rel/qt/${pkgver%.*}/${pkgver}/submodules/$_pkgname-$pkgver.tar.xz"
+source="http://download.qt.io/$_rel/qt/${pkgver%.*}/${pkgver}/submodules/$_pkgname-$pkgver.tar.xz
+ 03e8c91fc28b77c4f027b6c6d582b85878efae41.patch"
build() {
qmake-qt5
@@ -41,4 +42,5 @@ package() {
install -d "$pkgdir"/usr/share/licenses
ln -s /usr/share/licenses/qt5-base "$pkgdir"/usr/share/licenses/$pkgname
}
-sha512sums="19e19b3d6226839856f8e8792665eda1f09f0bbf95a38077bdf2831205ee09254c8df6a521ba3f5a228bcd98c4d1929a2bd9e9aa2f6f14c218d4d7458d1a866c qtwayland-everywhere-src-5.12.5.tar.xz"
+sha512sums="19e19b3d6226839856f8e8792665eda1f09f0bbf95a38077bdf2831205ee09254c8df6a521ba3f5a228bcd98c4d1929a2bd9e9aa2f6f14c218d4d7458d1a866c qtwayland-everywhere-src-5.12.5.tar.xz
+f570e9b11611ec43289afc83230b094f974c7d48be5b79e00b3815b5fb92ec845c768fa2911ccfbeec29dda338d0b3fab8cc9702536c816c78d98820d38466c9 03e8c91fc28b77c4f027b6c6d582b85878efae41.patch"