From 0eda91a0cbcc857e1fcd500a87903739c10d1845 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 25 Nov 2020 08:59:14 +1100 Subject: [PATCH] renderer: destroy surface in main thread --- app/render/opengl/openglrenderer.cpp | 14 +++++++++----- app/render/opengl/openglrenderer.h | 2 ++ app/render/renderer.h | 2 ++ app/render/rendererthreadwrapper.cpp | 4 +++- app/render/rendererthreadwrapper.h | 3 +++ app/render/rendermanager.cpp | 1 + app/widget/manageddisplay/manageddisplay.cpp | 1 + 7 files changed, 21 insertions(+), 6 deletions(-) diff --git a/app/render/opengl/openglrenderer.cpp b/app/render/opengl/openglrenderer.cpp index b07b7cf30..a92bb10f2 100644 --- a/app/render/opengl/openglrenderer.cpp +++ b/app/render/opengl/openglrenderer.cpp @@ -82,6 +82,7 @@ OpenGLRenderer::OpenGLRenderer(QObject* parent) : OpenGLRenderer::~OpenGLRenderer() { Destroy(); + PostDestroy(); } void OpenGLRenderer::Init(QOpenGLContext *existing_ctx) @@ -114,6 +115,14 @@ bool OpenGLRenderer::Init() return true; } +void OpenGLRenderer::PostDestroy() +{ + // Destroy surface if we created it + if (surface_.isValid()) { + surface_.destroy(); + } +} + void OpenGLRenderer::PostInit() { // Make context current on that surface @@ -142,11 +151,6 @@ void OpenGLRenderer::DestroyInternal() delete context_; } context_ = nullptr; - - // Destroy surface if we created it - if (surface_.isValid()) { - surface_.destroy(); - } } } diff --git a/app/render/opengl/openglrenderer.h b/app/render/opengl/openglrenderer.h index ef58578c8..49aa07252 100644 --- a/app/render/opengl/openglrenderer.h +++ b/app/render/opengl/openglrenderer.h @@ -44,6 +44,8 @@ public: virtual bool Init() override; + virtual void PostDestroy() override; + public slots: virtual void PostInit() override; diff --git a/app/render/renderer.h b/app/render/renderer.h index e7f450737..724c76b22 100644 --- a/app/render/renderer.h +++ b/app/render/renderer.h @@ -67,6 +67,8 @@ public: void Destroy(); + virtual void PostDestroy() = 0; + public slots: virtual void PostInit() = 0; diff --git a/app/render/rendererthreadwrapper.cpp b/app/render/rendererthreadwrapper.cpp index 9aba561d8..2b86c1539 100644 --- a/app/render/rendererthreadwrapper.cpp +++ b/app/render/rendererthreadwrapper.cpp @@ -58,12 +58,14 @@ void RendererThreadWrapper::DestroyInternal() { if (thread_) { QMetaObject::invokeMethod(inner_, "DestroyInternal", Qt::BlockingQueuedConnection); - inner_ = nullptr; thread_->quit(); thread_->wait(); delete thread_; thread_ = nullptr; + + // Destroy in main thread + inner_->PostDestroy(); } } diff --git a/app/render/rendererthreadwrapper.h b/app/render/rendererthreadwrapper.h index c984ed560..875a86d74 100644 --- a/app/render/rendererthreadwrapper.h +++ b/app/render/rendererthreadwrapper.h @@ -35,11 +35,14 @@ public: virtual ~RendererThreadWrapper() override { Destroy(); + PostDestroy(); delete inner_; } virtual bool Init() override; + virtual void PostDestroy() override {} + public slots: virtual void PostInit() override; diff --git a/app/render/rendermanager.cpp b/app/render/rendermanager.cpp index f771502b5..567b841d6 100644 --- a/app/render/rendermanager.cpp +++ b/app/render/rendermanager.cpp @@ -75,6 +75,7 @@ RenderManager::~RenderManager() delete still_cache_; context_->Destroy(); + context_->PostDestroy(); delete context_; } } diff --git a/app/widget/manageddisplay/manageddisplay.cpp b/app/widget/manageddisplay/manageddisplay.cpp index bbea5112f..1ac964fd7 100644 --- a/app/widget/manageddisplay/manageddisplay.cpp +++ b/app/widget/manageddisplay/manageddisplay.cpp @@ -208,6 +208,7 @@ void ManagedDisplayWidget::MenuColorspaceSelect(QAction *action) void ManagedDisplayWidget::OnDestroy() { attached_renderer_->Destroy(); + attached_renderer_->PostDestroy(); } void ManagedDisplayWidget::SetColorTransform(const ColorTransform &transform)