Module: wine Branch: master Commit: 03b388609d0f9aef1eb657ed6b8320682204b39b URL: http://source.winehq.org/git/wine.git/?a=commit;h=03b388609d0f9aef1eb657ed6b...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Wed Apr 20 22:09:27 2011 +0200
ddraw: Destroy the ddraw surface after the wined3d texture is destroyed.
---
dlls/ddraw/surface.c | 34 ++++++++++++++++++++++++++-------- 1 files changed, 26 insertions(+), 8 deletions(-)
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index 16b831a..84082c5 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -180,10 +180,13 @@ static ULONG WINAPI ddraw_surface7_AddRef(IDirectDrawSurface7 *iface)
TRACE("%p increasing refcount to %u.\n", This, refCount);
- if (refCount == 1 && This->WineD3DSurface) + if (refCount == 1) { EnterCriticalSection(&ddraw_cs); - IWineD3DSurface_AddRef(This->WineD3DSurface); + if (This->WineD3DSurface) + IWineD3DSurface_AddRef(This->WineD3DSurface); + if (This->wined3d_texture) + wined3d_texture_incref(This->wined3d_texture); LeaveCriticalSection(&ddraw_cs); }
@@ -256,9 +259,7 @@ static void ddraw_surface_cleanup(IDirectDrawSurfaceImpl *surface)
TRACE("surface %p.\n", surface);
- if (surface->wined3d_texture) /* If it's a texture, destroy the wined3d texture. */ - wined3d_texture_decref(surface->wined3d_texture); - else if (surface->wined3d_swapchain) + if (surface->wined3d_swapchain) { IDirectDrawImpl *ddraw = surface->ddraw;
@@ -388,7 +389,10 @@ static ULONG WINAPI ddraw_surface7_Release(IDirectDrawSurface7 *iface) LeaveCriticalSection(&ddraw_cs); return ref; } - ddraw_surface_cleanup(This); + if (This->wined3d_texture) /* If it's a texture, destroy the wined3d texture. */ + wined3d_texture_decref(This->wined3d_texture); + else + ddraw_surface_cleanup(This); LeaveCriticalSection(&ddraw_cs); }
@@ -3491,6 +3495,20 @@ const struct wined3d_parent_ops ddraw_surface_wined3d_parent_ops = ddraw_surface_wined3d_object_destroyed, };
+static void STDMETHODCALLTYPE ddraw_texture_wined3d_object_destroyed(void *parent) +{ + IDirectDrawSurfaceImpl *surface = parent; + + TRACE("surface %p.\n", surface); + + ddraw_surface_cleanup(surface); +} + +static const struct wined3d_parent_ops ddraw_texture_wined3d_parent_ops = +{ + ddraw_texture_wined3d_object_destroyed, +}; + HRESULT ddraw_surface_create_texture(IDirectDrawSurfaceImpl *surface) { const DDSURFACEDESC2 *desc = &surface->surface_desc; @@ -3513,10 +3531,10 @@ HRESULT ddraw_surface_create_texture(IDirectDrawSurfaceImpl *surface) format = PixelFormat_DD2WineD3D(&surface->surface_desc.u4.ddpfPixelFormat); if (desc->ddsCaps.dwCaps2 & DDSCAPS2_CUBEMAP) return IWineD3DDevice_CreateCubeTexture(surface->ddraw->wineD3DDevice, desc->dwWidth, - levels, 0, format, pool, surface, &ddraw_null_wined3d_parent_ops, &surface->wined3d_texture); + levels, 0, format, pool, surface, &ddraw_texture_wined3d_parent_ops, &surface->wined3d_texture); else return IWineD3DDevice_CreateTexture(surface->ddraw->wineD3DDevice, desc->dwWidth, desc->dwHeight, - levels, 0, format, pool, surface, &ddraw_null_wined3d_parent_ops, &surface->wined3d_texture); + levels, 0, format, pool, surface, &ddraw_texture_wined3d_parent_ops, &surface->wined3d_texture); }
HRESULT ddraw_surface_init(IDirectDrawSurfaceImpl *surface, IDirectDrawImpl *ddraw,