/**
* =========================================================================
* File : tgt.cpp
* Project : 0 A.D.
* Description : Timer implementation using timeGetTime
* =========================================================================
*/
// license: GPL; see lib/license.txt
// note: WinMM is delay-loaded to avoid dragging it in when this timer
// implementation isn't used. (this is relevant because its startup is
// fairly slow)
#include "precompiled.h"
#include "tgt.h"
#include "lib/sysdep/win/win.h"
#include <mmsystem.h>
#if MSC_VERSION
#pragma comment(lib, "winmm.lib")
#endif
// "Guidelines For Providing Multimedia Timer Support" claims that
// speeding the timer up to 2 ms has little impact, while 1 ms
// causes significant slowdown.
static const UINT PERIOD_MS = 2;
LibError CounterTGT::Activate()
{
// note: timeGetTime is always available and cannot fail.
MMRESULT ret = timeBeginPeriod(PERIOD_MS);
debug_assert(ret == TIMERR_NOERROR);
return INFO::OK;
}
void CounterTGT::Shutdown()
{
timeEndPeriod(PERIOD_MS);
}
bool CounterTGT::IsSafe() const
{
// the only point of criticism is the possibility of falling behind
// due to lost interrupts. this can happen to any interrupt-based timer
// and some systems may lack a counter-based timer, so consider TGT
// 'safe'. note that it is still only chosen when all other timers fail.
return true;
}
u64 CounterTGT::Counter() const
{
return timeGetTime();
}
/**
* WHRT uses this to ensure the counter (running at nominal frequency)
* doesn't overflow more than once during CALIBRATION_INTERVAL_MS.
**/
uint CounterTGT::CounterBits() const
{
return 32;
}
/**
* initial measurement of the tick rate. not necessarily correct
* (e.g. when using TSC: wcpu_ClockFrequency isn't exact).
**/
double CounterTGT::NominalFrequency() const
{
return 1000.0;
}
/**
* actual resolution [s]
**/
double CounterTGT::Resolution() const
{
return PERIOD_MS*1e-3;
}