diff options
author | mtklein <mtklein@chromium.org> | 2015-10-22 13:33:21 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-10-22 13:33:22 -0700 |
commit | a1840d50e29fd95e4df2d1168fe54c34c2a5c30c (patch) | |
tree | 77e89242b2f3ae8ecf71da647fc651b3b124012f /src | |
parent | c9b5f8b1522e72449d704d30ed6aee4fc6211ee8 (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.cpp | 18 | ||||
-rw-r--r-- | src/core/SkTime.cpp | 35 | ||||
-rw-r--r-- | src/ports/SkTime_Unix.cpp | 7 | ||||
-rw-r--r-- | src/ports/SkTime_win.cpp | 11 |
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 */ -} |