From a4588285909ff89c7f1e09f19533e8be69a7e9e8 Mon Sep 17 00:00:00 2001 From: Sam Cake Date: Mon, 10 Apr 2017 02:30:13 -0700 Subject: [PATCH] MOving forward with the TaskConcept and TaskModel, all working --- .../render-utils/src/RenderDeferredTask.cpp | 2 +- .../render-utils/src/RenderDeferredTask.h | 4 +- .../render-utils/src/RenderForwardTask.cpp | 2 +- .../render-utils/src/RenderForwardTask.h | 4 +- .../render-utils/src/RenderShadowTask.cpp | 4 +- libraries/render-utils/src/RenderShadowTask.h | 4 +- libraries/render-utils/src/ZoneRenderer.cpp | 2 +- libraries/render-utils/src/ZoneRenderer.h | 6 +- libraries/render/src/render/Engine.cpp | 21 +- libraries/render/src/render/Engine.h | 1 - .../src/render/RenderFetchCullSortTask.cpp | 2 +- .../src/render/RenderFetchCullSortTask.h | 4 +- libraries/render/src/render/Task.cpp | 3 +- libraries/render/src/render/Task.h | 291 ++++++++++-------- 14 files changed, 195 insertions(+), 155 deletions(-) diff --git a/libraries/render-utils/src/RenderDeferredTask.cpp b/libraries/render-utils/src/RenderDeferredTask.cpp index 4e9203ad4f..35bf9c0bde 100644 --- a/libraries/render-utils/src/RenderDeferredTask.cpp +++ b/libraries/render-utils/src/RenderDeferredTask.cpp @@ -50,7 +50,7 @@ using namespace render; extern void initOverlay3DPipelines(render::ShapePlumber& plumber); extern void initDeferredPipelines(render::ShapePlumber& plumber); -void RenderDeferredTask::build(render::Task& task, const render::Varying& input, render::Varying& output) { +void RenderDeferredTask::build(JobModel& task, const render::Varying& input, render::Varying& output) { auto items = input.get(); // Prepare the ShapePipelines diff --git a/libraries/render-utils/src/RenderDeferredTask.h b/libraries/render-utils/src/RenderDeferredTask.h index 9ad61b8f1e..660cae88b0 100644 --- a/libraries/render-utils/src/RenderDeferredTask.h +++ b/libraries/render-utils/src/RenderDeferredTask.h @@ -192,14 +192,14 @@ public: void run(const render::SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, const gpu::FramebufferPointer& srcFramebuffer); }; -class RenderDeferredTask : public render::Task { +class RenderDeferredTask { public: using Input = RenderFetchCullSortTask::Output; using JobModel = render::Task::ModelI; RenderDeferredTask() {} - void build(render::Task& task, const render::Varying& inputs, render::Varying& outputs); + void build(JobModel& task, const render::Varying& inputs, render::Varying& outputs); }; #endif // hifi_RenderDeferredTask_h diff --git a/libraries/render-utils/src/RenderForwardTask.cpp b/libraries/render-utils/src/RenderForwardTask.cpp index 630146c698..8a9d7dfbf3 100755 --- a/libraries/render-utils/src/RenderForwardTask.cpp +++ b/libraries/render-utils/src/RenderForwardTask.cpp @@ -29,7 +29,7 @@ using namespace render; extern void initForwardPipelines(ShapePlumber& plumber); -void RenderForwardTask::build(render::Task& task, const render::Varying& input, render::Varying& output) { +void RenderForwardTask::build(JobModel& task, const render::Varying& input, render::Varying& output) { auto items = input.get(); // Prepare the ShapePipelines diff --git a/libraries/render-utils/src/RenderForwardTask.h b/libraries/render-utils/src/RenderForwardTask.h index 3fcf1b398f..f78ce8f317 100755 --- a/libraries/render-utils/src/RenderForwardTask.h +++ b/libraries/render-utils/src/RenderForwardTask.h @@ -16,14 +16,14 @@ #include #include "LightingModel.h" -class RenderForwardTask : public render::Task { +class RenderForwardTask { public: using Input = RenderFetchCullSortTask::Output; using JobModel = render::Task::ModelI; RenderForwardTask() {} - void build(render::Task& task, const render::Varying& inputs, render::Varying& outputs); + void build(JobModel& task, const render::Varying& inputs, render::Varying& outputs); }; class PrepareFramebuffer { diff --git a/libraries/render-utils/src/RenderShadowTask.cpp b/libraries/render-utils/src/RenderShadowTask.cpp index 04e054c921..ddfe038a1a 100644 --- a/libraries/render-utils/src/RenderShadowTask.cpp +++ b/libraries/render-utils/src/RenderShadowTask.cpp @@ -90,7 +90,7 @@ void RenderShadowMap::run(const render::SceneContextPointer& sceneContext, const }); } -void RenderShadowTask::build(render::Task& task, const render::Varying& input, render::Varying& output, CullFunctor cullFunctor) { +void RenderShadowTask::build(JobModel& task, const render::Varying& input, render::Varying& output, CullFunctor cullFunctor) { cullFunctor = cullFunctor ? cullFunctor : [](const RenderArgs*, const AABox&){ return true; }; // Prepare the ShapePipeline @@ -136,7 +136,7 @@ void RenderShadowTask::build(render::Task& task, const render::Varying& input, r void RenderShadowTask::configure(const Config& configuration) { DependencyManager::get()->setShadowMapEnabled(configuration.enabled); // This is a task, so must still propogate configure() to its Jobs - Task::configure(configuration); +// Task::configure(configuration); } void RenderShadowSetup::run(const SceneContextPointer& sceneContext, const render::RenderContextPointer& renderContext, Output& output) { diff --git a/libraries/render-utils/src/RenderShadowTask.h b/libraries/render-utils/src/RenderShadowTask.h index a4b71308e1..9190034b2e 100644 --- a/libraries/render-utils/src/RenderShadowTask.h +++ b/libraries/render-utils/src/RenderShadowTask.h @@ -41,13 +41,13 @@ signals: void dirty(); }; -class RenderShadowTask : public render::Task { +class RenderShadowTask { public: using Config = RenderShadowTaskConfig; using JobModel = render::Task::Model; RenderShadowTask() {} - void build(render::Task& task, const render::Varying& inputs, render::Varying& outputs, render::CullFunctor shouldRender); + void build(JobModel& task, const render::Varying& inputs, render::Varying& outputs, render::CullFunctor shouldRender); void configure(const Config& configuration); }; diff --git a/libraries/render-utils/src/ZoneRenderer.cpp b/libraries/render-utils/src/ZoneRenderer.cpp index cdcad638af..e2bf9a5d22 100644 --- a/libraries/render-utils/src/ZoneRenderer.cpp +++ b/libraries/render-utils/src/ZoneRenderer.cpp @@ -17,7 +17,7 @@ using namespace render; const Selection::Name ZoneRendererTask::ZONES_SELECTION { "RankedZones" }; -void ZoneRendererTask::build(render::Task& task, const Varying& input, Varying& ouput) { +void ZoneRendererTask::build(JobModel& task, const Varying& input, Varying& ouput) { const auto zoneItems = task.addJob("FilterZones", input, ZONES_SELECTION.c_str()); diff --git a/libraries/render-utils/src/ZoneRenderer.h b/libraries/render-utils/src/ZoneRenderer.h index a5585644d5..c55dc2beb4 100644 --- a/libraries/render-utils/src/ZoneRenderer.h +++ b/libraries/render-utils/src/ZoneRenderer.h @@ -27,7 +27,7 @@ signals: protected: }; -class ZoneRendererTask : public render::Task { +class ZoneRendererTask { public: static const render::Selection::Name ZONES_SELECTION; @@ -35,11 +35,11 @@ public: using Inputs = render::ItemBounds; using Config = ZoneRendererConfig; - using JobModel = Model; + using JobModel = render::Task::ModelI; ZoneRendererTask() {} - void build(render::Task& task, const render::Varying& inputs, render::Varying& outputs); + void build(JobModel& task, const render::Varying& inputs, render::Varying& outputs); void configure(const Config& config) { _maxDrawn = config.maxDrawn; } diff --git a/libraries/render/src/render/Engine.cpp b/libraries/render/src/render/Engine.cpp index 15dafce29b..3e6ad458fb 100644 --- a/libraries/render/src/render/Engine.cpp +++ b/libraries/render/src/render/Engine.cpp @@ -22,13 +22,22 @@ using namespace render; -Engine::Engine() : - _sceneContext(std::make_shared()), - _renderContext(std::make_shared()) { -} +class EngineTask { +public: -void Engine::build() { - addJob("Stats"); + using JobModel = Task::Model; + + EngineTask() {} + + void build(JobModel& task, const Varying& in, Varying& out) { + task.addJob("Stats"); + } +}; + +Engine::Engine() : Task("Engine", EngineTask::JobModel::factoryModel()), + _sceneContext(std::make_shared()), + _renderContext(std::make_shared()) +{ } void Engine::load() { diff --git a/libraries/render/src/render/Engine.h b/libraries/render/src/render/Engine.h index f513912f4f..de8340c33e 100644 --- a/libraries/render/src/render/Engine.h +++ b/libraries/render/src/render/Engine.h @@ -25,7 +25,6 @@ namespace render { public: Engine(); - void build(); ~Engine() = default; // Load any persisted settings, and set up the presets diff --git a/libraries/render/src/render/RenderFetchCullSortTask.cpp b/libraries/render/src/render/RenderFetchCullSortTask.cpp index f3d9db7a88..d735afa52d 100644 --- a/libraries/render/src/render/RenderFetchCullSortTask.cpp +++ b/libraries/render/src/render/RenderFetchCullSortTask.cpp @@ -17,7 +17,7 @@ using namespace render; -void RenderFetchCullSortTask::build(Task& task, const Varying& input, Varying& output, CullFunctor cullFunctor) { +void RenderFetchCullSortTask::build(JobModel& task, const Varying& input, Varying& output, CullFunctor cullFunctor) { cullFunctor = cullFunctor ? cullFunctor : [](const RenderArgs*, const AABox&){ return true; }; // CPU jobs: diff --git a/libraries/render/src/render/RenderFetchCullSortTask.h b/libraries/render/src/render/RenderFetchCullSortTask.h index a5db245228..12bcb9786d 100644 --- a/libraries/render/src/render/RenderFetchCullSortTask.h +++ b/libraries/render/src/render/RenderFetchCullSortTask.h @@ -17,7 +17,7 @@ #include "Task.h" #include "CullTask.h" -class RenderFetchCullSortTask : public render::Task { +class RenderFetchCullSortTask { public: enum Buckets { @@ -38,7 +38,7 @@ public: RenderFetchCullSortTask() {} - void build(render::Task& task, const render::Varying& inputs, render::Varying& outputs, render::CullFunctor cullFunctor); + void build(JobModel& task, const render::Varying& inputs, render::Varying& outputs, render::CullFunctor cullFunctor); }; #endif // hifi_RenderFetchCullSortTask_h diff --git a/libraries/render/src/render/Task.cpp b/libraries/render/src/render/Task.cpp index c1a917d26a..cd0c938c73 100644 --- a/libraries/render/src/render/Task.cpp +++ b/libraries/render/src/render/Task.cpp @@ -21,6 +21,7 @@ void TaskConfig::refresh() { return; } - _task->configure(*this); + // _task->configure(*this); + _task->applyConfiguration(); } diff --git a/libraries/render/src/render/Task.h b/libraries/render/src/render/Task.h index 4370d7956f..805f431fcb 100644 --- a/libraries/render/src/render/Task.h +++ b/libraries/render/src/render/Task.h @@ -301,6 +301,7 @@ public: }; class Job; +class JobConcept; class Task; class JobNoIO {}; @@ -432,8 +433,7 @@ public slots: void refresh(); private: - friend class Task; - Task* _task; + JobConcept* _task; }; template void jobConfigure(T& data, const C& configuration) { @@ -458,73 +458,37 @@ template void jobRun(T& data, const SceneContextPoin data.run(sceneContext, renderContext, input, output); } -class GPUJobConfig : public JobConfig { - Q_OBJECT - Q_PROPERTY(double gpuRunTime READ getGPURunTime) - Q_PROPERTY(double batchRunTime READ getBatchRunTime) - - double _msGPURunTime { 0.0 }; - double _msBatchRunTime { 0.0 }; +// The guts of a job +class JobConcept { public: - using Persistent = PersistentConfig; + using Config = JobConfig; + using QConfigPointer = std::shared_ptr; - GPUJobConfig() = default; - GPUJobConfig(bool enabled) : JobConfig(enabled) {} + JobConcept(QConfigPointer config) : _config(config) {} + virtual ~JobConcept() = default; - // Running Time measurement on GPU and for Batch execution - void setGPUBatchRunTime(double msGpuTime, double msBatchTime) { _msGPURunTime = msGpuTime; _msBatchRunTime = msBatchTime; } - double getGPURunTime() const { return _msGPURunTime; } - double getBatchRunTime() const { return _msBatchRunTime; } -}; + virtual const Varying getInput() const { return Varying(); } + virtual const Varying getOutput() const { return Varying(); } -class GPUTaskConfig : public TaskConfig { - Q_OBJECT - Q_PROPERTY(double gpuRunTime READ getGPURunTime) - Q_PROPERTY(double batchRunTime READ getBatchRunTime) + virtual QConfigPointer& getConfiguration() { return _config; } + virtual void applyConfiguration() = 0; - double _msGPURunTime { 0.0 }; - double _msBatchRunTime { 0.0 }; -public: + virtual void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) = 0; - using Persistent = PersistentConfig; +protected: + void setCPURunTime(double mstime) { std::static_pointer_cast(_config)->setCPURunTime(mstime); } + QConfigPointer _config; - GPUTaskConfig() = default; - GPUTaskConfig(bool enabled) : TaskConfig(enabled) {} - - // Running Time measurement on GPU and for Batch execution - void setGPUBatchRunTime(double msGpuTime, double msBatchTime) { _msGPURunTime = msGpuTime; _msBatchRunTime = msBatchTime; } - double getGPURunTime() const { return _msGPURunTime; } - double getBatchRunTime() const { return _msBatchRunTime; } + friend class Job; }; class Job { public: + using Concept = JobConcept; using Config = JobConfig; using QConfigPointer = std::shared_ptr; using None = JobNoIO; - - // The guts of a job - class Concept { - public: - Concept(QConfigPointer config) : _config(config) {} - virtual ~Concept() = default; - - virtual const Varying getInput() const { return Varying(); } - virtual const Varying getOutput() const { return Varying(); } - - virtual QConfigPointer& getConfiguration() { return _config; } - virtual void applyConfiguration() = 0; - - virtual void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) = 0; - - protected: - void setCPURunTime(double mstime) { std::static_pointer_cast(_config)->setCPURunTime(mstime); } - - QConfigPointer _config; - - friend class Job; - }; using ConceptPointer = std::shared_ptr; template class Model : public Concept { @@ -549,6 +513,12 @@ public: applyConfiguration(); } + template + static std::shared_ptr factoryModel(const Varying& input, A&&... args) { + return std::make_shared(input, std::forward(args)...); + } + + void applyConfiguration() override { jobConfigure(_data, *std::static_pointer_cast(_config)); } @@ -593,14 +563,15 @@ protected: std::string _name = ""; }; - -template void jobBuild(T& data, const Varying& input, Varying& output, A&&... args) { - data.build(*(dynamic_cast(&data)), input, output, std::forward(args)...); -} +/* +template void taskBuild(T& data, typename T::JobModel* task, const Varying& input, Varying& output, A&&... args) { + data.build(*(task), input, output, std::forward(args)...); +}*/ // A task is a specialized job to run a collection of other jobs // It is defined with JobModel = Task::Model -class Task { + +class Task : public Job { public: using Config = TaskConfig; using QConfigPointer = Job::QConfigPointer; @@ -608,119 +579,179 @@ public: using Concept = Job::Concept; using Jobs = std::vector; - template class Model : public Concept { + Task(std::string name, ConceptPointer concept) : Job(name, concept) {} + + class TaskConcept : public Concept { + public: + Varying _input; + Varying _output; + Jobs _jobs; + + const Varying getInput() const override { return _input; } + const Varying getOutput() const override { return _output; } + + TaskConcept(const Varying& input, QConfigPointer config) : Concept(config), _input(input) {} + + // Create a new job in the container's queue; returns the job's output + template const Varying addJob(std::string name, const Varying& input, NA&&... args) { + _jobs.emplace_back(name, (NT::JobModel::factoryModel(input, std::forward(args)...))); + QConfigPointer config = _jobs.back().getConfiguration(); + config->setParent(getConfiguration().get()); + config->setObjectName(name.c_str()); + + // Connect loaded->refresh + QObject::connect(config.get(), SIGNAL(loaded()), getConfiguration().get(), SLOT(refresh())); + static const char* DIRTY_SIGNAL = "dirty()"; + if (config->metaObject()->indexOfSignal(DIRTY_SIGNAL) != -1) { + // Connect dirty->refresh if defined + QObject::connect(config.get(), SIGNAL(dirty()), getConfiguration().get(), SLOT(refresh())); + } + + return _jobs.back().getOutput(); + } + template const Varying addJob(std::string name, NA&&... args) { + const auto input = Varying(typename NT::JobModel::Input()); + return addJob(name, input, std::forward(args)...); + } + }; + + template class TaskModel : public TaskConcept { public: using Data = T; using Input = I; using Output = O; Data _data; - Varying _input; - Varying _output; - const Varying getInput() const override { return _input; } - const Varying getOutput() const override { return _output; } + TaskModel(const Varying& input) : + TaskConcept(input, nullptr), + _data(Data()) {} template - Model(const Varying& input, A&&... args) : - Concept(nullptr), - _data(Data()), - _input(input) { + static std::shared_ptr factoryModel(const Varying& input, A&&... args) { + auto model = std::make_shared(input); - jobBuild(_data, _input, _output, std::forward(args)...); + model->_data.build(*(model), model->_input, model->_output, std::forward(args)...); // Recreate the Config to use the templated type - _data.template createConfiguration(); - _config = _data.getConfiguration(); - applyConfiguration(); + model->createConfiguration(); + model->applyConfiguration(); + + return model; + } + + template + static std::shared_ptr factoryModel(A&&... args) { + const auto input = Varying(Input()); + return factoryModel(input, std::forward(args)...); + } + + void createConfiguration() { + auto config = std::make_shared(); + if (_config) { + // Transfer children to the new configuration + auto children = _config->children(); + for (auto& child : children) { + child->setParent(config.get()); + QObject::connect(child, SIGNAL(loaded()), config.get(), SLOT(refresh())); + static const char* DIRTY_SIGNAL = "dirty()"; + if (child->metaObject()->indexOfSignal(DIRTY_SIGNAL) != -1) { + // Connect dirty->refresh if defined + QObject::connect(child, SIGNAL(dirty()), config.get(), SLOT(refresh())); + } + } + } + _config = config; + std::static_pointer_cast(_config)->_task = this; + } + + QConfigPointer& getConfiguration() override { + if (!_config) { + createConfiguration(); + } + return _config; } void applyConfiguration() override { jobConfigure(_data, *std::static_pointer_cast(_config)); + for (auto& job : _jobs) { + job.applyConfiguration(); + } } void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) override { auto config = std::static_pointer_cast(_config); if (config->alwaysEnabled || config->enabled) { - for (auto job : _data._jobs) { + for (auto job : _jobs) { job.run(sceneContext, renderContext); } } } }; - template using ModelI = Model; - template using ModelO = Model; - template using ModelIO = Model; + template using Model = TaskModel; + template using ModelI = TaskModel; + template using ModelO = TaskModel; + template using ModelIO = TaskModel; - // Create a new job in the container's queue; returns the job's output + // Create a new job in the Task's queue; returns the job's output template const Varying addJob(std::string name, const Varying& input, A&&... args) { - _jobs.emplace_back(name, std::make_shared(input, std::forward(args)...)); - QConfigPointer config = _jobs.back().getConfiguration(); - config->setParent(getConfiguration().get()); - config->setObjectName(name.c_str()); - - // Connect loaded->refresh - QObject::connect(config.get(), SIGNAL(loaded()), getConfiguration().get(), SLOT(refresh())); - static const char* DIRTY_SIGNAL = "dirty()"; - if (config->metaObject()->indexOfSignal(DIRTY_SIGNAL) != -1) { - // Connect dirty->refresh if defined - QObject::connect(config.get(), SIGNAL(dirty()), getConfiguration().get(), SLOT(refresh())); - } - - return _jobs.back().getOutput(); + return std::static_pointer_cast( _concept)->addJob(name, input, std::forward(args)...); } template const Varying addJob(std::string name, A&&... args) { const auto input = Varying(typename T::JobModel::Input()); - return addJob(name, input, std::forward(args)...); + return std::static_pointer_cast( _concept)->addJob(name, input, std::forward(args)...); } template void setOutput(O&& output) { _concept->_output = Varying(output); } - template void createConfiguration() { - auto config = std::make_shared(); - if (_config) { - // Transfer children to the new configuration - auto children = _config->children(); - for (auto& child : children) { - child->setParent(config.get()); - QObject::connect(child, SIGNAL(loaded()), config.get(), SLOT(refresh())); - static const char* DIRTY_SIGNAL = "dirty()"; - if (child->metaObject()->indexOfSignal(DIRTY_SIGNAL) != -1) { - // Connect dirty->refresh if defined - QObject::connect(child, SIGNAL(dirty()), config.get(), SLOT(refresh())); - } - } - } - _config = config; - std::static_pointer_cast(_config)->_task = this; - } - std::shared_ptr getConfiguration() { - if (!_config) { - createConfiguration(); - } - return std::static_pointer_cast(_config); + return std::static_pointer_cast(_concept->getConfiguration()); } - void configure(const QObject& configuration) { - for (auto& job : _jobs) { - job.applyConfiguration(); - } - } - - void run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { - for (auto job : _jobs) { - job.run(sceneContext, renderContext); - } - } - - protected: +}; - QConfigPointer _config; - Jobs _jobs; +// Versions of the COnfig integrating a gpu & batch timer +class GPUJobConfig : public JobConfig { + Q_OBJECT + Q_PROPERTY(double gpuRunTime READ getGPURunTime) + Q_PROPERTY(double batchRunTime READ getBatchRunTime) + + double _msGPURunTime { 0.0 }; + double _msBatchRunTime { 0.0 }; +public: + using Persistent = PersistentConfig; + + GPUJobConfig() = default; + GPUJobConfig(bool enabled) : JobConfig(enabled) {} + + // Running Time measurement on GPU and for Batch execution + void setGPUBatchRunTime(double msGpuTime, double msBatchTime) { _msGPURunTime = msGpuTime; _msBatchRunTime = msBatchTime; } + double getGPURunTime() const { return _msGPURunTime; } + double getBatchRunTime() const { return _msBatchRunTime; } +}; + +class GPUTaskConfig : public TaskConfig { + Q_OBJECT + Q_PROPERTY(double gpuRunTime READ getGPURunTime) + Q_PROPERTY(double batchRunTime READ getBatchRunTime) + + double _msGPURunTime { 0.0 }; + double _msBatchRunTime { 0.0 }; +public: + + using Persistent = PersistentConfig; + + + GPUTaskConfig() = default; + GPUTaskConfig(bool enabled) : TaskConfig(enabled) {} + + // Running Time measurement on GPU and for Batch execution + void setGPUBatchRunTime(double msGpuTime, double msBatchTime) { _msGPURunTime = msGpuTime; _msBatchRunTime = msBatchTime; } + double getGPURunTime() const { return _msGPURunTime; } + double getBatchRunTime() const { return _msBatchRunTime; } }; }