diff options
-rw-r--r-- | src/render/backend/renderer.cpp | 11 | ||||
-rw-r--r-- | src/render/backend/renderer_p.h | 6 | ||||
-rw-r--r-- | src/render/jobs/job_common_p.h | 2 | ||||
-rw-r--r-- | src/render/jobs/jobs.pri | 8 | ||||
-rw-r--r-- | src/render/jobs/updateshaderdatatransformjob.cpp (renamed from src/render/jobs/framepreparationjob.cpp) | 90 | ||||
-rw-r--r-- | src/render/jobs/updateshaderdatatransformjob_p.h (renamed from src/render/jobs/framepreparationjob_p.h) | 18 | ||||
-rw-r--r-- | tests/benchmarks/render/jobs/tst_bench_jobs.cpp | 4 |
7 files changed, 67 insertions, 72 deletions
diff --git a/src/render/backend/renderer.cpp b/src/render/backend/renderer.cpp index 0fb0a0887..e83a47e9e 100644 --- a/src/render/backend/renderer.cpp +++ b/src/render/backend/renderer.cpp @@ -153,7 +153,7 @@ Renderer::Renderer(QRenderAspect::RenderType type) , m_pickBoundingVolumeJob(PickBoundingVolumeJobPtr::create(this)) , m_time(0) , m_settings(nullptr) - , m_framePreparationJob(Render::FramePreparationJobPtr::create()) + , m_updateShaderDataTransformJob(Render::UpdateShaderDataTransformJobPtr::create()) , m_cleanupJob(Render::FrameCleanupJobPtr::create()) , m_worldTransformJob(Render::UpdateWorldTransformJobPtr::create()) , m_expandBoundingVolumeJob(Render::ExpandBoundingVolumeJobPtr::create()) @@ -178,10 +178,10 @@ Renderer::Renderer(QRenderAspect::RenderType type) m_updateWorldBoundingVolumeJob->addDependency(m_worldTransformJob); m_updateWorldBoundingVolumeJob->addDependency(m_calculateBoundingVolumeJob); m_expandBoundingVolumeJob->addDependency(m_updateWorldBoundingVolumeJob); - m_framePreparationJob->addDependency(m_worldTransformJob); + m_updateShaderDataTransformJob->addDependency(m_worldTransformJob); // All world stuff depends on the RenderEntity's localBoundingVolume - m_pickBoundingVolumeJob->addDependency(m_framePreparationJob); + m_pickBoundingVolumeJob->addDependency(m_updateShaderDataTransformJob); m_defaultRenderStateSet = new RenderStateSet; m_defaultRenderStateSet->addState(RenderStateSet::createState<DepthTest>(GL_LESS)); @@ -224,7 +224,7 @@ void Renderer::setNodeManagers(NodeManagers *managers) { m_nodesManager = managers; - m_framePreparationJob->setManagers(m_nodesManager); + m_updateShaderDataTransformJob->setManagers(m_nodesManager); m_cleanupJob->setManagers(m_nodesManager); m_calculateBoundingVolumeJob->setManagers(m_nodesManager); m_pickBoundingVolumeJob->setManagers(m_nodesManager); @@ -359,7 +359,6 @@ void Renderer::setSceneRoot(QBackendNodeFactory *factory, Entity *sgRoot) qCDebug(Backend) << Q_FUNC_INFO << "DUMPING SCENE"; // Set the scene root on the jobs - m_framePreparationJob->setRoot(m_renderSceneRoot); m_worldTransformJob->setRoot(m_renderSceneRoot); m_expandBoundingVolumeJob->setRoot(m_renderSceneRoot); m_calculateBoundingVolumeJob->setRoot(m_renderSceneRoot); @@ -1011,7 +1010,7 @@ QVector<Qt3DCore::QAspectJobPtr> Renderer::renderBinJobs() } // Add jobs - renderBinJobs.push_back(m_framePreparationJob); + renderBinJobs.push_back(m_updateShaderDataTransformJob); renderBinJobs.push_back(m_expandBoundingVolumeJob); renderBinJobs.push_back(m_updateWorldBoundingVolumeJob); renderBinJobs.push_back(m_calculateBoundingVolumeJob); diff --git a/src/render/backend/renderer_p.h b/src/render/backend/renderer_p.h index cc6646fdc..8951551be 100644 --- a/src/render/backend/renderer_p.h +++ b/src/render/backend/renderer_p.h @@ -65,7 +65,7 @@ #include <Qt3DRender/private/expandboundingvolumejob_p.h> #include <Qt3DRender/private/updateworldtransformjob_p.h> #include <Qt3DRender/private/calcboundingvolumejob_p.h> -#include <Qt3DRender/private/framepreparationjob_p.h> +#include <Qt3DRender/private/updateshaderdatatransformjob_p.h> #include <Qt3DRender/private/framecleanupjob_p.h> #include <Qt3DRender/private/updateworldboundingvolumejob_p.h> #include <Qt3DRender/private/platformsurfacefilter_p.h> @@ -183,7 +183,7 @@ public: inline FrameCleanupJobPtr frameCleanupJob() const { return m_cleanupJob; } inline ExpandBoundingVolumeJobPtr expandBoundingVolumeJob() const { return m_expandBoundingVolumeJob; } - inline FramePreparationJobPtr framePreparationJob() const { return m_framePreparationJob; } + inline UpdateShaderDataTransformJobPtr updateShaderDataTransformJob() const { return m_updateShaderDataTransformJob; } inline CalculateBoundingVolumeJobPtr calculateBoundingVolumeJob() const { return m_calculateBoundingVolumeJob; } inline UpdateWorldTransformJobPtr updateWorldTransformJob() const { return m_worldTransformJob; } inline UpdateWorldBoundingVolumeJobPtr updateWorldBoundingVolumeJob() const { return m_updateWorldBoundingVolumeJob; } @@ -284,7 +284,7 @@ private: RenderSettings *m_settings; - FramePreparationJobPtr m_framePreparationJob; + UpdateShaderDataTransformJobPtr m_updateShaderDataTransformJob; FrameCleanupJobPtr m_cleanupJob; UpdateWorldTransformJobPtr m_worldTransformJob; ExpandBoundingVolumeJobPtr m_expandBoundingVolumeJob; diff --git a/src/render/jobs/job_common_p.h b/src/render/jobs/job_common_p.h index a5a8bb8e2..a30e75408 100644 --- a/src/render/jobs/job_common_p.h +++ b/src/render/jobs/job_common_p.h @@ -64,7 +64,7 @@ namespace JobTypes { enum JobType { LoadBuffer = 1, FrameCleanup, - FramePreparation, + UpdateShaderDataTransform, CalcBoundingVolume, CalcTriangleVolume, LoadGeometry, diff --git a/src/render/jobs/jobs.pri b/src/render/jobs/jobs.pri index 9ad8f9bc0..3d64976da 100644 --- a/src/render/jobs/jobs.pri +++ b/src/render/jobs/jobs.pri @@ -5,7 +5,6 @@ HEADERS += \ $$PWD/renderviewjobutils_p.h \ $$PWD/loadscenejob_p.h \ $$PWD/framecleanupjob_p.h \ - $$PWD/framepreparationjob_p.h \ $$PWD/loadtexturedatajob_p.h \ $$PWD/loadbufferjob_p.h \ $$PWD/loadgeometryjob_p.h \ @@ -23,14 +22,14 @@ HEADERS += \ $$PWD/lightgatherer_p.h \ $$PWD/expandboundingvolumejob_p.h \ $$PWD/updateworldboundingvolumejob_p.h \ - $$PWD/sendrendercapturejob_p.h + $$PWD/sendrendercapturejob_p.h \ + $$PWD/updateshaderdatatransformjob_p.h SOURCES += \ $$PWD/updateworldtransformjob.cpp \ $$PWD/renderviewjobutils.cpp \ $$PWD/loadscenejob.cpp \ $$PWD/framecleanupjob.cpp \ - $$PWD/framepreparationjob.cpp \ $$PWD/loadtexturedatajob.cpp \ $$PWD/loadbufferjob.cpp \ $$PWD/loadgeometryjob.cpp \ @@ -45,4 +44,5 @@ SOURCES += \ $$PWD/lightgatherer.cpp \ $$PWD/expandboundingvolumejob.cpp \ $$PWD/updateworldboundingvolumejob.cpp \ - $$PWD/sendrendercapturejob.cpp + $$PWD/sendrendercapturejob.cpp \ + $$PWD/updateshaderdatatransformjob.cpp diff --git a/src/render/jobs/framepreparationjob.cpp b/src/render/jobs/updateshaderdatatransformjob.cpp index ef5b4bdb4..a24517d51 100644 --- a/src/render/jobs/framepreparationjob.cpp +++ b/src/render/jobs/updateshaderdatatransformjob.cpp @@ -37,7 +37,7 @@ ** ****************************************************************************/ -#include "framepreparationjob_p.h" +#include "updateshaderdatatransformjob_p.h" #include <Qt3DRender/private/nodemanagers_p.h> #include <Qt3DRender/private/entity_p.h> #include <Qt3DRender/private/shaderdata_p.h> @@ -58,71 +58,69 @@ QT_BEGIN_NAMESPACE namespace Qt3DRender { namespace Render { -FramePreparationJob::FramePreparationJob() - : m_root(nullptr) - , m_manager(nullptr) +UpdateShaderDataTransformJob::UpdateShaderDataTransformJob() + : m_manager(nullptr) { - SET_JOB_RUN_STAT_TYPE(this, JobTypes::FramePreparation, 0); + SET_JOB_RUN_STAT_TYPE(this, JobTypes::UpdateShaderDataTransform, 0); } -FramePreparationJob::~FramePreparationJob() +UpdateShaderDataTransformJob::~UpdateShaderDataTransformJob() { } -void FramePreparationJob::setRoot(Entity *root) -{ - m_root = root; -} - -void FramePreparationJob::setManagers(NodeManagers *manager) +void UpdateShaderDataTransformJob::setManagers(NodeManagers *manager) { m_manager = manager; } -void FramePreparationJob::run() +void UpdateShaderDataTransformJob::run() { - parseNodeTree(m_root); + parseNodes(); } -void FramePreparationJob::parseNodeTree(Entity *node) +void UpdateShaderDataTransformJob::parseNodes() { - // Update transform properties in ShaderDatas and Lights - const QVector<ShaderData *> shaderDatas = node->renderComponents<ShaderData>(); - for (ShaderData *r : shaderDatas) - r->updateWorldTransform(*node->worldTransform()); + EntityManager *manager = m_manager->renderNodesManager(); + const QVector<HEntity> handles = manager->activeHandles(); - // Look if for the GeometryRender/Geometry the attributes and or buffers are dirty - // in which case we need to recompute the triangle list - GeometryRenderer *geomRenderer = node->renderComponent<GeometryRenderer>(); - const Qt3DCore::QNodeId geomRendererId = node->componentUuid<GeometryRenderer>(); - Geometry *geom = nullptr; - if (geomRenderer && - (geom = m_manager->lookupResource<Geometry, GeometryManager>(geomRenderer->geometryId())) != nullptr) { - if (!m_manager->geometryRendererManager()->isGeometryRendererScheduledForTriangleDataRefresh(geomRendererId)) { - // Check if the attributes or buffers are dirty - bool dirty = geomRenderer->isDirty(); - Attribute *attr = nullptr; - const auto attrIds = geom->attributes(); - for (const Qt3DCore::QNodeId attrId : attrIds) { - if ((attr = m_manager->attributeManager()->lookupResource(attrId)) != nullptr) { - dirty |= attr->isDirty(); - if (!dirty) { - Buffer *buffer = nullptr; - if ((buffer = m_manager->bufferManager()->lookupResource(attr->bufferId())) != nullptr) - dirty = buffer->isDirty(); + for (const HEntity handle : handles) { + Entity *node = manager->data(handle); + // Update transform properties in ShaderDatas and Lights + const QVector<ShaderData *> shaderDatas = node->renderComponents<ShaderData>(); + for (ShaderData *r : shaderDatas) + r->updateWorldTransform(*node->worldTransform()); + + // TO DO: This will be moved to a separate job in a follow up commit + + // Look if for the GeometryRender/Geometry the attributes and or buffers are dirty + // in which case we need to recompute the triangle list + GeometryRenderer *geomRenderer = node->renderComponent<GeometryRenderer>(); + Geometry *geom = nullptr; + if (geomRenderer && + (geom = m_manager->lookupResource<Geometry, GeometryManager>(geomRenderer->geometryId())) != nullptr) { + const Qt3DCore::QNodeId geomRendererId = geomRenderer->peerId(); + if (!m_manager->geometryRendererManager()->isGeometryRendererScheduledForTriangleDataRefresh(geomRendererId)) { + // Check if the attributes or buffers are dirty + bool dirty = geomRenderer->isDirty(); + Attribute *attr = nullptr; + const auto attrIds = geom->attributes(); + for (const Qt3DCore::QNodeId attrId : attrIds) { + if ((attr = m_manager->attributeManager()->lookupResource(attrId)) != nullptr) { + dirty |= attr->isDirty(); + if (!dirty) { + Buffer *buffer = nullptr; + if ((buffer = m_manager->bufferManager()->lookupResource(attr->bufferId())) != nullptr) + dirty = buffer->isDirty(); + } + if (dirty) + break; } - if (dirty) - break; } + if (dirty) + m_manager->geometryRendererManager()->requestTriangleDataRefreshForGeometryRenderer(geomRendererId); } - if (dirty) - m_manager->geometryRendererManager()->requestTriangleDataRefreshForGeometryRenderer(geomRendererId); } } - - const QVector<Entity *> children = node->children(); - for (Entity *c : children) - parseNodeTree(c); } } // namespace Render diff --git a/src/render/jobs/framepreparationjob_p.h b/src/render/jobs/updateshaderdatatransformjob_p.h index 35db5862d..7951121e1 100644 --- a/src/render/jobs/framepreparationjob_p.h +++ b/src/render/jobs/updateshaderdatatransformjob_p.h @@ -37,8 +37,8 @@ ** ****************************************************************************/ -#ifndef QT3DRENDER_RENDER_FRAMEPREPARATIONJOB_H -#define QT3DRENDER_RENDER_FRAMEPREPARATIONJOB_H +#ifndef QT3DRENDER_RENDER_UPDATESHADERDATATRANSFORMJOB_H +#define QT3DRENDER_RENDER_UPDATESHADERDATATRANSFORMJOB_H // // W A R N I N G @@ -63,26 +63,24 @@ namespace Render { class NodeManagers; class Entity; -class QT3DRENDERSHARED_PRIVATE_EXPORT FramePreparationJob : public Qt3DCore::QAspectJob +class QT3DRENDERSHARED_PRIVATE_EXPORT UpdateShaderDataTransformJob : public Qt3DCore::QAspectJob { public: - FramePreparationJob(); - ~FramePreparationJob(); + UpdateShaderDataTransformJob(); + ~UpdateShaderDataTransformJob(); - void setRoot(Entity *root); void setManagers(NodeManagers *manager); protected: void run() Q_DECL_FINAL; private: - void parseNodeTree(Entity *node); + void parseNodes(); - Entity *m_root; NodeManagers *m_manager; }; -typedef QSharedPointer<FramePreparationJob> FramePreparationJobPtr; +typedef QSharedPointer<UpdateShaderDataTransformJob> UpdateShaderDataTransformJobPtr; } // namespace Render @@ -90,4 +88,4 @@ typedef QSharedPointer<FramePreparationJob> FramePreparationJobPtr; QT_END_NAMESPACE -#endif // QT3DRENDER_RENDER_FRAMEPREPARATIONJOB_H +#endif // QT3DRENDER_RENDER_UPDATESHADERDATATRANSFORMJOB_H diff --git a/tests/benchmarks/render/jobs/tst_bench_jobs.cpp b/tests/benchmarks/render/jobs/tst_bench_jobs.cpp index 8cf1941d5..454cb9f6a 100644 --- a/tests/benchmarks/render/jobs/tst_bench_jobs.cpp +++ b/tests/benchmarks/render/jobs/tst_bench_jobs.cpp @@ -106,8 +106,8 @@ namespace Qt3DRender { QVector<Qt3DCore::QAspectJobPtr> framePreparationJob() { - static_cast<Render::Renderer *>(d_func()->m_renderer)->m_framePreparationJob->setRoot(d_func()->m_renderer->sceneRoot()); - return QVector<Qt3DCore::QAspectJobPtr>() << static_cast<Render::Renderer *>(d_func()->m_renderer)->m_framePreparationJob; + static_cast<Render::Renderer *>(d_func()->m_renderer)->m_updateShaderDataTransformJob->setManagers(d_func()->m_renderer->nodeManagers()); + return QVector<Qt3DCore::QAspectJobPtr>() << static_cast<Render::Renderer *>(d_func()->m_renderer)->m_updateShaderDataTransformJob; } QVector<Qt3DCore::QAspectJobPtr> frameCleanupJob() |