diff options
| author | 2020-02-09 16:53:22 -0400 | |
|---|---|---|
| committer | 2020-06-18 16:29:17 -0400 | |
| commit | 234b5ff6a999d7d69cdcdf214e0c3984cdab11cf (patch) | |
| tree | 4f0ef41d7738b53d1b81ac2f7072bec1ba5fe8f1 /src/core/host_timing.cpp | |
| parent | Tests: Add base tests to host timing (diff) | |
| download | yuzu-234b5ff6a999d7d69cdcdf214e0c3984cdab11cf.tar.gz yuzu-234b5ff6a999d7d69cdcdf214e0c3984cdab11cf.tar.xz yuzu-234b5ff6a999d7d69cdcdf214e0c3984cdab11cf.zip | |
Common: Implement WallClock Interface and implement a native clock for x64
Diffstat (limited to 'src/core/host_timing.cpp')
| -rw-r--r-- | src/core/host_timing.cpp | 21 |
1 files changed, 9 insertions, 12 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 |