From fd752a07c1a49b3d6dc96850350b2c5ca2f30efb Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Tue, 17 Apr 2018 02:05:35 -0700 Subject: [PATCH] Proposing a more flexible design for the engine --- interface/src/workload/GameWorkload.cpp | 22 +++++---- interface/src/workload/GameWorkload.h | 3 +- libraries/workload/src/workload/Engine.cpp | 32 ------------- libraries/workload/src/workload/Engine.h | 32 ++++--------- .../workload/src/workload/RegionTracker.h | 1 - libraries/workload/src/workload/Space.h | 1 + .../workload/src/workload/SpaceClassifier.cpp | 34 ++++++++++++++ .../workload/src/workload/SpaceClassifier.h | 47 +++++++++++++++++++ .../utilities/workload/workloadInspector.qml | 13 ++++- 9 files changed, 117 insertions(+), 68 deletions(-) create mode 100644 libraries/workload/src/workload/SpaceClassifier.cpp create mode 100644 libraries/workload/src/workload/SpaceClassifier.h diff --git a/interface/src/workload/GameWorkload.cpp b/interface/src/workload/GameWorkload.cpp index 0fc3e32701..5f992d0934 100644 --- a/interface/src/workload/GameWorkload.cpp +++ b/interface/src/workload/GameWorkload.cpp @@ -11,13 +11,14 @@ #include "GameWorkloadRenderer.h" #include #include +#include #include "PhysicsBoundary.h" GameWorkloadContext::GameWorkloadContext(const workload::SpacePointer& space, const render::ScenePointer& scene, - const PhysicalEntitySimulationPointer& simulation) -: WorkloadContext(space), _scene(scene), _simulation(simulation) + const PhysicalEntitySimulationPointer& simulation): WorkloadContext(space), + _scene(scene), _simulation(simulation) { } @@ -25,7 +26,9 @@ GameWorkloadContext::~GameWorkloadContext() { } -GameWorkload::GameWorkload() { +GameWorkload::GameWorkload() : + _engine(std::make_shared(std::make_shared(workload::SpaceClassifierTask::JobModel::create("Engine")))) +{ } GameWorkload::~GameWorkload() { @@ -37,11 +40,11 @@ void GameWorkload::startup(const workload::SpacePointer& space, const PhysicalEntitySimulationPointer& simulation) { _engine->reset(std::make_shared(space, scene, simulation)); - auto output = _engine->getOutput(); - _engine->addJob("SpaceToRender"); + auto output = _engine->_task->getOutput(); + _engine->_task->addJob("SpaceToRender"); - const auto regionChanges = _engine->getOutput(); - _engine->addJob("PhysicsBoundary", regionChanges); + const auto regionChanges = _engine->_task->getOutput(); + _engine->_task->addJob("PhysicsBoundary", regionChanges); } void GameWorkload::shutdown() { @@ -52,6 +55,9 @@ void GameWorkload::updateViews(const ViewFrustum& frustum, const glm::vec3& head workload::Views views; views.emplace_back(workload::View::evalFromFrustum(frustum, headPosition - frustum.getPosition())); views.emplace_back(workload::View::evalFromFrustum(frustum)); - _engine->feedInput(views); + _engine->_task->feedInput(views); } +void GameWorkload::updateSimulationTiming(const workload::Timings& timings) { + // _engine->_task->feedInput(timings); +} diff --git a/interface/src/workload/GameWorkload.h b/interface/src/workload/GameWorkload.h index 023ecab1b8..1f835686f8 100644 --- a/interface/src/workload/GameWorkload.h +++ b/interface/src/workload/GameWorkload.h @@ -38,8 +38,9 @@ public: void shutdown(); void updateViews(const ViewFrustum& frustum, const glm::vec3& headPosition); + void updateSimulationTimings(const workload::Timings& timings); - workload::EnginePointer _engine { std::make_shared() }; + workload::EnginePointer _engine; }; #endif // hifi_GameWorkload_h diff --git a/libraries/workload/src/workload/Engine.cpp b/libraries/workload/src/workload/Engine.cpp index fb02b7f826..0ecae55b72 100644 --- a/libraries/workload/src/workload/Engine.cpp +++ b/libraries/workload/src/workload/Engine.cpp @@ -13,43 +13,11 @@ #include -#include "ViewTask.h" -#include "RegionTracker.h" -#include "RegionState.h" - namespace workload { WorkloadContext::WorkloadContext(const SpacePointer& space) : task::JobContext(trace_workload()), _space(space) {} - class EngineBuilder { - public: - using Inputs = Views; - using Outputs = RegionTracker::Outputs; - using JobModel = Task::ModelIO; - void build(JobModel& model, const Varying& in, Varying& out) { - model.addJob("setupViews", in); - model.addJob("updateSpace"); - const auto regionTrackerOut = model.addJob("regionTracker"); - const auto regionChanges = regionTrackerOut.getN(1); - model.addJob("regionState", regionChanges); - out = regionTrackerOut; - } - }; - - Engine::Engine() : Task(EngineBuilder::JobModel::create("Engine")), - _context(nullptr) { - } - void Engine::reset(const WorkloadContextPointer& context) { _context = context; } - - void PerformSpaceTransaction::configure(const Config& config) { - - } - void PerformSpaceTransaction::run(const WorkloadContextPointer& context) { - context->_space->enqueueFrame(); - context->_space->processTransactionQueue(); - } - } // namespace workload diff --git a/libraries/workload/src/workload/Engine.h b/libraries/workload/src/workload/Engine.h index 3c5215c508..d1628dfc61 100644 --- a/libraries/workload/src/workload/Engine.h +++ b/libraries/workload/src/workload/Engine.h @@ -23,7 +23,6 @@ #include "Space.h" namespace workload { - class WorkloadContext : public task::JobContext { public: WorkloadContext(const SpacePointer& space); @@ -35,41 +34,26 @@ namespace workload { using WorkloadContextPointer = std::shared_ptr; Task_DeclareTypeAliases(WorkloadContext) - class Engine : public Task { + class Engine { public: - Engine(); + Engine(const std::shared_ptr& task) : _task(task), _context(nullptr) { + } ~Engine() = default; void reset(const WorkloadContextPointer& context); - void run() { if (_context) { run(_context); } } + void run() { if (_context) { _task->run(_context); } } + + std::shared_ptr getConfiguration() { return _task->getConfiguration(); } + + std::shared_ptr _task; protected: - void run(const WorkloadContextPointer& context) override { assert(_context); Task::run(_context); } private: WorkloadContextPointer _context; }; using EnginePointer = std::shared_ptr; - - class PerformSpaceTransactionConfig : public Job::Config { - Q_OBJECT - public: - signals : - void dirty(); - - protected: - }; - - class PerformSpaceTransaction { - public: - using Config = PerformSpaceTransactionConfig; - using JobModel = Job::Model; - - void configure(const Config& config); - void run(const WorkloadContextPointer& context); - protected: - }; } // namespace workload #endif // hifi_workload_Space_h diff --git a/libraries/workload/src/workload/RegionTracker.h b/libraries/workload/src/workload/RegionTracker.h index 13285bdf07..29a9af1f84 100644 --- a/libraries/workload/src/workload/RegionTracker.h +++ b/libraries/workload/src/workload/RegionTracker.h @@ -39,7 +39,6 @@ namespace workload { protected: }; - } // namespace workload #endif // hifi_workload_RegionTracker_h diff --git a/libraries/workload/src/workload/Space.h b/libraries/workload/src/workload/Space.h index 8ed85e15ab..ab7dd02134 100644 --- a/libraries/workload/src/workload/Space.h +++ b/libraries/workload/src/workload/Space.h @@ -70,6 +70,7 @@ private: using SpacePointer = std::shared_ptr; using Changes = std::vector; using IndexVectors = std::vector; +using Timings = std::vector; } // namespace workload diff --git a/libraries/workload/src/workload/SpaceClassifier.cpp b/libraries/workload/src/workload/SpaceClassifier.cpp new file mode 100644 index 0000000000..080210714f --- /dev/null +++ b/libraries/workload/src/workload/SpaceClassifier.cpp @@ -0,0 +1,34 @@ +// +// SpaceClassifier.cpp +// libraries/workload/src/workload +// +// Created by Andrew Meadows 2018.02.21 +// Copyright 2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// +#include "SpaceClassifier.h" + +#include "ViewTask.h" +#include "RegionState.h" + +using namespace workload; + +void PerformSpaceTransaction::configure(const Config& config) { + +} +void PerformSpaceTransaction::run(const WorkloadContextPointer& context) { + context->_space->enqueueFrame(); + context->_space->processTransactionQueue(); +} + +void SpaceClassifierTask::build(JobModel& model, const Varying& in, Varying& out) { + model.addJob("setupViews", in); + model.addJob("updateSpace"); + const auto regionTrackerOut = model.addJob("regionTracker"); + const auto regionChanges = regionTrackerOut.getN(1); + model.addJob("regionState", regionChanges); + out = regionTrackerOut; +} + diff --git a/libraries/workload/src/workload/SpaceClassifier.h b/libraries/workload/src/workload/SpaceClassifier.h new file mode 100644 index 0000000000..06ddaee520 --- /dev/null +++ b/libraries/workload/src/workload/SpaceClassifier.h @@ -0,0 +1,47 @@ +// +// SpaceClassifier.h +// libraries/workload/src/workload +// +// Created by Andrew Meadows 2018.02.21 +// Copyright 2018 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// +#ifndef hifi_workload_SpaceClassifier_h +#define hifi_workload_SpaceClassifier_h + +#include "ViewTask.h" +#include "RegionTracker.h" + +namespace workload { + class SpaceClassifierTask { + public: + using Inputs = Views; + using Outputs = RegionTracker::Outputs; + using JobModel = Task::ModelIO; + void build(JobModel& model, const Varying& in, Varying& out); + }; + + + class PerformSpaceTransactionConfig : public Job::Config { + Q_OBJECT + public: + signals : + void dirty(); + + protected: + }; + + class PerformSpaceTransaction { + public: + using Config = PerformSpaceTransactionConfig; + using JobModel = Job::Model; + + void configure(const Config& config); + void run(const WorkloadContextPointer& context); + protected: + }; +} // namespace workload + +#endif // hifi_workload_SpaceClassifier_h diff --git a/scripts/developer/utilities/workload/workloadInspector.qml b/scripts/developer/utilities/workload/workloadInspector.qml index 06e5edd046..2dc4ad0491 100644 --- a/scripts/developer/utilities/workload/workloadInspector.qml +++ b/scripts/developer/utilities/workload/workloadInspector.qml @@ -170,8 +170,17 @@ Rectangle { } Separator {} HifiControls.Label { - text: "Numbers: R2= " + Workload.getConfig("regionState")["numR2"]; - } + text: "Numbers:"; + } + HifiControls.Label { + text: "R1= " + Workload.getConfig("regionState")["numR1"]; + } + HifiControls.Label { + text: "R2= " + Workload.getConfig("regionState")["numR2"]; + } + HifiControls.Label { + text: "R3= " + Workload.getConfig("regionState")["numR3"]; + } Separator {} HifiControls.Label { text: "Display"