From e49c480820f0611ddcc3e1e52dcadc80fcf6cbe6 Mon Sep 17 00:00:00 2001 From: "H. Verbeet" Date: Mon, 16 Apr 2007 21:21:06 +0200 Subject: [PATCH] wined3d: Don't try to clear the depth stencil if there is none. --- dlls/wined3d/swapchain.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index e32423a0eb8..18d9b3d0e81 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -147,6 +147,7 @@ static void WINAPI IWineD3DSwapChainImpl_Destroy(IWineD3DSwapChain *iface, D3DCB static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion, DWORD dwFlags) { IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface; + DWORD clear_flags = 0; ENTER_GL(); @@ -293,18 +294,23 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO #endif LEAVE_GL(); + + if (This->wineD3DDevice->stencilBufferTarget) { + clear_flags |= WINED3DCLEAR_STENCIL|WINED3DCLEAR_ZBUFFER; + } + /* Although this is not strictly required, a simple demo showed this does occur on (at least non-debug) d3d */ if (This->presentParms.SwapEffect == WINED3DSWAPEFFECT_DISCARD) { TRACE("Clearing\n"); - IWineD3DDevice_Clear((IWineD3DDevice*)This->wineD3DDevice, 0, NULL, WINED3DCLEAR_STENCIL|WINED3DCLEAR_ZBUFFER|WINED3DCLEAR_TARGET, 0x00, 1.0, 0); + IWineD3DDevice_Clear((IWineD3DDevice*)This->wineD3DDevice, 0, NULL, clear_flags|WINED3DCLEAR_TARGET, 0x00, 1.0, 0); - } else { + } else if (clear_flags) { TRACE("Clearing z/stencil buffer\n"); - IWineD3DDevice_Clear((IWineD3DDevice*)This->wineD3DDevice, 0, NULL, WINED3DCLEAR_STENCIL|WINED3DCLEAR_ZBUFFER, 0x00, 1.0, 0); + IWineD3DDevice_Clear((IWineD3DDevice*)This->wineD3DDevice, 0, NULL, clear_flags, 0x00, 1.0, 0); } if(((IWineD3DSurfaceImpl *) This->frontBuffer)->Flags & SFLAG_INSYSMEM ||