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()
28 return SpecMicroseconds(NowSpec());
31inline uint64_t NowMilliseconds()
33 return NowMicroseconds() / 1000ULL;
36inline uint64_t XrToSharedMicroseconds(uint64_t timestamp_us)
38 const uint64_t start_us = SpecMicroseconds(libxr_linux_start_time_spec);
39 return UINT64_MAX - start_us < timestamp_us ? UINT64_MAX : start_us + timestamp_us;
42inline uint64_t SharedToXrMicroseconds(uint64_t timestamp_us)
44 const uint64_t start_us = SpecMicroseconds(libxr_linux_start_time_spec);
45 return timestamp_us >= start_us ? timestamp_us - start_us : 0;
48inline timespec RelativeFromMilliseconds(uint32_t milliseconds)
51 ts.tv_sec =
static_cast<time_t
>(milliseconds / 1000U);
52 ts.tv_nsec =
static_cast<long>(milliseconds % 1000U) * 1000000L;
56inline timespec AddMilliseconds(timespec base, uint64_t milliseconds)
58 base.tv_sec +=
static_cast<time_t
>(milliseconds / 1000ULL);
59 base.tv_nsec +=
static_cast<long>(milliseconds % 1000ULL) * 1000000L;
60 if (base.tv_nsec >= 1000000000L)
62 base.tv_sec += base.tv_nsec / 1000000000L;
63 base.tv_nsec %= 1000000000L;
68inline uint32_t RemainingMilliseconds(uint64_t deadline_ms)
70 const uint64_t now_ms = NowMilliseconds();
71 if (now_ms >= deadline_ms)
75 return static_cast<uint32_t
>(deadline_ms - now_ms);
78inline int64_t ElapsedMicroseconds(
const timespec& start)
80 const timespec now = NowSpec();
81 return static_cast<int64_t
>(now.tv_sec - start.tv_sec) * 1000000LL +
82 static_cast<int64_t
>(now.tv_nsec - start.tv_nsec) / 1000LL;
85inline uint32_t WaitSliceMilliseconds(uint32_t remaining_ms)