diff --git a/src/ddsurface.c b/src/ddsurface.c index 2c14a2a..ba876c0 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -419,12 +419,12 @@ HRESULT dds_Blt( if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || This->last_flip_tick + FLIP_REDRAW_TIMEOUT < timeGetTime()) { This->last_blt_tick = timeGetTime(); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); SwitchToThread(); if (g_ddraw.ticks_limiter.tick_length > 0) @@ -651,14 +651,15 @@ HRESULT dds_BltFast( if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { - DWORD time = timeGetTime(); - InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + + DWORD time = timeGetTime(); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + if (g_config.limiter_type == LIMIT_BLTFAST && g_ddraw.ticks_limiter.tick_length > 0) { g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE; @@ -1004,7 +1005,14 @@ HRESULT dds_ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC) if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + + DWORD time = timeGetTime(); + + if (!(This->flags & DDSD_BACKBUFFERCOUNT) || + (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) + { + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + } } return DD_OK; @@ -1173,14 +1181,15 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { - DWORD time = timeGetTime(); - InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + + DWORD time = timeGetTime(); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + if (g_ddraw.ticks_limiter.tick_length > 0 && !g_ddraw.ticks_limiter.dds_unlock_limiter_disabled) util_limit_game_ticks(); }