Get absolute time from timers

Independent of start()/stop()/getElapsedTime() functionality,
getAbsoluteTime() is added to return the time regardless of whether the
timer is running.

Bug: angleproject:2908
Change-Id: I056aeb6eddfba8757a139934c1cf68e00e860de6
Reviewed-on: https://chromium-review.googlesource.com/c/1296952
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/util/linux/LinuxTimer.cpp b/util/linux/LinuxTimer.cpp
index 1968205..e9067e3 100644
--- a/util/linux/LinuxTimer.cpp
+++ b/util/linux/LinuxTimer.cpp
@@ -14,33 +14,46 @@
 {
 }
 
+namespace
+{
+uint64_t getCurrentTimeNs()
+{
+    struct timespec currentTime;
+    clock_gettime(CLOCK_MONOTONIC, &currentTime);
+    return currentTime.tv_sec * 1'000'000'000llu + currentTime.tv_nsec;
+}
+}  // anonymous namespace
+
 void LinuxTimer::start()
 {
-    clock_gettime(CLOCK_MONOTONIC, &mStartTime);
+    mStartTimeNs = getCurrentTimeNs();
     mRunning = true;
 }
 
 void LinuxTimer::stop()
 {
-    clock_gettime(CLOCK_MONOTONIC, &mStopTime);
+    mStopTimeNs = getCurrentTimeNs();
     mRunning = false;
 }
 
 double LinuxTimer::getElapsedTime() const
 {
-    struct timespec endTime;
+    uint64_t endTimeNs;
     if (mRunning)
     {
-        clock_gettime(CLOCK_MONOTONIC, &endTime);
+        endTimeNs = getCurrentTimeNs();
     }
     else
     {
-        endTime = mStopTime;
+        endTimeNs = mStopTimeNs;
     }
 
-    double startSeconds = mStartTime.tv_sec + (1.0 / 1000000000) * mStartTime.tv_nsec;
-    double endSeconds = endTime.tv_sec + (1.0 / 1000000000) * endTime.tv_nsec;
-    return endSeconds - startSeconds;
+    return (endTimeNs - mStartTimeNs) * 1e-9;
+}
+
+double LinuxTimer::getAbsoluteTime()
+{
+    return getCurrentTimeNs() * 1e-9;
 }
 
 Timer *CreateTimer()