[09/10] wined3d: Don't try to clear the depth stencil if there is none

H. Verbeet hverbeet at gmail.com
Mon Apr 16 14:21:06 CDT 2007


The Clear call in Present currently fails if there is no depth
stencil, like in the d3d9 visual tests.

Changelog:
  - Don't try to clear the depth stencil if there is none
-------------- next part --------------
---

 dlls/wined3d/swapchain.c |   12 +++++++++---
 1 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index e32423a..18d9b3d 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 ||


More information about the wine-patches mailing list