1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-15 06:04:49 +01:00

use high resolutuion timer by default

This commit is contained in:
FunkyFr3sh 2024-06-15 05:28:06 +02:00
parent 02605d2b45
commit 30de4d7df4
3 changed files with 30 additions and 3 deletions

View File

@ -50,6 +50,10 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute
#define LIMIT_TESTCOOP 1
#define LIMIT_BLTFAST 2
#ifndef CREATE_WAITABLE_TIMER_HIGH_RESOLUTION
#define CREATE_WAITABLE_TIMER_HIGH_RESOLUTION 0x00000002
#endif
typedef struct SPEEDLIMITER
{
DWORD tick_length;

View File

@ -119,6 +119,10 @@ VERSIONHELPERAPI IsWindows10OrGreater(void) {
return IsWindowsThresholdOrGreater();
}
VERSIONHELPERAPI IsWindows10Version1803OrGreater(void) {
return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN10), LOBYTE(_WIN32_WINNT_WIN10), 17134, 0);
}
VERSIONHELPERAPI IsWindows11OrGreater(void) {
return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 22000, 0);
}

View File

@ -1578,12 +1578,28 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute
if (g_config.minfps > 0)
g_ddraw.minfps_tick_len = (DWORD)(1000.0f / g_config.minfps);
HANDLE (WINAPI *createTimerExW)(LPSECURITY_ATTRIBUTES, LPCWSTR, DWORD, DWORD) = NULL;
if (!IsWine() && IsWindows10Version1803OrGreater())
{
createTimerExW = (void*)real_GetProcAddress(real_LoadLibraryA("Kernel32.dll"), "CreateWaitableTimerExW");
}
DWORD timer_flags = CREATE_WAITABLE_TIMER_MANUAL_RESET | CREATE_WAITABLE_TIMER_HIGH_RESOLUTION;
/* can't fully set it up here due to missing g_ddraw.mode.dmDisplayFrequency */
g_fpsl.htimer = CreateWaitableTimer(NULL, TRUE, NULL);
g_fpsl.htimer = createTimerExW ? createTimerExW(NULL, NULL, timer_flags, TIMER_ALL_ACCESS) : NULL;
if (!g_fpsl.htimer)
g_fpsl.htimer = CreateWaitableTimer(NULL, TRUE, NULL);
if (g_config.maxgameticks > 0 && g_config.maxgameticks <= 1000)
{
g_ddraw.ticks_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL);
g_ddraw.ticks_limiter.htimer = createTimerExW ? createTimerExW(NULL, NULL, timer_flags, TIMER_ALL_ACCESS) : NULL;
if (!g_ddraw.ticks_limiter.htimer)
g_ddraw.ticks_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL);
float len = 1000.0f / g_config.maxgameticks;
g_ddraw.ticks_limiter.tick_length_ns = (LONGLONG)(len * 10000);
@ -1593,7 +1609,10 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute
if (g_config.maxgameticks >= 0 || g_config.maxgameticks == -2)
{
/* always using 60 fps for flip... */
g_ddraw.flip_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL);
g_ddraw.flip_limiter.htimer = createTimerExW ? createTimerExW(NULL, NULL, timer_flags, TIMER_ALL_ACCESS) : NULL;
if (!g_ddraw.flip_limiter.htimer)
g_ddraw.flip_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL);
float flip_len = 1000.0f / 60;
g_ddraw.flip_limiter.tick_length_ns = (LONGLONG)(flip_len * 10000);