[PATCH 1/5] wined3d: Fix swapchain draw buffer cleanup.
Henri Verbeet
hverbeet at codeweavers.com
Wed Aug 12 02:44:22 CDT 2009
Destroying the first back buffer before the other ones might cause an already
freed surface to be used as target in FindContext().
---
dlls/wined3d/swapchain.c | 29 +++++++++++++++++++----------
1 files changed, 19 insertions(+), 10 deletions(-)
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 2910ef9..d8d3733 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -45,23 +45,32 @@ static void WINAPI IWineD3DSwapChainImpl_Destroy(IWineD3DSwapChain *iface, D3DCB
IWineD3DSwapChain_SetGammaRamp(iface, 0, &This->orig_gamma);
- /* release the ref to the front and back buffer parents */
- if(This->frontBuffer) {
+ /* Release the swapchain's draw buffers. Make sure This->backBuffer[0] is
+ * the last buffer to be destroyed, FindContext() depends on that. */
+ if (This->frontBuffer)
+ {
IWineD3DSurface_SetContainer(This->frontBuffer, 0);
- if(D3DCB_DestroyRenderTarget(This->frontBuffer) > 0) {
- FIXME("(%p) Something's still holding the front buffer\n",This);
+ if (D3DCB_DestroyRenderTarget(This->frontBuffer))
+ {
+ FIXME("(%p) Something's still holding the front buffer (%p).\n",
+ This, This->frontBuffer);
}
+ This->frontBuffer = NULL;
}
- if(This->backBuffer) {
- UINT i;
- for(i = 0; i < This->presentParms.BackBufferCount; i++) {
+ if (This->backBuffer)
+ {
+ UINT i = This->presentParms.BackBufferCount;
+
+ while (i--)
+ {
IWineD3DSurface_SetContainer(This->backBuffer[i], 0);
- if(D3DCB_DestroyRenderTarget(This->backBuffer[i]) > 0) {
- FIXME("(%p) Something's still holding the back buffer\n",This);
- }
+ if (D3DCB_DestroyRenderTarget(This->backBuffer[i]))
+ FIXME("(%p) Something's still holding back buffer %u (%p).\n",
+ This, i, This->backBuffer[i]);
}
HeapFree(GetProcessHeap(), 0, This->backBuffer);
+ This->backBuffer = NULL;
}
for (i = 0; i < This->num_contexts; ++i)
--
1.6.0.6
More information about the wine-patches
mailing list