aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamuel Rødal <samuel.rodal@digia.com>2012-11-07 17:03:07 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-11-08 13:15:35 +0100
commit71d8505203714f2b487de08f4798b05cc55d8aa6 (patch)
treea220a6f8a39d4b68ea8f9931f2073f9cf84a4554
parent99b7d495530335bef8590e6b8a1266e3ec570955 (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.cpp12
-rw-r--r--src/quick/items/qquickthreadedwindowmanager_p.h1
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;