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();
         }