diff src/timer/win32/SDL_systimer.c @ 89:69b8fac3e1c0

Added Holger Schemel's fix for SDL_GetTicks() on W2K This adds QueryPerformanceCounter() support, which is probably a good thing.
author Sam Lantinga <slouken@lokigames.com>
date Sat, 07 Jul 2001 08:03:34 +0000
parents 74212992fb08
children e8157fcb3114
line wrap: on
line diff
--- a/src/timer/win32/SDL_systimer.c	Sat Jul 07 07:59:37 2001 +0000
+++ b/src/timer/win32/SDL_systimer.c	Sat Jul 07 08:03:34 2001 +0000
@@ -39,28 +39,64 @@
 
 #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 {