From 5e0bf417fb38c53d4ae43f9f84fe42461cd2e00c Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Thu, 28 May 2020 16:58:00 +0200 Subject: Fix handling of destroy-show and re-enable the zoom test for qmlpreview Fixes: QTBUG-84059 Change-Id: Id70c043f96e9525a5a6053efbf99c5ea3408da65 Reviewed-by: Andy Nichols --- src/quick/scenegraph/qsgthreadedrenderloop.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'src/quick/scenegraph/qsgthreadedrenderloop.cpp') diff --git a/src/quick/scenegraph/qsgthreadedrenderloop.cpp b/src/quick/scenegraph/qsgthreadedrenderloop.cpp index 1318b2c034..76f65e5f85 100644 --- a/src/quick/scenegraph/qsgthreadedrenderloop.cpp +++ b/src/quick/scenegraph/qsgthreadedrenderloop.cpp @@ -1237,6 +1237,20 @@ void QSGThreadedRenderLoop::windowDestroyed(QQuickWindow *window) void QSGThreadedRenderLoop::releaseSwapchain(QQuickWindow *window) { QQuickWindowPrivate *wd = QQuickWindowPrivate::get(window); + + // Counterintuitive, because this is not needed under normal circumstances + // due to the render loop using a dedicated rendercontext per thread, so + // per window. Problem is, there are cases like calling destroy(); show(); + // on the QQuickWindow. (and we get here on SurfaceAboutToBeDestroyed, i.e. + // from destroy()) + // + // That means recreating the native window and all the related graphics + // infrastructure, but the rendercontext stays around. So still have to + // notify the renderer to invalidate the relevant objects in the caches. + // + if (wd->renderer) + wd->renderer->invalidatePipelineCacheDependency(wd->rpDescForSwapchain); + delete wd->rpDescForSwapchain; wd->rpDescForSwapchain = nullptr; delete wd->swapchain; @@ -1419,8 +1433,9 @@ bool QSGThreadedRenderLoop::eventFilter(QObject *watched, QEvent *event) w->thread->waitCondition.wait(&w->thread->mutex); w->thread->mutex.unlock(); } - window->removeEventFilter(this); } + // keep this filter on the window - needed for uncommon but valid + // sequences of calls like window->destroy(); window->show(); } break; default: -- cgit v1.2.3