summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSvenn-Arne Dragly <s@dragly.com>2018-12-01 13:21:24 +0100
committerLaszlo Agocs <laszlo.agocs@qt.io>2018-12-04 13:21:05 +0000
commitb62a0c6d6ce988fb0af0e72ac00a5ead13ef8091 (patch)
treeaa3bcdb8091d7a368c9450750c6acdaa0721f6a5
parent437c95b5f50b6a433587c1cfb93ecab6b62c7725 (diff)
Dragon: Clean up resources properly on shutdownv2.2.0-rcv2.2.0-beta3
In the threaded case, we need to release the semaphore for the next frame data. For the non-threaded case, we need to make an offscreen surface current before the resources are released. Change-Id: I9df38614eb66e7164651e062a32165fe11259639 Fixes: QT3DS-2530 Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
-rw-r--r--src/imports/studio3d/q3dsstudio3drenderer.cpp6
-rw-r--r--src/runtime/dragon/dragonrenderer.cpp22
-rw-r--r--src/runtime/dragon/dragonrenderer_p.h2
-rw-r--r--src/runtime/dragon/qdragonrenderaspect.cpp10
-rw-r--r--src/runtime/dragon/qdragonrenderaspect_p.h2
5 files changed, 42 insertions, 0 deletions
diff --git a/src/imports/studio3d/q3dsstudio3drenderer.cpp b/src/imports/studio3d/q3dsstudio3drenderer.cpp
index 6d6a6de..44270e6 100644
--- a/src/imports/studio3d/q3dsstudio3drenderer.cpp
+++ b/src/imports/studio3d/q3dsstudio3drenderer.cpp
@@ -113,6 +113,12 @@ Q3DSStudio3DRenderer::~Q3DSStudio3DRenderer()
if (m_renderAspectD != nullptr)
m_renderAspectD->renderShutdown();
+
+ if (m_dragonRenderAspect != nullptr) {
+ m_dragonRenderAspect->beginRenderShutdown();
+ m_currentFrame = Qt3DRender::Dragon::Renderer::Frame();
+ m_dragonRenderAspect->endRenderShutdown();
+ }
}
void Q3DSStudio3DRenderer::invalidateItem()
diff --git a/src/runtime/dragon/dragonrenderer.cpp b/src/runtime/dragon/dragonrenderer.cpp
index 0745858..4b0301d 100644
--- a/src/runtime/dragon/dragonrenderer.cpp
+++ b/src/runtime/dragon/dragonrenderer.cpp
@@ -696,6 +696,28 @@ Renderer::Frame Renderer::doRender(Renderer::Frame frame)
return frame;
}
+void Renderer::beginShutdown()
+{
+ QMutexLocker lock(&m_latestDataMutex);
+
+ m_running.store(0);
+ m_latestData.clear();
+ nextFrameSemaphore.release();
+
+ if (m_renderThread) {
+ m_renderThread->wait();
+ } else {
+ Q_ASSERT(m_offscreenHelper->offscreenSurface());
+ m_glContext->makeCurrent(m_offscreenHelper->offscreenSurface());
+ }
+}
+
+void Renderer::endShutdown()
+{
+ if (!m_renderThread)
+ m_glContext->doneCurrent();
+}
+
RenderThread::RenderThread(Renderer *renderer)
: QThread()
, m_renderer(renderer)
diff --git a/src/runtime/dragon/dragonrenderer_p.h b/src/runtime/dragon/dragonrenderer_p.h
index 446fef7..af8e31a 100644
--- a/src/runtime/dragon/dragonrenderer_p.h
+++ b/src/runtime/dragon/dragonrenderer_p.h
@@ -171,6 +171,8 @@ public:
QOpenGLContext *openGLContext();
+ void beginShutdown();
+ void endShutdown();
private:
// Render thread
QScopedPointer<RenderThread> m_renderThread;
diff --git a/src/runtime/dragon/qdragonrenderaspect.cpp b/src/runtime/dragon/qdragonrenderaspect.cpp
index 4296d98..979ed90 100644
--- a/src/runtime/dragon/qdragonrenderaspect.cpp
+++ b/src/runtime/dragon/qdragonrenderaspect.cpp
@@ -524,6 +524,16 @@ void QDragonRenderAspect::initialize(QOpenGLContext *context)
m_renderer->initialize(context);
}
+void QDragonRenderAspect::beginRenderShutdown()
+{
+ m_renderer->beginShutdown();
+}
+
+void QDragonRenderAspect::endRenderShutdown()
+{
+ m_renderer->endShutdown();
+}
+
} // namespace Dragon
} // namespace Qt3DRender
QT_END_NAMESPACE
diff --git a/src/runtime/dragon/qdragonrenderaspect_p.h b/src/runtime/dragon/qdragonrenderaspect_p.h
index 32cb559..689e180 100644
--- a/src/runtime/dragon/qdragonrenderaspect_p.h
+++ b/src/runtime/dragon/qdragonrenderaspect_p.h
@@ -118,6 +118,8 @@ public:
Renderer::Frame renderSynchronous(Renderer::Frame frame);
void initialize(QOpenGLContext *context);
+ void endRenderShutdown();
+ void beginRenderShutdown();
private:
QVector<Qt3DCore::QAspectJobPtr> jobsToExecute(qint64 time) override;