1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-15 22:14:49 +01:00

add workaround for flickering (black frames) during zoom

This commit is contained in:
FunkyFr3sh 2024-07-26 08:29:43 +02:00
parent 918037dd3e
commit ec0dbeca6b
5 changed files with 11 additions and 0 deletions

@ -168,6 +168,7 @@ typedef struct CNCDDRAW
struct
{
LONG frame_skip;
BOOL enabled;
} zoom;
} CNCDDRAW;

@ -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())

@ -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()

@ -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

@ -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