diff --git a/dlls/d3d8/cubetexture.c b/dlls/d3d8/cubetexture.c index d3ec98c1330..24417df6cf3 100644 --- a/dlls/d3d8/cubetexture.c +++ b/dlls/d3d8/cubetexture.c @@ -64,12 +64,16 @@ static ULONG WINAPI IDirect3DCubeTexture8Impl_Release(LPDIRECT3DCUBETEXTURE8 ifa TRACE("(%p) : ReleaseRef to %d\n", This, ref); if (ref == 0) { + IDirect3DDevice8 *parentDevice = This->parentDevice; + TRACE("Releasing child %p\n", This->wineD3DCubeTexture); - IUnknown_Release(This->parentDevice); wined3d_mutex_lock(); IWineD3DCubeTexture_Release(This->wineD3DCubeTexture); wined3d_mutex_unlock(); + + /* Release the device last, as it may cause the device to be destroyed. */ + IDirect3DDevice8_Release(parentDevice); } return ref; } diff --git a/dlls/d3d8/indexbuffer.c b/dlls/d3d8/indexbuffer.c index 49391222663..bb62c39a376 100644 --- a/dlls/d3d8/indexbuffer.c +++ b/dlls/d3d8/indexbuffer.c @@ -64,10 +64,14 @@ static ULONG WINAPI IDirect3DIndexBuffer8Impl_Release(LPDIRECT3DINDEXBUFFER8 ifa TRACE("(%p) : ReleaseRef to %d\n", This, ref); if (ref == 0) { - IDirect3DDevice8_Release(This->parentDevice); + IDirect3DDevice8 *parentDevice = This->parentDevice; + wined3d_mutex_lock(); IWineD3DBuffer_Release(This->wineD3DIndexBuffer); wined3d_mutex_unlock(); + + /* Release the device last, as it may cause the device to be destroyed. */ + IDirect3DDevice8_Release(parentDevice); } return ref; } diff --git a/dlls/d3d8/surface.c b/dlls/d3d8/surface.c index 2d00fce822c..8923dd8b7ef 100644 --- a/dlls/d3d8/surface.c +++ b/dlls/d3d8/surface.c @@ -79,11 +79,14 @@ static ULONG WINAPI IDirect3DSurface8Impl_Release(LPDIRECT3DSURFACE8 iface) { TRACE("(%p) : ReleaseRef to %d\n", This, ref); if (ref == 0) { - if (This->parentDevice) IUnknown_Release(This->parentDevice); + IDirect3DDevice8 *parentDevice = This->parentDevice; + /* Implicit surfaces are destroyed with the device, not if refcount reaches 0. */ wined3d_mutex_lock(); IWineD3DSurface_Release(This->wineD3DSurface); wined3d_mutex_unlock(); + + if (parentDevice) IDirect3DDevice8_Release(parentDevice); } return ref; diff --git a/dlls/d3d8/texture.c b/dlls/d3d8/texture.c index e377fffec69..000b07858dd 100644 --- a/dlls/d3d8/texture.c +++ b/dlls/d3d8/texture.c @@ -65,10 +65,14 @@ static ULONG WINAPI IDirect3DTexture8Impl_Release(LPDIRECT3DTEXTURE8 iface) { TRACE("(%p) : ReleaseRef to %d\n", This, ref); if (ref == 0) { - IDirect3DDevice8_Release(This->parentDevice); + IDirect3DDevice8 *parentDevice = This->parentDevice; + wined3d_mutex_lock(); IWineD3DTexture_Release(This->wineD3DTexture); wined3d_mutex_unlock(); + + /* Release the device last, as it may cause the device to be destroyed. */ + IDirect3DDevice8_Release(parentDevice); } return ref; } diff --git a/dlls/d3d8/vertexbuffer.c b/dlls/d3d8/vertexbuffer.c index 99e8304ecd2..a798afd829b 100644 --- a/dlls/d3d8/vertexbuffer.c +++ b/dlls/d3d8/vertexbuffer.c @@ -65,10 +65,14 @@ static ULONG WINAPI IDirect3DVertexBuffer8Impl_Release(LPDIRECT3DVERTEXBUFFER8 i TRACE("(%p) : ReleaseRef to %d\n", This, ref); if (ref == 0) { - IDirect3DDevice8_Release(This->parentDevice); + IDirect3DDevice8 *parentDevice = This->parentDevice; + wined3d_mutex_lock(); IWineD3DBuffer_Release(This->wineD3DVertexBuffer); wined3d_mutex_unlock(); + + /* Release the device last, as it may cause the device to be destroyed. */ + IDirect3DDevice8_Release(parentDevice); } return ref; diff --git a/dlls/d3d8/volumetexture.c b/dlls/d3d8/volumetexture.c index 46c1ec5af83..d31c1561e0d 100644 --- a/dlls/d3d8/volumetexture.c +++ b/dlls/d3d8/volumetexture.c @@ -65,10 +65,14 @@ static ULONG WINAPI IDirect3DVolumeTexture8Impl_Release(LPDIRECT3DVOLUMETEXTURE8 TRACE("(%p) : ReleaseRef to %d\n", This, ref); if (ref == 0) { - IUnknown_Release(This->parentDevice); + IDirect3DDevice8 *parentDevice = This->parentDevice; + wined3d_mutex_lock(); IWineD3DVolumeTexture_Release(This->wineD3DVolumeTexture); wined3d_mutex_unlock(); + + /* Release the device last, as it may cause the device to be destroyed. */ + IDirect3DDevice8_Release(parentDevice); } return ref; }