From 8d6b2f3bfe3907042453ec9efafb426fda336ac2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Sep 2022 13:46:45 +0200 Subject: [PATCH] add option to lock surfaces --- inc/IDirectDrawSurface.h | 1 + inc/dd.h | 1 + src/IDirectDraw/IDirectDrawSurface.c | 2 ++ src/config.c | 3 +++ src/ddsurface.c | 8 ++++++++ src/render_d3d9.c | 6 ++++++ src/render_gdi.c | 6 ++++++ src/render_ogl.c | 6 ++++++ 8 files changed, 33 insertions(+) diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index 579b7d6..5cef293 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -25,6 +25,7 @@ typedef struct IDirectDrawSurfaceImpl DWORD flags; DWORD caps; DWORD backbuffer_count; + CRITICAL_SECTION cs; IDirectDrawPaletteImpl* palette; diff --git a/inc/dd.h b/inc/dd.h index a72aea0..b04fac0 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -147,6 +147,7 @@ typedef struct CNCDDRAW BOOL fixnotresponding; BOOL flipclear; BOOL locktopleft; + BOOL lock_surfaces; BOOL d3d9linear; BOOL gdilinear; int resolutions; diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index c1b2197..30f6f6a 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -110,6 +110,8 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) IDirectDrawPalette_Release(This->palette); } + DeleteCriticalSection(&This->cs); + HeapFree(GetProcessHeap(), 0, This); } diff --git a/src/config.c b/src/config.c index f82ae33..a6352ec 100644 --- a/src/config.c +++ b/src/config.c @@ -42,6 +42,7 @@ void cfg_load() g_ddraw->novidmem = cfg_get_bool("novidmem", FALSE); g_ddraw->fixnotresponding = cfg_get_bool("fixnotresponding", FALSE); g_ddraw->locktopleft = cfg_get_bool("locktopleft", FALSE); + g_ddraw->lock_surfaces = cfg_get_bool("lock_surfaces", FALSE); g_ddraw->releasealt = cfg_get_bool("releasealt", FALSE); g_ddraw->d3d9linear = cfg_get_bool("d3d9linear", TRUE); g_ddraw->gdilinear = cfg_get_bool("gdilinear", FALSE); @@ -353,6 +354,7 @@ static void cfg_create_ini() "novidmem=false\n" "fixnotresponding=false\n" "locktopleft=false\n" + "lock_surfaces=false\n" "releasealt=false\n" "gdilinear=false\n" "allow_wmactivate=false\n" @@ -954,6 +956,7 @@ static void cfg_create_ini() "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" + "lock_surfaces=true\n" "singlecpu=false\n" "fixwndprochook=true\n" "\n" diff --git a/src/ddsurface.c b/src/ddsurface.c index 32f6718..a3a4514 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -728,6 +728,9 @@ HRESULT dds_Lock( DWORD dwFlags, HANDLE hEvent) { + if (g_ddraw->lock_surfaces) + EnterCriticalSection(&This->cs); + dbg_dump_dds_lock_flags(dwFlags); if (g_ddraw && g_ddraw->fixnotresponding) @@ -942,6 +945,9 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) } } + if (g_ddraw->lock_surfaces) + LeaveCriticalSection(&This->cs); + return DD_OK; } @@ -995,6 +1001,8 @@ HRESULT dd_CreateSurface( lpDDSurfaceDesc->dwFlags |= DDSD_CAPS; + InitializeCriticalSection(&dst_surface->cs); + dst_surface->bpp = g_ddraw->bpp == 0 ? 16 : g_ddraw->bpp; dst_surface->flags = lpDDSurfaceDesc->dwFlags; dst_surface->caps = lpDDSurfaceDesc->ddsCaps.dwCaps; diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 16ceae4..2b19f7e 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -374,6 +374,9 @@ DWORD WINAPI d3d9_render_main(void) g_ddraw->primary->height == g_ddraw->height && (g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette)) { + if (g_ddraw->lock_surfaces) + EnterCriticalSection(&g_ddraw->primary->cs); + if (g_ddraw->vhack) { if (util_detect_low_res_screen()) @@ -455,6 +458,9 @@ DWORD WINAPI d3d9_render_main(void) } } } + + if (g_ddraw->lock_surfaces) + LeaveCriticalSection(&g_ddraw->primary->cs); } LeaveCriticalSection(&g_ddraw->cs); diff --git a/src/render_gdi.c b/src/render_gdi.c index ce1fc92..e4d0127 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -53,6 +53,9 @@ DWORD WINAPI gdi_render_main(void) g_ddraw->primary->height == g_ddraw->height && (g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette)) { + if (g_ddraw->lock_surfaces) + EnterCriticalSection(&g_ddraw->primary->cs); + if (warning_end_tick) { if (timeGetTime() < warning_end_tick) @@ -153,6 +156,9 @@ DWORD WINAPI gdi_render_main(void) g_ddraw->primary->bmi, DIB_RGB_COLORS); } + + if (g_ddraw->lock_surfaces) + LeaveCriticalSection(&g_ddraw->primary->cs); } LeaveCriticalSection(&g_ddraw->cs); diff --git a/src/render_ogl.c b/src/render_ogl.c index 2b7948e..d217e58 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -600,6 +600,9 @@ static void ogl_render() g_ddraw->primary->height == g_ddraw->height && (g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette)) { + if (g_ddraw->lock_surfaces) + EnterCriticalSection(&g_ddraw->primary->cs); + if (g_ddraw->vhack) { if (util_detect_low_res_screen()) @@ -703,6 +706,9 @@ static void ogl_render() } } } + + if (g_ddraw->lock_surfaces) + LeaveCriticalSection(&g_ddraw->primary->cs); } LeaveCriticalSection(&g_ddraw->cs);