summaryrefslogtreecommitdiff
path: root/src/core/core_timing.cpp
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2020-03-28 15:23:28 -0400
committerGravatar Fernando Sahmkow2020-06-27 11:36:01 -0400
commitf5e32935ca9d1727624c86ca78aff91027caf819 (patch)
treea041186cd47fcea90880b300af3351a56fb819aa /src/core/core_timing.cpp
parentScheduler: Correct Reload/Unload (diff)
downloadyuzu-f5e32935ca9d1727624c86ca78aff91027caf819.tar.gz
yuzu-f5e32935ca9d1727624c86ca78aff91027caf819.tar.xz
yuzu-f5e32935ca9d1727624c86ca78aff91027caf819.zip
SingleCore: Use Cycle Timing instead of Host Timing.
Diffstat (limited to 'src/core/core_timing.cpp')
-rw-r--r--src/core/core_timing.cpp41
1 files changed, 33 insertions, 8 deletions
diff --git a/src/core/core_timing.cpp b/src/core/core_timing.cpp
index 189d4aa34..12e9e60a4 100644
--- a/src/core/core_timing.cpp
+++ b/src/core/core_timing.cpp
@@ -14,6 +14,8 @@
14 14
15namespace Core::Timing { 15namespace Core::Timing {
16 16
17constexpr u64 MAX_SLICE_LENGTH = 4000;
18
17std::shared_ptr<EventType> CreateEvent(std::string name, TimedCallback&& callback) { 19std::shared_ptr<EventType> CreateEvent(std::string name, TimedCallback&& callback) {
18 return std::make_shared<EventType>(std::move(callback), std::move(name)); 20 return std::make_shared<EventType>(std::move(callback), std::move(name));
19} 21}
@@ -53,6 +55,7 @@ void CoreTiming::ThreadEntry(CoreTiming& instance) {
53void CoreTiming::Initialize(std::function<void(void)>&& on_thread_init_) { 55void CoreTiming::Initialize(std::function<void(void)>&& on_thread_init_) {
54 on_thread_init = std::move(on_thread_init_); 56 on_thread_init = std::move(on_thread_init_);
55 event_fifo_id = 0; 57 event_fifo_id = 0;
58 ticks = 0;
56 const auto empty_timed_callback = [](u64, s64) {}; 59 const auto empty_timed_callback = [](u64, s64) {};
57 ev_lost = CreateEvent("_lost_event", empty_timed_callback); 60 ev_lost = CreateEvent("_lost_event", empty_timed_callback);
58 if (is_multicore) { 61 if (is_multicore) {
@@ -126,20 +129,36 @@ void CoreTiming::UnscheduleEvent(const std::shared_ptr<EventType>& event_type, u
126 basic_lock.unlock(); 129 basic_lock.unlock();
127} 130}
128 131
129void CoreTiming::AddTicks(std::size_t core_index, u64 ticks) { 132void CoreTiming::AddTicks(u64 ticks) {
130 ticks_count[core_index] += ticks; 133 this->ticks += ticks;
134 downcount -= ticks;
131} 135}
132 136
133void CoreTiming::ResetTicks(std::size_t core_index) { 137void CoreTiming::Idle() {
134 ticks_count[core_index] = 0; 138 if (!event_queue.empty()) {
139 u64 next_event_time = event_queue.front().time;
140 ticks = nsToCycles(std::chrono::nanoseconds(next_event_time)) + 10U;
141 return;
142 }
143 ticks += 1000U;
144}
145
146void CoreTiming::ResetTicks() {
147 downcount = MAX_SLICE_LENGTH;
135} 148}
136 149
137u64 CoreTiming::GetCPUTicks() const { 150u64 CoreTiming::GetCPUTicks() const {
138 return clock->GetCPUCycles(); 151 if (is_multicore) {
152 return clock->GetCPUCycles();
153 }
154 return ticks;
139} 155}
140 156
141u64 CoreTiming::GetClockTicks() const { 157u64 CoreTiming::GetClockTicks() const {
142 return clock->GetClockCycles(); 158 if (is_multicore) {
159 return clock->GetClockCycles();
160 }
161 return CpuCyclesToClockCycles(ticks);
143} 162}
144 163
145void CoreTiming::ClearPendingEvents() { 164void CoreTiming::ClearPendingEvents() {
@@ -217,11 +236,17 @@ void CoreTiming::ThreadLoop() {
217} 236}
218 237
219std::chrono::nanoseconds CoreTiming::GetGlobalTimeNs() const { 238std::chrono::nanoseconds CoreTiming::GetGlobalTimeNs() const {
220 return clock->GetTimeNS(); 239 if (is_multicore) {
240 return clock->GetTimeNS();
241 }
242 return CyclesToNs(ticks);
221} 243}
222 244
223std::chrono::microseconds CoreTiming::GetGlobalTimeUs() const { 245std::chrono::microseconds CoreTiming::GetGlobalTimeUs() const {
224 return clock->GetTimeUS(); 246 if (is_multicore) {
247 return clock->GetTimeUS();
248 }
249 return CyclesToUs(ticks);
225} 250}
226 251
227} // namespace Core::Timing 252} // namespace Core::Timing