diff options
author | Svenn-Arne Dragly <s@dragly.com> | 2018-12-01 13:21:24 +0100 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2018-12-04 13:21:05 +0000 |
commit | b62a0c6d6ce988fb0af0e72ac00a5ead13ef8091 (patch) | |
tree | aa3bcdb8091d7a368c9450750c6acdaa0721f6a5 | |
parent | 437c95b5f50b6a433587c1cfb93ecab6b62c7725 (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.cpp | 6 | ||||
-rw-r--r-- | src/runtime/dragon/dragonrenderer.cpp | 22 | ||||
-rw-r--r-- | src/runtime/dragon/dragonrenderer_p.h | 2 | ||||
-rw-r--r-- | src/runtime/dragon/qdragonrenderaspect.cpp | 10 | ||||
-rw-r--r-- | src/runtime/dragon/qdragonrenderaspect_p.h | 2 |
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; |