diff options
author | Svenn-Arne Dragly <svenn-arne.dragly@qt.io> | 2018-01-22 10:42:55 +0100 |
---|---|---|
committer | Svenn-Arne Dragly <svenn-arne.dragly@qt.io> | 2018-02-02 10:20:11 +0000 |
commit | 46319648436814afb5a77755dde6681e304befaf (patch) | |
tree | 9a608913dd9be2ac99bb8e5ebf446dddd69c4c4f /src/quick3d | |
parent | 30abe028f9a95fa32fbb77cb60063d062e13f7ff (diff) |
Keep rendering in sync with aspect jobs by adding barriers
This makes sure that jobs that depend on a specific state of the
renderer (such as context being initialized) never run before this
is the case. This reduces the number of possible race conditions
and checks we need to do to ensure the jobs and the renderer are in
the correct state.
This way we no longer swap buffers when nothing has been rendered,
which in turn makes sure that we only draw one frame when the
render policy is OnDemand and there are no changes.
This change also adds a number of assertions on pointers to
resources to make it easier to detect missing job dependencies.
Finally, this change overhauls the job dependencies in
Renderer and RenderViewBuilder.
Task-number: QTBUG-66024
Change-Id: I3e4e9dd0dd53b5c88f5c1b17d68df42f28eae794
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/quick3d')
-rw-r--r-- | src/quick3d/imports/scene3d/scene3drenderer.cpp | 8 | ||||
-rw-r--r-- | src/quick3d/imports/scene3d/scene3drenderer_p.h | 1 |
2 files changed, 3 insertions, 6 deletions
diff --git a/src/quick3d/imports/scene3d/scene3drenderer.cpp b/src/quick3d/imports/scene3d/scene3drenderer.cpp index 1c9fec4d2..b2e541d35 100644 --- a/src/quick3d/imports/scene3d/scene3drenderer.cpp +++ b/src/quick3d/imports/scene3d/scene3drenderer.cpp @@ -135,7 +135,6 @@ Scene3DRenderer::Scene3DRenderer(Scene3DItem *item, Qt3DCore::QAspectEngine *asp , m_multisample(false) // this value is not used, will be synced from the Scene3DItem instead , m_lastMultisample(false) , m_needsShutdown(true) - , m_blocking(false) { Q_CHECK_PTR(m_item); Q_CHECK_PTR(m_item->window()); @@ -155,9 +154,6 @@ Scene3DRenderer::Scene3DRenderer(Scene3DItem *item, Qt3DCore::QAspectEngine *asp ContextSaver saver; static_cast<QRenderAspectPrivate*>(QRenderAspectPrivate::get(m_renderAspect))->renderInitialize(saver.context()); scheduleRootEntityChange(); - - const bool blockingRendermode = !qgetenv("SCENE3D_BLOCKING_RENDERMODE").isEmpty(); - m_blocking = blockingRendermode; } Scene3DRenderer::~Scene3DRenderer() @@ -207,6 +203,8 @@ void Scene3DRenderer::shutdown() // would return early m_item = nullptr; + static_cast<QRenderAspectPrivate*>(QRenderAspectPrivate::get(m_renderAspect))->abortRenderJobs(); + // Exit the simulation loop so no more jobs are asked for. Once this // returns it is safe to shutdown the renderer. if (m_aspectEngine) { @@ -311,7 +309,7 @@ void Scene3DRenderer::render() m_finalFBO->bind(); // Render Qt3D Scene - static_cast<QRenderAspectPrivate*>(QRenderAspectPrivate::get(m_renderAspect))->renderSynchronous(m_blocking); + static_cast<QRenderAspectPrivate*>(QRenderAspectPrivate::get(m_renderAspect))->tryRenderSynchronous(); // We may have called doneCurrent() so restore the context if the rendering surface was changed // Note: keep in mind that the ContextSave also restores the surface when destroyed diff --git a/src/quick3d/imports/scene3d/scene3drenderer_p.h b/src/quick3d/imports/scene3d/scene3drenderer_p.h index eb2b930ef..7a85bc774 100644 --- a/src/quick3d/imports/scene3d/scene3drenderer_p.h +++ b/src/quick3d/imports/scene3d/scene3drenderer_p.h @@ -109,7 +109,6 @@ private: bool m_multisample; bool m_lastMultisample; bool m_needsShutdown; - bool m_blocking; friend class Scene3DCleaner; }; |