summaryrefslogtreecommitdiffstats
path: root/src/render/frontend/qrenderaspect.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/frontend/qrenderaspect.cpp')
-rw-r--r--src/render/frontend/qrenderaspect.cpp83
1 files changed, 75 insertions, 8 deletions
diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp
index 271eb9c11..fc366b891 100644
--- a/src/render/frontend/qrenderaspect.cpp
+++ b/src/render/frontend/qrenderaspect.cpp
@@ -41,7 +41,7 @@
#include "qrenderaspect_p.h"
#include <Qt3DRender/private/nodemanagers_p.h>
-#include <Qt3DRender/private/renderer_p.h>
+#include <Qt3DRender/private/abstractrenderer_p.h>
#include <Qt3DRender/private/scenemanager_p.h>
#include <Qt3DRender/private/geometryrenderermanager_p.h>
@@ -56,8 +56,10 @@
#include <Qt3DRender/qmesh.h>
#include <Qt3DRender/qparameter.h>
#include <Qt3DRender/qrenderpassfilter.h>
+#include <Qt3DRender/qrenderpass.h>
#include <Qt3DRender/qrendertargetselector.h>
#include <Qt3DRender/qtechniquefilter.h>
+#include <Qt3DRender/qtechnique.h>
#include <Qt3DRender/qviewport.h>
#include <Qt3DRender/qrendertarget.h>
#include <Qt3DRender/qclearbuffers.h>
@@ -92,6 +94,7 @@
#include <Qt3DRender/qwaitfence.h>
#include <Qt3DRender/qshaderimage.h>
#include <Qt3DRender/qsubtreeenabler.h>
+#include <Qt3DRender/qdebugoverlay.h>
#include <Qt3DCore/qarmature.h>
#include <Qt3DCore/qjoint.h>
#include <Qt3DCore/qskeletonloader.h>
@@ -102,7 +105,7 @@
#include <Qt3DRender/private/cameralens_p.h>
#include <Qt3DRender/private/filterkey_p.h>
#include <Qt3DRender/private/entity_p.h>
-#include <Qt3DRender/private/renderer_p.h>
+#include <Qt3DRender/private/abstractrenderer_p.h>
#include <Qt3DRender/private/shaderdata_p.h>
#include <Qt3DRender/private/renderpassfilternode_p.h>
#include <Qt3DRender/private/rendertargetselectornode_p.h>
@@ -159,21 +162,25 @@
#include <Qt3DRender/private/setfence_p.h>
#include <Qt3DRender/private/waitfence_p.h>
#include <Qt3DRender/private/shaderimage_p.h>
+#include <Qt3DRender/private/debugoverlay_p.h>
#include <private/qrenderpluginfactory_p.h>
#include <private/qrenderplugin_p.h>
+#include <Qt3DRender/private/qrendererpluginfactory_p.h>
+
#include <Qt3DCore/qentity.h>
#include <Qt3DCore/qtransform.h>
#include <Qt3DCore/qnode.h>
#include <Qt3DCore/QAspectEngine>
#include <Qt3DCore/private/qservicelocator_p.h>
+#include <Qt3DCore/private/qscene_p.h>
+#include <Qt3DCore/private/qentity_p.h>
+#include <Qt3DCore/private/qaspectmanager_p.h>
-#include <QDebug>
-#include <QOffscreenSurface>
#include <QThread>
-#include <QWindow>
+#include <QOpenGLContext>
QT_BEGIN_NAMESPACE
@@ -202,11 +209,16 @@ QRenderAspectPrivate::QRenderAspectPrivate(QRenderAspect::RenderType type)
, m_nodeManagers(nullptr)
, m_renderer(nullptr)
, m_initialized(false)
+ , m_renderAfterJobs(false)
, m_renderType(type)
, m_offscreenHelper(nullptr)
{
m_instances.append(this);
loadSceneParsers();
+ if (m_renderType == QRenderAspect::Threaded && !QOpenGLContext::supportsThreadedOpenGL()) {
+ m_renderType = QRenderAspect::Synchronous;
+ m_renderAfterJobs = true;
+ }
}
/*! \internal */
@@ -239,6 +251,18 @@ void QRenderAspectPrivate::syncDirtyFrontEndNode(QNode *node, QBackendNode *back
renderBackend->syncFromFrontEnd(node, firstTime);
}
+void QRenderAspectPrivate::jobsDone()
+{
+ m_renderer->jobsDone(m_aspectManager);
+}
+
+void QRenderAspectPrivate::frameDone()
+{
+ m_renderer->setJobsInLastFrame(m_aspectManager->jobsInLastFrame());
+ if (m_renderAfterJobs)
+ m_renderer->doRender(true);
+}
+
/*! \internal */
void QRenderAspectPrivate::registerBackendTypes()
{
@@ -289,7 +313,7 @@ void QRenderAspectPrivate::registerBackendTypes()
q->registerBackendType<QParameter, true>(QSharedPointer<Render::NodeFunctor<Render::Parameter, Render::ParameterManager> >::create(m_renderer));
q->registerBackendType<QRenderPass, true>(QSharedPointer<Render::NodeFunctor<Render::RenderPass, Render::RenderPassManager> >::create(m_renderer));
q->registerBackendType<QShaderData, true>(QSharedPointer<Render::RenderShaderDataFunctor>::create(m_renderer, m_nodeManagers));
- q->registerBackendType<QShaderProgram, true>(QSharedPointer<Render::NodeFunctor<Render::Shader, Render::ShaderManager> >::create(m_renderer));
+ q->registerBackendType<QShaderProgram, true>(QSharedPointer<Render::ShaderFunctor>::create(m_renderer, m_nodeManagers->shaderManager()));
q->registerBackendType<QShaderProgramBuilder, true>(QSharedPointer<Render::NodeFunctor<Render::ShaderBuilder, Render::ShaderBuilderManager> >::create(m_renderer));
q->registerBackendType<QTechnique, true>(QSharedPointer<Render::TechniqueFunctor>::create(m_renderer, m_nodeManagers));
q->registerBackendType<QShaderImage, true>(QSharedPointer<Render::NodeFunctor<Render::ShaderImage, Render::ShaderImageManager>>::create(m_renderer));
@@ -318,6 +342,7 @@ void QRenderAspectPrivate::registerBackendTypes()
q->registerBackendType<QWaitFence, true>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::WaitFence, QWaitFence> >::create(m_renderer));
q->registerBackendType<QNoPicking, true>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::NoPicking, QNoPicking> >::create(m_renderer));
q->registerBackendType<QSubtreeEnabler, true>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::SubtreeEnabler, QSubtreeEnabler> >::create(m_renderer));
+ q->registerBackendType<QDebugOverlay, true>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::DebugOverlay, QDebugOverlay> >::create(m_renderer));
// Picking
q->registerBackendType<QObjectPicker, true>(QSharedPointer<Render::NodeFunctor<Render::ObjectPicker, Render::ObjectPickerManager> >::create(m_renderer));
@@ -392,6 +417,7 @@ void QRenderAspectPrivate::unregisterBackendTypes()
unregisterBackendType<QSetFence>();
unregisterBackendType<QWaitFence>();
unregisterBackendType<QSubtreeEnabler>();
+ unregisterBackendType<QDebugOverlay>();
// Picking
unregisterBackendType<QObjectPicker>();
@@ -540,12 +566,29 @@ QVector<Qt3DCore::QAspectJobPtr> QRenderAspect::jobsToExecute(qint64 time)
QVariant QRenderAspect::executeCommand(const QStringList &args)
{
Q_D(QRenderAspect);
+
+ if (args.size() == 1) {
+ Render::RenderSettings *settings = d->m_renderer->settings();
+ auto *droot = static_cast<Qt3DCore::QEntityPrivate *>(Qt3DCore::QNodePrivate::get(d->m_root));
+ auto *fg = qobject_cast<Qt3DRender::QFrameGraphNode *>(droot->m_scene->lookupNode(settings->activeFrameGraphID()));
+ if (fg) {
+ if (args.front() == QLatin1String("framegraph"))
+ return Qt3DRender::QFrameGraphNodePrivate::get(fg)->dumpFrameGraph();
+ if (args.front() == QLatin1String("framepaths"))
+ return Qt3DRender::QFrameGraphNodePrivate::get(fg)->dumpFrameGraphPaths().join(QLatin1String("\n"));
+ }
+ if (args.front() == QLatin1String("scenegraph"))
+ return droot->dumpSceneGraph();
+ }
+
return d->m_renderer->executeCommand(args);
}
void QRenderAspect::onEngineStartup()
{
Q_D(QRenderAspect);
+ if (d->m_renderAfterJobs) // synchronous rendering but using QWindow
+ d->m_renderer->initialize();
Render::NodeManagers *managers = d->m_renderer->nodeManagers();
Render::Entity *rootEntity = managers->lookupResource<Render::Entity, Render::EntityManager>(rootEntityId());
Q_ASSERT(rootEntity);
@@ -560,8 +603,9 @@ void QRenderAspect::onRegistered()
Q_D(QRenderAspect);
d->m_nodeManagers = new Render::NodeManagers();
- // TO DO: Load proper Renderer class based on Qt configuration preferences
- d->m_renderer = new Render::Renderer(d->m_renderType);
+ // Load proper Renderer class based on Qt configuration preferences
+ d->m_renderer = d->loadRendererPlugin();
+ Q_ASSERT(d->m_renderer);
d->m_renderer->setScreen(d->m_screen);
d->m_renderer->setNodeManagers(d->m_nodeManagers);
@@ -606,6 +650,8 @@ void QRenderAspect::onUnregistered()
d->unregisterBackendTypes();
+ d->m_renderer->releaseGraphicsResources();
+
delete d->m_nodeManagers;
d->m_nodeManagers = nullptr;
@@ -648,6 +694,27 @@ void QRenderAspectPrivate::loadSceneParsers()
}
}
+Render::AbstractRenderer *QRenderAspectPrivate::loadRendererPlugin()
+{
+ // Note: for now we load the first renderer plugin that is successfully loaded
+ // In the future we might want to offer the user a way to hint at which renderer
+ // plugin would best be loaded
+
+ const QByteArray envTarget = qgetenv("QT3D_RENDERER");
+ const QString targetKey = !envTarget.isEmpty() ? QString::fromLatin1(envTarget) : QStringLiteral("opengl");
+ const QStringList keys = Render::QRendererPluginFactory::keys();
+ for (const QString &key : keys) {
+ if (key != targetKey)
+ continue;
+ Render::AbstractRenderer *renderer = Render::QRendererPluginFactory::create(key, m_renderType);
+ if (renderer)
+ return renderer;
+ }
+ const QByteArray targetKeyName = targetKey.toLatin1();
+ qFatal("Unable to find renderer plugin for %s", targetKeyName.constData());
+ return nullptr;
+}
+
void QRenderAspectPrivate::loadRenderPlugin(const QString &pluginName)
{
Q_Q(QRenderAspect);