Commit 1860208f authored by Józef Kucia's avatar Józef Kucia Committed by Alexandre Julliard

d3d9: Do not decrease swapchain refcount when it is already 0.

parent d39630fc
...@@ -90,8 +90,15 @@ static ULONG WINAPI d3d9_swapchain_AddRef(IDirect3DSwapChain9Ex *iface) ...@@ -90,8 +90,15 @@ static ULONG WINAPI d3d9_swapchain_AddRef(IDirect3DSwapChain9Ex *iface)
static ULONG WINAPI d3d9_swapchain_Release(IDirect3DSwapChain9Ex *iface) static ULONG WINAPI d3d9_swapchain_Release(IDirect3DSwapChain9Ex *iface)
{ {
struct d3d9_swapchain *swapchain = impl_from_IDirect3DSwapChain9Ex(iface); struct d3d9_swapchain *swapchain = impl_from_IDirect3DSwapChain9Ex(iface);
ULONG refcount = InterlockedDecrement(&swapchain->refcount); ULONG refcount;
if (!swapchain->refcount)
{
WARN("Swapchain does not have any references.\n");
return 0;
}
refcount = InterlockedDecrement(&swapchain->refcount);
TRACE("%p decreasing refcount to %u.\n", iface, refcount); TRACE("%p decreasing refcount to %u.\n", iface, refcount);
if (!refcount) if (!refcount)
......
...@@ -1437,15 +1437,15 @@ static void test_refcount(void) ...@@ -1437,15 +1437,15 @@ static void test_refcount(void)
CHECK_CALL(hr, "GetSwapChain", device, ++refcount); CHECK_CALL(hr, "GetSwapChain", device, ++refcount);
if (pSwapChain) if (pSwapChain)
{ {
CHECK_REFCOUNT( pSwapChain, 1); CHECK_REFCOUNT(pSwapChain, 1);
hr = IDirect3DDevice9_GetRenderTarget(device, 0, &pRenderTarget); hr = IDirect3DDevice9_GetRenderTarget(device, 0, &pRenderTarget);
CHECK_CALL(hr, "GetRenderTarget", device, ++refcount); CHECK_CALL(hr, "GetRenderTarget", device, ++refcount);
CHECK_REFCOUNT( pSwapChain, 1); CHECK_REFCOUNT(pSwapChain, 1);
if(pRenderTarget) if (pRenderTarget)
{ {
CHECK_SURFACE_CONTAINER( pRenderTarget, IID_IDirect3DSwapChain9, pSwapChain); CHECK_SURFACE_CONTAINER(pRenderTarget, IID_IDirect3DSwapChain9, pSwapChain);
CHECK_REFCOUNT( pRenderTarget, 1); CHECK_REFCOUNT(pRenderTarget, 1);
CHECK_ADDREF_REFCOUNT(pRenderTarget, 2); CHECK_ADDREF_REFCOUNT(pRenderTarget, 2);
CHECK_REFCOUNT(device, refcount); CHECK_REFCOUNT(device, refcount);
...@@ -1454,9 +1454,9 @@ static void test_refcount(void) ...@@ -1454,9 +1454,9 @@ static void test_refcount(void)
hr = IDirect3DDevice9_GetRenderTarget(device, 0, &pRenderTarget); hr = IDirect3DDevice9_GetRenderTarget(device, 0, &pRenderTarget);
CHECK_CALL(hr, "GetRenderTarget", device, refcount); CHECK_CALL(hr, "GetRenderTarget", device, refcount);
CHECK_REFCOUNT( pRenderTarget, 2); CHECK_REFCOUNT(pRenderTarget, 2);
CHECK_RELEASE_REFCOUNT( pRenderTarget, 1); CHECK_RELEASE_REFCOUNT(pRenderTarget, 1);
CHECK_RELEASE_REFCOUNT( pRenderTarget, 0); CHECK_RELEASE_REFCOUNT(pRenderTarget, 0);
CHECK_REFCOUNT(device, --refcount); CHECK_REFCOUNT(device, --refcount);
/* The render target is released with the device, so AddRef with refcount=0 is fine here. */ /* The render target is released with the device, so AddRef with refcount=0 is fine here. */
...@@ -1484,7 +1484,7 @@ static void test_refcount(void) ...@@ -1484,7 +1484,7 @@ static void test_refcount(void)
hr = IDirect3DDevice9_GetDepthStencilSurface(device, &pStencilSurface); hr = IDirect3DDevice9_GetDepthStencilSurface(device, &pStencilSurface);
CHECK_CALL(hr, "GetDepthStencilSurface", device, ++refcount); CHECK_CALL(hr, "GetDepthStencilSurface", device, ++refcount);
CHECK_REFCOUNT( pSwapChain, 1); CHECK_REFCOUNT(pSwapChain, 1);
if (pStencilSurface) if (pStencilSurface)
{ {
CHECK_SURFACE_CONTAINER(pStencilSurface, IID_IDirect3DDevice9, device); CHECK_SURFACE_CONTAINER(pStencilSurface, IID_IDirect3DDevice9, device);
...@@ -1508,14 +1508,18 @@ static void test_refcount(void) ...@@ -1508,14 +1508,18 @@ static void test_refcount(void)
pStencilSurface = NULL; pStencilSurface = NULL;
} }
CHECK_RELEASE_REFCOUNT( pSwapChain, 0); CHECK_RELEASE_REFCOUNT(pSwapChain, 0);
CHECK_REFCOUNT(device, --refcount); CHECK_REFCOUNT(device, --refcount);
CHECK_RELEASE_REFCOUNT(pSwapChain, 0);
CHECK_RELEASE_REFCOUNT(pSwapChain, 0);
/* The implicit swapchwin is released with the device, so AddRef with refcount=0 is fine here. */ /* The implicit swapchwin is released with the device, so AddRef with refcount=0 is fine here. */
CHECK_ADDREF_REFCOUNT(pSwapChain, 1); CHECK_ADDREF_REFCOUNT(pSwapChain, 1);
CHECK_REFCOUNT(device, ++refcount); CHECK_REFCOUNT(device, ++refcount);
CHECK_RELEASE_REFCOUNT(pSwapChain, 0); CHECK_RELEASE_REFCOUNT(pSwapChain, 0);
CHECK_REFCOUNT(device, --refcount); CHECK_REFCOUNT(device, --refcount);
CHECK_RELEASE_REFCOUNT(pSwapChain, 0);
CHECK_RELEASE_REFCOUNT(pSwapChain, 0);
pSwapChain = NULL; pSwapChain = NULL;
} }
...@@ -1524,7 +1528,7 @@ static void test_refcount(void) ...@@ -1524,7 +1528,7 @@ static void test_refcount(void)
CHECK_CALL(hr, "CreateIndexBuffer", device, ++refcount ); CHECK_CALL(hr, "CreateIndexBuffer", device, ++refcount );
if(pIndexBuffer) if(pIndexBuffer)
{ {
tmp = get_refcount( (IUnknown *)pIndexBuffer ); tmp = get_refcount((IUnknown *)pIndexBuffer);
hr = IDirect3DDevice9_SetIndices(device, pIndexBuffer); hr = IDirect3DDevice9_SetIndices(device, pIndexBuffer);
CHECK_CALL( hr, "SetIndices", pIndexBuffer, tmp); CHECK_CALL( hr, "SetIndices", pIndexBuffer, tmp);
...@@ -1641,17 +1645,17 @@ static void test_refcount(void) ...@@ -1641,17 +1645,17 @@ static void test_refcount(void)
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
hr = IDirect3DDevice9_CreateAdditionalSwapChain(device, &d3dpp, &pSwapChain); hr = IDirect3DDevice9_CreateAdditionalSwapChain(device, &d3dpp, &pSwapChain);
CHECK_CALL(hr, "CreateAdditionalSwapChain", device, ++refcount); CHECK_CALL(hr, "CreateAdditionalSwapChain", device, ++refcount);
if(pSwapChain) if (pSwapChain)
{ {
/* check implicit back buffer */ /* check implicit back buffer */
hr = IDirect3DSwapChain9_GetBackBuffer(pSwapChain, 0, 0, &pBackBuffer); hr = IDirect3DSwapChain9_GetBackBuffer(pSwapChain, 0, 0, &pBackBuffer);
CHECK_CALL(hr, "GetBackBuffer", device, ++refcount); CHECK_CALL(hr, "GetBackBuffer", device, ++refcount);
CHECK_REFCOUNT( pSwapChain, 1); CHECK_REFCOUNT(pSwapChain, 1);
if(pBackBuffer) if (pBackBuffer)
{ {
CHECK_SURFACE_CONTAINER( pBackBuffer, IID_IDirect3DSwapChain9, pSwapChain); CHECK_SURFACE_CONTAINER(pBackBuffer, IID_IDirect3DSwapChain9, pSwapChain);
CHECK_REFCOUNT( pBackBuffer, 1); CHECK_REFCOUNT(pBackBuffer, 1);
CHECK_RELEASE_REFCOUNT( pBackBuffer, 0); CHECK_RELEASE_REFCOUNT(pBackBuffer, 0);
CHECK_REFCOUNT(device, --refcount); CHECK_REFCOUNT(device, --refcount);
/* The back buffer is released with the swapchain, so AddRef with refcount=0 is fine here. */ /* The back buffer is released with the swapchain, so AddRef with refcount=0 is fine here. */
...@@ -1663,7 +1667,7 @@ static void test_refcount(void) ...@@ -1663,7 +1667,7 @@ static void test_refcount(void)
CHECK_RELEASE_REFCOUNT(pBackBuffer, 0); CHECK_RELEASE_REFCOUNT(pBackBuffer, 0);
pBackBuffer = NULL; pBackBuffer = NULL;
} }
CHECK_REFCOUNT( pSwapChain, 1); CHECK_REFCOUNT(pSwapChain, 1);
} }
hr = IDirect3DDevice9_CreateQuery(device, D3DQUERYTYPE_EVENT, &pQuery); hr = IDirect3DDevice9_CreateQuery(device, D3DQUERYTYPE_EVENT, &pQuery);
CHECK_CALL(hr, "CreateQuery", device, ++refcount); CHECK_CALL(hr, "CreateQuery", device, ++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