From c5c45a1fb0476444eb1c576e9e160d0fd30fa60c Mon Sep 17 00:00:00 2001 From: Hannu Hanhi Date: Sat, 2 May 2020 23:06:01 +0300 Subject: [PATCH] Implement I_GetTimeMicros without affecting I_GetTime behaviour details --- src/sdl/i_system.c | 49 ++++++++++++++++++++-------------------------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 9d63225cb..426904c63 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -2060,12 +2060,11 @@ static p_timeGetTime pfntimeGetTime = NULL; // but lower precision on Windows NT // --------- -DWORD TimeFunction(boolean microseconds) +DWORD TimeFunction(int requested_frequency) { DWORD newtics = 0; - int multiplier = 1; - - if (microseconds) multiplier = 1000; + // this var acts as a multiplier if sub-millisecond precision is asked but is not available + int excess_frequency = requested_frequency / 1000; if (!starttickcount) // high precision timer { @@ -2085,7 +2084,7 @@ DWORD TimeFunction(boolean microseconds) if (frequency.LowPart && QueryPerformanceCounter(&currtime)) { - newtics = (INT32)((currtime.QuadPart - basetime.QuadPart) * 1000 * multiplier + newtics = (INT32)((currtime.QuadPart - basetime.QuadPart) * requested_frequency / frequency.QuadPart); } else if (pfntimeGetTime) @@ -2093,11 +2092,19 @@ DWORD TimeFunction(boolean microseconds) currtime.LowPart = pfntimeGetTime(); if (!basetime.LowPart) basetime.LowPart = currtime.LowPart; - newtics = currtime.LowPart - basetime.LowPart; + if (requested_frequency > 1000) + newtics = currtime.LowPart - basetime.LowPart * excess_frequency; + else + newtics = (currtime.LowPart - basetime.LowPart)/(1000/requested_frequency); } } else - newtics = (GetTickCount() - starttickcount) * multiplier; + { + if (requested_frequency > 1000) + newtics = (GetTickCount() - starttickcount) * excess_frequency; + else + newtics = (GetTickCount() - starttickcount)/(1000/requested_frequency); + } return newtics; } @@ -2119,8 +2126,9 @@ static void I_ShutdownTimer(void) // I_GetTime // returns time in 1/TICRATE second tics // -/* -tic_t I_GetTime (void) + +// millisecond precision only +int TimeFunction(int requested_frequency) { static Uint64 basetime = 0; Uint64 ticks = SDL_GetTicks(); @@ -2130,37 +2138,22 @@ tic_t I_GetTime (void) ticks -= basetime; - ticks = (ticks*TICRATE); + ticks = (ticks*requested_frequency); ticks = (ticks/1000); - return (tic_t)ticks; -} -*/ -int TimeFunction(boolean microseconds)// this cant actually do microseconds so it fakes it -{ - static Uint64 basetime = 0; - Uint64 ticks = SDL_GetTicks(); - - if (!basetime) - basetime = ticks; - - ticks -= basetime; - - return microseconds ? ticks * 1000 : ticks; + return ticks; } #endif tic_t I_GetTime(void) { - //return TimeFunction(false) / (1000/NEWTICRATE); - // how about this - return (TimeFunction(false) * NEWTICRATE) / 1000; + return TimeFunction(NEWTICRATE); } int I_GetTimeMicros(void) { - return TimeFunction(true); + return TimeFunction(1000000); } //