summaryrefslogtreecommitdiff
path: root/src/tests
diff options
context:
space:
mode:
authorGravatar Lioncash2019-02-12 12:32:15 -0500
committerGravatar Lioncash2019-02-12 12:42:17 -0500
commit48d9d66dc585477d26b4cfbf1c4f71fd637b42ea (patch)
treef53430f173796e92b2e3dfd2570ed6752d5e8f77 /src/tests
parentMerge pull request #1904 from bunnei/better-fermi-copy (diff)
downloadyuzu-48d9d66dc585477d26b4cfbf1c4f71fd637b42ea.tar.gz
yuzu-48d9d66dc585477d26b4cfbf1c4f71fd637b42ea.tar.xz
yuzu-48d9d66dc585477d26b4cfbf1c4f71fd637b42ea.zip
core_timing: Rename CoreTiming namespace to Core::Timing
Places all of the timing-related functionality under the existing Core namespace to keep things consistent, rather than having the timing utilities sitting in its own completely separate namespace.
Diffstat (limited to 'src/tests')
-rw-r--r--src/tests/core/core_timing.cpp169
1 files changed, 85 insertions, 84 deletions
diff --git a/src/tests/core/core_timing.cpp b/src/tests/core/core_timing.cpp
index 2242c14cf..77607a755 100644
--- a/src/tests/core/core_timing.cpp
+++ b/src/tests/core/core_timing.cpp
@@ -31,10 +31,10 @@ void CallbackTemplate(u64 userdata, s64 cycles_late) {
31class ScopeInit final { 31class ScopeInit final {
32public: 32public:
33 ScopeInit() { 33 ScopeInit() {
34 CoreTiming::Init(); 34 Core::Timing::Init();
35 } 35 }
36 ~ScopeInit() { 36 ~ScopeInit() {
37 CoreTiming::Shutdown(); 37 Core::Timing::Shutdown();
38 } 38 }
39}; 39};
40 40
@@ -44,37 +44,37 @@ static void AdvanceAndCheck(u32 idx, int downcount, int expected_lateness = 0,
44 expected_callback = CB_IDS[idx]; 44 expected_callback = CB_IDS[idx];
45 lateness = expected_lateness; 45 lateness = expected_lateness;
46 46
47 CoreTiming::AddTicks(CoreTiming::GetDowncount() - 47 // Pretend we executed X cycles of instructions.
48 cpu_downcount); // Pretend we executed X cycles of instructions. 48 Core::Timing::AddTicks(Core::Timing::GetDowncount() - cpu_downcount);
49 CoreTiming::Advance(); 49 Core::Timing::Advance();
50 50
51 REQUIRE(decltype(callbacks_ran_flags)().set(idx) == callbacks_ran_flags); 51 REQUIRE(decltype(callbacks_ran_flags)().set(idx) == callbacks_ran_flags);
52 REQUIRE(downcount == CoreTiming::GetDowncount()); 52 REQUIRE(downcount == Core::Timing::GetDowncount());
53} 53}
54 54
55TEST_CASE("CoreTiming[BasicOrder]", "[core]") { 55TEST_CASE("CoreTiming[BasicOrder]", "[core]") {
56 ScopeInit guard; 56 ScopeInit guard;
57 57
58 CoreTiming::EventType* cb_a = CoreTiming::RegisterEvent("callbackA", CallbackTemplate<0>); 58 Core::Timing::EventType* cb_a = Core::Timing::RegisterEvent("callbackA", CallbackTemplate<0>);
59 CoreTiming::EventType* cb_b = CoreTiming::RegisterEvent("callbackB", CallbackTemplate<1>); 59 Core::Timing::EventType* cb_b = Core::Timing::RegisterEvent("callbackB", CallbackTemplate<1>);
60 CoreTiming::EventType* cb_c = CoreTiming::RegisterEvent("callbackC", CallbackTemplate<2>); 60 Core::Timing::EventType* cb_c = Core::Timing::RegisterEvent("callbackC", CallbackTemplate<2>);
61 CoreTiming::EventType* cb_d = CoreTiming::RegisterEvent("callbackD", CallbackTemplate<3>); 61 Core::Timing::EventType* cb_d = Core::Timing::RegisterEvent("callbackD", CallbackTemplate<3>);
62 CoreTiming::EventType* cb_e = CoreTiming::RegisterEvent("callbackE", CallbackTemplate<4>); 62 Core::Timing::EventType* cb_e = Core::Timing::RegisterEvent("callbackE", CallbackTemplate<4>);
63 63
64 // Enter slice 0 64 // Enter slice 0
65 CoreTiming::Advance(); 65 Core::Timing::Advance();
66 66
67 // D -> B -> C -> A -> E 67 // D -> B -> C -> A -> E
68 CoreTiming::ScheduleEvent(1000, cb_a, CB_IDS[0]); 68 Core::Timing::ScheduleEvent(1000, cb_a, CB_IDS[0]);
69 REQUIRE(1000 == CoreTiming::GetDowncount()); 69 REQUIRE(1000 == Core::Timing::GetDowncount());
70 CoreTiming::ScheduleEvent(500, cb_b, CB_IDS[1]); 70 Core::Timing::ScheduleEvent(500, cb_b, CB_IDS[1]);
71 REQUIRE(500 == CoreTiming::GetDowncount()); 71 REQUIRE(500 == Core::Timing::GetDowncount());
72 CoreTiming::ScheduleEvent(800, cb_c, CB_IDS[2]); 72 Core::Timing::ScheduleEvent(800, cb_c, CB_IDS[2]);
73 REQUIRE(500 == CoreTiming::GetDowncount()); 73 REQUIRE(500 == Core::Timing::GetDowncount());
74 CoreTiming::ScheduleEvent(100, cb_d, CB_IDS[3]); 74 Core::Timing::ScheduleEvent(100, cb_d, CB_IDS[3]);
75 REQUIRE(100 == CoreTiming::GetDowncount()); 75 REQUIRE(100 == Core::Timing::GetDowncount());
76 CoreTiming::ScheduleEvent(1200, cb_e, CB_IDS[4]); 76 Core::Timing::ScheduleEvent(1200, cb_e, CB_IDS[4]);
77 REQUIRE(100 == CoreTiming::GetDowncount()); 77 REQUIRE(100 == Core::Timing::GetDowncount());
78 78
79 AdvanceAndCheck(3, 400); 79 AdvanceAndCheck(3, 400);
80 AdvanceAndCheck(1, 300); 80 AdvanceAndCheck(1, 300);
@@ -86,36 +86,36 @@ TEST_CASE("CoreTiming[BasicOrder]", "[core]") {
86TEST_CASE("CoreTiming[Threadsave]", "[core]") { 86TEST_CASE("CoreTiming[Threadsave]", "[core]") {
87 ScopeInit guard; 87 ScopeInit guard;
88 88
89 CoreTiming::EventType* cb_a = CoreTiming::RegisterEvent("callbackA", CallbackTemplate<0>); 89 Core::Timing::EventType* cb_a = Core::Timing::RegisterEvent("callbackA", CallbackTemplate<0>);
90 CoreTiming::EventType* cb_b = CoreTiming::RegisterEvent("callbackB", CallbackTemplate<1>); 90 Core::Timing::EventType* cb_b = Core::Timing::RegisterEvent("callbackB", CallbackTemplate<1>);
91 CoreTiming::EventType* cb_c = CoreTiming::RegisterEvent("callbackC", CallbackTemplate<2>); 91 Core::Timing::EventType* cb_c = Core::Timing::RegisterEvent("callbackC", CallbackTemplate<2>);
92 CoreTiming::EventType* cb_d = CoreTiming::RegisterEvent("callbackD", CallbackTemplate<3>); 92 Core::Timing::EventType* cb_d = Core::Timing::RegisterEvent("callbackD", CallbackTemplate<3>);
93 CoreTiming::EventType* cb_e = CoreTiming::RegisterEvent("callbackE", CallbackTemplate<4>); 93 Core::Timing::EventType* cb_e = Core::Timing::RegisterEvent("callbackE", CallbackTemplate<4>);
94 94
95 // Enter slice 0 95 // Enter slice 0
96 CoreTiming::Advance(); 96 Core::Timing::Advance();
97 97
98 // D -> B -> C -> A -> E 98 // D -> B -> C -> A -> E
99 CoreTiming::ScheduleEventThreadsafe(1000, cb_a, CB_IDS[0]); 99 Core::Timing::ScheduleEventThreadsafe(1000, cb_a, CB_IDS[0]);
100 // Manually force since ScheduleEventThreadsafe doesn't call it 100 // Manually force since ScheduleEventThreadsafe doesn't call it
101 CoreTiming::ForceExceptionCheck(1000); 101 Core::Timing::ForceExceptionCheck(1000);
102 REQUIRE(1000 == CoreTiming::GetDowncount()); 102 REQUIRE(1000 == Core::Timing::GetDowncount());
103 CoreTiming::ScheduleEventThreadsafe(500, cb_b, CB_IDS[1]); 103 Core::Timing::ScheduleEventThreadsafe(500, cb_b, CB_IDS[1]);
104 // Manually force since ScheduleEventThreadsafe doesn't call it 104 // Manually force since ScheduleEventThreadsafe doesn't call it
105 CoreTiming::ForceExceptionCheck(500); 105 Core::Timing::ForceExceptionCheck(500);
106 REQUIRE(500 == CoreTiming::GetDowncount()); 106 REQUIRE(500 == Core::Timing::GetDowncount());
107 CoreTiming::ScheduleEventThreadsafe(800, cb_c, CB_IDS[2]); 107 Core::Timing::ScheduleEventThreadsafe(800, cb_c, CB_IDS[2]);
108 // Manually force since ScheduleEventThreadsafe doesn't call it 108 // Manually force since ScheduleEventThreadsafe doesn't call it
109 CoreTiming::ForceExceptionCheck(800); 109 Core::Timing::ForceExceptionCheck(800);
110 REQUIRE(500 == CoreTiming::GetDowncount()); 110 REQUIRE(500 == Core::Timing::GetDowncount());
111 CoreTiming::ScheduleEventThreadsafe(100, cb_d, CB_IDS[3]); 111 Core::Timing::ScheduleEventThreadsafe(100, cb_d, CB_IDS[3]);
112 // Manually force since ScheduleEventThreadsafe doesn't call it 112 // Manually force since ScheduleEventThreadsafe doesn't call it
113 CoreTiming::ForceExceptionCheck(100); 113 Core::Timing::ForceExceptionCheck(100);
114 REQUIRE(100 == CoreTiming::GetDowncount()); 114 REQUIRE(100 == Core::Timing::GetDowncount());
115 CoreTiming::ScheduleEventThreadsafe(1200, cb_e, CB_IDS[4]); 115 Core::Timing::ScheduleEventThreadsafe(1200, cb_e, CB_IDS[4]);
116 // Manually force since ScheduleEventThreadsafe doesn't call it 116 // Manually force since ScheduleEventThreadsafe doesn't call it
117 CoreTiming::ForceExceptionCheck(1200); 117 Core::Timing::ForceExceptionCheck(1200);
118 REQUIRE(100 == CoreTiming::GetDowncount()); 118 REQUIRE(100 == Core::Timing::GetDowncount());
119 119
120 AdvanceAndCheck(3, 400); 120 AdvanceAndCheck(3, 400);
121 AdvanceAndCheck(1, 300); 121 AdvanceAndCheck(1, 300);
@@ -143,42 +143,42 @@ TEST_CASE("CoreTiming[SharedSlot]", "[core]") {
143 143
144 ScopeInit guard; 144 ScopeInit guard;
145 145
146 CoreTiming::EventType* cb_a = CoreTiming::RegisterEvent("callbackA", FifoCallback<0>); 146 Core::Timing::EventType* cb_a = Core::Timing::RegisterEvent("callbackA", FifoCallback<0>);
147 CoreTiming::EventType* cb_b = CoreTiming::RegisterEvent("callbackB", FifoCallback<1>); 147 Core::Timing::EventType* cb_b = Core::Timing::RegisterEvent("callbackB", FifoCallback<1>);
148 CoreTiming::EventType* cb_c = CoreTiming::RegisterEvent("callbackC", FifoCallback<2>); 148 Core::Timing::EventType* cb_c = Core::Timing::RegisterEvent("callbackC", FifoCallback<2>);
149 CoreTiming::EventType* cb_d = CoreTiming::RegisterEvent("callbackD", FifoCallback<3>); 149 Core::Timing::EventType* cb_d = Core::Timing::RegisterEvent("callbackD", FifoCallback<3>);
150 CoreTiming::EventType* cb_e = CoreTiming::RegisterEvent("callbackE", FifoCallback<4>); 150 Core::Timing::EventType* cb_e = Core::Timing::RegisterEvent("callbackE", FifoCallback<4>);
151 151
152 CoreTiming::ScheduleEvent(1000, cb_a, CB_IDS[0]); 152 Core::Timing::ScheduleEvent(1000, cb_a, CB_IDS[0]);
153 CoreTiming::ScheduleEvent(1000, cb_b, CB_IDS[1]); 153 Core::Timing::ScheduleEvent(1000, cb_b, CB_IDS[1]);
154 CoreTiming::ScheduleEvent(1000, cb_c, CB_IDS[2]); 154 Core::Timing::ScheduleEvent(1000, cb_c, CB_IDS[2]);
155 CoreTiming::ScheduleEvent(1000, cb_d, CB_IDS[3]); 155 Core::Timing::ScheduleEvent(1000, cb_d, CB_IDS[3]);
156 CoreTiming::ScheduleEvent(1000, cb_e, CB_IDS[4]); 156 Core::Timing::ScheduleEvent(1000, cb_e, CB_IDS[4]);
157 157
158 // Enter slice 0 158 // Enter slice 0
159 CoreTiming::Advance(); 159 Core::Timing::Advance();
160 REQUIRE(1000 == CoreTiming::GetDowncount()); 160 REQUIRE(1000 == Core::Timing::GetDowncount());
161 161
162 callbacks_ran_flags = 0; 162 callbacks_ran_flags = 0;
163 counter = 0; 163 counter = 0;
164 lateness = 0; 164 lateness = 0;
165 CoreTiming::AddTicks(CoreTiming::GetDowncount()); 165 Core::Timing::AddTicks(Core::Timing::GetDowncount());
166 CoreTiming::Advance(); 166 Core::Timing::Advance();
167 REQUIRE(MAX_SLICE_LENGTH == CoreTiming::GetDowncount()); 167 REQUIRE(MAX_SLICE_LENGTH == Core::Timing::GetDowncount());
168 REQUIRE(0x1FULL == callbacks_ran_flags.to_ullong()); 168 REQUIRE(0x1FULL == callbacks_ran_flags.to_ullong());
169} 169}
170 170
171TEST_CASE("CoreTiming[PredictableLateness]", "[core]") { 171TEST_CASE("Core::Timing[PredictableLateness]", "[core]") {
172 ScopeInit guard; 172 ScopeInit guard;
173 173
174 CoreTiming::EventType* cb_a = CoreTiming::RegisterEvent("callbackA", CallbackTemplate<0>); 174 Core::Timing::EventType* cb_a = Core::Timing::RegisterEvent("callbackA", CallbackTemplate<0>);
175 CoreTiming::EventType* cb_b = CoreTiming::RegisterEvent("callbackB", CallbackTemplate<1>); 175 Core::Timing::EventType* cb_b = Core::Timing::RegisterEvent("callbackB", CallbackTemplate<1>);
176 176
177 // Enter slice 0 177 // Enter slice 0
178 CoreTiming::Advance(); 178 Core::Timing::Advance();
179 179
180 CoreTiming::ScheduleEvent(100, cb_a, CB_IDS[0]); 180 Core::Timing::ScheduleEvent(100, cb_a, CB_IDS[0]);
181 CoreTiming::ScheduleEvent(200, cb_b, CB_IDS[1]); 181 Core::Timing::ScheduleEvent(200, cb_b, CB_IDS[1]);
182 182
183 AdvanceAndCheck(0, 90, 10, -10); // (100 - 10) 183 AdvanceAndCheck(0, 90, 10, -10); // (100 - 10)
184 AdvanceAndCheck(1, MAX_SLICE_LENGTH, 50, -50); 184 AdvanceAndCheck(1, MAX_SLICE_LENGTH, 50, -50);
@@ -192,9 +192,10 @@ static void RescheduleCallback(u64 userdata, s64 cycles_late) {
192 REQUIRE(reschedules >= 0); 192 REQUIRE(reschedules >= 0);
193 REQUIRE(lateness == cycles_late); 193 REQUIRE(lateness == cycles_late);
194 194
195 if (reschedules > 0) 195 if (reschedules > 0) {
196 CoreTiming::ScheduleEvent(1000, reinterpret_cast<CoreTiming::EventType*>(userdata), 196 Core::Timing::ScheduleEvent(1000, reinterpret_cast<Core::Timing::EventType*>(userdata),
197 userdata); 197 userdata);
198 }
198} 199}
199} // namespace ChainSchedulingTest 200} // namespace ChainSchedulingTest
200 201
@@ -203,35 +204,35 @@ TEST_CASE("CoreTiming[ChainScheduling]", "[core]") {
203 204
204 ScopeInit guard; 205 ScopeInit guard;
205 206
206 CoreTiming::EventType* cb_a = CoreTiming::RegisterEvent("callbackA", CallbackTemplate<0>); 207 Core::Timing::EventType* cb_a = Core::Timing::RegisterEvent("callbackA", CallbackTemplate<0>);
207 CoreTiming::EventType* cb_b = CoreTiming::RegisterEvent("callbackB", CallbackTemplate<1>); 208 Core::Timing::EventType* cb_b = Core::Timing::RegisterEvent("callbackB", CallbackTemplate<1>);
208 CoreTiming::EventType* cb_c = CoreTiming::RegisterEvent("callbackC", CallbackTemplate<2>); 209 Core::Timing::EventType* cb_c = Core::Timing::RegisterEvent("callbackC", CallbackTemplate<2>);
209 CoreTiming::EventType* cb_rs = 210 Core::Timing::EventType* cb_rs =
210 CoreTiming::RegisterEvent("callbackReschedule", RescheduleCallback); 211 Core::Timing::RegisterEvent("callbackReschedule", RescheduleCallback);
211 212
212 // Enter slice 0 213 // Enter slice 0
213 CoreTiming::Advance(); 214 Core::Timing::Advance();
214 215
215 CoreTiming::ScheduleEvent(800, cb_a, CB_IDS[0]); 216 Core::Timing::ScheduleEvent(800, cb_a, CB_IDS[0]);
216 CoreTiming::ScheduleEvent(1000, cb_b, CB_IDS[1]); 217 Core::Timing::ScheduleEvent(1000, cb_b, CB_IDS[1]);
217 CoreTiming::ScheduleEvent(2200, cb_c, CB_IDS[2]); 218 Core::Timing::ScheduleEvent(2200, cb_c, CB_IDS[2]);
218 CoreTiming::ScheduleEvent(1000, cb_rs, reinterpret_cast<u64>(cb_rs)); 219 Core::Timing::ScheduleEvent(1000, cb_rs, reinterpret_cast<u64>(cb_rs));
219 REQUIRE(800 == CoreTiming::GetDowncount()); 220 REQUIRE(800 == Core::Timing::GetDowncount());
220 221
221 reschedules = 3; 222 reschedules = 3;
222 AdvanceAndCheck(0, 200); // cb_a 223 AdvanceAndCheck(0, 200); // cb_a
223 AdvanceAndCheck(1, 1000); // cb_b, cb_rs 224 AdvanceAndCheck(1, 1000); // cb_b, cb_rs
224 REQUIRE(2 == reschedules); 225 REQUIRE(2 == reschedules);
225 226
226 CoreTiming::AddTicks(CoreTiming::GetDowncount()); 227 Core::Timing::AddTicks(Core::Timing::GetDowncount());
227 CoreTiming::Advance(); // cb_rs 228 Core::Timing::Advance(); // cb_rs
228 REQUIRE(1 == reschedules); 229 REQUIRE(1 == reschedules);
229 REQUIRE(200 == CoreTiming::GetDowncount()); 230 REQUIRE(200 == Core::Timing::GetDowncount());
230 231
231 AdvanceAndCheck(2, 800); // cb_c 232 AdvanceAndCheck(2, 800); // cb_c
232 233
233 CoreTiming::AddTicks(CoreTiming::GetDowncount()); 234 Core::Timing::AddTicks(Core::Timing::GetDowncount());
234 CoreTiming::Advance(); // cb_rs 235 Core::Timing::Advance(); // cb_rs
235 REQUIRE(0 == reschedules); 236 REQUIRE(0 == reschedules);
236 REQUIRE(MAX_SLICE_LENGTH == CoreTiming::GetDowncount()); 237 REQUIRE(MAX_SLICE_LENGTH == Core::Timing::GetDowncount());
237} 238}