Fixed bug 5467 - SDL sys timer Mac OS update proposal

David Carlier

Change of api from 2016 which reduce code complexity a bit.
This commit is contained in:
Sam Lantinga
2021-01-23 09:50:43 -08:00
parent 0f57864c9e
commit 96cfb81232
6 changed files with 28 additions and 7 deletions

View File

@@ -46,7 +46,7 @@
Also added OS X Monotonic clock support
Based on work in https://github.com/ThomasHabets/monotonic_clock
*/
#if HAVE_NANOSLEEP || HAVE_CLOCK_GETTIME
#if HAVE_NANOSLEEP || HAVE_CLOCK_GETTIME || HAVE_CLOCK_GETTIME_NSEC_NP
#include <time.h>
#endif
#ifdef __APPLE__
@@ -54,7 +54,7 @@
#endif
/* Use CLOCK_MONOTONIC_RAW, if available, which is not subject to adjustment by NTP */
#if HAVE_CLOCK_GETTIME
#if HAVE_CLOCK_GETTIME || HAVE_CLOCK_GETTIME_NSEC_NP
#ifdef CLOCK_MONOTONIC_RAW
#define SDL_MONOTONIC_CLOCK CLOCK_MONOTONIC_RAW
#else
@@ -65,7 +65,7 @@
/* The first ticks value of the application */
#if HAVE_CLOCK_GETTIME
static struct timespec start_ts;
#elif defined(__APPLE__)
#elif defined(__APPLE__) && !HAVE_CLOCK_GETTIME_NSEC_NP
static uint64_t start_mach;
mach_timebase_info_data_t mach_base_info;
#endif
@@ -87,11 +87,17 @@ SDL_TicksInit(void)
has_monotonic_time = SDL_TRUE;
} else
#elif defined(__APPLE__)
#if !HAVE_CLOCK_GETTIME_NSEC_NP
kern_return_t ret = mach_timebase_info(&mach_base_info);
if (ret == 0) {
has_monotonic_time = SDL_TRUE;
start_mach = mach_absolute_time();
} else
#else
if (clock_gettime_nsec_np(SDL_MONOTONIC_CLOCK) > 0) {
has_monotonic_time = SDL_TRUE;
} else
#endif
#endif
{
gettimeofday(&start_tv, NULL);
@@ -118,8 +124,12 @@ SDL_GetTicks(void)
clock_gettime(SDL_MONOTONIC_CLOCK, &now);
ticks = (Uint32)((now.tv_sec - start_ts.tv_sec) * 1000 + (now.tv_nsec - start_ts.tv_nsec) / 1000000);
#elif defined(__APPLE__)
#if !HAVE_CLOCK_GETTIME_NSEC_NP
uint64_t now = mach_absolute_time();
ticks = (Uint32)((((now - start_mach) * mach_base_info.numer) / mach_base_info.denom) / 1000000);
#else
ticks = (Uint32)clock_gettime_nsec_np(SDL_MONOTONIC_CLOCK);
#endif
#else
SDL_assert(SDL_FALSE);
ticks = 0;
@@ -150,7 +160,11 @@ SDL_GetPerformanceCounter(void)
ticks *= 1000000000;
ticks += now.tv_nsec;
#elif defined(__APPLE__)
#if !HAVE_CLOCK_GETTIME_NSEC_NP
ticks = mach_absolute_time();
#else
ticks = (Uint32)clock_gettime_nsec_np(SDL_MONOTONIC_CLOCK);
#endif
#else
SDL_assert(SDL_FALSE);
ticks = 0;
@@ -177,13 +191,16 @@ SDL_GetPerformanceFrequency(void)
#if HAVE_CLOCK_GETTIME
return 1000000000;
#elif defined(__APPLE__)
#if !HAVE_CLOCK_GETTIME_NSEC_NP
Uint64 freq = mach_base_info.denom;
freq *= 1000000000;
freq /= mach_base_info.numer;
return freq;
#else
return 1000000000;
#endif
}
#endif
}
return 1000000;
}