diff options
author | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> | 2020-05-14 11:19:19 +0200 |
---|---|---|
committer | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io> | 2020-05-14 14:53:47 +0200 |
commit | 7ad4b549442472e8c950189dd78b2e83098baa48 (patch) | |
tree | 28b6fbca4ee1df69c132fe790fc685746710d522 /src/quick/items | |
parent | e27b7e6eaef48ea9710d0e1c5931067de744bd1b (diff) |
RHI: Fix crash in QQuickWindow when updating render target
The crash is reproducible e.g. when a resize event comes
after a render target has been created, and it has to be
recreated. It would then delete the render pass descriptor
but it would still be in the pipeline cache in the renderer.
We need to tell the renderer it is invalidated before deleting
it.
Discovered as part of making QQuickWidget work on RHI. The
crash was reproducible by creating a new tab widget in the
qquickwidget example.
Task-number: QTBUG-78638
Change-Id: Ia840cc423a811aee18c568d43624b6bf852246f7
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
Diffstat (limited to 'src/quick/items')
-rw-r--r-- | src/quick/items/qquickwindow.cpp | 9 | ||||
-rw-r--r-- | src/quick/items/qquickwindow_p.h | 2 |
2 files changed, 7 insertions, 4 deletions
diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index 330bf4a59f..c53fd00e45 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -510,9 +510,12 @@ void forceUpdate(QQuickItem *item) forceUpdate(items.at(i)); } -void QQuickWindowRenderTarget::reset(QRhi *rhi) +void QQuickWindowRenderTarget::reset(QRhi *rhi, QSGRenderer *renderer) { if (rhi && owns) { + if (renderer != nullptr && rpDesc != nullptr) + renderer->invalidatePipelineCacheDependency(rpDesc); + delete renderTarget; delete rpDesc; delete texture; @@ -535,7 +538,7 @@ void QQuickWindowPrivate::ensureCustomRenderTarget() redirect.renderTargetDirty = false; - redirect.rt.reset(rhi); + redirect.rt.reset(rhi, renderer); // a default constructed QQuickRenderTarget means no redirection if (customRenderTarget.isNull()) @@ -765,7 +768,7 @@ QQuickWindowPrivate::QQuickWindowPrivate() QQuickWindowPrivate::~QQuickWindowPrivate() { - redirect.rt.reset(rhi); + redirect.rt.reset(rhi, renderer); delete customRenderStage; if (QQmlInspectorService *service = QQmlDebugConnector::service<QQmlInspectorService>()) service->removeWindow(q_func()); diff --git a/src/quick/items/qquickwindow_p.h b/src/quick/items/qquickwindow_p.h index ba8691cba3..3d629cd74f 100644 --- a/src/quick/items/qquickwindow_p.h +++ b/src/quick/items/qquickwindow_p.h @@ -110,7 +110,7 @@ public: class QQuickWindowRenderTarget { public: - void reset(QRhi *rhi); + void reset(QRhi *rhi, QSGRenderer *renderer); QRhiRenderTarget *renderTarget = nullptr; QRhiRenderPassDescriptor *rpDesc = nullptr; QRhiTexture *texture = nullptr; |