diff options
author | Samuel Rødal <samuel.rodal@digia.com> | 2012-11-07 17:03:07 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2012-11-08 13:15:35 +0100 |
commit | 71d8505203714f2b487de08f4798b05cc55d8aa6 (patch) | |
tree | a220a6f8a39d4b68ea8f9931f2073f9cf84a4554 | |
parent | 99b7d495530335bef8590e6b8a1266e3ec570955 (diff) |
Prevent crash when doing threaded rendering of multiple windows.
Don't call renderSceneGraph() on non-renderable windows. We also don't
call syncSceneGraph() on them, which is where the renderer will be set.
Also get rid of harmless warning about non-renderable windows.
Change-Id: I24739abefe0d554efb568514057719f981590c28
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
-rw-r--r-- | src/quick/items/qquickthreadedwindowmanager.cpp | 12 | ||||
-rw-r--r-- | src/quick/items/qquickthreadedwindowmanager_p.h | 1 |
2 files changed, 8 insertions, 5 deletions
diff --git a/src/quick/items/qquickthreadedwindowmanager.cpp b/src/quick/items/qquickthreadedwindowmanager.cpp index fac4fb034f..4c38686298 100644 --- a/src/quick/items/qquickthreadedwindowmanager.cpp +++ b/src/quick/items/qquickthreadedwindowmanager.cpp @@ -184,6 +184,7 @@ void QQuickRenderThreadSingleContextWindowManager::handleAddedWindow(QQuickWindo data->sizeWasChanged = false; data->windowSize = window->size(); data->isVisible = window->isVisible(); + data->isRenderable = QQuickWindowPrivate::get(window)->isRenderable(); m_rendered_windows[window] = data; isExternalUpdatePending = true; @@ -397,7 +398,9 @@ void QQuickRenderThreadSingleContextWindowManager::run() WindowData *windowData = it.value(); QQuickWindowPrivate *windowPrivate = QQuickWindowPrivate::get(window); - if (windowPrivate->isRenderable()) { + windowData->isRenderable = windowPrivate->isRenderable(); + + if (windowData->isRenderable) { gl->makeCurrent(window); if (windowData->viewportSize != windowData->windowSize) { @@ -410,10 +413,6 @@ void QQuickRenderThreadSingleContextWindowManager::run() } windowPrivate->syncSceneGraph(); - } else { - qWarning().nospace() - << "Non-renderable window " << window - << " (" << window->geometry() << ")."; } } inSync = false; @@ -435,6 +434,9 @@ void QQuickRenderThreadSingleContextWindowManager::run() WindowData *windowData = it.value(); QQuickWindowPrivate *windowPrivate = QQuickWindowPrivate::get(window); + if (!windowData->isRenderable) + continue; + #ifdef THREAD_DEBUG printf(" RenderThread: Rendering window %p\n", window); #endif diff --git a/src/quick/items/qquickthreadedwindowmanager_p.h b/src/quick/items/qquickthreadedwindowmanager_p.h index 9e28d87eef..b71620f933 100644 --- a/src/quick/items/qquickthreadedwindowmanager_p.h +++ b/src/quick/items/qquickthreadedwindowmanager_p.h @@ -159,6 +159,7 @@ private: uint sizeWasChanged : 1; uint isVisible : 1; + uint isRenderable : 1; }; QHash<QQuickWindow *, WindowData *> m_rendered_windows; |