diff options
| author | 2019-11-26 21:48:56 -0500 | |
|---|---|---|
| committer | 2019-11-26 21:48:56 -0500 | |
| commit | ec0ce96c568b2b610c5218efd7faa5d9a19350f8 (patch) | |
| tree | 61b5133e3cc6a9edf3b45c5fe6604493689f6769 /src/tests | |
| parent | Merge pull request #3164 from ReinUsesLisp/half-cast-float (diff) | |
| download | yuzu-ec0ce96c568b2b610c5218efd7faa5d9a19350f8.tar.gz yuzu-ec0ce96c568b2b610c5218efd7faa5d9a19350f8.tar.xz yuzu-ec0ce96c568b2b610c5218efd7faa5d9a19350f8.zip | |
core_timing: Use better reference tracking for EventType. (#3159)
* core_timing: Use better reference tracking for EventType.
- Moves ownership of the event to the caller, ensuring we don't fire events for destroyed objects.
- Removes need for unique names - we won't be using this for save states anyways.
Diffstat (limited to 'src/tests')
| -rw-r--r-- | src/tests/core/core_timing.cpp | 84 |
1 files changed, 18 insertions, 66 deletions
diff --git a/src/tests/core/core_timing.cpp b/src/tests/core/core_timing.cpp index 3443bf05e..1e3940801 100644 --- a/src/tests/core/core_timing.cpp +++ b/src/tests/core/core_timing.cpp | |||
| @@ -7,7 +7,9 @@ | |||
| 7 | #include <array> | 7 | #include <array> |
| 8 | #include <bitset> | 8 | #include <bitset> |
| 9 | #include <cstdlib> | 9 | #include <cstdlib> |
| 10 | #include <memory> | ||
| 10 | #include <string> | 11 | #include <string> |
| 12 | |||
| 11 | #include "common/file_util.h" | 13 | #include "common/file_util.h" |
| 12 | #include "core/core.h" | 14 | #include "core/core.h" |
| 13 | #include "core/core_timing.h" | 15 | #include "core/core_timing.h" |
| @@ -65,11 +67,16 @@ TEST_CASE("CoreTiming[BasicOrder]", "[core]") { | |||
| 65 | ScopeInit guard; | 67 | ScopeInit guard; |
| 66 | auto& core_timing = guard.core_timing; | 68 | auto& core_timing = guard.core_timing; |
| 67 | 69 | ||
| 68 | Core::Timing::EventType* cb_a = core_timing.RegisterEvent("callbackA", CallbackTemplate<0>); | 70 | std::shared_ptr<Core::Timing::EventType> cb_a = |
| 69 | Core::Timing::EventType* cb_b = core_timing.RegisterEvent("callbackB", CallbackTemplate<1>); | 71 | Core::Timing::CreateEvent("callbackA", CallbackTemplate<0>); |
| 70 | Core::Timing::EventType* cb_c = core_timing.RegisterEvent("callbackC", CallbackTemplate<2>); | 72 | std::shared_ptr<Core::Timing::EventType> cb_b = |
| 71 | Core::Timing::EventType* cb_d = core_timing.RegisterEvent("callbackD", CallbackTemplate<3>); | 73 | Core::Timing::CreateEvent("callbackB", CallbackTemplate<1>); |
| 72 | Core::Timing::EventType* cb_e = core_timing.RegisterEvent("callbackE", CallbackTemplate<4>); | 74 | std::shared_ptr<Core::Timing::EventType> cb_c = |
| 75 | Core::Timing::CreateEvent("callbackC", CallbackTemplate<2>); | ||
| 76 | std::shared_ptr<Core::Timing::EventType> cb_d = | ||
| 77 | Core::Timing::CreateEvent("callbackD", CallbackTemplate<3>); | ||
| 78 | std::shared_ptr<Core::Timing::EventType> cb_e = | ||
| 79 | Core::Timing::CreateEvent("callbackE", CallbackTemplate<4>); | ||
| 73 | 80 | ||
| 74 | // Enter slice 0 | 81 | // Enter slice 0 |
| 75 | core_timing.ResetRun(); | 82 | core_timing.ResetRun(); |
| @@ -99,8 +106,8 @@ TEST_CASE("CoreTiming[FairSharing]", "[core]") { | |||
| 99 | ScopeInit guard; | 106 | ScopeInit guard; |
| 100 | auto& core_timing = guard.core_timing; | 107 | auto& core_timing = guard.core_timing; |
| 101 | 108 | ||
| 102 | Core::Timing::EventType* empty_callback = | 109 | std::shared_ptr<Core::Timing::EventType> empty_callback = |
| 103 | core_timing.RegisterEvent("empty_callback", EmptyCallback); | 110 | Core::Timing::CreateEvent("empty_callback", EmptyCallback); |
| 104 | 111 | ||
| 105 | callbacks_done = 0; | 112 | callbacks_done = 0; |
| 106 | u64 MAX_CALLBACKS = 10; | 113 | u64 MAX_CALLBACKS = 10; |
| @@ -133,8 +140,10 @@ TEST_CASE("Core::Timing[PredictableLateness]", "[core]") { | |||
| 133 | ScopeInit guard; | 140 | ScopeInit guard; |
| 134 | auto& core_timing = guard.core_timing; | 141 | auto& core_timing = guard.core_timing; |
| 135 | 142 | ||
| 136 | Core::Timing::EventType* cb_a = core_timing.RegisterEvent("callbackA", CallbackTemplate<0>); | 143 | std::shared_ptr<Core::Timing::EventType> cb_a = |
| 137 | Core::Timing::EventType* cb_b = core_timing.RegisterEvent("callbackB", CallbackTemplate<1>); | 144 | Core::Timing::CreateEvent("callbackA", CallbackTemplate<0>); |
| 145 | std::shared_ptr<Core::Timing::EventType> cb_b = | ||
| 146 | Core::Timing::CreateEvent("callbackB", CallbackTemplate<1>); | ||
| 138 | 147 | ||
| 139 | // Enter slice 0 | 148 | // Enter slice 0 |
| 140 | core_timing.ResetRun(); | 149 | core_timing.ResetRun(); |
| @@ -145,60 +154,3 @@ TEST_CASE("Core::Timing[PredictableLateness]", "[core]") { | |||
| 145 | AdvanceAndCheck(core_timing, 0, 0, 10, -10); // (100 - 10) | 154 | AdvanceAndCheck(core_timing, 0, 0, 10, -10); // (100 - 10) |
| 146 | AdvanceAndCheck(core_timing, 1, 1, 50, -50); | 155 | AdvanceAndCheck(core_timing, 1, 1, 50, -50); |
| 147 | } | 156 | } |
| 148 | |||
| 149 | namespace ChainSchedulingTest { | ||
| 150 | static int reschedules = 0; | ||
| 151 | |||
| 152 | static void RescheduleCallback(Core::Timing::CoreTiming& core_timing, u64 userdata, | ||
| 153 | s64 cycles_late) { | ||
| 154 | --reschedules; | ||
| 155 | REQUIRE(reschedules >= 0); | ||
| 156 | REQUIRE(lateness == cycles_late); | ||
| 157 | |||
| 158 | if (reschedules > 0) { | ||
| 159 | core_timing.ScheduleEvent(1000, reinterpret_cast<Core::Timing::EventType*>(userdata), | ||
| 160 | userdata); | ||
| 161 | } | ||
| 162 | } | ||
| 163 | } // namespace ChainSchedulingTest | ||
| 164 | |||
| 165 | TEST_CASE("CoreTiming[ChainScheduling]", "[core]") { | ||
| 166 | using namespace ChainSchedulingTest; | ||
| 167 | |||
| 168 | ScopeInit guard; | ||
| 169 | auto& core_timing = guard.core_timing; | ||
| 170 | |||
| 171 | Core::Timing::EventType* cb_a = core_timing.RegisterEvent("callbackA", CallbackTemplate<0>); | ||
| 172 | Core::Timing::EventType* cb_b = core_timing.RegisterEvent("callbackB", CallbackTemplate<1>); | ||
| 173 | Core::Timing::EventType* cb_c = core_timing.RegisterEvent("callbackC", CallbackTemplate<2>); | ||
| 174 | Core::Timing::EventType* cb_rs = core_timing.RegisterEvent( | ||
| 175 | "callbackReschedule", [&core_timing](u64 userdata, s64 cycles_late) { | ||
| 176 | RescheduleCallback(core_timing, userdata, cycles_late); | ||
| 177 | }); | ||
| 178 | |||
| 179 | // Enter slice 0 | ||
| 180 | core_timing.ResetRun(); | ||
| 181 | |||
| 182 | core_timing.ScheduleEvent(800, cb_a, CB_IDS[0]); | ||
| 183 | core_timing.ScheduleEvent(1000, cb_b, CB_IDS[1]); | ||
| 184 | core_timing.ScheduleEvent(2200, cb_c, CB_IDS[2]); | ||
| 185 | core_timing.ScheduleEvent(1000, cb_rs, reinterpret_cast<u64>(cb_rs)); | ||
| 186 | REQUIRE(800 == core_timing.GetDowncount()); | ||
| 187 | |||
| 188 | reschedules = 3; | ||
| 189 | AdvanceAndCheck(core_timing, 0, 0); // cb_a | ||
| 190 | AdvanceAndCheck(core_timing, 1, 1); // cb_b, cb_rs | ||
| 191 | REQUIRE(2 == reschedules); | ||
| 192 | |||
| 193 | core_timing.AddTicks(core_timing.GetDowncount()); | ||
| 194 | core_timing.Advance(); // cb_rs | ||
| 195 | core_timing.SwitchContext(3); | ||
| 196 | REQUIRE(1 == reschedules); | ||
| 197 | REQUIRE(200 == core_timing.GetDowncount()); | ||
| 198 | |||
| 199 | AdvanceAndCheck(core_timing, 2, 3); // cb_c | ||
| 200 | |||
| 201 | core_timing.AddTicks(core_timing.GetDowncount()); | ||
| 202 | core_timing.Advance(); // cb_rs | ||
| 203 | REQUIRE(0 == reschedules); | ||
| 204 | } | ||