summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2019-08-06 15:32:26 +0300
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2019-08-07 10:47:09 +0300
commit884f6b2c6413d506561f8ab57dc5143c239a3398 (patch)
tree760d7fee4accdc7b184582c912df95991d2fa3e4 /src
parent21b950c54d2f4a262a63ae6872b1b10ea888b772 (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.cpp32
-rw-r--r--src/api/studio3dqml/q3dsrenderer_p.h2
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