summaryrefslogtreecommitdiff
path: root/src/core/host_timing.cpp
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2020-02-09 16:53:22 -0400
committerGravatar Fernando Sahmkow2020-06-18 16:29:17 -0400
commit234b5ff6a999d7d69cdcdf214e0c3984cdab11cf (patch)
tree4f0ef41d7738b53d1b81ac2f7072bec1ba5fe8f1 /src/core/host_timing.cpp
parentTests: Add base tests to host timing (diff)
downloadyuzu-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.cpp21
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
38CoreTiming::CoreTiming() = default; 38CoreTiming::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
39CoreTiming::~CoreTiming() = default; 43CoreTiming::~CoreTiming() = default;
40 44
41void CoreTiming::ThreadEntry(CoreTiming& instance) { 45void 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
110u64 CoreTiming::GetCPUTicks() const { 113u64 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
115u64 CoreTiming::GetClockTicks() const { 117u64 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
120void CoreTiming::ClearPendingEvents() { 121void CoreTiming::ClearPendingEvents() {
@@ -174,15 +175,11 @@ void CoreTiming::Advance() {
174} 175}
175 176
176std::chrono::nanoseconds CoreTiming::GetGlobalTimeNs() const { 177std::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
182std::chrono::microseconds CoreTiming::GetGlobalTimeUs() const { 181std::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