Index: src/core/SkTime.cpp |
diff --git a/src/core/SkTime.cpp b/src/core/SkTime.cpp |
index 16f66161a78969d6bea59644a30d7ed43d30ef88..86a0685c70af27703490024f15bf80ff5aef5152 100644 |
--- a/src/core/SkTime.cpp |
+++ b/src/core/SkTime.cpp |
@@ -36,13 +36,24 @@ |
return new double(1e6 / khz.QuadPart); |
}); |
} |
+#elif defined(__MACH__) |
+ // TODO: fold into std::chrono when available? |
+ #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 |
- // This std::chrono code looks great on Linux, Mac, and Android, |
- // but MSVC 2013 returns mostly garbage (0ns times, etc). |
- // This is ostensibly fixed in MSVC 2015. |
+ // This std::chrono code looks great on Linux and Android, |
+ // but MSVC 2013 returned mostly garbage (0ns times, etc). |
#include <chrono> |
double SkTime::GetNSecs() { |
- auto now = std::chrono::steady_clock::now(); |
+ auto now = std::chrono::high_resolution_clock::now(); |
std::chrono::duration<double, std::nano> ns = now.time_since_epoch(); |
return ns.count(); |
} |