From c2630bd66cdec12721375236f1f2d7c4dd9ccad4 Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Fri, 21 Aug 2020 08:43:46 +0200 Subject: Job Graph dump improvements - Reverse dependency order so that graph shows jobs from first to last instead of last to first - Add instance id to RenderViewBuilder jobs, otherwise it all appears as if there's a single instance of a given job when in reality there is one per RenderView Change-Id: Id47764151f0321c794068e71e21a25e921d04589 Reviewed-by: Mike Krus --- src/core/qscheduler.cpp | 2 +- src/plugins/renderers/opengl/renderer/renderer.cpp | 6 ++--- .../opengl/renderer/renderviewbuilder.cpp | 26 +++++++++++++--------- .../opengl/renderer/renderviewbuilder_p.h | 4 ++-- src/render/jobs/filterproximitydistancejob.cpp | 11 ++++++++- src/render/jobs/filterproximitydistancejob_p.h | 1 + src/render/jobs/frustumcullingjob.cpp | 11 ++++++++- src/render/jobs/frustumcullingjob_p.h | 1 + src/render/jobs/genericlambdajob_p.h | 4 ++-- 9 files changed, 46 insertions(+), 20 deletions(-) diff --git a/src/core/qscheduler.cpp b/src/core/qscheduler.cpp index b9d3b75aa..a18a0b144 100644 --- a/src/core/qscheduler.cpp +++ b/src/core/qscheduler.cpp @@ -80,7 +80,7 @@ void dumpJobs(const std::vector &jobs) { for (const auto &job: jobs) { auto dependencies = job->dependencies(); for (const auto &dependency: dependencies) - stream << QLatin1String("\t") << formatJob(job.data()) << QLatin1String(" -> ") << formatJob(dependency.toStrongRef().data()) << Qt::endl; + stream << QLatin1String("\t") << formatJob(dependency.toStrongRef().data()) << QLatin1String(" -> ") << formatJob(job.data()) << Qt::endl; } stream << "}" << Qt::endl; diff --git a/src/plugins/renderers/opengl/renderer/renderer.cpp b/src/plugins/renderers/opengl/renderer/renderer.cpp index 7eceaf944..55a9fa4e4 100644 --- a/src/plugins/renderers/opengl/renderer/renderer.cpp +++ b/src/plugins/renderers/opengl/renderer/renderer.cpp @@ -255,9 +255,9 @@ Renderer::Renderer() , m_lightGathererJob(new CachingLightGatherer(&m_cache)) , m_renderableEntityFilterJob(new CachingRenderableEntityFilter(&m_cache)) , m_computableEntityFilterJob(new CachingComputableEntityFilter(&m_cache)) - , m_bufferGathererJob(CreateSynchronizerJobPtr([this] { lookForDirtyBuffers(); }, JobTypes::DirtyBufferGathering)) - , m_vaoGathererJob(CreateSynchronizerJobPtr([this] { lookForAbandonedVaos(); }, JobTypes::DirtyVaoGathering)) - , m_textureGathererJob(CreateSynchronizerJobPtr([this] { lookForDirtyTextures(); }, JobTypes::DirtyTextureGathering)) + , m_bufferGathererJob(CreateSynchronizerJobPtr([this] { lookForDirtyBuffers(); }, JobTypes::DirtyBufferGathering, 0)) + , m_vaoGathererJob(CreateSynchronizerJobPtr([this] { lookForAbandonedVaos(); }, JobTypes::DirtyVaoGathering, 0)) + , m_textureGathererJob(CreateSynchronizerJobPtr([this] { lookForDirtyTextures(); }, JobTypes::DirtyTextureGathering, 0)) , m_introspectShaderJob(CreateSynchronizerPostFramePtr([this] { reloadDirtyShaders(); }, [this] (Qt3DCore::QAspectManager *m) { sendShaderChangesToFrontend(m); }, JobTypes::DirtyShaderGathering)) diff --git a/src/plugins/renderers/opengl/renderer/renderviewbuilder.cpp b/src/plugins/renderers/opengl/renderer/renderviewbuilder.cpp index 9cd7e27b7..26ad8f0ec 100644 --- a/src/plugins/renderers/opengl/renderer/renderviewbuilder.cpp +++ b/src/plugins/renderers/opengl/renderer/renderviewbuilder.cpp @@ -534,8 +534,8 @@ RenderViewBuilder::RenderViewBuilder(Render::FrameGraphNode *leafNode, int rende , m_renderViewJob(RenderViewInitializerJobPtr::create()) , m_filterEntityByLayerJob() , m_frustumCullingJob(new Render::FrustumCullingJob()) - , m_syncPreFrustumCullingJob(CreateSynchronizerJobPtr(SyncPreFrustumCulling(m_renderViewJob, m_frustumCullingJob), JobTypes::SyncFrustumCulling)) - , m_setClearDrawBufferIndexJob(CreateSynchronizerJobPtr(SetClearDrawBufferIndex(m_renderViewJob), JobTypes::ClearBufferDrawIndex)) + , m_syncPreFrustumCullingJob(CreateSynchronizerJobPtr(SyncPreFrustumCulling(m_renderViewJob, m_frustumCullingJob), JobTypes::SyncFrustumCulling, renderViewIndex)) + , m_setClearDrawBufferIndexJob(CreateSynchronizerJobPtr(SetClearDrawBufferIndex(m_renderViewJob), JobTypes::ClearBufferDrawIndex, renderViewIndex)) , m_syncFilterEntityByLayerJob() , m_filterProximityJob(Render::FilterProximityDistanceJobPtr::create()) { @@ -637,7 +637,8 @@ void RenderViewBuilder::prepareJobs() m_renderViewCommandBuilderJobs, m_renderer, m_leafNode), - JobTypes::SyncRenderViewPreCommandBuilding); + JobTypes::SyncRenderViewPreCommandBuilding, + m_renderViewIndex); } m_renderViewJob->setRenderer(m_renderer); @@ -675,7 +676,8 @@ void RenderViewBuilder::prepareJobs() m_syncMaterialGathererJob = CreateSynchronizerJobPtr(SyncMaterialParameterGatherer(m_materialGathererJobs, m_renderer, m_leafNode), - JobTypes::SyncMaterialGatherer); + JobTypes::SyncMaterialGatherer, + m_renderViewIndex); } const bool layerCacheNeedsRebuild = m_rebuildFlags.testFlag(RebuildFlag::LayerCacheRebuild); @@ -683,9 +685,10 @@ void RenderViewBuilder::prepareJobs() m_filterEntityByLayerJob = Render::FilterLayerEntityJobPtr::create(); m_filterEntityByLayerJob->setManager(m_renderer->nodeManagers()); m_syncFilterEntityByLayerJob = CreateSynchronizerJobPtr(SyncFilterEntityByLayer(m_filterEntityByLayerJob, - m_renderer, - m_leafNode), - JobTypes::SyncFilterEntityByLayer); + m_renderer, + m_leafNode), + JobTypes::SyncFilterEntityByLayer, + m_renderViewIndex); } m_syncRenderViewPreCommandUpdateJob = CreateSynchronizerJobPtr(SyncRenderViewPreCommandUpdate(m_renderViewJob, @@ -697,12 +700,14 @@ void RenderViewBuilder::prepareJobs() m_renderer, m_leafNode, m_rebuildFlags), - JobTypes::SyncRenderViewPreCommandUpdate); + JobTypes::SyncRenderViewPreCommandUpdate, + m_renderViewIndex); m_syncRenderViewPostCommandUpdateJob = CreateSynchronizerJobPtr(SyncRenderViewPostCommandUpdate(m_renderViewJob, m_renderViewCommandUpdaterJobs, m_renderer), - JobTypes::SyncRenderViewPostCommandUpdate); + JobTypes::SyncRenderViewPostCommandUpdate, + m_renderViewIndex); m_syncRenderViewPostInitializationJob = CreateSynchronizerJobPtr(SyncRenderViewPostInitialization(m_renderViewJob, m_frustumCullingJob, @@ -711,7 +716,8 @@ void RenderViewBuilder::prepareJobs() m_materialGathererJobs, m_renderViewCommandUpdaterJobs, m_renderViewCommandBuilderJobs), - JobTypes::SyncRenderViewInitialization); + JobTypes::SyncRenderViewInitialization, + m_renderViewIndex); } std::vector RenderViewBuilder::buildJobHierachy() const diff --git a/src/plugins/renderers/opengl/renderer/renderviewbuilder_p.h b/src/plugins/renderers/opengl/renderer/renderviewbuilder_p.h index b7d3ed270..77fec9f0c 100644 --- a/src/plugins/renderers/opengl/renderer/renderviewbuilder_p.h +++ b/src/plugins/renderers/opengl/renderer/renderviewbuilder_p.h @@ -74,8 +74,8 @@ namespace OpenGL { class Renderer; using SynchronizerJobPtr = GenericLambdaJobPtr>; -#define CreateSynchronizerJobPtr(lambda, type) \ - SynchronizerJobPtr::create(lambda, type, #type) +#define CreateSynchronizerJobPtr(lambda, type, instance) \ + SynchronizerJobPtr::create(lambda, type, #type, instance) using RenderViewCommandBuilderJobPtr = Render::RenderViewCommandBuilderJobPtr; using RenderViewCommandUpdaterJobPtr = Render::RenderViewCommandUpdaterJobPtr; diff --git a/src/render/jobs/filterproximitydistancejob.cpp b/src/render/jobs/filterproximitydistancejob.cpp index cbfea14a1..cbbd39b8c 100644 --- a/src/render/jobs/filterproximitydistancejob.cpp +++ b/src/render/jobs/filterproximitydistancejob.cpp @@ -40,13 +40,22 @@ namespace Qt3DRender { namespace Render { +namespace { +int instanceCounter = 0; +} // anonymous + FilterProximityDistanceJob::FilterProximityDistanceJob() : m_manager(nullptr) , m_targetEntity(nullptr) , m_distanceThresholdSquared(0.) { - SET_JOB_RUN_STAT_TYPE(this, JobTypes::ProximityFiltering, 0) + SET_JOB_RUN_STAT_TYPE(this, JobTypes::ProximityFiltering, instanceCounter++) +} + +FilterProximityDistanceJob::~FilterProximityDistanceJob() +{ + --instanceCounter; } void FilterProximityDistanceJob::run() diff --git a/src/render/jobs/filterproximitydistancejob_p.h b/src/render/jobs/filterproximitydistancejob_p.h index fd93d529d..fe93ba731 100644 --- a/src/render/jobs/filterproximitydistancejob_p.h +++ b/src/render/jobs/filterproximitydistancejob_p.h @@ -57,6 +57,7 @@ class Q_3DRENDERSHARED_PRIVATE_EXPORT FilterProximityDistanceJob : public Qt3DCo { public: FilterProximityDistanceJob(); + ~FilterProximityDistanceJob(); inline void setManager(NodeManagers *manager) { m_manager = manager; } inline void setProximityFilterIds(const Qt3DCore::QNodeIdVector &proximityFilterIds) { m_proximityFilterIds = proximityFilterIds; } diff --git a/src/render/jobs/frustumcullingjob.cpp b/src/render/jobs/frustumcullingjob.cpp index aa1a57a31..17dac3c49 100644 --- a/src/render/jobs/frustumcullingjob.cpp +++ b/src/render/jobs/frustumcullingjob.cpp @@ -51,13 +51,22 @@ namespace Qt3DRender { namespace Render { +namespace { +int instanceCounter = 0; +} // anonymous + FrustumCullingJob::FrustumCullingJob() : Qt3DCore::QAspectJob() , m_root(nullptr) , m_manager(nullptr) , m_active(false) { - SET_JOB_RUN_STAT_TYPE(this, JobTypes::FrustumCulling, 0) + SET_JOB_RUN_STAT_TYPE(this, JobTypes::FrustumCulling, instanceCounter++) +} + +FrustumCullingJob::~FrustumCullingJob() +{ + --instanceCounter; } void FrustumCullingJob::run() diff --git a/src/render/jobs/frustumcullingjob_p.h b/src/render/jobs/frustumcullingjob_p.h index 60cc05388..276c0c803 100644 --- a/src/render/jobs/frustumcullingjob_p.h +++ b/src/render/jobs/frustumcullingjob_p.h @@ -73,6 +73,7 @@ class Q_3DRENDERSHARED_PRIVATE_EXPORT FrustumCullingJob : public Qt3DCore::QAspe { public: FrustumCullingJob(); + ~FrustumCullingJob(); QT3D_ALIGNED_MALLOC_AND_FREE() diff --git a/src/render/jobs/genericlambdajob_p.h b/src/render/jobs/genericlambdajob_p.h index 994cd3a14..765746b0c 100644 --- a/src/render/jobs/genericlambdajob_p.h +++ b/src/render/jobs/genericlambdajob_p.h @@ -64,11 +64,11 @@ template class GenericLambdaJob : public Qt3DCore::QAspectJob { public: - explicit GenericLambdaJob(T callable, JobTypes::JobType type = JobTypes::GenericLambda, const char *name = "GenericLambda") + explicit GenericLambdaJob(T callable, JobTypes::JobType type = JobTypes::GenericLambda, const char *name = "GenericLambda", int instance = 0) : Qt3DCore::QAspectJob() , m_callable(callable) { - SET_JOB_RUN_STAT_TYPE_AND_NAME(this, type, name, 0) + SET_JOB_RUN_STAT_TYPE_AND_NAME(this, type, name, instance) } // QAspectJob interface -- cgit v1.2.3