summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2016-08-02 14:46:40 +0200
committerFrederik Gladhorn <frederik.gladhorn@qt.io>2016-10-12 17:21:20 +0000
commitcfd030f4b8e3daa9af346c4b3bbb3f7f887aa887 (patch)
treea7c234642e4d061243d9f5ceb3f3dfd8b407d06b
parent0dbe3992e2de28a4d92067844055cedab6c9928c (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.cpp11
-rw-r--r--src/render/backend/renderer_p.h6
-rw-r--r--src/render/jobs/job_common_p.h2
-rw-r--r--src/render/jobs/jobs.pri8
-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.cpp4
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()