Henri Verbeet : wined3d: Merge the IWineD3DSwapChain::Destroy() implementations.
Alexandre Julliard
julliard at winehq.org
Fri Apr 8 10:51:00 CDT 2011
Module: wine
Branch: master
Commit: d19c3588bc3c6fa8a6cf4fa42efeb5a3746b4ee6
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d19c3588bc3c6fa8a6cf4fa42efeb5a3746b4ee6
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Thu Apr 7 18:46:00 2011 +0200
wined3d: Merge the IWineD3DSwapChain::Destroy() implementations.
They're mostly the same, except for the GL version also destroying its
contexts, and being a bit more careful about the order in which backbuffers
are destroyed.
---
dlls/wined3d/swapchain.c | 175 ++++++++++++++++-----------------------------
1 files changed, 62 insertions(+), 113 deletions(-)
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index ddd946d..4ab2209 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -25,6 +25,65 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
WINE_DECLARE_DEBUG_CHANNEL(fps);
+/* Do not call while under the GL lock. */
+static void WINAPI IWineD3DBaseSwapChainImpl_Destroy(IWineD3DSwapChain *iface)
+{
+ IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)iface;
+ WINED3DDISPLAYMODE mode;
+ UINT i;
+
+ TRACE("Destroying swapchain %p.\n", iface);
+
+ IWineD3DSwapChain_SetGammaRamp(iface, 0, &swapchain->orig_gamma);
+
+ /* Release the swapchain's draw buffers. Make sure swapchain->back_buffers[0]
+ * is the last buffer to be destroyed, FindContext() depends on that. */
+ if (swapchain->front_buffer)
+ {
+ surface_set_container(swapchain->front_buffer, WINED3D_CONTAINER_NONE, NULL);
+ if (IWineD3DSurface_Release((IWineD3DSurface *)swapchain->front_buffer))
+ WARN("Something's still holding the front buffer (%p).\n", swapchain->front_buffer);
+ swapchain->front_buffer = NULL;
+ }
+
+ if (swapchain->back_buffers)
+ {
+ i = swapchain->presentParms.BackBufferCount;
+
+ while (i--)
+ {
+ surface_set_container(swapchain->back_buffers[i], WINED3D_CONTAINER_NONE, NULL);
+ if (IWineD3DSurface_Release((IWineD3DSurface *)swapchain->back_buffers[i]))
+ WARN("Something's still holding back buffer %u (%p).\n", i, swapchain->back_buffers[i]);
+ }
+ HeapFree(GetProcessHeap(), 0, swapchain->back_buffers);
+ swapchain->back_buffers = NULL;
+ }
+
+ for (i = 0; i < swapchain->num_contexts; ++i)
+ {
+ context_destroy(swapchain->device, swapchain->context[i]);
+ }
+
+ /* Restore the screen resolution if we rendered in fullscreen.
+ * This will restore the screen resolution to what it was before creating
+ * the swapchain. In case of d3d8 and d3d9 this will be the original
+ * desktop resolution. In case of d3d7 this will be a NOP because ddraw
+ * sets the resolution before starting up Direct3D, thus orig_width and
+ * orig_height will be equal to the modes in the presentation params. */
+ if (!swapchain->presentParms.Windowed && swapchain->presentParms.AutoRestoreDisplayMode)
+ {
+ mode.Width = swapchain->orig_width;
+ mode.Height = swapchain->orig_height;
+ mode.RefreshRate = 0;
+ mode.Format = swapchain->orig_fmt;
+ IWineD3DDevice_SetDisplayMode((IWineD3DDevice *)swapchain->device, 0, &mode);
+ }
+
+ HeapFree(GetProcessHeap(), 0, swapchain->context);
+ HeapFree(GetProcessHeap(), 0, swapchain);
+}
+
static HRESULT WINAPI IWineD3DBaseSwapChainImpl_QueryInterface(IWineD3DSwapChain *iface, REFIID riid, void **object)
{
TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
@@ -63,7 +122,7 @@ static ULONG WINAPI IWineD3DBaseSwapChainImpl_Release(IWineD3DSwapChain *iface)
TRACE("%p decreasing refcount to %u.\n", swapchain, refcount);
if (!refcount)
- IWineD3DSwapChain_Destroy(iface);
+ IWineD3DBaseSwapChainImpl_Destroy(iface);
return refcount;
}
@@ -213,67 +272,6 @@ static HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetGammaRamp(IWineD3DSwapChain *
return WINED3D_OK;
}
-/* Do not call while under the GL lock. */
-static void WINAPI IWineD3DSwapChainImpl_Destroy(IWineD3DSwapChain *iface)
-{
- IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface;
- WINED3DDISPLAYMODE mode;
- unsigned int i;
-
- TRACE("Destroying swapchain %p\n", iface);
-
- IWineD3DSwapChain_SetGammaRamp(iface, 0, &This->orig_gamma);
-
- /* Release the swapchain's draw buffers. Make sure This->back_buffers[0] is
- * the last buffer to be destroyed, FindContext() depends on that. */
- if (This->front_buffer)
- {
- surface_set_container(This->front_buffer, WINED3D_CONTAINER_NONE, NULL);
- if (IWineD3DSurface_Release((IWineD3DSurface *)This->front_buffer))
- {
- WARN("(%p) Something's still holding the front buffer (%p).\n",
- This, This->front_buffer);
- }
- This->front_buffer = NULL;
- }
-
- if (This->back_buffers)
- {
- UINT i = This->presentParms.BackBufferCount;
-
- while (i--)
- {
- surface_set_container(This->back_buffers[i], WINED3D_CONTAINER_NONE, NULL);
- if (IWineD3DSurface_Release((IWineD3DSurface *)This->back_buffers[i]))
- WARN("(%p) Something's still holding back buffer %u (%p).\n",
- This, i, This->back_buffers[i]);
- }
- HeapFree(GetProcessHeap(), 0, This->back_buffers);
- This->back_buffers = NULL;
- }
-
- for (i = 0; i < This->num_contexts; ++i)
- {
- context_destroy(This->device, This->context[i]);
- }
- /* Restore the screen resolution if we rendered in fullscreen
- * This will restore the screen resolution to what it was before creating the swapchain. In case of d3d8 and d3d9
- * this will be the original desktop resolution. In case of d3d7 this will be a NOP because ddraw sets the resolution
- * before starting up Direct3D, thus orig_width and orig_height will be equal to the modes in the presentation params
- */
- if (!This->presentParms.Windowed && This->presentParms.AutoRestoreDisplayMode)
- {
- mode.Width = This->orig_width;
- mode.Height = This->orig_height;
- mode.RefreshRate = 0;
- mode.Format = This->orig_fmt;
- IWineD3DDevice_SetDisplayMode((IWineD3DDevice *)This->device, 0, &mode);
- }
-
- HeapFree(GetProcessHeap(), 0, This->context);
- HeapFree(GetProcessHeap(), 0, This);
-}
-
/* A GL context is provided by the caller */
static void swapchain_blit(IWineD3DSwapChainImpl *This, struct wined3d_context *context,
const RECT *src_rect, const RECT *dst_rect)
@@ -658,7 +656,7 @@ static const IWineD3DSwapChainVtbl IWineD3DSwapChain_Vtbl =
IWineD3DBaseSwapChainImpl_Release,
/* IWineD3DSwapChain */
IWineD3DBaseSwapChainImpl_GetParent,
- IWineD3DSwapChainImpl_Destroy,
+ IWineD3DBaseSwapChainImpl_Destroy,
IWineD3DBaseSwapChainImpl_GetDevice,
IWineD3DSwapChainImpl_Present,
IWineD3DSwapChainImpl_SetDestWindowOverride,
@@ -671,55 +669,6 @@ static const IWineD3DSwapChainVtbl IWineD3DSwapChain_Vtbl =
IWineD3DBaseSwapChainImpl_GetGammaRamp
};
-static void WINAPI IWineGDISwapChainImpl_Destroy(IWineD3DSwapChain *iface)
-{
- IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)iface;
- WINED3DDISPLAYMODE mode;
-
- TRACE("Destroying swapchain %p.\n", iface);
-
- IWineD3DSwapChain_SetGammaRamp(iface, 0, &swapchain->orig_gamma);
-
- /* release the ref to the front and back buffer parents */
- if (swapchain->front_buffer)
- {
- surface_set_container(swapchain->front_buffer, WINED3D_CONTAINER_NONE, NULL);
- if (IWineD3DSurface_Release((IWineD3DSurface *)swapchain->front_buffer))
- WARN("Something's still holding the front buffer.\n");
- }
-
- if (swapchain->back_buffers)
- {
- UINT i;
-
- for (i = 0; i < swapchain->presentParms.BackBufferCount; ++i)
- {
- surface_set_container(swapchain->back_buffers[i], WINED3D_CONTAINER_NONE, NULL);
- if (IWineD3DSurface_Release((IWineD3DSurface *)swapchain->back_buffers[i]))
- WARN("Something's still holding the back buffer.\n");
- }
- HeapFree(GetProcessHeap(), 0, swapchain->back_buffers);
- }
-
- /* Restore the screen resolution if we rendered in fullscreen.
- * This will restore the screen resolution to what it was before creating
- * the swapchain. In case of d3d8 and d3d9 this will be the original
- * desktop resolution. In case of d3d7 this will be a NOP because ddraw
- * sets the resolution before starting up Direct3D, thus orig_width and
- * orig_height will be equal to the modes in the presentation params. */
- if (!swapchain->presentParms.Windowed && swapchain->presentParms.AutoRestoreDisplayMode)
- {
- mode.Width = swapchain->orig_width;
- mode.Height = swapchain->orig_height;
- mode.RefreshRate = 0;
- mode.Format = swapchain->orig_fmt;
- IWineD3DDevice_SetDisplayMode((IWineD3DDevice *)swapchain->device, 0, &mode);
- }
-
- HeapFree(GetProcessHeap(), 0, swapchain->context);
- HeapFree(GetProcessHeap(), 0, swapchain);
-}
-
/* Helper function that blits the front buffer contents to the target window. */
void x11_copy_to_screen(IWineD3DSwapChainImpl *swapchain, const RECT *rect)
{
@@ -896,7 +845,7 @@ static const IWineD3DSwapChainVtbl IWineGDISwapChain_Vtbl =
IWineD3DBaseSwapChainImpl_Release,
/* IWineD3DSwapChain */
IWineD3DBaseSwapChainImpl_GetParent,
- IWineGDISwapChainImpl_Destroy,
+ IWineD3DBaseSwapChainImpl_Destroy,
IWineD3DBaseSwapChainImpl_GetDevice,
IWineGDISwapChainImpl_Present,
IWineGDISwapChainImpl_SetDestWindowOverride,
More information about the wine-cvs
mailing list