aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar mtklein <mtklein@chromium.org>2015-10-22 13:33:21 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-10-22 13:33:22 -0700
commita1840d50e29fd95e4df2d1168fe54c34c2a5c30c (patch)
tree77e89242b2f3ae8ecf71da647fc651b3b124012f /src
parentc9b5f8b1522e72449d704d30ed6aee4fc6211ee8 (diff)
SkTime::GetNSecs()
- Move high-precision wall timers from tools/timer to SkTime. - Implement SkTime::GetMSecs() in terms of SkTime::GetNSecs(). - Delete unused tools/timer code. I have no idea what's going on there in src/animator. I don't intend to investigate. BUG=skia: Committed: https://skia.googlesource.com/skia/+/70084cbc16ee8162649f2601377feb6e49de0217 CQ_EXTRA_TRYBOTS=client.skia.compile:Build-Ubuntu-GCC-x86_64-Debug-CrOS_Link-Trybot Review URL: https://codereview.chromium.org/1422513003
Diffstat (limited to 'src')
-rw-r--r--src/animator/SkTime.cpp18
-rw-r--r--src/core/SkTime.cpp35
-rw-r--r--src/ports/SkTime_Unix.cpp7
-rw-r--r--src/ports/SkTime_win.cpp11
4 files changed, 35 insertions, 36 deletions
diff --git a/src/animator/SkTime.cpp b/src/animator/SkTime.cpp
index a4e035bd1e..560ccd2fc8 100644
--- a/src/animator/SkTime.cpp
+++ b/src/animator/SkTime.cpp
@@ -28,15 +28,6 @@ void SkTime::GetDateTime(DateTime* t) {
}
}
-SkMSec SkTime::GetMSecs() {
-#ifdef SK_DEBUG
- if (gForceTickCount != (SkMSec) -1) {
- return gForceTickCount;
- }
-#endif
- return ::GetTickCount();
-}
-
#elif defined(xSK_BUILD_FOR_MAC)
#include <time.h>
@@ -58,13 +49,4 @@ void SkTime::GetDateTime(DateTime* t) {
}
}
-SkMSec SkTime::GetMSecs() {
- UnsignedWide wide;
- ::Microseconds(&wide);
-
- int64_t s = ((int64_t)wide.hi << 32) | wide.lo;
- s = (s + 500) / 1000; // rounded divide
- return (SkMSec)s;
-}
-
#endif
diff --git a/src/core/SkTime.cpp b/src/core/SkTime.cpp
index fa6c04447d..03970aa824 100644
--- a/src/core/SkTime.cpp
+++ b/src/core/SkTime.cpp
@@ -5,6 +5,7 @@
* found in the LICENSE file.
*/
+#include "SkOncePtr.h"
#include "SkString.h"
#include "SkTime.h"
@@ -22,3 +23,37 @@ void SkTime::DateTime::toISO8601(SkString* dst) const {
timeZoneMinutes);
}
}
+
+// TODO: use rdtscp when (runtime) available
+// TODO: use std::chrono when (compile-time) available
+
+#if defined(_MSC_VER)
+ #include <intrin.h>
+ SK_DECLARE_STATIC_ONCE_PTR(double, ns_per_tick);
+ double SkTime::GetNSecs() {
+ uint64_t ticks = __rdtsc();
+ return ticks * *ns_per_tick.get([]{
+ LARGE_INTEGER khz; // The docs say this returns Hz, but it returns KHz.
+ QueryPerformanceFrequency(&khz);
+ return new double(1e6 / khz.QuadPart);
+ });
+ }
+#elif defined(__MACH__)
+ #include <mach/mach_time.h>
+ SK_DECLARE_STATIC_ONCE_PTR(double, ns_per_tick);
+ double SkTime::GetNSecs() {
+ uint64_t ticks = mach_absolute_time();
+ return ticks * *ns_per_tick.get([]{
+ mach_timebase_info_data_t timebase;
+ (void)mach_timebase_info(&timebase);
+ return new double(timebase.numer * 1.0 / timebase.denom);
+ });
+ }
+#else
+ #include <time.h>
+ double SkTime::GetNSecs() {
+ struct timespec ts = {0, 0};
+ (void)clock_gettime(CLOCK_MONOTONIC, &ts);
+ return ts.tv_sec * 1e9 + ts.tv_nsec;
+ }
+#endif
diff --git a/src/ports/SkTime_Unix.cpp b/src/ports/SkTime_Unix.cpp
index ec96bb8a90..1ea3b8fbd0 100644
--- a/src/ports/SkTime_Unix.cpp
+++ b/src/ports/SkTime_Unix.cpp
@@ -34,10 +34,3 @@ void SkTime::GetDateTime(DateTime* dt)
dt->fSecond = SkToU8(tstruct->tm_sec);
}
}
-
-SkMSec SkTime::GetMSecs()
-{
- struct timeval tv;
- gettimeofday(&tv, nullptr);
- return (SkMSec) (tv.tv_sec * 1000 + tv.tv_usec / 1000 ); // microseconds to milliseconds
-}
diff --git a/src/ports/SkTime_win.cpp b/src/ports/SkTime_win.cpp
index 19f4695a86..2bd5062c3c 100644
--- a/src/ports/SkTime_win.cpp
+++ b/src/ports/SkTime_win.cpp
@@ -39,14 +39,3 @@ void SkTime::GetDateTime(DateTime* dt)
dt->fSecond = SkToU8(st.wSecond);
}
}
-
-SkMSec SkTime::GetMSecs()
-{
- FILETIME ft;
- LARGE_INTEGER li;
- GetSystemTimeAsFileTime(&ft);
- li.LowPart = ft.dwLowDateTime;
- li.HighPart = ft.dwHighDateTime;
- __int64 t = li.QuadPart; /* In 100-nanosecond intervals */
- return (SkMSec)(t / 10000); /* In milliseconds */
-}