d3d8: Handle volume refcount forwarding in d3d8.
This commit is contained in:
parent
0d725490d6
commit
0a3f417359
|
@ -196,6 +196,9 @@ struct IDirect3DVolume8Impl
|
|||
|
||||
/* IDirect3DVolume8 fields */
|
||||
IWineD3DVolume *wineD3DVolume;
|
||||
|
||||
/* If set forward refcounting to this object */
|
||||
IUnknown *forwardReference;
|
||||
};
|
||||
|
||||
/* ------------------- */
|
||||
|
@ -598,4 +601,6 @@ extern ULONG WINAPI D3D8CB_DestroyDepthStencilSurface (IWineD3DSurface *pSurface
|
|||
|
||||
extern ULONG WINAPI D3D8CB_DestroySurface(IWineD3DSurface *pSurface);
|
||||
|
||||
extern ULONG WINAPI D3D8CB_DestroyVolume(IWineD3DVolume *pVolume);
|
||||
|
||||
#endif /* __WINE_D3DX8_PRIVATE_H */
|
||||
|
|
|
@ -41,15 +41,13 @@ static HRESULT WINAPI IDirect3DVolume8Impl_QueryInterface(LPDIRECT3DVOLUME8 ifac
|
|||
|
||||
static ULONG WINAPI IDirect3DVolume8Impl_AddRef(LPDIRECT3DVOLUME8 iface) {
|
||||
IDirect3DVolume8Impl *This = (IDirect3DVolume8Impl *)iface;
|
||||
IUnknown *containerParent = NULL;
|
||||
|
||||
TRACE("(%p)\n", This);
|
||||
|
||||
IWineD3DVolume_GetContainerParent(This->wineD3DVolume, &containerParent);
|
||||
if (containerParent) {
|
||||
if (This->forwardReference) {
|
||||
/* Forward to the containerParent */
|
||||
TRACE("(%p) : Forwarding to %p\n", This, containerParent);
|
||||
return IUnknown_AddRef(containerParent);
|
||||
TRACE("(%p) : Forwarding to %p\n", This, This->forwardReference);
|
||||
return IUnknown_AddRef(This->forwardReference);
|
||||
} else {
|
||||
/* No container, handle our own refcounting */
|
||||
ULONG ref = InterlockedIncrement(&This->ref);
|
||||
|
@ -60,15 +58,13 @@ static ULONG WINAPI IDirect3DVolume8Impl_AddRef(LPDIRECT3DVOLUME8 iface) {
|
|||
|
||||
static ULONG WINAPI IDirect3DVolume8Impl_Release(LPDIRECT3DVOLUME8 iface) {
|
||||
IDirect3DVolume8Impl *This = (IDirect3DVolume8Impl *)iface;
|
||||
IUnknown *containerParent = NULL;
|
||||
|
||||
TRACE("(%p)\n", This);
|
||||
|
||||
IWineD3DVolume_GetContainerParent(This->wineD3DVolume, &containerParent);
|
||||
if (containerParent) {
|
||||
if (This->forwardReference) {
|
||||
/* Forward to the containerParent */
|
||||
TRACE("(%p) : Forwarding to %p\n", This, containerParent);
|
||||
return IUnknown_Release(containerParent);
|
||||
TRACE("(%p) : Forwarding to %p\n", This, This->forwardReference);
|
||||
return IUnknown_Release(This->forwardReference);
|
||||
}
|
||||
else {
|
||||
/* No container, handle our own refcounting */
|
||||
|
@ -227,7 +223,18 @@ HRESULT WINAPI D3D8CB_CreateVolume(IUnknown *pDevice, IUnknown *pSuperior, UINT
|
|||
*ppVolume = NULL;
|
||||
} else {
|
||||
*ppVolume = (IWineD3DVolume *)object->wineD3DVolume;
|
||||
object->forwardReference = pSuperior;
|
||||
}
|
||||
TRACE("(%p) Created volume %p\n", This, *ppVolume);
|
||||
return hrc;
|
||||
}
|
||||
|
||||
ULONG WINAPI D3D8CB_DestroyVolume(IWineD3DVolume *pVolume) {
|
||||
IDirect3DVolume8Impl* volumeParent;
|
||||
|
||||
IWineD3DVolume_GetParent(pVolume, (IUnknown **) &volumeParent);
|
||||
/* GetParent's AddRef was forwarded to an object in destruction.
|
||||
* Releasing it here again would cause an endless recursion. */
|
||||
volumeParent->forwardReference = NULL;
|
||||
return IDirect3DVolume8_Release((IDirect3DVolume8*) volumeParent);
|
||||
}
|
||||
|
|
|
@ -57,7 +57,7 @@ static ULONG WINAPI IDirect3DVolumeTexture8Impl_Release(LPDIRECT3DVOLUMETEXTURE8
|
|||
TRACE("(%p) : ReleaseRef to %d\n", This, ref);
|
||||
|
||||
if (ref == 0) {
|
||||
IWineD3DVolumeTexture_Release(This->wineD3DVolumeTexture);
|
||||
IWineD3DVolumeTexture_Destroy(This->wineD3DVolumeTexture, D3D8CB_DestroyVolume);
|
||||
IUnknown_Release(This->parentDevice);
|
||||
HeapFree(GetProcessHeap(), 0, This);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue