Commit c722f2d3 authored by Henri Verbeet's avatar Henri Verbeet Committed by Alexandre Julliard

ddraw: Merge ddraw_surface_destroy() into ddraw_surface_cleanup().

parent af8228f0
...@@ -444,37 +444,6 @@ static ULONG WINAPI d3d_texture1_AddRef(IDirect3DTexture *iface) ...@@ -444,37 +444,6 @@ static ULONG WINAPI d3d_texture1_AddRef(IDirect3DTexture *iface)
return IUnknown_AddRef(surface->texture_outer); return IUnknown_AddRef(surface->texture_outer);
} }
/*****************************************************************************
* ddraw_surface_destroy
*
* A helper function for IDirectDrawSurface7::Release
*
* Frees the surface, regardless of its refcount.
* See IDirectDrawSurface7::Release for more information
*
* Params:
* This: Surface to free
*
*****************************************************************************/
static void ddraw_surface_destroy(struct ddraw_surface *This)
{
TRACE("surface %p.\n", This);
/* Check the iface count and give a warning */
if(This->iface_count > 1)
{
/* This can happen when a complex surface is destroyed,
* because the 2nd surface was addref()ed when the app
* called GetAttachedSurface
*/
WARN("(%p): Destroying surface with refcounts 7: %d 4: %d 3: %d 2: %d 1: %d\n",
This, This->ref7, This->ref4, This->ref3, This->ref2, This->ref1);
}
if (This->wined3d_surface)
wined3d_surface_decref(This->wined3d_surface);
}
static void ddraw_surface_cleanup(struct ddraw_surface *surface) static void ddraw_surface_cleanup(struct ddraw_surface *surface)
{ {
struct ddraw_surface *surf; struct ddraw_surface *surf;
...@@ -498,20 +467,24 @@ static void ddraw_surface_cleanup(struct ddraw_surface *surface) ...@@ -498,20 +467,24 @@ static void ddraw_surface_cleanup(struct ddraw_surface *surface)
surf = surface->complex_array[i]; surf = surface->complex_array[i];
surface->complex_array[i] = NULL; surface->complex_array[i] = NULL;
while (surf) ddraw_surface_cleanup(surf);
{
struct ddraw_surface *destroy = surf;
surf = surf->complex_array[0]; /* Iterate through the "tree" */
ddraw_surface_destroy(destroy); /* Destroy it */
}
} }
if (surface->device1) if (surface->device1)
IUnknown_Release(&surface->device1->IUnknown_inner); IUnknown_Release(&surface->device1->IUnknown_inner);
ifaceToRelease = surface->ifaceToRelease; ifaceToRelease = surface->ifaceToRelease;
/* Destroy the root surface. */ if (surface->iface_count > 1)
ddraw_surface_destroy(surface); {
/* This can happen when a complex surface is destroyed, because the
* 2nd surface was addref()ed when the app called
* GetAttachedSurface(). */
WARN("Destroying surface %p with refcounts 7: %u 4: %u 3: %u 2: %u 1: %u.\n",
surface, surface->ref7, surface->ref4, surface->ref3, surface->ref2, surface->ref1);
}
if (surface->wined3d_surface)
wined3d_surface_decref(surface->wined3d_surface);
/* Reduce the ddraw refcount */ /* Reduce the ddraw refcount */
if (ifaceToRelease) if (ifaceToRelease)
......
...@@ -1958,7 +1958,7 @@ static void CubeMapTest(void) ...@@ -1958,7 +1958,7 @@ static void CubeMapTest(void)
IDirectDrawSurface7_Release(cubemap); IDirectDrawSurface7_Release(cubemap);
ref = getRefcount((IUnknown *) palette); ref = getRefcount((IUnknown *) palette);
todo_wine ok(ref == 1, "Refcount is %u, expected 1\n", ref); ok(ref == 1, "Refcount is %u, expected 1\n", ref);
IDirectDrawPalette_Release(palette); IDirectDrawPalette_Release(palette);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment