diff options
author | Inho Lee <inho.lee@qt.io> | 2022-12-06 13:32:42 +0100 |
---|---|---|
committer | Inho Lee <inho.lee@qt.io> | 2022-12-07 06:56:56 +0100 |
commit | 8f9fa232ac72a5f0caf58e120f3825820423c4de (patch) | |
tree | 22b027da744c036a76d675f660b16e851b842495 /src | |
parent | c894bf34981bf7286e2e248e2d2e1511b0c5de02 (diff) | |
download | qtwayland-8f9fa232ac72a5f0caf58e120f3825820423c4de.tar.gz |
Compositor_api: delete TexProvider properly
If a QuickItem used in a compositor has a texture provider,
it is not destroyed before deleting QRhi. It makes a warning
of unreleased resources.
Fixes: QTBUG-108767
Pick-to: 6.4
Change-Id: Id86839f1de1ff4f374170627d9c1e02c4afb7301
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/compositor/compositor_api/qwaylandquickitem.cpp | 22 | ||||
-rw-r--r-- | src/compositor/compositor_api/qwaylandquickitem_p.h | 1 |
2 files changed, 21 insertions, 2 deletions
diff --git a/src/compositor/compositor_api/qwaylandquickitem.cpp b/src/compositor/compositor_api/qwaylandquickitem.cpp index eb241205..3f729e9f 100644 --- a/src/compositor/compositor_api/qwaylandquickitem.cpp +++ b/src/compositor/compositor_api/qwaylandquickitem.cpp @@ -475,8 +475,10 @@ QWaylandQuickItem::~QWaylandQuickItem() Q_D(QWaylandQuickItem); disconnect(this, &QQuickItem::windowChanged, this, &QWaylandQuickItem::updateWindow); QMutexLocker locker(d->mutex); - if (d->provider) + if (d->provider) { + disconnect(d->texProviderConnection); d->provider->deleteLater(); + } } /*! @@ -1478,8 +1480,24 @@ QSGNode *QWaylandQuickItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeDat d->newTexture = true; } - if (!d->provider) + if (!d->provider) { d->provider = new QWaylandSurfaceTextureProvider(); + if (compositor()) { + d->texProviderConnection = + QObject::connect( + compositor(), + &QObject::destroyed, + this, + [this](QObject*) { + auto *itemPriv = QWaylandQuickItemPrivate::get(this); + if (itemPriv->provider) { + itemPriv->provider->deleteLater(); + itemPriv->provider = nullptr; + } + disconnect(itemPriv->texProviderConnection); } + ); + } + } if (d->newTexture) { d->newTexture = false; diff --git a/src/compositor/compositor_api/qwaylandquickitem_p.h b/src/compositor/compositor_api/qwaylandquickitem_p.h index d3af887f..22ba1c3c 100644 --- a/src/compositor/compositor_api/qwaylandquickitem_p.h +++ b/src/compositor/compositor_api/qwaylandquickitem_p.h @@ -133,6 +133,7 @@ public: QScopedPointer<QWaylandView> view; QPointer<QWaylandSurface> oldSurface; mutable QWaylandSurfaceTextureProvider *provider = nullptr; + QMetaObject::Connection texProviderConnection; bool paintEnabled = true; bool touchEventsEnabled = true; bool inputEventsEnabled = true; |