diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2016-01-20 16:33:53 +0100 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2016-01-22 14:29:34 +0000 |
commit | 86177b98e27a9d376e35039454986ff7de8f3104 (patch) | |
tree | 6ac256365641f538128666917f0b5090d873320a /src/render/frontend | |
parent | 31e4d157c6b0af0c04546af643707a3811583455 (diff) |
QAspectEngine/QAbstractAspects: get rid of setData
Getting rid of set data and the refactoring on setting the surface implies
that:
- Given the FrameGraph configuration, there may be several RenderViews
each having a different RenderSurfaceSelector/Window
- This means that the Renderer/QRenderAspect can't know about the surface
before reading the scene
- This means that the Renderer may be dealing with more than 1 window
- This means that initialization, render and shutdown procedures will have to
be updated accordingly
Therefore the Renderer was refactored to:
- Be initialized without knowing about a surface
- For each RenderView, check the surface and if different from the previous
one:
* Make the context current with it
* Create the appropriate glHelpers (as Surfaces may have != formats)
TO DO:
- Fix picking
- Fix windows exposition
- Fix shutdown / detection of all windows beging closed
Change-Id: I49d070b05f46be4b26cfb57e494feba145d1da9c
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/render/frontend')
-rw-r--r-- | src/render/frontend/qrenderaspect.cpp | 73 | ||||
-rw-r--r-- | src/render/frontend/qrenderaspect.h | 7 |
2 files changed, 22 insertions, 58 deletions
diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp index 860445e48..bd14694cd 100644 --- a/src/render/frontend/qrenderaspect.cpp +++ b/src/render/frontend/qrenderaspect.cpp @@ -216,11 +216,8 @@ void QRenderAspectPrivate::setSurface(QSurface *surface) m_surfaceSize = surface->size(); // If the window/offscreen surface has a native surface, tell the renderer - if (hasPlatformSurface) { - m_renderer->setSurface(surface); - m_renderer->setSurfaceSize(m_surfaceSize); - m_renderer->setDevicePixelRatio(m_devicePixelRatio); - } + // if (hasPlatformSurface) + // m_renderer->setSurface(surface); } } @@ -398,59 +395,31 @@ QVector<Qt3DCore::QAspectJobPtr> QRenderAspect::jobsToExecute(qint64 time) // Clear any old dependencies from previous frames d->m_cleanupJob->removeDependency(QWeakPointer<QAspectJob>()); - // Do not create any more RenderView jobs when the platform surface is gone. - if (d->m_renderer->surface()) { - // Traverse the current framegraph and create jobs to populate - // RenderBins with RenderCommands - QVector<QAspectJobPtr> renderBinJobs = d->m_renderer->renderBinJobs(); - // TODO: Add wrapper around ThreadWeaver::Collection - for (int i = 0; i < renderBinJobs.size(); ++i) { - QAspectJobPtr renderBinJob = renderBinJobs.at(i); - renderBinJob->addDependency(d->m_updateBoundingVolumeJob); - jobs.append(renderBinJob); - d->m_cleanupJob->addDependency(renderBinJob); - } + // Note: We need the RenderBinJobs to set the surface + // so we must create the RenderViews in all cases + + // Traverse the current framegraph and create jobs to populate + // RenderBins with RenderCommands + QVector<QAspectJobPtr> renderBinJobs = d->m_renderer->renderBinJobs(); + // TODO: Add wrapper around ThreadWeaver::Collection + for (int i = 0; i < renderBinJobs.size(); ++i) { + QAspectJobPtr renderBinJob = renderBinJobs.at(i); + renderBinJob->addDependency(d->m_updateBoundingVolumeJob); + jobs.append(renderBinJob); + d->m_cleanupJob->addDependency(renderBinJob); } jobs.append(d->m_cleanupJob); } return jobs; } -const QSize &QRenderAspect::surfaceSize() const -{ - Q_D(const QRenderAspect); - return d->m_surfaceSize; -} - -void QRenderAspect::setSurfaceSize(const QSize &s) -{ - Q_D(QRenderAspect); - d->m_surfaceSize = s; - if (d->m_renderer) - d->m_renderer->setSurfaceSize(s); -} - -qreal QRenderAspect::devicePixelRatio() const -{ - Q_D(const QRenderAspect); - return d->m_devicePixelRatio; -} - -void QRenderAspect::setDevicePixelRatio(qreal r) -{ - Q_D(QRenderAspect); - d->m_devicePixelRatio = r; - if (d->m_renderer) - d->m_renderer->setDevicePixelRatio(r); -} - void QRenderAspect::onRootEntityChanged(Qt3DCore::QEntity *rootEntity) { Q_D(QRenderAspect); d->m_renderer->setSceneRoot(d, d->m_renderer->nodeManagers()->lookupResource<Render::Entity, Render::EntityManager>(rootEntity->id())); } -void QRenderAspect::onInitialize(const QVariantMap &data) +void QRenderAspect::onInitialize() { // TODO: Remove the m_initialized variable and split out onInitialize() // and setting a resource (the QSurface) on the aspects. @@ -471,13 +440,13 @@ void QRenderAspect::onInitialize(const QVariantMap &data) d->m_initialized = true; } - QSurface *surface = Q_NULLPTR; - const QVariant &v = data.value(QStringLiteral("surface")); - if (v.isValid()) - surface = v.value<QSurface *>(); + // QSurface *surface = Q_NULLPTR; + // const QVariant &v = data.value(QStringLiteral("surface")); + // if (v.isValid()) + // surface = v.value<QSurface *>(); - if (surface) - d->setSurface(surface); + // if (surface) + // d->setSurface(surface); if (d->m_aspectManager) d->m_renderer->registerEventFilter(d->services()->eventFilterService()); diff --git a/src/render/frontend/qrenderaspect.h b/src/render/frontend/qrenderaspect.h index 2a9cd0eed..6df8b20ff 100644 --- a/src/render/frontend/qrenderaspect.h +++ b/src/render/frontend/qrenderaspect.h @@ -70,18 +70,13 @@ public: QVector<Qt3DCore::QAspectJobPtr> jobsToExecute(qint64 time) Q_DECL_OVERRIDE; - const QSize &surfaceSize() const; - void setSurfaceSize(const QSize &s); - qreal devicePixelRatio() const; - void setDevicePixelRatio(qreal r); - protected: void registerBackendTypes(); QRenderAspect(QRenderAspectPrivate &dd, QObject *parent); Q_DECLARE_PRIVATE(QRenderAspect) void onRootEntityChanged(Qt3DCore::QEntity *rootObject) Q_DECL_OVERRIDE; - void onInitialize(const QVariantMap &data) Q_DECL_OVERRIDE; + void onInitialize() Q_DECL_OVERRIDE; void onCleanup() Q_DECL_OVERRIDE; QVector<Qt3DCore::QAspectJobPtr> createRenderBufferJobs(); |