raze-gles/source/build/src/timer.cpp
terminx 04811f21f4 Replace separate timer implementations in SDL and Winlayer with a shared implementation based on std::chrono
git-svn-id: https://svn.eduke32.com/eduke32@7976 1a8010ca-5511-0410-912e-c29ae57300e0

# Conflicts:
#	platform/Windows/build.vcxproj
#	platform/Windows/build.vcxproj.filters
#	source/build/src/mdsprite.cpp
2019-09-20 16:09:24 +02:00

60 lines
1.6 KiB
C++

#include "timer.h"
#include "build.h"
#include "compat.h"
#include <chrono>
using namespace std;
using namespace chrono;
static int32_t timerlastsample;
static int32_t timerticspersec=0;
static void(*usertimercallback)(void) = NULL;
int32_t timerGetRate(void) { return timerticspersec; }
void timerUninit(void) { timerticspersec = 0; }
uint32_t timerGetTicks(void) { return duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count(); }
uint64_t timerGetTicksU64(void) { return high_resolution_clock::now().time_since_epoch().count(); }
uint64_t timerGetFreqU64(void) { return high_resolution_clock::period::den; }
// Returns the time since an unspecified starting time in milliseconds.
// (May be not monotonic for certain configurations.)
ATTRIBUTE((flatten))
double timerGetHiTicks(void) { return duration<double, milli>(high_resolution_clock::now().time_since_epoch()).count(); }
int32_t timerInit(int32_t const tickspersecond)
{
timerticspersec = tickspersecond;
timerlastsample = timerGetTicksU64() * timerticspersec / timerGetFreqU64();
usertimercallback = NULL;
return 0;
}
void timerUpdate(void)
{
if (!timerticspersec) return;
uint64_t n = (timerGetTicksU64() * timerticspersec / timerGetFreqU64()) - timerlastsample;
if (n <= 0) return;
totalclock += n;
timerlastsample += n;
if (usertimercallback)
for (; n > 0; n--) usertimercallback();
}
void(*timerSetCallback(void(*callback)(void)))(void)
{
void(*oldtimercallback)(void);
oldtimercallback = usertimercallback;
usertimercallback = callback;
return oldtimercallback;
}