From b03600fb4f79c55b460d5e5b5cd59fee68d6329d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 13 Sep 2022 07:41:01 +0200 Subject: [PATCH] #101 clear backbuffer on flip --- inc/IDirectDrawSurface.h | 1 + inc/dd.h | 1 + src/config.c | 3 +++ src/ddsurface.c | 7 +++++++ 4 files changed, 12 insertions(+) diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index 97aa39f..f5f897e 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -21,6 +21,7 @@ typedef struct IDirectDrawSurfaceImpl DWORD width; DWORD height; DWORD bpp; + DWORD size; DWORD flags; DWORD caps; diff --git a/inc/dd.h b/inc/dd.h index 45dea1c..0c6219c 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -146,6 +146,7 @@ typedef struct CNCDDRAW int fixchilds; BOOL fixwndprochook; BOOL fixnotresponding; + BOOL flipclear; BOOL locktopleft; BOOL d3d9linear; BOOL gdilinear; diff --git a/src/config.c b/src/config.c index f4af46e..76f6e44 100644 --- a/src/config.c +++ b/src/config.c @@ -39,6 +39,7 @@ void cfg_load() g_ddraw->fixpitch = cfg_get_bool("fixpitch", TRUE); g_ddraw->fixchilds = cfg_get_int("fixchilds", FIX_CHILDS_DETECT_PAINT); g_ddraw->fixwndprochook = cfg_get_bool("fixwndprochook", FALSE); + g_ddraw->flipclear = cfg_get_bool("flipclear", FALSE); g_ddraw->novidmem = cfg_get_bool("novidmem", FALSE); g_ddraw->fixnotresponding = cfg_get_bool("fixnotresponding", FALSE); g_ddraw->locktopleft = cfg_get_bool("locktopleft", FALSE); @@ -357,6 +358,7 @@ static void cfg_create_ini() "gdilinear=false\n" "allow_wmactivate=false\n" "dinputhook=false\n" + "flipclear=false\n" "bpp=0\n" "\n" "\n" @@ -491,6 +493,7 @@ static void cfg_create_ini() "[CARMA95]\n" "renderer=opengl\n" "noactivateapp=true\n" + "flipclear=true\n" "\n" "; Carmageddon\n" "[CARM95]\n" diff --git a/src/ddsurface.c b/src/ddsurface.c index 7e867eb..99eb515 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -545,6 +545,12 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa InterlockedExchangePointer(&backbuffer->surface, buf); InterlockedExchangePointer(&backbuffer->bitmap, bitmap); InterlockedExchangePointer(&backbuffer->hdc, dc); + + if (g_ddraw->flipclear) + { + memset(buf, 0, backbuffer->size); + } + LeaveCriticalSection(&g_ddraw->cs); if (!lpDDSurfaceTargetOverride && This->backbuffer->backbuffer) @@ -1092,6 +1098,7 @@ HRESULT dd_CreateSurface( CreateDIBSection(dst_surface->hdc, dst_surface->bmi, DIB_RGB_COLORS, (void**)&dst_surface->surface, NULL, 0); dst_surface->bmi->bmiHeader.biHeight = -((int)bmp_height); + dst_surface->size = dst_surface->l_pitch * bmp_height * dst_surface->lx_pitch; if (!dst_surface->bitmap) {