diff options
| author | 2020-03-28 15:23:28 -0400 | |
|---|---|---|
| committer | 2020-06-27 11:36:01 -0400 | |
| commit | f5e32935ca9d1727624c86ca78aff91027caf819 (patch) | |
| tree | a041186cd47fcea90880b300af3351a56fb819aa /src/core/core_timing.cpp | |
| parent | Scheduler: Correct Reload/Unload (diff) | |
| download | yuzu-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.cpp | 41 |
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 | ||
| 15 | namespace Core::Timing { | 15 | namespace Core::Timing { |
| 16 | 16 | ||
| 17 | constexpr u64 MAX_SLICE_LENGTH = 4000; | ||
| 18 | |||
| 17 | std::shared_ptr<EventType> CreateEvent(std::string name, TimedCallback&& callback) { | 19 | std::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) { | |||
| 53 | void CoreTiming::Initialize(std::function<void(void)>&& on_thread_init_) { | 55 | void 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 | ||
| 129 | void CoreTiming::AddTicks(std::size_t core_index, u64 ticks) { | 132 | void CoreTiming::AddTicks(u64 ticks) { |
| 130 | ticks_count[core_index] += ticks; | 133 | this->ticks += ticks; |
| 134 | downcount -= ticks; | ||
| 131 | } | 135 | } |
| 132 | 136 | ||
| 133 | void CoreTiming::ResetTicks(std::size_t core_index) { | 137 | void 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 | |||
| 146 | void CoreTiming::ResetTicks() { | ||
| 147 | downcount = MAX_SLICE_LENGTH; | ||
| 135 | } | 148 | } |
| 136 | 149 | ||
| 137 | u64 CoreTiming::GetCPUTicks() const { | 150 | u64 CoreTiming::GetCPUTicks() const { |
| 138 | return clock->GetCPUCycles(); | 151 | if (is_multicore) { |
| 152 | return clock->GetCPUCycles(); | ||
| 153 | } | ||
| 154 | return ticks; | ||
| 139 | } | 155 | } |
| 140 | 156 | ||
| 141 | u64 CoreTiming::GetClockTicks() const { | 157 | u64 CoreTiming::GetClockTicks() const { |
| 142 | return clock->GetClockCycles(); | 158 | if (is_multicore) { |
| 159 | return clock->GetClockCycles(); | ||
| 160 | } | ||
| 161 | return CpuCyclesToClockCycles(ticks); | ||
| 143 | } | 162 | } |
| 144 | 163 | ||
| 145 | void CoreTiming::ClearPendingEvents() { | 164 | void CoreTiming::ClearPendingEvents() { |
| @@ -217,11 +236,17 @@ void CoreTiming::ThreadLoop() { | |||
| 217 | } | 236 | } |
| 218 | 237 | ||
| 219 | std::chrono::nanoseconds CoreTiming::GetGlobalTimeNs() const { | 238 | std::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 | ||
| 223 | std::chrono::microseconds CoreTiming::GetGlobalTimeUs() const { | 245 | std::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 |