diff --git a/dlls/ddraw/direct3d.c b/dlls/ddraw/direct3d.c index 4a359383636..8de0c1c05e8 100644 --- a/dlls/ddraw/direct3d.c +++ b/dlls/ddraw/direct3d.c @@ -737,6 +737,8 @@ IDirect3DImpl_7_CreateDevice(IDirect3D7 *iface, IParentImpl *IndexBufferParent; HRESULT hr; IDirectDrawSurfaceImpl *target = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, Surface); + IDirectDrawSurface7 *depthbuffer = NULL; + static DDSCAPS2 depthcaps = { DDSCAPS_ZBUFFER, 0, 0, 0 }; TRACE("(%p)->(%s,%p,%p)\n", iface, debugstr_guid(refiid), Surface, Device); *Device = NULL; @@ -872,6 +874,19 @@ IDirect3DImpl_7_CreateDevice(IDirect3D7 *iface, This->d3ddevice = object; + /* Look for a depth buffer and enable the Z test if one is found */ + hr = IDirectDrawSurface7_GetAttachedSurface(Surface, + &depthcaps, + &depthbuffer); + if(depthbuffer) + { + TRACE("(%p) Depth buffer found, enabling Z test\n", object); + IWineD3DDevice_SetRenderState(This->wineD3DDevice, + WINED3DRS_ZENABLE, + TRUE); + IDirectDrawSurface7_Release(depthbuffer); + } + return D3D_OK; } diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index d7940bd6c1f..ab7eda6152d 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -309,6 +309,7 @@ IDirectDrawSurfaceImpl_Release(IDirectDrawSurface7 *iface) /* Unset any index buffer, just to be sure */ IWineD3DDevice_SetIndices(ddraw->wineD3DDevice, NULL, 0); + IWineD3DDevice_SetDepthStencilSurface(ddraw->wineD3DDevice, NULL); if(IWineD3DDevice_Uninit3D(ddraw->wineD3DDevice) != D3D_OK) { @@ -779,6 +780,14 @@ IDirectDrawSurfaceImpl_AddAttachedSurface(IDirectDrawSurface7 *iface, Surf->first_attached = This->first_attached; This->next_attached = Surf; + /* Check if we attach a back buffer to the primary */ + if(Surf->surface_desc.ddsCaps.dwCaps & DDSCAPS_ZBUFFER && + This->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) + { + IWineD3DDevice_SetDepthStencilSurface(This->ddraw->wineD3DDevice, + Surf->WineD3DSurface); + } + /* MSDN: * "This method increments the reference count of the surface being attached." */ @@ -838,6 +847,14 @@ IDirectDrawSurfaceImpl_DeleteAttachedSurface(IDirectDrawSurface7 *iface, Surf->next_attached = NULL; Surf->first_attached = Surf; + /* Check if we attach a back buffer to the primary */ + if(Surf->surface_desc.ddsCaps.dwCaps & DDSCAPS_ZBUFFER && + This->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) + { + IWineD3DDevice_SetDepthStencilSurface(This->ddraw->wineD3DDevice, + NULL); + } + IDirectDrawSurface7_Release(Attach); return DD_OK; }