+ if(sys_usenoclockbutbenchmark.integer)
+ {
+ benchmark_time += 1;
+ return ((double) benchmark_time) / 1e6;
+ }
+#ifdef WIN32
+ // LordHavoc: note to people modifying this code, DWORD is specifically defined as an unsigned 32bit number, therefore the 65536.0 * 65536.0 is fine.
+ if (sys_usetimegettime.integer)
+ {
+ static int firsttimegettime = true;
+ // timeGetTime
+ // platform:
+ // Windows 95/98/ME/NT/2000/XP
+ // features:
+ // reasonable accuracy (millisecond)
+ // issues:
+ // wraps around every 47 days or so (but this is non-fatal to us, odd times are rejected, only causes a one frame stutter)
+
+ // make sure the timer is high precision, otherwise different versions of windows have varying accuracy
+ if (firsttimegettime)
+ {
+ timeBeginPeriod (1);
+ firsttimegettime = false;
+ }
+
+ newtime = (double) timeGetTime () / 1000.0;
+ }
+ else
+ {
+ // QueryPerformanceCounter
+ // platform:
+ // Windows 95/98/ME/NT/2000/XP
+ // features:
+ // very accurate (CPU cycles)
+ // known issues:
+ // does not necessarily match realtime too well (tends to get faster and faster in win98)
+ // wraps around occasionally on some platforms (depends on CPU speed and probably other unknown factors)
+ double timescale;
+ LARGE_INTEGER PerformanceFreq;
+ LARGE_INTEGER PerformanceCount;
+
+ if (!QueryPerformanceFrequency (&PerformanceFreq))
+ {
+ Con_Printf ("No hardware timer available\n");
+ // fall back to timeGetTime
+ Cvar_SetValueQuick(&sys_usetimegettime, true);
+ return Sys_DoubleTime();
+ }
+ QueryPerformanceCounter (&PerformanceCount);
+
+ #ifdef __BORLANDC__
+ timescale = 1.0 / ((double) PerformanceFreq.u.LowPart + (double) PerformanceFreq.u.HighPart * 65536.0 * 65536.0);
+ newtime = ((double) PerformanceCount.u.LowPart + (double) PerformanceCount.u.HighPart * 65536.0 * 65536.0) * timescale;
+ #else
+ timescale = 1.0 / ((double) PerformanceFreq.LowPart + (double) PerformanceFreq.HighPart * 65536.0 * 65536.0);
+ newtime = ((double) PerformanceCount.LowPart + (double) PerformanceCount.HighPart * 65536.0 * 65536.0) * timescale;
+ #endif
+ }
+#else
+# ifndef MACOSX
+ if (sys_useclockgettime.integer)
+ {
+ struct timespec ts;
+# ifdef SUNOS
+ clock_gettime(CLOCK_HIGHRES, &ts);
+# else
+ clock_gettime(CLOCK_MONOTONIC, &ts);
+# endif
+ newtime = (double) ts.tv_sec + ts.tv_nsec / 1000000000.0;
+ }
+ else
+# endif
+ {
+ struct timeval tp;
+ gettimeofday(&tp, NULL);
+ newtime = (double) tp.tv_sec + tp.tv_usec / 1000000.0;
+ }
+#endif