From ec0dbeca6bac5252a717a811c46c049f98290cfe Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 26 Jul 2024 08:29:43 +0200 Subject: [PATCH] add workaround for flickering (black frames) during zoom --- inc/dd.h | 1 + src/ddsurface.c | 3 +++ src/dllmain.c | 1 + src/render_d3d9.c | 3 +++ src/render_ogl.c | 3 +++ 5 files changed, 11 insertions(+) diff --git a/inc/dd.h b/inc/dd.h index bce317a..31708ff 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -168,6 +168,7 @@ typedef struct CNCDDRAW struct { + LONG frame_skip; BOOL enabled; } zoom; } CNCDDRAW; diff --git a/src/ddsurface.c b/src/ddsurface.c index 2f6a873..83e05b6 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -418,6 +418,9 @@ HRESULT dds_Blt( if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { + if (!(dwFlags & DDBLT_COLORFILL)) + InterlockedExchange(&g_ddraw.zoom.frame_skip, 0); + InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || This->last_flip_tick + FLIP_REDRAW_TIMEOUT < timeGetTime()) diff --git a/src/dllmain.c b/src/dllmain.c index b75c335..3dee497 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -152,6 +152,7 @@ void DDEnableZoom() TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); g_ddraw.zoom.enabled = TRUE; + InterlockedExchange(&g_ddraw.zoom.frame_skip, 20); } BOOL DDIsWindowed() diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 9109f96..876618d 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -552,6 +552,9 @@ DWORD WINAPI d3d9_render_main(void) (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED) && g_ddraw.render.run) { + if (InterlockedDecrement(&g_ddraw.zoom.frame_skip) > 0) + continue; + #if _DEBUG dbg_draw_frame_info_start(); #endif diff --git a/src/render_ogl.c b/src/render_ogl.c index d1c7df2..fa4c9d1 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -887,6 +887,9 @@ static void ogl_render() (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED) && g_ddraw.render.run) { + if (InterlockedDecrement(&g_ddraw.zoom.frame_skip) > 0) + continue; + #if _DEBUG dbg_draw_frame_info_start(); #endif