History

Moving the view controller up into workload and exposing timings

samcake committed 8 years ago

Commit ba29eba1 parent 6d755a23 files · +196 −73Browse files

Showing the changes to interface/src/workload/GameWorkload.cpp (1 of 3 files). Show all

Unified · Split

interface/src/workload/GameWorkload.cpp+2−73
@@ -15,77 +15,6 @@ · 14 unmodified lines
15 15
16#include "PhysicsBoundary.h"16#include "PhysicsBoundary.h"
17 17
18ControlViews::ControlViews() {
19 regionBackFronts[0] = glm::vec2(1.0f, 3.0f);
20 regionBackFronts[1] = glm::vec2(1.0f, 5.0f);
21 regionBackFronts[2] = glm::vec2(1.0f, 10.0f);
22 regionRegulators[0] = Regulator(std::chrono::milliseconds(2), regionBackFronts[0], 5.0f * regionBackFronts[0], glm::vec2(0.4f, 0.2f), 0.5f * glm::vec2(0.3f, 0.2f));
23 regionRegulators[1] = Regulator(std::chrono::milliseconds(2), regionBackFronts[1], 8.0f * regionBackFronts[1], glm::vec2(0.4f, 0.2f), 0.5f * glm::vec2(0.3f, 0.2f));
24 regionRegulators[2] = Regulator(std::chrono::milliseconds(2), regionBackFronts[2], 10.0f * regionBackFronts[2], glm::vec2(0.4f, 0.2f), 0.5f * glm::vec2(0.3f, 0.2f));
25}
26
27void ControlViews::configure(const Config& config) {
28 _data = config.data;
29}
30
31void ControlViews::run(const workload::WorkloadContextPointer& runContext, const Input& inputs, Output& outputs) {
32 const auto& inViews = inputs.get0();
33 const auto& inTimings = inputs.get1();
34 auto& outViews = outputs;
35 outViews.clear();
36 outViews = inViews;
37
38 if (_data.regulateViewRanges && inTimings.size()) {
39 regulateViews(outViews, inTimings);
40
41 auto config = std::static_pointer_cast<Config>(runContext->jobConfig);
42 config->dataExport = _dataExport;
43 config->emitDirty();
44 }
45
46
47}
48
49glm::vec2 Regulator::run(const Timing_ns& regulationDuration, const Timing_ns& measured, const glm::vec2& current) {
50 glm::vec2 next = current;
51
52 // Regulate next value based on current moving toward the goal budget
53 float error_ms = std::chrono::duration<float, std::milli>(_budget - measured).count();
54 float coef = error_ms / std::chrono::duration<float, std::milli>(regulationDuration).count();
55 next += coef * (error_ms < 0.0f ? _speedDown : _speedUp);
56
57 // Clamp to min max
58 next = glm::clamp(next, _minRange, _maxRange);
59
60 return next;
61}
62
63void ControlViews::regulateViews(workload::Views& outViews, const workload::Timings& timings) {
64
65 for (auto& outView : outViews) {
66 for (int r = 0; r < workload::Region::NUM_VIEW_REGIONS; r++) {
67 outView.regionBackFronts[r] = regionBackFronts[r];
68 }
69 }
70
71 auto loopDuration = std::chrono::nanoseconds{ std::chrono::milliseconds(16) };
72 _dataExport.ranges[workload::Region::R1] = regionBackFronts[workload::Region::R1] = regionRegulators[workload::Region::R1].run(loopDuration, timings[0], regionBackFronts[workload::Region::R1]);
73 _dataExport.ranges[workload::Region::R2] = regionBackFronts[workload::Region::R2] = regionRegulators[workload::Region::R2].run(loopDuration, timings[0], regionBackFronts[workload::Region::R2]);
74 _dataExport.ranges[workload::Region::R3] = regionBackFronts[workload::Region::R3] = regionRegulators[workload::Region::R3].run(loopDuration, timings[1], regionBackFronts[workload::Region::R3]);
75
76 _dataExport.timings[workload::Region::R1] = std::chrono::duration<float, std::milli>(timings[0]).count();
77 _dataExport.timings[workload::Region::R2] = _dataExport.timings[workload::Region::R1];
78 _dataExport.timings[workload::Region::R3] = std::chrono::duration<float, std::milli>(timings[1]).count();
79
80 for (auto& outView : outViews) {
81 outView.regionBackFronts[workload::Region::R1] = regionBackFronts[workload::Region::R1];
82 outView.regionBackFronts[workload::Region::R2] = regionBackFronts[workload::Region::R2];
83 outView.regionBackFronts[workload::Region::R3] = regionBackFronts[workload::Region::R3];
84
85 workload::View::updateRegionsFromBackFronts(outView);
86 }
87}
88
89class WorkloadEngineBuilder {18class WorkloadEngineBuilder {
90public:19public:
91public:20public:
@@ -99,8 +28,8 @@ public: · 7 unmodified lines
99 28
100 const auto usedViews = model.addJob<workload::SetupViews>("setupViews", inViews);29 const auto usedViews = model.addJob<workload::SetupViews>("setupViews", inViews);
101 30
102 const auto controlViewsIn = ControlViews::Input(usedViews, inTimings).asVarying();31 const auto controlViewsIn = workload::ControlViews::Input(usedViews, inTimings).asVarying();
103 const auto fixedViews = model.addJob<ControlViews>("controlViews", controlViewsIn);32 const auto fixedViews = model.addJob<workload::ControlViews>("controlViews", controlViewsIn);
104 33
105 const auto regionTrackerOut = model.addJob<workload::SpaceClassifierTask>("spaceClassifier", fixedViews);34 const auto regionTrackerOut = model.addJob<workload::SpaceClassifierTask>("spaceClassifier", fixedViews);
106 35