summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2017-03-21 09:03:50 +0100
committerPaul Lemire <paul.lemire@kdab.com>2018-03-16 11:20:59 +0000
commit02dff327fae71d6efdda091f8ae0a4483e72e849 (patch)
treeebd0f7ed4b00e338d87203b15c979436b916a06d
parentf72228046be1aaa707ab45c03dbd07b77f5acc6a (diff)
Renderer: instantiate, initialize and shutdown CommandThread
Change-Id: I89a3ee4b6d72565c1be91244c1bde39f1dd7101b Reviewed-by: Mike Krus <mike.krus@kdab.com> Reviewed-by: Svenn-Arne Dragly <svenn-arne.dragly@qt.io> Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r--src/render/backend/abstractrenderer_p.h6
-rw-r--r--src/render/backend/renderer.cpp12
-rw-r--r--src/render/backend/renderer_p.h7
-rw-r--r--tests/auto/render/commons/testrenderer.h3
4 files changed, 28 insertions, 0 deletions
diff --git a/src/render/backend/abstractrenderer_p.h b/src/render/backend/abstractrenderer_p.h
index 54f37ea21..182c4ea36 100644
--- a/src/render/backend/abstractrenderer_p.h
+++ b/src/render/backend/abstractrenderer_p.h
@@ -83,6 +83,7 @@ class FrameGraphNode;
class RenderSettings;
class BackendNode;
class OffscreenSurfaceHelper;
+class Shader;
class QT3DRENDERSHARED_PRIVATE_EXPORT AbstractRenderer
{
@@ -170,6 +171,11 @@ public:
virtual void setOffscreenSurfaceHelper(OffscreenSurfaceHelper *helper) = 0;
virtual QSurfaceFormat format() = 0;
virtual QOpenGLContext *shareContext() const = 0;
+
+
+ // These commands are executed in a dedicated command thread
+ // More will be added later
+ virtual void loadShader(Shader *shader) const = 0;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractRenderer::BackendNodeDirtySet)
diff --git a/src/render/backend/renderer.cpp b/src/render/backend/renderer.cpp
index bdc024308..68b6dd1fd 100644
--- a/src/render/backend/renderer.cpp
+++ b/src/render/backend/renderer.cpp
@@ -89,6 +89,7 @@
#include <Qt3DRender/private/buffercapture_p.h>
#include <Qt3DRender/private/offscreensurfacehelper_p.h>
#include <Qt3DRender/private/renderviewbuilder_p.h>
+#include <Qt3DRender/private/commandthread_p.h>
#include <Qt3DRender/qcameralens.h>
#include <Qt3DCore/private/qeventfilterservice_p.h>
@@ -158,6 +159,7 @@ Renderer::Renderer(QRenderAspect::RenderType type)
, m_graphicsContext(nullptr)
, m_renderQueue(new RenderQueue())
, m_renderThread(type == QRenderAspect::Threaded ? new RenderThread(this) : nullptr)
+ , m_commandThread(new CommandThread(this))
, m_vsyncFrameAdvanceService(new VSyncFrameAdvanceService(m_renderThread != nullptr))
, m_waitForInitializationToBeCompleted(0)
, m_pickEventFilter(new PickEventFilter())
@@ -317,6 +319,11 @@ QOpenGLContext *Renderer::shareContext() const
: nullptr);
}
+void Renderer::loadShader(Shader *shader) const
+{
+ Q_UNUSED(shader);
+}
+
void Renderer::setOpenGLContext(QOpenGLContext *context)
{
m_glContext = context;
@@ -372,6 +379,9 @@ void Renderer::initialize()
// Note: we don't have a surface at this point
// The context will be made current later on (at render time)
m_graphicsContext->setOpenGLContext(ctx);
+
+ // Initialize command thread
+ m_commandThread->initialize(ctx);
}
// Store the format used by the context and queue up creating an
@@ -405,6 +415,8 @@ void Renderer::shutdown()
qDeleteAll(m_renderQueue->nextFrameQueue());
m_renderQueue->reset();
+ m_commandThread->shutdown();
+
if (!m_renderThread) {
releaseGraphicsResources();
} else {
diff --git a/src/render/backend/renderer_p.h b/src/render/backend/renderer_p.h
index af4d5c9de..d79bf6136 100644
--- a/src/render/backend/renderer_p.h
+++ b/src/render/backend/renderer_p.h
@@ -137,6 +137,7 @@ class RenderView;
class Effect;
class RenderPass;
class RenderThread;
+class CommandThread;
class RenderStateSet;
class VSyncFrameAdvanceService;
class PickEventFilter;
@@ -221,6 +222,11 @@ public:
RenderSettings *settings() const override;
QOpenGLContext *shareContext() const override;
+
+ // Executed in secondary GL thread
+ void loadShader(Shader *shader) const override;
+
+
void updateGLResources();
void updateTexture(Texture *texture);
void cleanupTexture(const Texture *texture);
@@ -301,6 +307,7 @@ private:
RenderQueue *m_renderQueue;
QScopedPointer<RenderThread> m_renderThread;
+ QScopedPointer<CommandThread> m_commandThread;
QScopedPointer<VSyncFrameAdvanceService> m_vsyncFrameAdvanceService;
QSemaphore m_submitRenderViewsSemaphore;
diff --git a/tests/auto/render/commons/testrenderer.h b/tests/auto/render/commons/testrenderer.h
index b3f602dc2..26b7c6fc6 100644
--- a/tests/auto/render/commons/testrenderer.h
+++ b/tests/auto/render/commons/testrenderer.h
@@ -81,6 +81,9 @@ public:
void setOffscreenSurfaceHelper(Qt3DRender::Render::OffscreenSurfaceHelper *helper) override;
QSurfaceFormat format() override;
+
+ void loadShader(Qt3DRender::Render::Shader *) const override {}
+
protected:
Qt3DRender::Render::AbstractRenderer::BackendNodeDirtySet m_changes;
Qt3DRender::Render::NodeManagers *m_managers;