d3d8: Don't release the parent device before destroying its children.
This commit is contained in:
parent
5d56eddb7c
commit
6792bb8843
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue