diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/host_timing.cpp | 21 | ||||
| -rw-r--r-- | src/core/host_timing.h | 4 |
2 files changed, 11 insertions, 14 deletions
diff --git a/src/core/host_timing.cpp b/src/core/host_timing.cpp index d9514b2c5..ef9977b76 100644 --- a/src/core/host_timing.cpp +++ b/src/core/host_timing.cpp | |||
| @@ -35,7 +35,11 @@ struct CoreTiming::Event { | |||
| 35 | } | 35 | } |
| 36 | }; | 36 | }; |
| 37 | 37 | ||
| 38 | CoreTiming::CoreTiming() = default; | 38 | CoreTiming::CoreTiming() { |
| 39 | Common::WallClock* wall = Common::CreateBestMatchingClock(Core::Timing::BASE_CLOCK_RATE, Core::Timing::CNTFREQ); | ||
| 40 | clock = std::unique_ptr<Common::WallClock>(wall); | ||
| 41 | } | ||
| 42 | |||
| 39 | CoreTiming::~CoreTiming() = default; | 43 | CoreTiming::~CoreTiming() = default; |
| 40 | 44 | ||
| 41 | void CoreTiming::ThreadEntry(CoreTiming& instance) { | 45 | void CoreTiming::ThreadEntry(CoreTiming& instance) { |
| @@ -46,7 +50,6 @@ void CoreTiming::Initialize() { | |||
| 46 | event_fifo_id = 0; | 50 | event_fifo_id = 0; |
| 47 | const auto empty_timed_callback = [](u64, s64) {}; | 51 | const auto empty_timed_callback = [](u64, s64) {}; |
| 48 | ev_lost = CreateEvent("_lost_event", empty_timed_callback); | 52 | ev_lost = CreateEvent("_lost_event", empty_timed_callback); |
| 49 | start_time = std::chrono::steady_clock::now(); | ||
| 50 | timer_thread = std::make_unique<std::thread>(ThreadEntry, std::ref(*this)); | 53 | timer_thread = std::make_unique<std::thread>(ThreadEntry, std::ref(*this)); |
| 51 | } | 54 | } |
| 52 | 55 | ||
| @@ -108,13 +111,11 @@ void CoreTiming::UnscheduleEvent(const std::shared_ptr<EventType>& event_type, u | |||
| 108 | } | 111 | } |
| 109 | 112 | ||
| 110 | u64 CoreTiming::GetCPUTicks() const { | 113 | u64 CoreTiming::GetCPUTicks() const { |
| 111 | std::chrono::nanoseconds time_now = GetGlobalTimeNs(); | 114 | return clock->GetCPUCycles(); |
| 112 | return Core::Timing::nsToCycles(time_now); | ||
| 113 | } | 115 | } |
| 114 | 116 | ||
| 115 | u64 CoreTiming::GetClockTicks() const { | 117 | u64 CoreTiming::GetClockTicks() const { |
| 116 | std::chrono::nanoseconds time_now = GetGlobalTimeNs(); | 118 | return clock->GetClockCycles(); |
| 117 | return Core::Timing::nsToClockCycles(time_now); | ||
| 118 | } | 119 | } |
| 119 | 120 | ||
| 120 | void CoreTiming::ClearPendingEvents() { | 121 | void CoreTiming::ClearPendingEvents() { |
| @@ -174,15 +175,11 @@ void CoreTiming::Advance() { | |||
| 174 | } | 175 | } |
| 175 | 176 | ||
| 176 | std::chrono::nanoseconds CoreTiming::GetGlobalTimeNs() const { | 177 | std::chrono::nanoseconds CoreTiming::GetGlobalTimeNs() const { |
| 177 | sys_time_point current = std::chrono::steady_clock::now(); | 178 | return clock->GetTimeNS(); |
| 178 | auto elapsed = current - start_time; | ||
| 179 | return std::chrono::duration_cast<std::chrono::nanoseconds>(elapsed); | ||
| 180 | } | 179 | } |
| 181 | 180 | ||
| 182 | std::chrono::microseconds CoreTiming::GetGlobalTimeUs() const { | 181 | std::chrono::microseconds CoreTiming::GetGlobalTimeUs() const { |
| 183 | sys_time_point current = std::chrono::steady_clock::now(); | 182 | return clock->GetTimeUS(); |
| 184 | auto elapsed = current - start_time; | ||
| 185 | return std::chrono::duration_cast<std::chrono::microseconds>(elapsed); | ||
| 186 | } | 183 | } |
| 187 | 184 | ||
| 188 | } // namespace Core::Timing | 185 | } // namespace Core::Timing |
diff --git a/src/core/host_timing.h b/src/core/host_timing.h index 1d053a7fa..f04a150ee 100644 --- a/src/core/host_timing.h +++ b/src/core/host_timing.h | |||
| @@ -17,12 +17,12 @@ | |||
| 17 | #include "common/spin_lock.h" | 17 | #include "common/spin_lock.h" |
| 18 | #include "common/thread.h" | 18 | #include "common/thread.h" |
| 19 | #include "common/threadsafe_queue.h" | 19 | #include "common/threadsafe_queue.h" |
| 20 | #include "common/wall_clock.h" | ||
| 20 | 21 | ||
| 21 | namespace Core::HostTiming { | 22 | namespace Core::HostTiming { |
| 22 | 23 | ||
| 23 | /// A callback that may be scheduled for a particular core timing event. | 24 | /// A callback that may be scheduled for a particular core timing event. |
| 24 | using TimedCallback = std::function<void(u64 userdata, s64 cycles_late)>; | 25 | using TimedCallback = std::function<void(u64 userdata, s64 cycles_late)>; |
| 25 | using sys_time_point = std::chrono::time_point<std::chrono::steady_clock>; | ||
| 26 | 26 | ||
| 27 | /// Contains the characteristics of a particular event. | 27 | /// Contains the characteristics of a particular event. |
| 28 | struct EventType { | 28 | struct EventType { |
| @@ -112,7 +112,7 @@ private: | |||
| 112 | static void ThreadEntry(CoreTiming& instance); | 112 | static void ThreadEntry(CoreTiming& instance); |
| 113 | void Advance(); | 113 | void Advance(); |
| 114 | 114 | ||
| 115 | sys_time_point start_time; | 115 | std::unique_ptr<Common::WallClock> clock; |
| 116 | 116 | ||
| 117 | u64 global_timer = 0; | 117 | u64 global_timer = 0; |
| 118 | 118 | ||