This commit is contained in:
@@ -0,0 +1,119 @@
|
||||
// File: crn_win32_timer.cpp
|
||||
// See Copyright Notice and license at the end of inc/crnlib.h
|
||||
#include "crn_core.h"
|
||||
#include "crn_win32_timer.h"
|
||||
#include "crn_winhdr.h"
|
||||
|
||||
namespace crnlib
|
||||
{
|
||||
uint64 timer::g_init_ticks;
|
||||
uint64 timer::g_freq;
|
||||
double timer::g_inv_freq;
|
||||
|
||||
timer::timer() :
|
||||
m_start_time(0),
|
||||
m_stop_time(0),
|
||||
m_started(false),
|
||||
m_stopped(false)
|
||||
{
|
||||
if (!g_inv_freq) init();
|
||||
}
|
||||
|
||||
timer::timer(timer_ticks start_ticks)
|
||||
{
|
||||
if (!g_inv_freq) init();
|
||||
|
||||
m_start_time = start_ticks;
|
||||
|
||||
m_started = true;
|
||||
m_stopped = false;
|
||||
}
|
||||
|
||||
void timer::start(timer_ticks start_ticks)
|
||||
{
|
||||
m_start_time = start_ticks;
|
||||
|
||||
m_started = true;
|
||||
m_stopped = false;
|
||||
}
|
||||
|
||||
void timer::start()
|
||||
{
|
||||
QueryPerformanceCounter((LARGE_INTEGER*)&m_start_time);
|
||||
|
||||
m_started = true;
|
||||
m_stopped = false;
|
||||
}
|
||||
|
||||
void timer::stop()
|
||||
{
|
||||
CRNLIB_ASSERT(m_started);
|
||||
|
||||
QueryPerformanceCounter((LARGE_INTEGER*)&m_stop_time);
|
||||
|
||||
m_stopped = true;
|
||||
}
|
||||
|
||||
double timer::get_elapsed_secs() const
|
||||
{
|
||||
CRNLIB_ASSERT(m_started);
|
||||
if (!m_started)
|
||||
return 0;
|
||||
|
||||
uint64 stop_time = m_stop_time;
|
||||
if (!m_stopped)
|
||||
QueryPerformanceCounter((LARGE_INTEGER*)&stop_time);
|
||||
|
||||
uint64 delta = stop_time - m_start_time;
|
||||
return delta * g_inv_freq;
|
||||
}
|
||||
|
||||
uint64 timer::get_elapsed_us() const
|
||||
{
|
||||
CRNLIB_ASSERT(m_started);
|
||||
if (!m_started)
|
||||
return 0;
|
||||
|
||||
uint64 stop_time = m_stop_time;
|
||||
if (!m_stopped)
|
||||
QueryPerformanceCounter((LARGE_INTEGER*)&stop_time);
|
||||
|
||||
uint64 delta = stop_time - m_start_time;
|
||||
return (delta * 1000000ULL + (g_freq >> 1U)) / g_freq;
|
||||
}
|
||||
|
||||
void timer::init()
|
||||
{
|
||||
if (!g_inv_freq)
|
||||
{
|
||||
QueryPerformanceFrequency((LARGE_INTEGER*)&g_freq);
|
||||
g_inv_freq = 1.0f / g_freq;
|
||||
|
||||
QueryPerformanceCounter((LARGE_INTEGER*)&g_init_ticks);
|
||||
}
|
||||
}
|
||||
|
||||
timer_ticks timer::get_init_ticks()
|
||||
{
|
||||
if (!g_inv_freq) init();
|
||||
|
||||
return g_init_ticks;
|
||||
}
|
||||
|
||||
timer_ticks timer::get_ticks()
|
||||
{
|
||||
if (!g_inv_freq) init();
|
||||
|
||||
timer_ticks ticks;
|
||||
QueryPerformanceCounter((LARGE_INTEGER*)&ticks);
|
||||
return ticks;
|
||||
}
|
||||
|
||||
double timer::ticks_to_secs(timer_ticks ticks)
|
||||
{
|
||||
if (!g_inv_freq) init();
|
||||
|
||||
return ticks * g_inv_freq;
|
||||
}
|
||||
|
||||
} // namespace crnlib
|
||||
Reference in New Issue
Block a user