[5/10] WineD3D: Restore the display mode when releasing a swapchain

Stefan Dösinger stefan at codeweavers.com
Thu Feb 15 06:53:33 CST 2007


-------------- next part --------------
From 48a46729a0ff09f3618ef1457fb76a9b7068cfd1 Mon Sep 17 00:00:00 2001
From: Stefan Doesinger <stefan at codeweavers.com>
Date: Sat, 10 Feb 2007 18:11:34 +0100
Subject: [PATCH] WineD3D: Restore the display mode when releasing a swapchain

If the swapchain was fullscreened, the display mode has to be restored. This code sets it to the values
stored at creation time. In case of d3d8 and d3d9 this will be the desktop resolution, in case of ddraw a
NOP because ddraw apps have to set the display mode before creating the render targets, and orig_width,
orig_height will be the same as the values in the requested presentation parameters(inserted by ddraw.dll)
---
 dlls/wined3d/device.c          |    1 +
 dlls/wined3d/swapchain.c       |   13 +++++++++++++
 dlls/wined3d/wined3d_private.h |    1 +
 3 files changed, 15 insertions(+), 0 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index a80c3e7..4bfc07d 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1288,6 +1288,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevic
 
     object->orig_width = GetSystemMetrics(SM_CXSCREEN);
     object->orig_height = GetSystemMetrics(SM_CYSCREEN);
+    object->orig_fmt = pixelformat_for_depth(GetDeviceCaps(hDc, BITSPIXEL) * GetDeviceCaps(hDc, PLANES));
 
     /** MSDN: If Windowed is TRUE and either of the BackBufferWidth/Height values is zero,
      *  then the corresponding dimension of the client area of the hDeviceWindow
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 52271df..e99e096 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -104,6 +104,7 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_GetParent(IWineD3DSwapChain *iface,
 /*IWineD3DSwapChain parts follow: */
 static void WINAPI IWineD3DSwapChainImpl_Destroy(IWineD3DSwapChain *iface, D3DCB_DESTROYSURFACEFN D3DCB_DestroyRenderTarget) {
     IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface;
+    WINED3DDISPLAYMODE mode;
 
     /* release the ref to the front and back buffer parents */
     if(This->frontBuffer) {
@@ -123,6 +124,18 @@ static void WINAPI IWineD3DSwapChainImpl_Destroy(IWineD3DSwapChain *iface, D3DCB
         }
     }
 
+    /* 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 == FALSE) {
+        mode.Width = This->orig_width;
+        mode.Height = This->orig_height;
+        mode.RefreshRate = 0;
+        mode.Format = This->orig_fmt;
+        IWineD3DDevice_SetDisplayMode((IWineD3DDevice *) This->wineD3DDevice, 0, &mode);
+    }
     DestroyContext(This->wineD3DDevice, This->context);
 
     HeapFree(GetProcessHeap(), 0, This);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index c20532e..3a2ee8a 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1318,6 +1318,7 @@ typedef struct IWineD3DSwapChainImpl
     BOOL                      wantsDepthStencilBuffer;
     D3DPRESENT_PARAMETERS     presentParms;
     DWORD                     orig_width, orig_height;
+    WINED3DFORMAT             orig_fmt;
 
     long prev_time, frames;   /* Performance tracking */
 
-- 
1.4.4.3



More information about the wine-patches mailing list