| // | |
| // Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // | |
| // OSXTimer.cpp: Implementation of a high precision timer class on OSX | |
| #include "osx/OSXTimer.h" | |
| #include <CoreServices/CoreServices.h> | |
| #include <mach/mach.h> | |
| #include <mach/mach_time.h> | |
| OSXTimer::OSXTimer() | |
| : mRunning(false) | |
| { | |
| } | |
| void OSXTimer::start() | |
| { | |
| mStartTime = mach_absolute_time(); | |
| mRunning = true; | |
| } | |
| void OSXTimer::stop() | |
| { | |
| mStopTime = mach_absolute_time(); | |
| mRunning = false; | |
| } | |
| double OSXTimer::getElapsedTime() const | |
| { | |
| // If this is the first time we've run, get the timebase. | |
| // We can use denom == 0 to indicate that sTimebaseInfo is | |
| // uninitialised because it makes no sense to have a zero | |
| // denominator in a fraction. | |
| static mach_timebase_info_data_t timebaseInfo; | |
| static double secondCoeff; | |
| if ( timebaseInfo.denom == 0 ) | |
| { | |
| mach_timebase_info(&timebaseInfo); | |
| secondCoeff = timebaseInfo.numer * (1.0 / 1000000000) / timebaseInfo.denom; | |
| } | |
| if (mRunning) | |
| { | |
| return secondCoeff * (mach_absolute_time() - mStartTime); | |
| } | |
| else | |
| { | |
| return secondCoeff * (mStopTime - mStartTime); | |
| } | |
| } | |
| Timer *CreateTimer() | |
| { | |
| return new OSXTimer(); | |
| } |