summaryrefslogtreecommitdiff
path: root/dev-qt/qtwayland/files
diff options
context:
space:
mode:
authorV3n3RiX <venerix@koprulu.sector>2022-03-20 00:40:44 +0000
committerV3n3RiX <venerix@koprulu.sector>2022-03-20 00:40:44 +0000
commit4cbcc855382a06088e2f016f62cafdbcb7e40665 (patch)
tree356496503d52354aa6d9f2d36126302fed5f3a73 /dev-qt/qtwayland/files
parentfcc5224904648a8e6eb528d7603154160a20022f (diff)
gentoo resync : 20.03.2022
Diffstat (limited to 'dev-qt/qtwayland/files')
-rw-r--r--dev-qt/qtwayland/files/qtwayland-5.15.2-QTBUG-90037-QTBUG-91264.patch131
-rw-r--r--dev-qt/qtwayland/files/qtwayland-5.15.2-fix-qmake-deps.patch126
-rw-r--r--dev-qt/qtwayland/files/qtwayland-5.15.2-fixup-mutexes.patch87
-rw-r--r--dev-qt/qtwayland/files/qtwayland-5.15.2-guard-mResizeDirty.patch37
4 files changed, 381 insertions, 0 deletions
diff --git a/dev-qt/qtwayland/files/qtwayland-5.15.2-QTBUG-90037-QTBUG-91264.patch b/dev-qt/qtwayland/files/qtwayland-5.15.2-QTBUG-90037-QTBUG-91264.patch
new file mode 100644
index 000000000000..8bffa3e08b3e
--- /dev/null
+++ b/dev-qt/qtwayland/files/qtwayland-5.15.2-QTBUG-90037-QTBUG-91264.patch
@@ -0,0 +1,131 @@
+From d7b34dbf072236cdfb3b64e5ad26d1ff29dfec5f Mon Sep 17 00:00:00 2001
+From: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
+Date: Thu, 22 Apr 2021 08:42:33 +0200
+Subject: client: Gracefully handle shutdown and window hiding
+
+When a window is hidden or destroyed, the render thread may already
+be rendering. We need to properly read-lock the surface pointer
+when it is in use and exit when it becomes null.
+
+Note that there is also a potential crash in the Mesa GL driver
+where it keeps a proxy to the wl_surface, so if we delete this
+while we are still rendering, it can crash inside the driver.
+This is not addressed by this patch, and has not been reproduced
+on any other drivers so far.
+
+[ChangeLog][Client] Fixed a crash that could happen when hiding
+or closing windows while Qt Quick was actively rendering on
+a different thread.
+
+Pick-to: 6.0 6.1 5.15
+Fixes: QTBUG-91264
+Fixes: QTBUG-90037
+Task-number: QTBUG-92249
+Change-Id: I029b123b83c58740321e8b90a463ced748d8bcf4
+Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
+Reviewed-by: David Edmundson <davidedmundson@kde.org>
+(cherry picked from commit b19b0fbaf775e8b8eda1e03c265a5393d618c6c0)
+---
+ src/client/qwaylandwindow.cpp | 17 ++++++++++++++++-
+ src/client/qwaylandwindow_p.h | 2 +-
+ .../client/wayland-egl/qwaylandglcontext.cpp | 1 -
+ 3 files changed, 17 insertions(+), 3 deletions(-)
+
+diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
+index 494911b3..0d849b57 100644
+--- a/src/client/qwaylandwindow.cpp
++++ b/src/client/qwaylandwindow.cpp
+@@ -414,6 +414,7 @@ void QWaylandWindow::closePopups(QWaylandWindow *parent)
+
+ QPlatformScreen *QWaylandWindow::calculateScreenFromSurfaceEvents() const
+ {
++ QReadLocker lock(&mSurfaceLock);
+ if (mSurface) {
+ if (auto *screen = mSurface->oldestEnteredScreen())
+ return screen;
+@@ -552,6 +553,10 @@ void QWaylandWindow::sendRecursiveExposeEvent()
+
+ void QWaylandWindow::attach(QWaylandBuffer *buffer, int x, int y)
+ {
++ QReadLocker locker(&mSurfaceLock);
++ if (mSurface == nullptr)
++ return;
++
+ if (buffer) {
+ Q_ASSERT(!buffer->committed());
+ handleUpdate();
+@@ -571,6 +576,10 @@ void QWaylandWindow::attachOffset(QWaylandBuffer *buffer)
+
+ void QWaylandWindow::damage(const QRect &rect)
+ {
++ QReadLocker locker(&mSurfaceLock);
++ if (mSurface == nullptr)
++ return;
++
+ const int s = scale();
+ if (mDisplay->compositorVersion() >= 4)
+ mSurface->damage_buffer(s * rect.x(), s * rect.y(), s * rect.width(), s * rect.height());
+@@ -605,6 +614,8 @@ void QWaylandWindow::commit(QWaylandBuffer *buffer, const QRegion &damage)
+ qCDebug(lcWaylandBackingstore) << "Buffer already committed, ignoring.";
+ return;
+ }
++
++ QReadLocker locker(&mSurfaceLock);
+ if (!mSurface)
+ return;
+
+@@ -624,7 +635,9 @@ void QWaylandWindow::commit(QWaylandBuffer *buffer, const QRegion &damage)
+
+ void QWaylandWindow::commit()
+ {
+- mSurface->commit();
++ QReadLocker locker(&mSurfaceLock);
++ if (mSurface != nullptr)
++ mSurface->commit();
+ }
+
+ const wl_callback_listener QWaylandWindow::callbackListener = {
+@@ -725,6 +738,7 @@ QPointF QWaylandWindow::mapFromWlSurface(const QPointF &surfacePosition) const
+
+ wl_surface *QWaylandWindow::wlSurface()
+ {
++ QReadLocker locker(&mSurfaceLock);
+ return mSurface ? mSurface->object() : nullptr;
+ }
+
+@@ -749,6 +763,7 @@ QWaylandScreen *QWaylandWindow::waylandScreen() const
+
+ void QWaylandWindow::handleContentOrientationChange(Qt::ScreenOrientation orientation)
+ {
++ QReadLocker locker(&mSurfaceLock);
+ if (mDisplay->compositorVersion() < 2)
+ return;
+
+diff --git a/src/client/qwaylandwindow_p.h b/src/client/qwaylandwindow_p.h
+index d45980a8..54ac67a9 100644
+--- a/src/client/qwaylandwindow_p.h
++++ b/src/client/qwaylandwindow_p.h
+@@ -288,7 +288,7 @@ private:
+
+ static QWaylandWindow *mMouseGrab;
+
+- QReadWriteLock mSurfaceLock;
++ mutable QReadWriteLock mSurfaceLock;
+
+ friend class QWaylandSubSurface;
+ };
+diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp
+index 683fe123..8f12736d 100644
+--- a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp
++++ b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp
+@@ -192,7 +192,6 @@ public:
+ }
+ void blit(QWaylandEglWindow *window)
+ {
+- Q_ASSERT(window->wlSurface());
+ QOpenGLTextureCache *cache = QOpenGLTextureCache::cacheForContext(m_context->context());
+
+ QSize surfaceSize = window->surfaceSize();
+--
+2.35.0
+
diff --git a/dev-qt/qtwayland/files/qtwayland-5.15.2-fix-qmake-deps.patch b/dev-qt/qtwayland/files/qtwayland-5.15.2-fix-qmake-deps.patch
new file mode 100644
index 000000000000..e0c18228ed0f
--- /dev/null
+++ b/dev-qt/qtwayland/files/qtwayland-5.15.2-fix-qmake-deps.patch
@@ -0,0 +1,126 @@
+From 3b72261b8b06397a532a40e41103c6b7a44e3ab5 Mon Sep 17 00:00:00 2001
+From: Fabian Vogt <fabian@ritter-vogt.de>
+Date: Fri, 4 Feb 2022 11:07:36 +0100
+Subject: [PATCH] Use proper dependencies in compile tests
+
+Use the dependencies as found by the "libraries" section instead of relying
+on them being available in the default location (e.g. "-ldrm").
+
+Additionally, VK_USE_PLATFORM_WAYLAND_KHR requires <wayland-client.h>, so
+add the wayland-client dependency.
+
+This fixes those tests if e.g. wayland-client headers need to be found through
+pkgconfig.
+
+This part of the code changed completely in Qt 6, so this is a totally
+different patch and not a cherry-pick of 5fc2e1915c3a
+("CMake: Fix qtwayland feature detection").
+
+Fixes: QTBUG-100475
+---
+ src/client/configure.json | 8 ++++----
+ src/compositor/configure.json | 34 +++++++++++++++++++++++++++++-----
+ 2 files changed, 33 insertions(+), 9 deletions(-)
+
+diff --git a/src/client/configure.json b/src/client/configure.json
+index 2f424580..29222357 100644
+--- a/src/client/configure.json
++++ b/src/client/configure.json
+@@ -149,8 +149,7 @@
+ "#endif"
+ ]
+ },
+- "libs": "-ldrm",
+- "use": "egl"
++ "use": "drm egl"
+ },
+ "vulkan-server-buffer": {
+ "label": "Vulkan Buffer Sharing",
+@@ -168,7 +167,8 @@
+ "exportAllocInfo.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR;",
+ "return 0;"
+ ]
+- }
++ },
++ "use": "wayland-client"
+ },
+ "egl_1_5-wayland": {
+ "label": "EGL 1.5 with Wayland Platform",
+@@ -183,7 +183,7 @@
+ "eglGetPlatformDisplay(EGL_PLATFORM_WAYLAND_EXT, (struct wl_display *)(nullptr), nullptr);"
+ ]
+ },
+- "use": "egl"
++ "use": "egl wayland-client"
+ }
+ },
+
+diff --git a/src/compositor/configure.json b/src/compositor/configure.json
+index bcfd5215..da95d07b 100644
+--- a/src/compositor/configure.json
++++ b/src/compositor/configure.json
+@@ -7,6 +7,31 @@
+ "testDir": "../../config.tests",
+
+ "libraries": {
++ "wayland-client": {
++ "label": "Wayland client library",
++ "headers": "wayland-version.h",
++ "test": {
++ "main": [
++ "#if WAYLAND_VERSION_MAJOR < 1",
++ "# error Wayland 1.8.0 or higher required",
++ "#endif",
++ "#if WAYLAND_VERSION_MAJOR == 1",
++ "# if WAYLAND_VERSION_MINOR < 8",
++ "# error Wayland 1.8.0 or higher required",
++ "# endif",
++ "# if WAYLAND_VERSION_MINOR == 8",
++ "# if WAYLAND_VERSION_MICRO < 0",
++ "# error Wayland 1.8.0 or higher required",
++ "# endif",
++ "# endif",
++ "#endif"
++ ]
++ },
++ "sources": [
++ { "type": "pkgConfig", "args": "wayland-client" },
++ "-lwayland-client"
++ ]
++ },
+ "wayland-server": {
+ "label": "wayland-server",
+ "headers": "wayland-version.h",
+@@ -151,8 +176,7 @@
+ "#endif"
+ ]
+ },
+- "libs": "-ldrm",
+- "use": "egl"
++ "use": "drm egl"
+ },
+ "dmabuf-client-buffer": {
+ "label": "Linux Client dma-buf Buffer Sharing",
+@@ -176,8 +200,7 @@
+ "return 0;"
+ ]
+ },
+- "libs": "-ldrm",
+- "use": "egl"
++ "use": "drm egl"
+ },
+ "vulkan-server-buffer": {
+ "label": "Vulkan Buffer Sharing",
+@@ -195,7 +218,8 @@
+ "exportAllocInfo.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR;",
+ "return 0;"
+ ]
+- }
++ },
++ "use": "wayland-client"
+ }
+ },
+
+--
+GitLab
+
diff --git a/dev-qt/qtwayland/files/qtwayland-5.15.2-fixup-mutexes.patch b/dev-qt/qtwayland/files/qtwayland-5.15.2-fixup-mutexes.patch
new file mode 100644
index 000000000000..b861cebe60ac
--- /dev/null
+++ b/dev-qt/qtwayland/files/qtwayland-5.15.2-fixup-mutexes.patch
@@ -0,0 +1,87 @@
+From bf4335b1ea9b179076cbd7a1c2e8cfa9538b1dc1 Mon Sep 17 00:00:00 2001
+From: David Edmundson <davidedmundson@kde.org>
+Date: Thu, 3 Feb 2022 14:27:08 +0000
+Subject: [PATCH] Fix up mutexes for frame callbacks
+
+Everything related to frame callback timings is used by potentially 3
+threads. Access needs guarding.
+
+Change-Id: I9f22390c175d9f2f63d31b1ebf0cdc0b830be937
+---
+ src/client/qwaylandwindow.cpp | 14 +++++++++-----
+ src/client/qwaylandwindow_p.h | 10 +++++++---
+ 2 files changed, 16 insertions(+), 8 deletions(-)
+
+diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
+index 7aee362a..72e0e601 100644
+--- a/src/client/qwaylandwindow.cpp
++++ b/src/client/qwaylandwindow.cpp
+@@ -256,8 +256,12 @@ void QWaylandWindow::reset()
+ mFrameCallback = nullptr;
+ }
+
+- mFrameCallbackElapsedTimer.invalidate();
+- mWaitingForFrameCallback = false;
++ {
++ QMutexLocker locker(&mFrameSyncMutex);
++ mFrameCallbackElapsedTimer.invalidate();
++ mWaitingForFrameCallback = false;
++ }
++
+ mFrameCallbackTimedOut = false;
+
+ mMask = QRegion();
+@@ -1142,6 +1146,7 @@ QVariant QWaylandWindow::property(const QString &name, const QVariant &defaultVa
+
+ void QWaylandWindow::timerEvent(QTimerEvent *event)
+ {
++ QMutexLocker locker(&mFrameSyncMutex);
+ if (event->timerId() != mFrameCallbackCheckIntervalTimerId)
+ return;
+
+@@ -1200,15 +1205,14 @@ void QWaylandWindow::handleUpdate()
+ {
+ qCDebug(lcWaylandBackingstore) << "handleUpdate" << QThread::currentThread();
+
+- if (mWaitingForFrameCallback)
+- return;
+-
+ // TODO: Should sync subsurfaces avoid requesting frame callbacks?
+ QReadLocker lock(&mSurfaceLock);
+ if (!mSurface)
+ return;
+
+ QMutexLocker locker(&mFrameSyncMutex);
++ if (mWaitingForFrameCallback)
++ return;
+
+ struct ::wl_surface *wrappedSurface = reinterpret_cast<struct ::wl_surface *>(wl_proxy_create_wrapper(mSurface->object()));
+ wl_proxy_set_queue(reinterpret_cast<wl_proxy *>(wrappedSurface), mDisplay->frameEventQueue());
+diff --git a/src/client/qwaylandwindow_p.h b/src/client/qwaylandwindow_p.h
+index 3ff68ccb..025d7917 100644
+--- a/src/client/qwaylandwindow_p.h
++++ b/src/client/qwaylandwindow_p.h
+@@ -226,13 +226,17 @@ protected:
+ Qt::MouseButtons mMousePressedInContentArea = Qt::NoButton;
+
+ WId mWindowId;
++
++ // The following are used by the main thread the render thread and the event frame thread
++ // Access should be guarded by mFrameSyncMutex
++ QMutex mFrameSyncMutex;
++ QWaitCondition mFrameSyncWait;
+ bool mWaitingForFrameCallback = false;
+- bool mFrameCallbackTimedOut = false; // Whether the frame callback has timed out
+ int mFrameCallbackCheckIntervalTimerId = -1;
+ QElapsedTimer mFrameCallbackElapsedTimer;
++
++ bool mFrameCallbackTimedOut = false; // Whether the frame callback has timed out
+ struct ::wl_callback *mFrameCallback = nullptr;
+- QMutex mFrameSyncMutex;
+- QWaitCondition mFrameSyncWait;
+
+ // True when we have called deliverRequestUpdate, but the client has not yet attached a new buffer
+ bool mWaitingForUpdate = false;
+--
+GitLab
+
diff --git a/dev-qt/qtwayland/files/qtwayland-5.15.2-guard-mResizeDirty.patch b/dev-qt/qtwayland/files/qtwayland-5.15.2-guard-mResizeDirty.patch
new file mode 100644
index 000000000000..c2e377cff054
--- /dev/null
+++ b/dev-qt/qtwayland/files/qtwayland-5.15.2-guard-mResizeDirty.patch
@@ -0,0 +1,37 @@
+From 2e2042aa18efd1389a140a5d0028d8359bd455a7 Mon Sep 17 00:00:00 2001
+From: David Edmundson <davidedmundson@kde.org>
+Date: Thu, 3 Feb 2022 19:42:33 +0000
+Subject: [PATCH] Guard mResizeDirty by the correctMutex
+
+mResizeDirty is used in the GUI thread in setCanResize which can be
+called from the GUI thread. It is queried and set whilst the resizeLock
+is held. We need to guard our usage.
+
+Change-Id: I5f8dcf8aa2cb2c4bb6274103df1da9e3e268605a
+---
+ src/client/qwaylandwindow.cpp | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
+index 949374b1..7aee362a 100644
+--- a/src/client/qwaylandwindow.cpp
++++ b/src/client/qwaylandwindow.cpp
+@@ -357,11 +357,12 @@ void QWaylandWindow::setGeometry(const QRect &rect)
+ if (mWindowDecoration)
+ mWindowDecoration->update();
+
+- if (mResizeAfterSwap && windowType() == Egl && mSentInitialResize)
++ if (mResizeAfterSwap && windowType() == Egl && mSentInitialResize) {
++ QMutexLocker lock(&mResizeLock);
+ mResizeDirty = true;
+- else
++ } else {
+ QWindowSystemInterface::handleGeometryChange(window(), geometry());
+-
++ }
+ mSentInitialResize = true;
+ }
+ QRect exposeGeometry(QPoint(), geometry().size());
+--
+GitLab
+