|
@@ -23,6 +23,19 @@ static s64 WindowsQueryPerformanceCounter() {
|
|
|
QueryPerformanceCounter(&counter);
|
|
QueryPerformanceCounter(&counter);
|
|
|
return counter.QuadPart;
|
|
return counter.QuadPart;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+static s64 GetSystemTimeNS() {
|
|
|
|
|
+ // GetSystemTimePreciseAsFileTime returns the file time in 100ns units.
|
|
|
|
|
+ static constexpr s64 Multiplier = 100;
|
|
|
|
|
+ // Convert Windows epoch to Unix epoch.
|
|
|
|
|
+ static constexpr s64 WindowsEpochToUnixEpochNS = 0x19DB1DED53E8000LL;
|
|
|
|
|
+
|
|
|
|
|
+ FILETIME filetime;
|
|
|
|
|
+ GetSystemTimePreciseAsFileTime(&filetime);
|
|
|
|
|
+ return Multiplier * ((static_cast<s64>(filetime.dwHighDateTime) << 32) +
|
|
|
|
|
+ static_cast<s64>(filetime.dwLowDateTime)) -
|
|
|
|
|
+ WindowsEpochToUnixEpochNS;
|
|
|
|
|
+}
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
SteadyClock::time_point SteadyClock::Now() noexcept {
|
|
SteadyClock::time_point SteadyClock::Now() noexcept {
|
|
@@ -53,4 +66,16 @@ SteadyClock::time_point SteadyClock::Now() noexcept {
|
|
|
#endif
|
|
#endif
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+RealTimeClock::time_point RealTimeClock::Now() noexcept {
|
|
|
|
|
+#if defined(_WIN32)
|
|
|
|
|
+ return time_point{duration{GetSystemTimeNS()}};
|
|
|
|
|
+#elif defined(__APPLE__)
|
|
|
|
|
+ return time_point{duration{clock_gettime_nsec_np(CLOCK_REALTIME)}};
|
|
|
|
|
+#else
|
|
|
|
|
+ timespec ts;
|
|
|
|
|
+ clock_gettime(CLOCK_REALTIME, &ts);
|
|
|
|
|
+ return time_point{std::chrono::seconds{ts.tv_sec} + std::chrono::nanoseconds{ts.tv_nsec}};
|
|
|
|
|
+#endif
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
}; // namespace Common
|
|
}; // namespace Common
|