From ec76bd6aef5949eafd53a643dea329bb6cf7eb0d Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 7 Jul 2001 08:03:34 +0000 Subject: [PATCH] Added Holger Schemel's fix for SDL_GetTicks() on W2K This adds QueryPerformanceCounter() support, which is probably a good thing. --HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%4090 --- src/timer/win32/SDL_systimer.c | 42 +++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/src/timer/win32/SDL_systimer.c b/src/timer/win32/SDL_systimer.c index af5faf96b..ff2a85627 100644 --- a/src/timer/win32/SDL_systimer.c +++ b/src/timer/win32/SDL_systimer.c @@ -39,28 +39,64 @@ static char rcsid = #define TIME_WRAP_VALUE (~(DWORD)0) -/* The first ticks value of the application */ +/* The first (low-resolution) ticks value of the application */ static DWORD start; +#ifndef USE_GETTICKCOUNT +/* Store if a high-resolution performance counter exists on the system */ +static BOOL hires_timer_available; +/* The first high-resolution ticks value of the application */ +static LARGE_INTEGER hires_start_ticks; +/* The number of ticks per second of the high-resolution performance counter */ +static LARGE_INTEGER hires_ticks_per_second; +#endif + void SDL_StartTicks(void) { /* Set first ticks value */ #ifdef USE_GETTICKCOUNT start = GetTickCount(); #else - start = timeGetTime(); + if (QueryPerformanceFrequency(&hires_ticks_per_second) == TRUE) + { + hires_timer_available = TRUE; + QueryPerformanceCounter(&hires_start_ticks); + } + else + { + hires_timer_available = FALSE; + timeBeginPeriod(1); /* use 1 ms timer precision */ + start = timeGetTime(); + } #endif } Uint32 SDL_GetTicks(void) { DWORD now, ticks; +#ifndef USE_GETTICKCOUNT + LARGE_INTEGER hires_now; +#endif #ifdef USE_GETTICKCOUNT now = GetTickCount(); #else - now = timeGetTime(); + if (hires_timer_available) + { + QueryPerformanceCounter(&hires_now); + + hires_now.QuadPart -= hires_start_ticks.QuadPart; + hires_now.QuadPart *= 1000; + hires_now.QuadPart /= hires_ticks_per_second.QuadPart; + + return (DWORD)hires_now.QuadPart; + } + else + { + now = timeGetTime(); + } #endif + if ( now < start ) { ticks = (TIME_WRAP_VALUE-start) + now; } else {