diff --git a/inc/dd.h b/inc/dd.h index 1c2dfb8..4b78f43 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -83,6 +83,7 @@ typedef struct CNCDDRAW LONG palette_updated; LONG surface_updated; + LONG clear_screen; float scale_w; float scale_h; diff --git a/src/dd.c b/src/dd.c index bf64109..7394178 100644 --- a/src/dd.c +++ b/src/dd.c @@ -763,6 +763,11 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_ddraw->render.thread == NULL) { + if (g_ddraw->maintas || g_ddraw->boxing) + { + InterlockedExchange(&g_ddraw->render.clear_screen, TRUE); + } + InterlockedExchange(&g_ddraw->render.palette_updated, TRUE); InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 85419ea..05c0290 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -416,6 +416,11 @@ DWORD WINAPI d3d9_render_main(void) } } + if (InterlockedExchange(&g_ddraw->render.clear_screen, FALSE)) + { + IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); + } + g_ddraw->child_window_exists = FALSE; EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary); diff --git a/src/render_gdi.c b/src/render_gdi.c index d036c2d..c216ccc 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -80,6 +80,12 @@ DWORD WINAPI gdi_render_main(void) memcpy(&g_ddraw->primary->bmi->bmiColors[0], g_ddraw->primary->palette->data_rgb, 256 * sizeof(int)); } + if (InterlockedExchange(&g_ddraw->render.clear_screen, FALSE)) + { + RECT rc = { 0, 0, g_ddraw->render.width, g_ddraw->render.height }; + FillRect(g_ddraw->render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); + } + if (g_ddraw->gdilinear) { SetStretchBltMode(g_ddraw->render.hdc, HALFTONE); diff --git a/src/render_ogl.c b/src/render_ogl.c index a312f08..b13f153 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -659,7 +659,7 @@ static void ogl_render() if (glGetError() != GL_NO_ERROR) g_ogl.use_opengl = FALSE; } - else if (g_ddraw->wine) + else if (g_ddraw->wine || InterlockedExchange(&g_ddraw->render.clear_screen, FALSE)) { glClear(GL_COLOR_BUFFER_BIT); } diff --git a/src/wndproc.c b/src/wndproc.c index 784ea6f..f76e913 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -27,8 +27,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam lParam); */ - RECT rc = { 0, 0, g_ddraw->render.width, g_ddraw->render.height }; - static BOOL in_size_move = FALSE; static int redraw_count = 0; @@ -749,10 +747,10 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_ERASEBKGND: { - EnterCriticalSection(&g_ddraw->cs); - FillRect(g_ddraw->render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw->cs); + if (g_ddraw->maintas || g_ddraw->boxing) + { + InterlockedExchange(&g_ddraw->render.clear_screen, TRUE); + } break; } }