From 797a4eae16d986b62324149d2be40a8d3db60ddf Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 27 Aug 2019 23:49:05 +1000 Subject: [PATCH] share contexts on all renderthreads --- app/node/processor/renderer/renderer.cpp | 2 +- app/node/processor/renderer/rendererthread.cpp | 5 ++++- app/node/processor/renderer/rendererthread.h | 5 ++++- app/render/renderinstance.cpp | 13 +++++++++++++ app/render/renderinstance.h | 4 ++++ 5 files changed, 26 insertions(+), 3 deletions(-) diff --git a/app/node/processor/renderer/renderer.cpp b/app/node/processor/renderer/renderer.cpp index 79f898f63..9bb112edc 100644 --- a/app/node/processor/renderer/renderer.cpp +++ b/app/node/processor/renderer/renderer.cpp @@ -192,7 +192,7 @@ void RendererProcessor::Start() threads_.resize(QThread::idealThreadCount()); for (int i=0;i(width_, height_, format_, mode_); + threads_[i] = std::make_shared(QOpenGLContext::currentContext(), width_, height_, format_, mode_); threads_[i]->StartThread(QThread::HighPriority); // Ensure this connection is "Queued" so that it always runs in this object's threaded rather than any of the diff --git a/app/node/processor/renderer/rendererthread.cpp b/app/node/processor/renderer/rendererthread.cpp index 3f40a6918..21654dedb 100644 --- a/app/node/processor/renderer/rendererthread.cpp +++ b/app/node/processor/renderer/rendererthread.cpp @@ -22,7 +22,8 @@ #include -RendererThread::RendererThread(const int &width, const int &height, const olive::PixelFormat &format, const olive::RenderMode &mode) : +RendererThread::RendererThread(QOpenGLContext *share_ctx, const int &width, const int &height, const olive::PixelFormat &format, const olive::RenderMode &mode) : + share_ctx_(share_ctx), cancelled_(false), width_(width), height_(height), @@ -80,6 +81,8 @@ void RendererThread::run() RenderInstance instance(width_, height_, format_, mode_); render_instance_ = &instance; + instance.SetShareContext(share_ctx_); + // Allocate and create resources if (instance.Start()) { diff --git a/app/node/processor/renderer/rendererthread.h b/app/node/processor/renderer/rendererthread.h index 91856cd80..0f9abe3a1 100644 --- a/app/node/processor/renderer/rendererthread.h +++ b/app/node/processor/renderer/rendererthread.h @@ -34,7 +34,8 @@ class RendererThread : public QThread { Q_OBJECT public: - RendererThread(const int& width, + RendererThread(QOpenGLContext* share_ctx, + const int& width, const int& height, const olive::PixelFormat& format, const olive::RenderMode& mode); @@ -53,6 +54,8 @@ signals: void FinishedPath(); private: + QOpenGLContext* share_ctx_; + QWaitCondition wait_cond_; QMutex mutex_; diff --git a/app/render/renderinstance.cpp b/app/render/renderinstance.cpp index b0d72a942..9a49d3720 100644 --- a/app/render/renderinstance.cpp +++ b/app/render/renderinstance.cpp @@ -26,6 +26,7 @@ RenderInstance::RenderInstance(const int& width, const int& height, const olive::PixelFormat& format, const olive::RenderMode& mode) : + share_ctx_(nullptr), width_(width), height_(height), format_(format), @@ -33,8 +34,20 @@ RenderInstance::RenderInstance(const int& width, { } +void RenderInstance::SetShareContext(QOpenGLContext *share) +{ + Q_ASSERT(!IsStarted()); + + share_ctx_ = share; +} + bool RenderInstance::Start() { + // If we're sharing resources, set this up now + if (share_ctx_ != nullptr) { + ctx_.setShareContext(share_ctx_); + } + // Create OpenGL context (automatically destroys any existing if there is one) if (!ctx_.create()) { qWarning() << tr("Failed to create OpenGL context in thread %1").arg(reinterpret_cast(this)); diff --git a/app/render/renderinstance.h b/app/render/renderinstance.h index 58a390309..01b518eb0 100644 --- a/app/render/renderinstance.h +++ b/app/render/renderinstance.h @@ -43,6 +43,8 @@ public: const olive::PixelFormat& format, const olive::RenderMode& mode); + void SetShareContext(QOpenGLContext* share); + bool Start(); void Stop(); @@ -54,6 +56,8 @@ public: private: QOpenGLContext ctx_; + QOpenGLContext* share_ctx_; + QOffscreenSurface surface_; RenderFramebuffer buffer_;