1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-25 01:57:47 +01:00

add debug code for possible DwmFlush failure

This commit is contained in:
FunkyFr3sh 2024-02-25 23:46:32 +01:00
parent bc1bf81e15
commit 5b3a7b4994
3 changed files with 37 additions and 14 deletions

View File

@ -48,12 +48,14 @@ typedef struct FPSLIMITER
D3DKMTCLOSEADAPTERPROC D3DKMTCloseAdapter; D3DKMTCLOSEADAPTERPROC D3DKMTCloseAdapter;
BOOL got_adapter; BOOL got_adapter;
BOOL initialized; BOOL initialized;
CRITICAL_SECTION cs;
BOOL cs_initialized;
} FPSLIMITER; } FPSLIMITER;
extern FPSLIMITER g_fpsl; extern FPSLIMITER g_fpsl;
void fpsl_init(); void fpsl_init();
BOOL fpsl_wait_for_vblank(BOOL open_adapter); BOOL fpsl_wait_for_vblank();
BOOL fpsl_dwm_flush(); BOOL fpsl_dwm_flush();
BOOL fpsl_dwm_is_enabled(); BOOL fpsl_dwm_is_enabled();
void fpsl_frame_start(); void fpsl_frame_start();

View File

@ -1224,11 +1224,7 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent)
{ {
if (g_config.maxgameticks == -2) if (g_config.maxgameticks == -2)
{ {
BOOL open = if (fpsl_dwm_flush() || fpsl_wait_for_vblank())
!(g_config.maxfps < 0 ||
(g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)));
if (fpsl_dwm_flush() || fpsl_wait_for_vblank(open))
return DD_OK; return DD_OK;
} }

View File

@ -35,6 +35,12 @@ void fpsl_init()
g_fpsl.D3DKMTCloseAdapter(&g_fpsl.close_adapter); g_fpsl.D3DKMTCloseAdapter(&g_fpsl.close_adapter);
} }
if (!g_fpsl.cs_initialized)
{
g_fpsl.cs_initialized = TRUE;
InitializeCriticalSection(&g_fpsl.cs);
}
if (!g_fpsl.gdi32_dll) if (!g_fpsl.gdi32_dll)
{ {
g_fpsl.gdi32_dll = real_LoadLibraryA("gdi32.dll"); g_fpsl.gdi32_dll = real_LoadLibraryA("gdi32.dll");
@ -78,19 +84,26 @@ void fpsl_init()
g_fpsl.initialized = TRUE; g_fpsl.initialized = TRUE;
} }
BOOL fpsl_wait_for_vblank(BOOL open_adapter) BOOL fpsl_wait_for_vblank()
{ {
if (g_fpsl.initialized) if (g_fpsl.initialized)
{ {
if (open_adapter && g_fpsl.D3DKMTOpenAdapterFromHdc && !g_fpsl.got_adapter) if (!g_fpsl.got_adapter && g_fpsl.D3DKMTOpenAdapterFromHdc && g_ddraw->render.hdc)
{ {
g_fpsl.adapter.hDc = g_ddraw->render.hdc; EnterCriticalSection(&g_fpsl.cs);
if (g_fpsl.D3DKMTOpenAdapterFromHdc(&g_fpsl.adapter) == 0) if (!g_fpsl.got_adapter)
{ {
g_fpsl.vblank_event.hAdapter = g_fpsl.adapter.hAdapter; g_fpsl.adapter.hDc = g_ddraw->render.hdc;
g_fpsl.got_adapter = TRUE;
if (g_fpsl.D3DKMTOpenAdapterFromHdc(&g_fpsl.adapter) == 0)
{
g_fpsl.vblank_event.hAdapter = g_fpsl.adapter.hAdapter;
g_fpsl.got_adapter = TRUE;
}
} }
LeaveCriticalSection(&g_fpsl.cs);
} }
if (g_fpsl.got_adapter && g_fpsl.D3DKMTWaitForVerticalBlankEvent) if (g_fpsl.got_adapter && g_fpsl.D3DKMTWaitForVerticalBlankEvent)
@ -104,7 +117,19 @@ BOOL fpsl_wait_for_vblank(BOOL open_adapter)
BOOL fpsl_dwm_flush() BOOL fpsl_dwm_flush()
{ {
return g_fpsl.initialized && fpsl_dwm_is_enabled() && g_fpsl.DwmFlush && SUCCEEDED(g_fpsl.DwmFlush()); if (g_fpsl.initialized && fpsl_dwm_is_enabled() && g_fpsl.DwmFlush)
{
HRESULT x = g_fpsl.DwmFlush();
if (!SUCCEEDED(x))
{
//TRACE(" ERROR %s(result=%08X)\n", __FUNCTION__, x);
}
return SUCCEEDED(x);
}
return FALSE;
} }
BOOL fpsl_dwm_is_enabled() BOOL fpsl_dwm_is_enabled()
@ -128,7 +153,7 @@ void fpsl_frame_end()
if (g_config.maxfps < 0 || if (g_config.maxfps < 0 ||
(g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency))) (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)))
{ {
if (fpsl_dwm_flush() || fpsl_wait_for_vblank(TRUE)) if (fpsl_dwm_flush() || fpsl_wait_for_vblank())
return; return;
} }