diff options
author | Gunnar Sletta <gunnar.sletta@nokia.com> | 2011-12-08 13:24:17 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-12-19 14:23:12 +0100 |
commit | 6efca58ab943bbd8c91c8f12ad47484677e2cf60 (patch) | |
tree | d1d5629d17451f36abaca975eed92d9132269e01 /src/quick/items/qquickwindowmanager.cpp | |
parent | 8460eae44c241d5975b3041eedf6e08c9638fd41 (diff) |
Implement "headless mode" for hidden QQuickCanvases
When all views are hidden, we stop the rendering thread,
kill the OpenGL context and all scene graph content.
The entire scenegraph is recreated based on the QML scene
when a view is shown again.
Change-Id: I734619d9f29263a5cdecbcc9b88c3808d1d64a7f
Reviewed-by: Kim M. Kalland <kim.kalland@nokia.com>
Diffstat (limited to 'src/quick/items/qquickwindowmanager.cpp')
-rw-r--r-- | src/quick/items/qquickwindowmanager.cpp | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/src/quick/items/qquickwindowmanager.cpp b/src/quick/items/qquickwindowmanager.cpp index 6c752943e7..ea17cae8f1 100644 --- a/src/quick/items/qquickwindowmanager.cpp +++ b/src/quick/items/qquickwindowmanager.cpp @@ -452,7 +452,7 @@ void QQuickRenderThreadSingleContextWindowManager::handleRemovedWindows() while (m_removed_windows.size()) { QQuickCanvas *canvas = m_removed_windows.takeLast(); #ifdef THREAD_DEBUG - printf(" RenderThread: removing %p\n", canvas); + printf(" RenderThread: removing %p\n", canvas); #endif QQuickCanvasPrivate::get(canvas)->cleanupNodesOnShutdown(); @@ -527,8 +527,13 @@ void QQuickRenderThreadSingleContextWindowManager::run() printf("QML Rendering Thread Started\n"); #endif - if (!gl) - initialize(); + lock(); + Q_ASSERT(!gl); + initialize(); + // Wake GUI as it is waiting for the GL context to have appeared, as + // an indication that the render thread is now running. + wake(); + unlock(); while (!shouldExit) { lock(); @@ -895,10 +900,6 @@ void QQuickRenderThreadSingleContextWindowManager::paint(QQuickCanvas *canvas) printf("GUI: paint called: %p\n", canvas); #endif - return; - - - lockInGui(); exhaustSyncEvent(); @@ -963,7 +964,10 @@ void QQuickRenderThreadSingleContextWindowManager::startRendering() renderThreadAwakened = false; inSync = false; + lockInGui(); start(); // Start the render thread... + wait(); + unlockInGui(); // Animations will now be driven from the rendering thread. if (animationTimer >= 0) { |