diff options
-rw-r--r-- | src/render/backend/qrenderaspect.cpp | 25 | ||||
-rw-r--r-- | src/render/backend/qrenderaspect.h | 11 | ||||
-rw-r--r-- | src/render/backend/qrenderaspect_p.h | 2 | ||||
-rw-r--r-- | src/render/backend/renderer.cpp | 38 | ||||
-rw-r--r-- | src/render/backend/renderer_p.h | 6 |
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); |