Commit 5dbd834c authored by Markus Amsler's avatar Markus Amsler Committed by Alexandre Julliard

d3d8: Release non implicit surfaces only if refcount is 0, with test.

parent 1adf857a
...@@ -72,12 +72,14 @@ static ULONG WINAPI IDirect3DSurface8Impl_Release(LPDIRECT3DSURFACE8 iface) { ...@@ -72,12 +72,14 @@ static ULONG WINAPI IDirect3DSurface8Impl_Release(LPDIRECT3DSURFACE8 iface) {
ULONG ref = InterlockedDecrement(&This->ref); ULONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) : ReleaseRef to %d\n", This, ref); TRACE("(%p) : ReleaseRef to %d\n", This, ref);
if (ref == 0 && This->parentDevice) IUnknown_Release(This->parentDevice); if (ref == 0) {
if (This->parentDevice) IUnknown_Release(This->parentDevice);
/* Implicit surfaces are destroyed with the device, not if refcount reaches 0. */ /* Implicit surfaces are destroyed with the device, not if refcount reaches 0. */
if (ref >= 0 && !This->isImplicit) { if (!This->isImplicit) {
IWineD3DSurface_Release(This->wineD3DSurface); IWineD3DSurface_Release(This->wineD3DSurface);
HeapFree(GetProcessHeap(), 0, This); HeapFree(GetProcessHeap(), 0, This);
} }
}
return ref; return ref;
} }
......
...@@ -476,10 +476,13 @@ static void test_refcount(void) ...@@ -476,10 +476,13 @@ static void test_refcount(void)
/* Surfaces */ /* Surfaces */
hr = IDirect3DDevice8_CreateDepthStencilSurface( pDevice, 32, 32, D3DFMT_D24S8, D3DMULTISAMPLE_NONE, &pStencilSurface ); hr = IDirect3DDevice8_CreateDepthStencilSurface( pDevice, 32, 32, D3DFMT_D24S8, D3DMULTISAMPLE_NONE, &pStencilSurface );
CHECK_CALL( hr, "CreateDepthStencilSurface", pDevice, ++refcount ); CHECK_CALL( hr, "CreateDepthStencilSurface", pDevice, ++refcount );
CHECK_REFCOUNT( pStencilSurface, 1);
hr = IDirect3DDevice8_CreateImageSurface( pDevice, 32, 32, D3DFMT_X8R8G8B8, &pImageSurface ); hr = IDirect3DDevice8_CreateImageSurface( pDevice, 32, 32, D3DFMT_X8R8G8B8, &pImageSurface );
CHECK_CALL( hr, "CreateImageSurface", pDevice, ++refcount ); CHECK_CALL( hr, "CreateImageSurface", pDevice, ++refcount );
CHECK_REFCOUNT( pImageSurface, 1);
hr = IDirect3DDevice8_CreateRenderTarget( pDevice, 32, 32, D3DFMT_X8R8G8B8, D3DMULTISAMPLE_NONE, TRUE, &pRenderTarget3 ); hr = IDirect3DDevice8_CreateRenderTarget( pDevice, 32, 32, D3DFMT_X8R8G8B8, D3DMULTISAMPLE_NONE, TRUE, &pRenderTarget3 );
CHECK_CALL( hr, "CreateRenderTarget", pDevice, ++refcount ); CHECK_CALL( hr, "CreateRenderTarget", pDevice, ++refcount );
CHECK_REFCOUNT( pRenderTarget3, 1);
/* Misc */ /* Misc */
hr = IDirect3DDevice8_CreateStateBlock( pDevice, D3DSBT_ALL, &dStateBlock ); hr = IDirect3DDevice8_CreateStateBlock( pDevice, D3DSBT_ALL, &dStateBlock );
CHECK_CALL( hr, "CreateStateBlock", pDevice, refcount ); CHECK_CALL( hr, "CreateStateBlock", pDevice, refcount );
......
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