7extern struct timespec libxr_linux_start_time_spec;
11namespace MonotonicTime
13inline uint64_t SpecMicroseconds(
const timespec& ts)
15 return static_cast<uint64_t
>(ts.tv_sec) * 1000000ULL +
16 static_cast<uint64_t
>(ts.tv_nsec) / 1000ULL;
19inline timespec NowSpec()
22 clock_gettime(CLOCK_MONOTONIC, &ts);
26inline uint64_t NowMicroseconds() {
return SpecMicroseconds(NowSpec()); }
28inline uint64_t NowMilliseconds() {
return NowMicroseconds() / 1000ULL; }
30inline uint64_t XrToSharedMicroseconds(uint64_t timestamp_us)
32 const uint64_t start_us = SpecMicroseconds(libxr_linux_start_time_spec);
33 return UINT64_MAX - start_us < timestamp_us ? UINT64_MAX : start_us + timestamp_us;
36inline uint64_t SharedToXrMicroseconds(uint64_t timestamp_us)
38 const uint64_t start_us = SpecMicroseconds(libxr_linux_start_time_spec);
39 return timestamp_us >= start_us ? timestamp_us - start_us : 0;
42inline timespec RelativeFromMilliseconds(uint32_t milliseconds)
45 ts.tv_sec =
static_cast<time_t
>(milliseconds / 1000U);
46 ts.tv_nsec =
static_cast<long>(milliseconds % 1000U) * 1000000L;
50inline timespec AddMilliseconds(timespec base, uint64_t milliseconds)
52 base.tv_sec +=
static_cast<time_t
>(milliseconds / 1000ULL);
53 base.tv_nsec +=
static_cast<long>(milliseconds % 1000ULL) * 1000000L;
54 if (base.tv_nsec >= 1000000000L)
56 base.tv_sec += base.tv_nsec / 1000000000L;
57 base.tv_nsec %= 1000000000L;
62inline uint32_t RemainingMilliseconds(uint64_t deadline_ms)
64 const uint64_t now_ms = NowMilliseconds();
65 if (now_ms >= deadline_ms)
69 return static_cast<uint32_t
>(deadline_ms - now_ms);
72inline int64_t ElapsedMicroseconds(
const timespec& start)
74 const timespec now = NowSpec();
75 return static_cast<int64_t
>(now.tv_sec - start.tv_sec) * 1000000LL +
76 static_cast<int64_t
>(now.tv_nsec - start.tv_nsec) / 1000LL;
79inline uint32_t WaitSliceMilliseconds(uint32_t remaining_ms) {
return remaining_ms; }