use NtDelayExecution for SDL_SYS_DelayNS

This commit is contained in:
expikr 2025-08-27 13:58:45 -07:00
parent 98bed62259
commit 4f4d465104

View file

@ -103,6 +103,42 @@ Uint64 SDL_GetPerformanceFrequency(void)
return (Uint64)frequency.QuadPart;
}
#ifdef SDL_TIMER_WINDOWS_USE_NTDELAYEXECUTION
typedef LONG (NTAPI *NtDelayExecution_t)(BOOLEAN Alertable, PLARGE_INTEGER DelayInterval);
static NtDelayExecution_t pNtDelayExecution;
static void SDL_NtDelayExecution(BOOLEAN Alertable, PLARGE_INTEGER DelayInterval)
{
if (!pNtDelayExecution) {
static bool initialized;
if (!initialized) {
HMODULE module = GetModuleHandle(TEXT("ntdll.dll"));
if (module) {
pNtDelayExecution = (NtDelayExecution_t)GetProcAddress(module, "NtDelayExecution");
}
initialized = true;
}
if (!pNtDelayExecution) {
return;
}
}
pNtDelayExecution(Alertable, DelayInterval);
}
void SDL_SYS_DelayNS(Uint64 ns)
{
Sint64 tick = ns;
tick /= 100;
tick *= -1;
SDL_NtDelayExecution(0, (PLARGE_INTEGER)&tick);
}
#else
void SDL_SYS_DelayNS(Uint64 ns)
{
HANDLE timer = SDL_GetWaitableTimer();
@ -130,4 +166,6 @@ void SDL_SYS_DelayNS(Uint64 ns)
Sleep(delay);
}
#endif // SDL_TIMER_WINDOWS_USE_NTDELAYEXECUTION
#endif // SDL_TIMER_WINDOWS