Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
Added high resolution timing API: SDL_GetPerformanceCounter(), SDL_Ge…
Browse files Browse the repository at this point in the history
…tPerformanceFrequency()
  • Loading branch information
slouken committed Mar 25, 2011
1 parent 3c5967c commit 01cb78a
Show file tree
Hide file tree
Showing 8 changed files with 127 additions and 1 deletion.
10 changes: 10 additions & 0 deletions include/SDL_timer.h
Expand Up @@ -47,6 +47,16 @@ extern "C" {
*/
extern DECLSPEC Uint32 SDLCALL SDL_GetTicks(void);

/**
* \brief Get the current value of the high resolution counter
*/
extern DECLSPEC Uint64 SDLCALL SDL_GetPerformanceCounter(void);

/**
* \brief Get the count per second of the high resolution counter
*/
extern DECLSPEC Uint64 SDLCALL SDL_GetPerformanceFrequency(void);

/**
* \brief Wait a specified number of milliseconds before returning.
*/
Expand Down
12 changes: 12 additions & 0 deletions src/timer/beos/SDL_systimer.c
Expand Up @@ -42,6 +42,18 @@ SDL_GetTicks(void)
return ((system_time() - start) / 1000);
}

Uint64
SDL_GetPerformanceCounter(void)
{
return system_time();
}

Uint64
SDL_GetPerformanceFrequency(void)
{
return 1000000;
}

void
SDL_Delay(Uint32 ms)
{
Expand Down
12 changes: 12 additions & 0 deletions src/timer/dummy/SDL_systimer.c
Expand Up @@ -37,6 +37,18 @@ SDL_GetTicks(void)
return 0;
}

Uint64
SDL_GetPerformanceCounter(void)
{
return SDL_GetTicks();
}

Uint64
SDL_GetPerformanceFrequency(void)
{
return 1000;
}

void
SDL_Delay(Uint32 ms)
{
Expand Down
12 changes: 12 additions & 0 deletions src/timer/nds/SDL_systimer.c
Expand Up @@ -52,6 +52,18 @@ SDL_GetTicks(void)
return timer_ticks;
}

Uint64
SDL_GetPerformanceCounter(void)
{
return SDL_GetTicks();
}

Uint64
SDL_GetPerformanceFrequency(void)
{
return 1000;
}

void
SDL_Delay(Uint32 ms)
{
Expand Down
36 changes: 36 additions & 0 deletions src/timer/unix/SDL_systimer.c
Expand Up @@ -64,6 +64,7 @@ SDL_GetTicks(void)
#if HAVE_CLOCK_GETTIME
Uint32 ticks;
struct timespec now;

clock_gettime(CLOCK_MONOTONIC, &now);
ticks =
(now.tv_sec - start.tv_sec) * 1000 + (now.tv_nsec -
Expand All @@ -72,6 +73,7 @@ SDL_GetTicks(void)
#else
Uint32 ticks;
struct timeval now;

gettimeofday(&now, NULL);
ticks =
(now.tv_sec - start.tv_sec) * 1000 + (now.tv_usec -
Expand All @@ -80,6 +82,40 @@ SDL_GetTicks(void)
#endif
}

Uint64
SDL_GetPerformanceCounter(void)
{
#if HAVE_CLOCK_GETTIME
Uint64 ticks;
struct timespec now;

clock_gettime(CLOCK_MONOTONIC, &now);
ticks = now.tv_sec;
ticks *= 1000000000;
ticks += now.tv_nsec;
return (ticks);
#else
Uint64 ticks;
struct timeval now;

gettimeofday(&now, NULL);
ticks = now.tv_sec;
ticks *= 1000000;
ticks += now.tv_usec;
return (ticks);
#endif
}

Uint64
SDL_GetPerformanceFrequency(void)
{
#if HAVE_CLOCK_GETTIME
return 1000000000;
#else
return 1000000;
#endif
}

void
SDL_Delay(Uint32 ms)
{
Expand Down
12 changes: 12 additions & 0 deletions src/timer/wince/SDL_systimer.c
Expand Up @@ -87,6 +87,18 @@ SDL_GetTicks()
return ((Uint32) wce_rel_ticks());
}

Uint64
SDL_GetPerformanceCounter(void)
{
return SDL_GetTicks();
}

Uint64
SDL_GetPerformanceFrequency(void)
{
return 1000;
}

/* Give up approx. givem milliseconds to the OS. */
void
SDL_Delay(Uint32 ms)
Expand Down
22 changes: 22 additions & 0 deletions src/timer/windows/SDL_systimer.c
Expand Up @@ -99,6 +99,28 @@ SDL_GetTicks(void)
return (ticks);
}

Uint64
SDL_GetPerformanceCounter(void)
{
LARGE_INTEGER counter;

if (!QueryPerformanceCounter(&counter)) {
return SDL_GetTicks();
}
return counter.QuadPart;
}

Uint64
SDL_GetPerformanceFrequency(void)
{
LARGE_INTEGER frequency;

if (!QueryPerformanceFrequency(&frequency)) {
return 1000;
}
return frequency.QuadPart;
}

void
SDL_Delay(Uint32 ms)
{
Expand Down
12 changes: 11 additions & 1 deletion test/testtimer.c
Expand Up @@ -29,8 +29,9 @@ callback(Uint32 interval, void *param)
int
main(int argc, char *argv[])
{
int desired;
int i, desired;
SDL_TimerID t1, t2, t3;
Uint64 start, now;

if (SDL_Init(SDL_INIT_TIMER) < 0) {
fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
Expand Down Expand Up @@ -85,6 +86,15 @@ main(int argc, char *argv[])
SDL_RemoveTimer(t2);
SDL_RemoveTimer(t3);

start = SDL_GetPerformanceCounter();
for (i = 0; i < 1000000; ++i) {
ticktock(0);
}
now = SDL_GetPerformanceCounter();
printf("1 million iterations of ticktock took %f ms\n", (double)((now - start)*1000) / SDL_GetPerformanceFrequency());

SDL_Quit();
return (0);
}

/* vi: set ts=4 sw=4 expandtab: */

0 comments on commit 01cb78a

Please sign in to comment.