From 40b6961c186b2c9ff804a6d206f9fbaeff2b7c6a Mon Sep 17 00:00:00 2001 From: Bart Ribbers Date: Tue, 6 Aug 2024 16:11:33 +0200 Subject: [PATCH] community/qt6-qtwayland: backport fixes to prevent Plasma from crashing To be released in Qt 6.7.3 but KDE requested us to ship it earlier --- ...ainst-windows-being-on-a-null-screen.patch | 43 +++++++++ ...ing-window-size-on-the-render-thread.patch | 87 +++++++++++++++++++ community/qt6-qtwayland/APKBUILD | 4 + 3 files changed, 134 insertions(+) create mode 100644 community/qt6-qtwayland/0002-qt6-qtwayland-client-guard-against-windows-being-on-a-null-screen.patch create mode 100644 community/qt6-qtwayland/0003-qt6-qtwayland-Client-Improve-thread-safety-determining-window-size-on-the-render-thread.patch diff --git a/community/qt6-qtwayland/0002-qt6-qtwayland-client-guard-against-windows-being-on-a-null-screen.patch b/community/qt6-qtwayland/0002-qt6-qtwayland-client-guard-against-windows-being-on-a-null-screen.patch new file mode 100644 index 00000000000..e1ce73af622 --- /dev/null +++ b/community/qt6-qtwayland/0002-qt6-qtwayland-client-guard-against-windows-being-on-a-null-screen.patch @@ -0,0 +1,43 @@ +From 406995207eae8d644b6e5262aa716a48c7e471a8 Mon Sep 17 00:00:00 2001 +From: David Edmundson +Date: Wed, 10 Jul 2024 09:00:33 +0100 +Subject: [PATCH] client: Guard against windows being on a null screen + +calculateScreenFromSurfaceEvents uses the screen information from our +surface enter events. If this is not set yet, or refers to outputs not +yet complete we fall back to the QWindow::screen. This was introduced in +e03613524fc9f6be5c4cd7e9bdb00bc09c7f1e0b. + +It was assumed that this would always be a valid value as QtBase keeps +it updated, but there are apparently paths for it to still be null. + +It will be evaluated again when the surface receives a wl_enter event or +the output that we have entered is finally initialised and we will then +be marked as on the correct screen. + +Change-Id: I33b4a5112c3426a8ea523d39a0658ba7ffee5298 +Reviewed-by: Aleix Pol Gonzalez +Reviewed-by: Vlad Zahorodnii +(cherry picked from commit c4f91b479303dda2e49499de249018d7c66c5f99) +Reviewed-by: Qt Cherry-pick Bot +(cherry picked from commit ec07c90cd647fd7a647f3f10dcae4d18699263df) +--- + src/client/qwaylandwindow.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp +index c3725ffc9..192373184 100644 +--- a/src/client/qwaylandwindow.cpp ++++ b/src/client/qwaylandwindow.cpp +@@ -1407,7 +1407,7 @@ void QWaylandWindow::handleScreensChanged() + { + QPlatformScreen *newScreen = calculateScreenFromSurfaceEvents(); + +- if (newScreen->screen() == window()->screen()) ++ if (!newScreen || newScreen->screen() == window()->screen()) + return; + + QWindowSystemInterface::handleWindowScreenChanged(window(), newScreen->QPlatformScreen::screen()); +-- +GitLab + diff --git a/community/qt6-qtwayland/0003-qt6-qtwayland-Client-Improve-thread-safety-determining-window-size-on-the-render-thread.patch b/community/qt6-qtwayland/0003-qt6-qtwayland-Client-Improve-thread-safety-determining-window-size-on-the-render-thread.patch new file mode 100644 index 00000000000..6e8d23aa9e9 --- /dev/null +++ b/community/qt6-qtwayland/0003-qt6-qtwayland-Client-Improve-thread-safety-determining-window-size-on-the-render-thread.patch @@ -0,0 +1,87 @@ +From 632127d7f1d86cba4dd17361f24f9fd70a0ae44c Mon Sep 17 00:00:00 2001 +From: David Edmundson +Date: Fri, 5 Jul 2024 16:13:40 +0100 +Subject: [PATCH] Client: Improve thread safety determining window size on the + render thread + +updateSurface is called from both the render and GUI thread. We +therefore need every property referenced to be thread safe. + +Rather than guarding each property we cache the buffer size whenever the +window geometry or scale changes and put a mutex round this one +variable. + +Change-Id: I4168ced27556e0e4558bbdbd1daa275d7523c33d +Reviewed-by: Vlad Zahorodnii +(cherry picked from commit 83da29c62f8fb918df8d91826d16b5d5ceb2c704) +Reviewed-by: Qt Cherry-pick Bot +(cherry picked from commit f817608c7152487f489d0f3a227c1d0ceb7b0c2c) +Reviewed-by: David Edmundson +--- + .../client/wayland-egl/qwaylandeglwindow.cpp | 20 +++++++++++++++---- + .../client/wayland-egl/qwaylandeglwindow_p.h | 6 ++++++ + 2 files changed, 22 insertions(+), 4 deletions(-) + +diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp +index 652a65630..44f1038c3 100644 +--- a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp ++++ b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp +@@ -50,6 +50,15 @@ QWaylandWindow::WindowType QWaylandEglWindow::windowType() const + + void QWaylandEglWindow::ensureSize() + { ++ // this is always called on the main thread ++ QMargins margins = mWindowDecoration ? frameMargins() : QMargins{}; ++ QRect rect = geometry(); ++ QSize sizeWithMargins = (rect.size() + QSize(margins.left() + margins.right(), margins.top() + margins.bottom())) * scale(); ++ { ++ QWriteLocker lock(&m_bufferSizeLock); ++ m_bufferSize = sizeWithMargins; ++ } ++ + updateSurface(false); + } + +@@ -60,14 +69,17 @@ void QWaylandEglWindow::setGeometry(const QRect &rect) + // we're now getting a resize we don't want to create it again. + // Just resize the wl_egl_window, the EGLSurface will be created + // the next time makeCurrent is called. +- updateSurface(false); ++ ensureSize(); + } + + void QWaylandEglWindow::updateSurface(bool create) + { +- QMargins margins = mWindowDecoration ? frameMargins() : QMargins{}; +- QRect rect = geometry(); +- QSize sizeWithMargins = (rect.size() + QSize(margins.left() + margins.right(), margins.top() + margins.bottom())) * scale(); ++ ++ QSize sizeWithMargins; ++ { ++ QReadLocker lock(&m_bufferSizeLock); ++ sizeWithMargins = m_bufferSize; ++ } + + // wl_egl_windows must have both width and height > 0 + // mesa's egl returns NULL if we try to create a, invalid wl_egl_window, however not all EGL +diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow_p.h b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow_p.h +index 5b9aa9874..048f0b610 100644 +--- a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow_p.h ++++ b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow_p.h +@@ -60,7 +60,13 @@ private: + mutable QOpenGLFramebufferObject *m_contentFBO = nullptr; + + QSurfaceFormat m_format; ++ // Size used in the last call to wl_egl_window_resize + QSize m_requestedSize; ++ ++ // Size of the buffer used by QWaylandWindow ++ // This is always written to from the main thread, potentially read from the rendering thread ++ QReadWriteLock m_bufferSizeLock; ++ QSize m_bufferSize; + }; + + } +-- +GitLab + diff --git a/community/qt6-qtwayland/APKBUILD b/community/qt6-qtwayland/APKBUILD index 832da385c3f..3a717217e50 100644 --- a/community/qt6-qtwayland/APKBUILD +++ b/community/qt6-qtwayland/APKBUILD @@ -34,6 +34,8 @@ esac source="https://download.qt.io/$_rel/qt/${pkgver%.*}/${pkgver/_/-}/submodules/qtwayland-everywhere-src-${pkgver/_/-}.tar.xz 0001-qt6-qtwayland-Client-Ensure-that-guessed-popup-parent-has-a-shell-surface.patch + 0002-qt6-qtwayland-client-guard-against-windows-being-on-a-null-screen.patch + 0003-qt6-qtwayland-Client-Improve-thread-safety-determining-window-size-on-the-render-thread.patch " build() { @@ -52,4 +54,6 @@ package() { sha512sums=" 2cd4f45f05ae60bc7f82b94f2e9c217ee4b8322f60381e1b079b90e0687e51cfbeb10b5dd724e1cca7e422b1b101d2b91c0ee47b1a732411cef330fb052c97c2 qtwayland-everywhere-src-6.7.2.tar.xz a278bb8c0652999b1187620a7ded28c19cffdbdd42834cbb9ab948598c59a827d22d6a59c4cfd8886702b215694d96f14e868286719f49b99031fbfc308216a0 0001-qt6-qtwayland-Client-Ensure-that-guessed-popup-parent-has-a-shell-surface.patch +ad8f8840ddefb932e46e4080430afa5dadb8f801d38b941bcc1af9f7a5512d249d51d5fc42346ef3c5eafd48c0f70018286ba252ec259a826d44a4bec91ceeca 0002-qt6-qtwayland-client-guard-against-windows-being-on-a-null-screen.patch +c109a7a74be3f0314a8caa82f0263f87464a3bc7e4fb00e2657e682422b1e9bad04be3e1888fc3b1a481ce5e61c3eb87a85d8803fcc69c8f4d42cfbdceba3027 0003-qt6-qtwayland-Client-Improve-thread-safety-determining-window-size-on-the-render-thread.patch "