diff options
-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; |