diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2019-08-06 15:32:26 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2019-08-07 10:47:09 +0300 |
commit | 884f6b2c6413d506561f8ab57dc5143c239a3398 (patch) | |
tree | 760d7fee4accdc7b184582c912df95991d2fa3e4 /src | |
parent | 21b950c54d2f4a262a63ae6872b1b10ea888b772 (diff) |
Initialize runtime after first Quick frame has been shown
This allows at least showing something on the screen while the
presentation loads. The render thread is still blocked, so only a
static QML scene can be shown.
Task-number: QT3DS-3805
Change-Id: Ib0994b739506a445833b5fa5b39f2f5322dd17d2
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/api/studio3dqml/q3dsrenderer.cpp | 32 | ||||
-rw-r--r-- | src/api/studio3dqml/q3dsrenderer_p.h | 2 |
2 files changed, 30 insertions, 4 deletions
diff --git a/src/api/studio3dqml/q3dsrenderer.cpp b/src/api/studio3dqml/q3dsrenderer.cpp index e3fce5c..4d48a93 100644 --- a/src/api/studio3dqml/q3dsrenderer.cpp +++ b/src/api/studio3dqml/q3dsrenderer.cpp @@ -40,6 +40,7 @@ #include <QtStudio3D/private/q3dsdatainput_p.h> #include <QtCore/qdebug.h> +#include <QtCore/qrunnable.h> #include <QtGui/qwindow.h> #include <QtGui/qopenglcontext.h> #include <QtQuick/qquickwindow.h> @@ -100,6 +101,8 @@ void Q3DSRenderer::synchronize(QQuickFramebufferObject *inView) m_presentation->setVariantList(m_commands.m_variantList); m_presentation->setSource(m_commands.m_source); m_presentation->setDelayedLoading(m_commands.m_delayedLoading); + m_commands.m_sourceChanged = false; + m_commands.m_variantListChanged = false; m_initialized = false; m_initializationFailure = false; m_error.clear(); @@ -125,6 +128,28 @@ void Q3DSRenderer::releaseRuntime() } } +class RuntimeInitializer : public QRunnable +{ +public: + RuntimeInitializer(Q3DSRenderer *r) + : m_renderer(r) + { } + void run() override + { + if (!m_renderer->m_initialized && !m_renderer->m_initializationFailure) { + m_renderer->m_initialized + = m_renderer->initializeRuntime(m_renderer->framebufferObject()); + m_renderer->m_initializationFailure = !m_renderer->m_initialized; + if (m_renderer->m_initializationFailure) + m_renderer->m_commands.clear(true); + } + } + +private: + Q3DSRenderer *m_renderer; +}; + + /** Invoked by the QML scene graph indicating that it's time to render. * Calls `draw()` if the plugin is visible, or `processCommands()` otherwise. * @@ -138,10 +163,9 @@ void Q3DSRenderer::render() // We may start in a non visible state but we still need // to init the runtime otherwise the commands are never processed if (!m_initialized && !m_initializationFailure) { - m_initialized = initializeRuntime(this->framebufferObject()); - m_initializationFailure = !m_initialized; - if (m_initializationFailure) - m_commands.clear(true); + auto *ri = new RuntimeInitializer(this); + // Initialize runtime after the first frame has been drawn + m_window->scheduleRenderJob(ri, QQuickWindow::AfterSwapStage); } // Don't render if the plugin is hidden; however, if hidden, but sure diff --git a/src/api/studio3dqml/q3dsrenderer_p.h b/src/api/studio3dqml/q3dsrenderer_p.h index 8927f34..61e8770 100644 --- a/src/api/studio3dqml/q3dsrenderer_p.h +++ b/src/api/studio3dqml/q3dsrenderer_p.h @@ -104,6 +104,8 @@ protected: Q3DSPresentation *m_presentation; QString m_error; QElapsedTimer *m_startupTimer; + + friend class RuntimeInitializer; }; QT_END_NAMESPACE |