From 442b6c3f575fb99aa797c68c863a68f28dea040d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh <cc.red.alert.1@googlemail.com> Date: Thu, 6 May 2021 00:15:47 +0200 Subject: [PATCH] some experimental code for Capitalism2/CapLab --- src/ddsurface.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 85db767..6dc684c 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -15,6 +15,15 @@ HRESULT dds_AddAttachedSurface(IDirectDrawSurfaceImpl *This, LPDIRECTDRAWSURFACE lpDDSurface) { IDirectDrawSurface_AddRef(lpDDSurface); + + if (g_ddraw->backbuffer && !This->backbuffer) + { + IDirectDrawSurfaceImpl* surface = (IDirectDrawSurfaceImpl*)lpDDSurface; + surface->caps |= DDSCAPS_BACKBUFFER; + + This->backbuffer = surface; + } + return DD_OK; } @@ -672,21 +681,21 @@ HRESULT dds_EnumAttachedSurfaces(IDirectDrawSurfaceImpl *This, LPVOID lpContext, HRESULT dds_Flip(IDirectDrawSurfaceImpl *This, LPDIRECTDRAWSURFACE surface, DWORD flags) { - if(This->caps & DDSCAPS_PRIMARYSURFACE && g_ddraw->render.run) + if (This->backbuffer) { - if (This->backbuffer) - { - EnterCriticalSection(&g_ddraw->cs); - void* surface = InterlockedExchangePointer(&This->surface, This->backbuffer->surface); - HBITMAP bitmap = (HBITMAP)InterlockedExchangePointer(&This->bitmap, This->backbuffer->bitmap); - HDC hdc = (HDC)InterlockedExchangePointer(&This->hdc, This->backbuffer->hdc); + EnterCriticalSection(&g_ddraw->cs); + void* surface = InterlockedExchangePointer(&This->surface, This->backbuffer->surface); + HBITMAP bitmap = (HBITMAP)InterlockedExchangePointer(&This->bitmap, This->backbuffer->bitmap); + HDC hdc = (HDC)InterlockedExchangePointer(&This->hdc, This->backbuffer->hdc); - InterlockedExchangePointer(&This->backbuffer->surface, surface); - InterlockedExchangePointer(&This->backbuffer->bitmap, bitmap); - InterlockedExchangePointer(&This->backbuffer->hdc, hdc); - LeaveCriticalSection(&g_ddraw->cs); - } + InterlockedExchangePointer(&This->backbuffer->surface, surface); + InterlockedExchangePointer(&This->backbuffer->bitmap, bitmap); + InterlockedExchangePointer(&This->backbuffer->hdc, hdc); + LeaveCriticalSection(&g_ddraw->cs); + } + if (This->caps & DDSCAPS_PRIMARYSURFACE && g_ddraw->render.run) + { This->last_flip_tick = timeGetTime(); InterlockedExchange(&g_ddraw->render.surface_updated, TRUE);