summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2020-08-21 11:09:44 +0200
committerPaul Lemire <paul.lemire@kdab.com>2020-08-25 16:45:59 +0200
commit09eb4028e1221a8aaca8b563a1dba2ae6c39b92c (patch)
tree796ec16f1cec8b65368587e8e734ee9c536706d6 /src/plugins
parent4c7cfd85abdd4a914a5b80e7c406b7cc823840a6 (diff)
Rework Scene3D to fix potential crash on shutdown
- Rework Scene3DRenderer/Scene3DItem to remove coupling and help simplify the flow - Introduce a Scene3DManagerNode to manager lifetime of the Scene3DRenderer. Rely on the Scene3DManagerNode dtor to know to shutdown the Qt3D renderer in the proper thread. - Try to handle the fact that destruction order between Item and SGNode is random by using an AspectEngineDestroyer helper - Stop using a sharedptr to store the QEntity on the Scene3DItem side. This can lead to crashes as the AspectEngine assumes it is the sole owner of the Entity ptr. Change-Id: I14915705eb9ab1195b2b783cbbb45076acc2ac1a Task-number: QTBUG-84847 Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/renderers/opengl/renderer/renderer.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/plugins/renderers/opengl/renderer/renderer.cpp b/src/plugins/renderers/opengl/renderer/renderer.cpp
index 27e00d9cb..27c3a61ca 100644
--- a/src/plugins/renderers/opengl/renderer/renderer.cpp
+++ b/src/plugins/renderers/opengl/renderer/renderer.cpp
@@ -534,7 +534,11 @@ void Renderer::shutdown()
QMutexLocker lock(&m_hasBeenInitializedMutex);
qCDebug(Backend) << Q_FUNC_INFO << "Requesting renderer shutdown";
- m_running.storeRelaxed(0);
+ const bool wasRunning = m_running.testAndSetRelaxed(1, 0);
+
+ // We might have already been shutdown
+ if (!wasRunning)
+ return;
// We delete any renderqueue that we may not have had time to render
// before the surface was destroyed
@@ -1780,7 +1784,7 @@ bool Renderer::shouldRender() const
{
// Only render if something changed during the last frame, or the last frame
// was not rendered successfully (or render-on-demand is disabled)
- return (m_settings->renderPolicy() == QRenderSettings::Always
+ return ((m_settings && m_settings->renderPolicy() == QRenderSettings::Always)
|| m_dirtyBits.marked != 0
|| m_dirtyBits.remaining != 0
|| !m_lastFrameCorrect.loadRelaxed());