summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Edmundson <davidedmundson@kde.org>2024-01-10 23:00:26 +0000
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2024-01-11 16:46:29 +0000
commitc991b34f232d84e34cb15f4c6f25ccaef74e3499 (patch)
tree40b91b9582a468866ca154569d2857e09604f510
parent2ec6b4d3e4dc1c37e2757e7d00137e6c8f7a89fe (diff)
client: Avoid creating decorations in the render thread
createDecoration is called when on the main thread from when window flags change, implicitly from initWindow, and also every handleWindowStatesChanged which will be called when we get the first configure event in an xdg shell. There is no need to create the decoration in QWaylandGLContext::makeCurrent. Any current call to makeCurrent before the platform window is shown will not create a decoration as there's a check for a shell surface. Any call afterwards will have already been handled by initWindow. Similarly the SHM backend store does not need to handle decorations itself. Fixes: QTBUG-105703 Change-Id: I644cece28277131cf7a65eaa234ff08c8431d544 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> (cherry picked from commit c5aed5ae22f00e4b6c3be7051560b297bc10d941) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> (cherry picked from commit a3c66ed7a868e57f1f7f6a051b85e2fc4899e538)
-rw-r--r--src/client/qwaylandshmbackingstore.cpp1
-rw-r--r--src/client/qwaylandwindow.cpp8
-rw-r--r--src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp2
3 files changed, 3 insertions, 8 deletions
diff --git a/src/client/qwaylandshmbackingstore.cpp b/src/client/qwaylandshmbackingstore.cpp
index 02d830ad8..83add5945 100644
--- a/src/client/qwaylandshmbackingstore.cpp
+++ b/src/client/qwaylandshmbackingstore.cpp
@@ -190,7 +190,6 @@ void QWaylandShmBackingStore::endPaint()
void QWaylandShmBackingStore::ensureSize()
{
waylandWindow()->setBackingStore(this);
- waylandWindow()->createDecoration();
resize(mRequestedSize);
}
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
index f32a487e6..1fb5c3f83 100644
--- a/src/client/qwaylandwindow.cpp
+++ b/src/client/qwaylandwindow.cpp
@@ -1031,6 +1031,8 @@ void QWaylandWindow::setWindowFlags(Qt::WindowFlags flags)
bool QWaylandWindow::createDecoration()
{
+ Q_ASSERT_X(QThread::currentThreadId() == QThreadData::get2(thread())->threadId.loadRelaxed(),
+ "QWaylandWindow::createDecoration", "not called from main thread");
if (!mDisplay->supportsWindowDecoration())
return false;
@@ -1111,11 +1113,7 @@ bool QWaylandWindow::createDecoration()
// size and are not redrawn, leaving the new buffer empty. As a simple
// work-around, we trigger a full extra update whenever the client-side
// window decorations are toggled while the window is showing.
- // Note: createDecoration() is sometimes called from the render thread
- // of Qt Quick. This is essentially wrong and could potentially cause problems,
- // but until the underlying issue has been fixed, we have to use invokeMethod()
- // here to avoid asserts.
- QMetaObject::invokeMethod(window(), &QWindow::requestUpdate);
+ window()->requestUpdate();
}
return mWindowDecoration;
diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp
index 039ec1a6a..685ad1e4d 100644
--- a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp
+++ b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp
@@ -313,8 +313,6 @@ bool QWaylandGLContext::makeCurrent(QPlatformSurface *surface)
if (m_currentWindow->isExposed())
m_currentWindow->setCanResize(false);
- if (m_decorationsContext != EGL_NO_CONTEXT && !m_currentWindow->decoration())
- m_currentWindow->createDecoration();
if (eglSurface == EGL_NO_SURFACE) {
m_currentWindow->updateSurface(true);