From b2a3cede2cdc8aa2fe973cd31471d2aab8904a59 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 19 Jun 2020 17:06:14 +1000 Subject: [PATCH] renderer: re-use the same opengl instance for all background rendering Previously the OpenGL instance was tied to each render/cache task, creating and destroying it each time one started and stopped. This was completely unnecessary since the instance holds no state and can be shared by all of the render tasks without having to expensively start a new one. --- app/core.cpp | 10 +++++--- app/render/backend/opengl/openglbackend.cpp | 23 +----------------- app/render/backend/opengl/openglbackend.h | 5 ---- app/render/backend/opengl/openglproxy.cpp | 26 +++++++++++++++++++++ app/render/backend/opengl/openglproxy.h | 11 +++++++++ app/render/backend/opengl/openglworker.cpp | 13 +++++------ app/render/backend/opengl/openglworker.h | 5 +--- 7 files changed, 52 insertions(+), 41 deletions(-) diff --git a/app/core.cpp b/app/core.cpp index 55f0b2c49..e8f34fcf4 100644 --- a/app/core.cpp +++ b/app/core.cpp @@ -181,6 +181,9 @@ void Core::Start() // the fact that some of the config paths set by default rely on the app name having been set (in main()) Config::Current().SetDefaults(); + // Load application config + Config::Load(); + // Declare custom types for Qt signal/slot system DeclareTypesForQt(); @@ -193,9 +196,8 @@ void Core::Start() // Initialize task manager TaskManager::CreateInstance(); - // Load application config - Config::Load(); - + // Initialize OpenGL service + OpenGLProxy::CreateInstance(); // // Start application @@ -223,6 +225,8 @@ void Core::Stop() } } + OpenGLProxy::DestroyInstance(); + MenuShared::DestroyInstance(); TaskManager::DestroyInstance(); diff --git a/app/render/backend/opengl/openglbackend.cpp b/app/render/backend/opengl/openglbackend.cpp index a66fa8928..60e81f914 100644 --- a/app/render/backend/opengl/openglbackend.cpp +++ b/app/render/backend/opengl/openglbackend.cpp @@ -27,38 +27,17 @@ OLIVE_NAMESPACE_ENTER OpenGLBackend::OpenGLBackend(QObject* parent) : RenderBackend(parent) { - proxy_ = new OpenGLProxy(); - QThread* proxy_thread = new QThread(); - proxy_thread->start(QThread::IdlePriority); - proxy_->moveToThread(proxy_thread); - - if (!proxy_->Init()) { - ClearProxy(); - } } OpenGLBackend::~OpenGLBackend() { Close(); - - ClearProxy(); } RenderWorker *OpenGLBackend::CreateNewWorker() { - return new OpenGLWorker(this, proxy_); -} - -void OpenGLBackend::ClearProxy() -{ - if (proxy_) { - proxy_->thread()->quit(); - proxy_->thread()->wait(); - proxy_->thread()->deleteLater(); - proxy_->deleteLater(); - proxy_ = nullptr; - } + return new OpenGLWorker(this); } OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/opengl/openglbackend.h b/app/render/backend/opengl/openglbackend.h index a1df6dcab..7d88611f3 100644 --- a/app/render/backend/opengl/openglbackend.h +++ b/app/render/backend/opengl/openglbackend.h @@ -36,11 +36,6 @@ public: protected: virtual RenderWorker* CreateNewWorker() override; -private: - void ClearProxy(); - - OpenGLProxy* proxy_; - }; OLIVE_NAMESPACE_EXIT diff --git a/app/render/backend/opengl/openglproxy.cpp b/app/render/backend/opengl/openglproxy.cpp index aff4dac42..c96e52d7a 100644 --- a/app/render/backend/opengl/openglproxy.cpp +++ b/app/render/backend/opengl/openglproxy.cpp @@ -33,6 +33,8 @@ OLIVE_NAMESPACE_ENTER +OpenGLProxy* OpenGLProxy::instance_ = nullptr; + OpenGLProxy::OpenGLProxy(QObject *parent) : QObject(parent), ctx_(nullptr), @@ -48,6 +50,30 @@ OpenGLProxy::~OpenGLProxy() surface_.destroy(); } +void OpenGLProxy::CreateInstance() +{ + instance_ = new OpenGLProxy(); + + QThread* proxy_thread = new QThread(); + proxy_thread->start(QThread::IdlePriority); + instance_->moveToThread(proxy_thread); + + if (!instance_->Init()) { + DestroyInstance(); + } +} + +void OpenGLProxy::DestroyInstance() +{ + if (instance_) { + instance_->thread()->quit(); + instance_->thread()->wait(); + instance_->thread()->deleteLater(); + instance_->deleteLater(); + instance_ = nullptr; + } +} + bool OpenGLProxy::Init() { // Create context object diff --git a/app/render/backend/opengl/openglproxy.h b/app/render/backend/opengl/openglproxy.h index 7c6878626..ff59f76b9 100644 --- a/app/render/backend/opengl/openglproxy.h +++ b/app/render/backend/opengl/openglproxy.h @@ -41,6 +41,15 @@ public: virtual ~OpenGLProxy() override; + static void CreateInstance(); + + static void DestroyInstance(); + + static OpenGLProxy* instance() + { + return instance_; + } + /** * @brief Initialize OpenGL instance in whatever thread this object is a part of * @@ -101,6 +110,8 @@ private: OpenGLTextureCache texture_cache_; + static OpenGLProxy* instance_; + private slots: void FinishInit(); diff --git a/app/render/backend/opengl/openglworker.cpp b/app/render/backend/opengl/openglworker.cpp index b3e10b71c..ec518ffc7 100644 --- a/app/render/backend/opengl/openglworker.cpp +++ b/app/render/backend/opengl/openglworker.cpp @@ -22,15 +22,14 @@ OLIVE_NAMESPACE_ENTER -OpenGLWorker::OpenGLWorker(RenderBackend *parent, OpenGLProxy* proxy) : - RenderWorker(parent), - proxy_(proxy) +OpenGLWorker::OpenGLWorker(RenderBackend *parent) : + RenderWorker(parent) { } void OpenGLWorker::TextureToFrame(const QVariant &texture, FramePtr frame, const QMatrix4x4& mat) const { - QMetaObject::invokeMethod(proxy_, + QMetaObject::invokeMethod(OpenGLProxy::instance(), "TextureToBuffer", Qt::BlockingQueuedConnection, Q_ARG(const QVariant&, texture), @@ -42,7 +41,7 @@ QVariant OpenGLWorker::FootageFrameToTexture(StreamPtr stream, FramePtr frame) c { QVariant value; - QMetaObject::invokeMethod(proxy_, + QMetaObject::invokeMethod(OpenGLProxy::instance(), "FrameToValue", Qt::BlockingQueuedConnection, Q_RETURN_ARG(QVariant, value), @@ -58,7 +57,7 @@ QVariant OpenGLWorker::CachedFrameToTexture(FramePtr frame) const { QVariant value; - QMetaObject::invokeMethod(proxy_, + QMetaObject::invokeMethod(OpenGLProxy::instance(), "PreCachedFrameToValue", Qt::BlockingQueuedConnection, Q_RETURN_ARG(QVariant, value), @@ -71,7 +70,7 @@ QVariant OpenGLWorker::ProcessShader(const Node *node, const TimeRange &range, c { QVariant value; - QMetaObject::invokeMethod(proxy_, + QMetaObject::invokeMethod(OpenGLProxy::instance(), "RunNodeAccelerated", Qt::BlockingQueuedConnection, Q_RETURN_ARG(QVariant, value), diff --git a/app/render/backend/opengl/openglworker.h b/app/render/backend/opengl/openglworker.h index 23b5e787f..75eed65f8 100644 --- a/app/render/backend/opengl/openglworker.h +++ b/app/render/backend/opengl/openglworker.h @@ -29,7 +29,7 @@ OLIVE_NAMESPACE_ENTER class OpenGLWorker : public RenderWorker { public: - OpenGLWorker(RenderBackend* parent, OpenGLProxy* proxy); + OpenGLWorker(RenderBackend* parent); protected: virtual void TextureToFrame(const QVariant& texture, FramePtr frame, const QMatrix4x4 &mat) const override; @@ -42,9 +42,6 @@ protected: virtual bool TextureHasAlpha(const QVariant& v) const override; -private: - OpenGLProxy* proxy_; - }; OLIVE_NAMESPACE_EXIT