diff options
author | David Redondo <qt@david-redondo.de> | 2024-01-22 15:33:59 +0100 |
---|---|---|
committer | David Redondo <qt@david-redondo.de> | 2024-01-24 10:37:59 +0100 |
commit | 8e3a9b8828c4009efd47d95da12f4da7c0a80bac (patch) | |
tree | fed95a03f6b96fad9ad427c7b895d4788e93c769 | |
parent | 76569162c796be0ac927e04bfe8a6a71809ff7a1 (diff) |
client: Fix deletion of new queued shm buffers during reconnect
When reconnecting the cleanup of existing buffers is delayed in order
to preserve contents and copy them to buffers belonging to the new
connection. Due to the order of events it could happen that
a new buffer was deleted along with the old ones but still being
referenced by a window.
During reconnect all QScreens are removed and new ones added for
the wl_outputs on the new connection during the initial roundtrips.
When the first new QScreen is added all QWindows move form the placeholder
screen to it. This can cause for example QWidgets to repaint. At this point
the windows are not reinited yet, and the buffer is queued inside the window.
Only afterwards the reconnected signal was emitted which would cause
deletion of all existing buffers including the newly queued ones.
To fix this the signal is moved after the first roundtrip where all globals
are announced and new buffers can be created but no new screens have been
announced yet. The signal is renamed to be more fit for its new location.
Pick-to: 6.7
Pick-to: 6.6
Change-Id: I06be14d235ac342a4b420176aadad3ccf18178fe
Reviewed-by: David Edmundson <davidedmundson@kde.org>
-rw-r--r-- | src/client/qwaylanddisplay.cpp | 4 | ||||
-rw-r--r-- | src/client/qwaylanddisplay_p.h | 2 | ||||
-rw-r--r-- | src/client/qwaylandshmbackingstore.cpp | 2 | ||||
-rw-r--r-- | src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp | 2 | ||||
-rw-r--r-- | src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp | 2 |
5 files changed, 6 insertions, 6 deletions
diff --git a/src/client/qwaylanddisplay.cpp b/src/client/qwaylanddisplay.cpp index 43f9443fb..1040c3b7a 100644 --- a/src/client/qwaylanddisplay.cpp +++ b/src/client/qwaylanddisplay.cpp @@ -391,6 +391,8 @@ bool QWaylandDisplay::initialize() forceRoundTrip(); + emit connected(); + if (!mWaitingScreens.isEmpty()) { // Give wl_output.done and zxdg_output_v1.done events a chance to arrive forceRoundTrip(); @@ -481,8 +483,6 @@ void QWaylandDisplay::reconnect() wl_event_queue_destroy(m_frameEventQueue); initEventThread(); - emit reconnected(); - auto needsRecreate = [](QPlatformWindow *window) { return window && !static_cast<QWaylandWindow *>(window)->wlSurface(); }; diff --git a/src/client/qwaylanddisplay_p.h b/src/client/qwaylanddisplay_p.h index 477a5dbf2..e647f41c0 100644 --- a/src/client/qwaylanddisplay_p.h +++ b/src/client/qwaylanddisplay_p.h @@ -259,7 +259,7 @@ public Q_SLOTS: void flushRequests(); Q_SIGNALS: - void reconnected(); + void connected(); void globalAdded(const RegistryGlobal &global); void globalRemoved(const RegistryGlobal &global); diff --git a/src/client/qwaylandshmbackingstore.cpp b/src/client/qwaylandshmbackingstore.cpp index fc5e78221..723b264d5 100644 --- a/src/client/qwaylandshmbackingstore.cpp +++ b/src/client/qwaylandshmbackingstore.cpp @@ -137,7 +137,7 @@ QWaylandShmBackingStore::QWaylandShmBackingStore(QWindow *window, QWaylandDispla : QPlatformBackingStore(window) , mDisplay(display) { - QObject::connect(mDisplay, &QWaylandDisplay::reconnected, window, [this]() { + QObject::connect(mDisplay, &QWaylandDisplay::connected, window, [this]() { auto copy = mBuffers; // clear available buffers so we create new ones // actual deletion is deferred till after resize call so we can copy diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp index f4ed8cd61..e6258893a 100644 --- a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp +++ b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp @@ -24,7 +24,7 @@ QWaylandEglWindow::QWaylandEglWindow(QWindow *window, QWaylandDisplay *display) , m_clientBufferIntegration(static_cast<QWaylandEglClientBufferIntegration *>(mDisplay->clientBufferIntegration())) , m_format(window->requestedFormat()) { - connect(display, &QWaylandDisplay::reconnected, this, [this] { + connect(display, &QWaylandDisplay::connected, this, [this] { m_clientBufferIntegration = static_cast<QWaylandEglClientBufferIntegration *>( mDisplay->clientBufferIntegration()); }); diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp index 685ad1e4d..472ef5fbf 100644 --- a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp +++ b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp @@ -195,7 +195,7 @@ QWaylandGLContext::QWaylandGLContext(EGLDisplay eglDisplay, QWaylandDisplay *dis const QSurfaceFormat &fmt, QPlatformOpenGLContext *share) : QEGLPlatformContext(fmt, share, eglDisplay), m_display(display) { - m_reconnectionWatcher = QObject::connect(m_display, &QWaylandDisplay::reconnected, [this]() { + m_reconnectionWatcher = QObject::connect(m_display, &QWaylandDisplay::connected, [this]() { invalidateContext(); }); |