mirror of
https://github.com/FunkyFr3sh/cnc-ddraw.git
synced 2025-03-24 17:49:52 +01:00
new .ini option "maxgameticks=-2"
This commit is contained in:
parent
fe4181cc98
commit
65443fa4e4
1
inc/dd.h
1
inc/dd.h
@ -106,6 +106,7 @@ typedef struct cnc_ddraw
|
|||||||
BOOL nonexclusive;
|
BOOL nonexclusive;
|
||||||
BOOL fixchildwindows;
|
BOOL fixchildwindows;
|
||||||
BOOL d3d9linear;
|
BOOL d3d9linear;
|
||||||
|
int maxgameticks;
|
||||||
BOOL bnet_active;
|
BOOL bnet_active;
|
||||||
BOOL bnet_was_fullscreen;
|
BOOL bnet_was_fullscreen;
|
||||||
BOOL bnet_was_upscaled;
|
BOOL bnet_was_upscaled;
|
||||||
|
@ -47,12 +47,14 @@ typedef struct fps_limiter
|
|||||||
D3DKMTOPENADAPTERFROMHDCPROC D3DKMTOpenAdapterFromHdc;
|
D3DKMTOPENADAPTERFROMHDCPROC D3DKMTOpenAdapterFromHdc;
|
||||||
D3DKMTCLOSEADAPTERPROC D3DKMTCloseAdapter;
|
D3DKMTCLOSEADAPTERPROC D3DKMTCloseAdapter;
|
||||||
BOOL got_adapter;
|
BOOL got_adapter;
|
||||||
|
BOOL initialized;
|
||||||
} fps_limiter;
|
} fps_limiter;
|
||||||
|
|
||||||
extern fps_limiter g_fpsl;
|
extern fps_limiter g_fpsl;
|
||||||
|
|
||||||
void fpsl_init();
|
void fpsl_init();
|
||||||
BOOL fpsl_wait_for_vblank();
|
BOOL fpsl_wait_for_vblank();
|
||||||
|
BOOL fpsl_dwm_flush();
|
||||||
BOOL fpsl_dwm_is_enabled();
|
BOOL fpsl_dwm_is_enabled();
|
||||||
void fpsl_frame_start();
|
void fpsl_frame_start();
|
||||||
void fpsl_frame_end();
|
void fpsl_frame_end();
|
||||||
|
10
src/config.c
10
src/config.c
@ -81,19 +81,19 @@ void cfg_load()
|
|||||||
g_fpsl.htimer = CreateWaitableTimer(NULL, TRUE, NULL);
|
g_fpsl.htimer = CreateWaitableTimer(NULL, TRUE, NULL);
|
||||||
//can't fully set it up here due to missing g_ddraw->mode.dmDisplayFrequency
|
//can't fully set it up here due to missing g_ddraw->mode.dmDisplayFrequency
|
||||||
|
|
||||||
int max_ticks = cfg_get_int("maxgameticks", 0);
|
g_ddraw->maxgameticks = cfg_get_int("maxgameticks", 0);
|
||||||
|
|
||||||
if (max_ticks > 0 && max_ticks <= 1000)
|
if (g_ddraw->maxgameticks > 0 && g_ddraw->maxgameticks <= 1000)
|
||||||
{
|
{
|
||||||
if (g_ddraw->accurate_timers)
|
if (g_ddraw->accurate_timers)
|
||||||
g_ddraw->ticks_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL);
|
g_ddraw->ticks_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL);
|
||||||
|
|
||||||
float len = 1000.0f / max_ticks;
|
float len = 1000.0f / g_ddraw->maxgameticks;
|
||||||
g_ddraw->ticks_limiter.tick_length_ns = len * 10000;
|
g_ddraw->ticks_limiter.tick_length_ns = len * 10000;
|
||||||
g_ddraw->ticks_limiter.tick_length = len + 0.5f;
|
g_ddraw->ticks_limiter.tick_length = len + 0.5f;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (max_ticks >= 0)
|
if (g_ddraw->maxgameticks >= 0 || g_ddraw->maxgameticks == -2)
|
||||||
{
|
{
|
||||||
//always using 60 fps for flip...
|
//always using 60 fps for flip...
|
||||||
if (g_ddraw->accurate_timers)
|
if (g_ddraw->accurate_timers)
|
||||||
@ -298,7 +298,7 @@ static void cfg_create_ini()
|
|||||||
"; Hide WM_ACTIVATEAPP and WM_NCACTIVATE messages to prevent problems on alt+tab\n"
|
"; Hide WM_ACTIVATEAPP and WM_NCACTIVATE messages to prevent problems on alt+tab\n"
|
||||||
"noactivateapp=false\n"
|
"noactivateapp=false\n"
|
||||||
"\n"
|
"\n"
|
||||||
"; Max game ticks per second, possible values: -1 = disabled, 0 = emulate 60hz vblank, 1-1000 = custom game speed\n"
|
"; Max game ticks per second, possible values: -1 = disabled, -2 = refresh rate, 0 = emulate 60hz vblank, 1-1000 = custom game speed\n"
|
||||||
"; Note: Can be used to slow down a too fast running game, fix flickering or too fast animations\n"
|
"; Note: Can be used to slow down a too fast running game, fix flickering or too fast animations\n"
|
||||||
"; Note: Usually one of the following values will work: 60 / 30 / 25 / 20 / 15 (lower value = slower game speed)\n"
|
"; Note: Usually one of the following values will work: 60 / 30 / 25 / 20 / 15 (lower value = slower game speed)\n"
|
||||||
"maxgameticks=0\n"
|
"maxgameticks=0\n"
|
||||||
|
6
src/dd.c
6
src/dd.c
@ -704,6 +704,12 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags)
|
|||||||
|
|
||||||
HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE h)
|
HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE h)
|
||||||
{
|
{
|
||||||
|
if (g_ddraw->maxgameticks == -2)
|
||||||
|
{
|
||||||
|
if (fpsl_dwm_flush())
|
||||||
|
return DD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
if (!g_ddraw->flip_limiter.tick_length)
|
if (!g_ddraw->flip_limiter.tick_length)
|
||||||
return DD_OK;
|
return DD_OK;
|
||||||
|
|
||||||
|
@ -27,36 +27,58 @@ void fpsl_init()
|
|||||||
|
|
||||||
if (g_fpsl.got_adapter && g_fpsl.D3DKMTCloseAdapter)
|
if (g_fpsl.got_adapter && g_fpsl.D3DKMTCloseAdapter)
|
||||||
{
|
{
|
||||||
|
g_fpsl.initialized = FALSE;
|
||||||
g_fpsl.got_adapter = FALSE;
|
g_fpsl.got_adapter = FALSE;
|
||||||
g_fpsl.close_adapter.hAdapter = g_fpsl.adapter.hAdapter;
|
g_fpsl.close_adapter.hAdapter = g_fpsl.adapter.hAdapter;
|
||||||
g_fpsl.D3DKMTCloseAdapter(&g_fpsl.close_adapter);
|
g_fpsl.D3DKMTCloseAdapter(&g_fpsl.close_adapter);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!g_fpsl.gdi32_dll)
|
if (!g_fpsl.gdi32_dll)
|
||||||
|
{
|
||||||
g_fpsl.gdi32_dll = LoadLibraryA("gdi32.dll");
|
g_fpsl.gdi32_dll = LoadLibraryA("gdi32.dll");
|
||||||
|
}
|
||||||
|
|
||||||
if (!g_fpsl.dwmapi_dll)
|
if (!g_fpsl.dwmapi_dll)
|
||||||
|
{
|
||||||
g_fpsl.dwmapi_dll = LoadLibraryA("dwmapi.dll");
|
g_fpsl.dwmapi_dll = LoadLibraryA("dwmapi.dll");
|
||||||
|
}
|
||||||
|
|
||||||
g_fpsl.DwmFlush =
|
if (!g_fpsl.DwmFlush)
|
||||||
(DWMFLUSHPROC)GetProcAddress(g_fpsl.dwmapi_dll, "DwmFlush");
|
{
|
||||||
|
g_fpsl.DwmFlush =
|
||||||
|
(DWMFLUSHPROC)GetProcAddress(g_fpsl.dwmapi_dll, "DwmFlush");
|
||||||
|
}
|
||||||
|
|
||||||
g_fpsl.DwmIsCompositionEnabled =
|
if (!g_fpsl.DwmIsCompositionEnabled)
|
||||||
(DWMISCOMPOSITIONENABLEDPROC)GetProcAddress(g_fpsl.dwmapi_dll, "DwmIsCompositionEnabled");
|
{
|
||||||
|
g_fpsl.DwmIsCompositionEnabled =
|
||||||
|
(DWMISCOMPOSITIONENABLEDPROC)GetProcAddress(g_fpsl.dwmapi_dll, "DwmIsCompositionEnabled");
|
||||||
|
}
|
||||||
|
|
||||||
g_fpsl.D3DKMTWaitForVerticalBlankEvent =
|
if (!g_fpsl.D3DKMTWaitForVerticalBlankEvent)
|
||||||
(D3DKMTWAITFORVERTICALBLANKEVENTPROC)GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTWaitForVerticalBlankEvent");
|
{
|
||||||
|
g_fpsl.D3DKMTWaitForVerticalBlankEvent =
|
||||||
|
(D3DKMTWAITFORVERTICALBLANKEVENTPROC)GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTWaitForVerticalBlankEvent");
|
||||||
|
}
|
||||||
|
|
||||||
g_fpsl.D3DKMTOpenAdapterFromHdc =
|
if (!g_fpsl.D3DKMTOpenAdapterFromHdc)
|
||||||
(D3DKMTOPENADAPTERFROMHDCPROC)GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTOpenAdapterFromHdc");
|
{
|
||||||
|
g_fpsl.D3DKMTOpenAdapterFromHdc =
|
||||||
|
(D3DKMTOPENADAPTERFROMHDCPROC)GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTOpenAdapterFromHdc");
|
||||||
|
}
|
||||||
|
|
||||||
g_fpsl.D3DKMTCloseAdapter =
|
if (!g_fpsl.D3DKMTCloseAdapter)
|
||||||
(D3DKMTCLOSEADAPTERPROC)GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTCloseAdapter");
|
{
|
||||||
|
g_fpsl.D3DKMTCloseAdapter =
|
||||||
|
(D3DKMTCLOSEADAPTERPROC)GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTCloseAdapter");
|
||||||
|
}
|
||||||
|
|
||||||
|
g_fpsl.initialized = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL fpsl_wait_for_vblank()
|
BOOL fpsl_wait_for_vblank()
|
||||||
{
|
{
|
||||||
if (g_fpsl.D3DKMTOpenAdapterFromHdc && !g_fpsl.got_adapter)
|
if (g_fpsl.initialized && g_fpsl.D3DKMTOpenAdapterFromHdc && !g_fpsl.got_adapter)
|
||||||
{
|
{
|
||||||
g_fpsl.adapter.hDc = g_ddraw->render.hdc;
|
g_fpsl.adapter.hDc = g_ddraw->render.hdc;
|
||||||
|
|
||||||
@ -75,6 +97,11 @@ BOOL fpsl_wait_for_vblank()
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL fpsl_dwm_flush()
|
||||||
|
{
|
||||||
|
return g_fpsl.initialized && fpsl_dwm_is_enabled() && g_fpsl.DwmFlush && SUCCEEDED(g_fpsl.DwmFlush());
|
||||||
|
}
|
||||||
|
|
||||||
BOOL fpsl_dwm_is_enabled()
|
BOOL fpsl_dwm_is_enabled()
|
||||||
{
|
{
|
||||||
BOOL dwm_enabled = FALSE;
|
BOOL dwm_enabled = FALSE;
|
||||||
@ -95,10 +122,7 @@ void fpsl_frame_end()
|
|||||||
{
|
{
|
||||||
if (g_ddraw->render.maxfps < 0 || g_ddraw->vsync)
|
if (g_ddraw->render.maxfps < 0 || g_ddraw->vsync)
|
||||||
{
|
{
|
||||||
if (fpsl_dwm_is_enabled() && g_fpsl.DwmFlush && SUCCEEDED(g_fpsl.DwmFlush()))
|
if (fpsl_dwm_flush() || fpsl_wait_for_vblank())
|
||||||
return;
|
|
||||||
|
|
||||||
if (fpsl_wait_for_vblank())
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user