summaryrefslogtreecommitdiffstats
path: root/src/render/backend
diff options
context:
space:
mode:
authorKevin Ottens <kevin.ottens@kdab.com>2015-01-14 16:45:59 +0100
committerSean Harmer <sean.harmer@kdab.com>2015-01-17 16:22:58 +0100
commit2719260a3ae9d46e134817ca21465e952cc58952 (patch)
treece97784df1c1428fb19501596c7808cc7f2e258e /src/render/backend
parent13115b1a0b120b7b70d46028e27ca0fc5c050592 (diff)
Add a synchronous mode to QRenderAspect
With this specific mode frames will be rendered one by one when requested from the outside with renderSynchronous. Since it is meant as an integration point, we also provide renderInitialize which allows to inject our own OpenGL context to the renderer. Change-Id: I03a4a70b5b4dd9a79b22504657e9ede7c7554af8 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/render/backend')
-rw-r--r--src/render/backend/qrenderaspect.cpp25
-rw-r--r--src/render/backend/qrenderaspect.h11
-rw-r--r--src/render/backend/qrenderaspect_p.h2
-rw-r--r--src/render/backend/renderer.cpp38
-rw-r--r--src/render/backend/renderer_p.h6
5 files changed, 60 insertions, 22 deletions
diff --git a/src/render/backend/qrenderaspect.cpp b/src/render/backend/qrenderaspect.cpp
index 43b0894d9..9c28b58c9 100644
--- a/src/render/backend/qrenderaspect.cpp
+++ b/src/render/backend/qrenderaspect.cpp
@@ -110,9 +110,9 @@ QT_BEGIN_NAMESPACE
namespace Qt3D {
-QRenderAspectPrivate::QRenderAspectPrivate(QRenderAspect *qq)
+QRenderAspectPrivate::QRenderAspectPrivate(QRenderAspect::RenderType type, QRenderAspect *qq)
: QAbstractAspectPrivate(qq)
- , m_renderer(new Render::Renderer)
+ , m_renderer(new Render::Renderer(type))
, m_surfaceEventFilter(new Render::PlatformSurfaceFilter(m_renderer))
, m_surface(Q_NULLPTR)
, m_time(0)
@@ -157,7 +157,7 @@ void QRenderAspectPrivate::setSurface(QSurface *surface)
}
QRenderAspect::QRenderAspect(QObject *parent)
- : QAbstractAspect(*new QRenderAspectPrivate(this), parent)
+ : QAbstractAspect(*new QRenderAspectPrivate(Threaded, this), parent)
{
// Won't return until the private RenderThread in Renderer has been created
// The Renderer is set to wait the surface with a wait condition
@@ -165,7 +165,14 @@ QRenderAspect::QRenderAspect(QObject *parent)
registerBackendTypes();
}
+QRenderAspect::QRenderAspect(QRenderAspect::RenderType type, QObject *parent)
+ : QAbstractAspect(*new QRenderAspectPrivate(type, this), parent)
+{
+ registerBackendTypes();
+}
+
QRenderAspect::QRenderAspect(QRenderAspectPrivate &dd, QObject *parent)
+
: QAbstractAspect(dd, parent)
{
registerBackendTypes();
@@ -203,6 +210,18 @@ void QRenderAspect::registerBackendTypes()
registerBackendType<QShaderData>(QBackendNodeFunctorPtr(new Render::RenderNodeFunctor<Render::RenderShaderData, Render::ShaderDataManager>(d->m_renderer->shaderDataManager())));
}
+void QRenderAspect::renderInitialize(QOpenGLContext *context)
+{
+ Q_D(QRenderAspect);
+ d->m_renderer->initialize(context);
+}
+
+void QRenderAspect::renderSynchronous()
+{
+ Q_D(QRenderAspect);
+ d->m_renderer->doRender(1);
+}
+
QVector<QAspectJobPtr> QRenderAspect::jobsToExecute(qint64 time)
{
Q_D(QRenderAspect);
diff --git a/src/render/backend/qrenderaspect.h b/src/render/backend/qrenderaspect.h
index 314a41665..899fe7cf5 100644
--- a/src/render/backend/qrenderaspect.h
+++ b/src/render/backend/qrenderaspect.h
@@ -47,6 +47,8 @@
QT_BEGIN_NAMESPACE
+class QOpenGLContext;
+
namespace Qt3D {
namespace Render {
@@ -59,7 +61,16 @@ class QT3DRENDERERSHARED_EXPORT QRenderAspect : public QAbstractAspect
{
Q_OBJECT
public:
+ enum RenderType {
+ Synchronous,
+ Threaded
+ };
+
explicit QRenderAspect(QObject *parent = 0);
+ explicit QRenderAspect(RenderType type, QObject *parent = 0);
+
+ void renderInitialize(QOpenGLContext *context);
+ void renderSynchronous();
QVector<QAspectJobPtr> jobsToExecute(qint64 time) Q_DECL_OVERRIDE;
diff --git a/src/render/backend/qrenderaspect_p.h b/src/render/backend/qrenderaspect_p.h
index 526738485..6320bfd09 100644
--- a/src/render/backend/qrenderaspect_p.h
+++ b/src/render/backend/qrenderaspect_p.h
@@ -59,7 +59,7 @@ class Renderer;
class QRenderAspectPrivate : public QAbstractAspectPrivate
{
- QRenderAspectPrivate(QRenderAspect *qq);
+ QRenderAspectPrivate(QRenderAspect::RenderType type, QRenderAspect *qq);
Q_DECLARE_PUBLIC(QRenderAspect)
diff --git a/src/render/backend/renderer.cpp b/src/render/backend/renderer.cpp
index 31c9c0b8a..dc7187f1f 100644
--- a/src/render/backend/renderer.cpp
+++ b/src/render/backend/renderer.cpp
@@ -111,7 +111,7 @@ static void logOpenGLDebugMessage(const QOpenGLDebugMessage &debugMessage)
const QString SCENE_PARSERS_PATH = QStringLiteral("/sceneparsers");
-Renderer::Renderer(int cachedFrames)
+Renderer::Renderer(QRenderAspect::RenderType type, int cachedFrames)
: m_rendererAspect(Q_NULLPTR)
, m_graphicsContext(Q_NULLPTR)
, m_surface(Q_NULLPTR)
@@ -140,7 +140,7 @@ Renderer::Renderer(int cachedFrames)
, m_parameterManager(new ParameterManager())
, m_shaderDataManager(new ShaderDataManager())
, m_renderQueues(new RenderQueues(cachedFrames - 1))
- , m_renderThread(new RenderThread(this))
+ , m_renderThread(type == QRenderAspect::Threaded ? new RenderThread(this) : Q_NULLPTR)
, m_frameCount(0)
, m_cachedFramesCount(cachedFrames)
, m_debugLogger(Q_NULLPTR)
@@ -149,8 +149,10 @@ Renderer::Renderer(int cachedFrames)
// Set renderer as running - it will wait in the context of the
// RenderThread for RenderViews to be submitted
- m_running.fetchAndStoreOrdered(1);
- m_renderThread->waitForStart();
+ if (m_renderThread) {
+ m_running.fetchAndStoreOrdered(1);
+ m_renderThread->waitForStart();
+ }
buildDefaultTechnique();
buildDefaultMaterial();
@@ -231,9 +233,11 @@ Renderer::~Renderer()
// Bail out of the main render loop. Ensure that even if the render thread
// is waiting on RenderViews to be populated that we wake up the wait condition.
// We check for termination immediately after being awoken.
- m_running.fetchAndStoreOrdered(0);
- m_submitRenderViewsCondition.wakeOne();
- m_renderThread->wait();
+ if (m_renderThread) {
+ m_running.fetchAndStoreOrdered(0);
+ m_submitRenderViewsCondition.wakeOne();
+ m_renderThread->wait();
+ }
// Clean up the TLS allocators
destroyAllocators();
@@ -302,9 +306,10 @@ void Renderer::destroyThreadLocalAllocator(void *renderer)
// Called in RenderThread context by the run method of RenderThread
// RenderThread has locked the mutex already and unlocks it when this
// method termintates
-void Renderer::initialize()
+void Renderer::initialize(QOpenGLContext *context)
{
- m_waitForWindowToBeSetCondition.wait(mutex());
+ if (m_renderThread)
+ m_waitForWindowToBeSetCondition.wait(mutex());
QByteArray debugLoggingMode = qgetenv("QT3D_DEBUG_LOGGING");
bool enableDebugLogging = !debugLoggingMode.isEmpty();
@@ -316,10 +321,12 @@ void Renderer::initialize()
if (enableDebugLogging)
sf.setOption(QSurfaceFormat::DebugContext);
- QOpenGLContext* ctx = new QOpenGLContext;
- ctx->setFormat(sf);
- if (!ctx->create())
- qCWarning(Backend) << Q_FUNC_INFO << "OpenGL context creation failed";
+ QOpenGLContext* ctx = context ? context : new QOpenGLContext;
+ if (!context) {
+ ctx->setFormat(sf);
+ if (!ctx->create())
+ qCWarning(Backend) << Q_FUNC_INFO << "OpenGL context creation failed";
+ }
m_graphicsContext->setOpenGLContext(ctx, m_surface);
if (enableDebugLogging) {
@@ -519,7 +526,7 @@ bool Renderer::canRender() const
{
// Make sure that we've not been told to terminate whilst waiting on
// the above wait condition
- if (!m_running.load()) {
+ if (m_renderThread && !m_running.load()) {
qCDebug(Rendering) << "RenderThread termination requested whilst waiting";
return false;
}
@@ -538,7 +545,8 @@ bool Renderer::canRender() const
void Renderer::submitRenderViews(int maxFrameCount)
{
QMutexLocker locker(&m_mutex);
- m_submitRenderViewsCondition.wait(locker.mutex());
+ if (m_renderThread)
+ m_submitRenderViewsCondition.wait(locker.mutex());
locker.unlock();
QElapsedTimer timer;
diff --git a/src/render/backend/renderer_p.h b/src/render/backend/renderer_p.h
index 2acc7a97f..fc3a29833 100644
--- a/src/render/backend/renderer_p.h
+++ b/src/render/backend/renderer_p.h
@@ -43,6 +43,7 @@
#ifndef QT3D_RENDER_RENDERER_H
#define QT3D_RENDER_RENDERER_H
+#include <Qt3DRenderer/qrenderaspect.h>
#include <Qt3DRenderer/qtechnique.h>
#include <Qt3DRenderer/private/quniformvalue_p.h>
#include <Qt3DRenderer/private/handle_types_p.h>
@@ -76,7 +77,6 @@ class QShaderProgram;
class QMesh;
class QRenderPass;
class QAbstractShapeMesh;
-class QRenderAspect;
class QFrameAllocator;
class QOpenGLFilter;
class AbstractSceneParser;
@@ -128,7 +128,7 @@ class ShaderDataManager;
class Renderer
{
public:
- explicit Renderer(int cachedFrames = 5);
+ explicit Renderer(QRenderAspect::RenderType type, int cachedFrames = 5);
~Renderer();
void setQRenderAspect(QRenderAspect *aspect) { m_rendererAspect = aspect; }
@@ -195,7 +195,7 @@ public:
void enqueueRenderView(RenderView *renderView, int submitOrder);
void submitRenderViews(int maxFrameCount = -1);
- void initialize();
+ void initialize(QOpenGLContext *context = Q_NULLPTR);
void shutdown();
QFrameAllocator *currentFrameAllocator(int frameIndex);