summaryrefslogtreecommitdiff
path: root/src/tests
diff options
context:
space:
mode:
authorGravatar bunnei2019-11-26 21:48:56 -0500
committerGravatar GitHub2019-11-26 21:48:56 -0500
commitec0ce96c568b2b610c5218efd7faa5d9a19350f8 (patch)
tree61b5133e3cc6a9edf3b45c5fe6604493689f6769 /src/tests
parentMerge pull request #3164 from ReinUsesLisp/half-cast-float (diff)
downloadyuzu-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.cpp84
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
149namespace ChainSchedulingTest {
150static int reschedules = 0;
151
152static 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
165TEST_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}