summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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);