diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2016-08-02 14:46:40 +0200 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@qt.io> | 2016-10-12 17:21:20 +0000 |
commit | cfd030f4b8e3daa9af346c4b3bbb3f7f887aa887 (patch) | |
tree | a7c234642e4d061243d9f5ceb3f3dfd8b407d06b | |
parent | 0dbe3992e2de28a4d92067844055cedab6c9928c (diff) |
Rename FramePreparationJob to UpdateShaderDataTransformJob
Currently the FramePreparationJob updates shader data transforms and
looks for meshes that needs to be converted to triangles for picking.
These are two distinct processings that could take place concurrently.
This is a first part of the split required to do so.
Change-Id: I1dabf04c0498b9d092ca48343e8572b471ce86c4
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
-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() |