DDraw: Pass the fullscreen flag to wined3d

Stefan Dösinger stefandoesinger at gmx.at
Sat Sep 9 06:33:17 CDT 2006


DDraw apps can change between fullscreen and windows mode after creating an 
ddraw object by setting DDSCL_FULLSCREEN or DDSCL_NORMAL with 
IDirectDraw7::SetCooperativeLevel. WineD3D needs this flag because some DDraw 
behaviour is different in windowed mode. The flag is not stored in the 
swapchain, like the d3d8 / d3d9 fullscreen flag, because for 2D apps no 
swapchain is created, and d3d8 windowed mode works differently than ddraw 
windowed mode.

This patch(and the following patches) will apply with some offsets because of 
the critical section patches in my tree. This patches do not depend on them.
-------------- next part --------------
From fc5f1bdd23d3172a24b91f3bf20b1b637695dc63 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Stefan_D=F6singer?= <stefan at codeweavers.com>
Date: Sat, 9 Sep 2006 10:28:16 +0200
Subject: [PATCH] DDraw: Pass the fullscreen flag to wined3d
---
 dlls/ddraw/ddraw.c               |    5 +++++
 dlls/wined3d/device.c            |   13 +++++++++++++
 dlls/wined3d/wined3d_private.h   |    1 +
 include/wine/wined3d_interface.h |    2 ++
 4 files changed, 21 insertions(+), 0 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 0094b2a..0890ffc 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -581,6 +581,9 @@ IDirectDrawImpl_SetCooperativeLevel(IDir
         {
             IWineD3DDevice_SetHWND(This->wineD3DDevice, hwnd);
         }
+
+        IWineD3DDevice_SetFullscreen(This->wineD3DDevice,
+                                     FALSE);
     }
     else if(cooplevel & DDSCL_FULLSCREEN)
     {
@@ -603,6 +606,8 @@ IDirectDrawImpl_SetCooperativeLevel(IDir
         if(This->cooperative_level & DDSCL_NORMAL)
         {
             This->cooperative_level &= ~DDSCL_NORMAL;
+            IWineD3DDevice_SetFullscreen(This->wineD3DDevice,
+                                         TRUE);
         }
 
         /* Don't override focus windows or private device windows */
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 5a07adf..34026db 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -2175,6 +2175,18 @@ static HRESULT WINAPI IWineD3DDeviceImpl
     return WINED3D_OK;
 }
 
+static void WINAPI IWineD3DDeviceImpl_SetFullscreen(IWineD3DDevice *iface, BOOL fullscreen) {
+    IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
+    TRACE("(%p) Setting DDraw fullscreen mode to %s\n", This, fullscreen ? "true" : "false");
+
+    /* DirectDraw apps can change between fullscreen and windowed mode after device creation with
+     * IDirectDraw7::SetCooperativeLevel. The GDI surface implementation needs to know this.
+     * DDraw doesn't necessarilly have a swapchain, so we have to store the fullscreen flag
+     * seperately.
+     */
+    This->ddraw_fullscreen = fullscreen;
+}
+
 static HRESULT WINAPI IWineD3DDeviceImpl_EnumDisplayModes(IWineD3DDevice *iface, DWORD Flags, UINT Width, UINT Height, WINED3DFORMAT pixelformat, LPVOID context, D3DCB_ENUMDISPLAYMODESCALLBACK callback) {
     IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
 
@@ -7965,6 +7977,7 @@ const IWineD3DDeviceVtbl IWineD3DDevice_
     /*** Odd functions **/
     IWineD3DDeviceImpl_Init3D,
     IWineD3DDeviceImpl_Uninit3D,
+    IWineD3DDeviceImpl_SetFullscreen,
     IWineD3DDeviceImpl_EnumDisplayModes,
     IWineD3DDeviceImpl_EvictManagedResources,
     IWineD3DDeviceImpl_GetAvailableTextureMem,
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index f103705..9b36a70 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -576,6 +576,7 @@ #define                         NEEDS_DI
     IWineD3DSurface *ddraw_primary;
     DWORD ddraw_width, ddraw_height;
     WINED3DFORMAT ddraw_format;
+    BOOL ddraw_fullscreen;
 
     /* List of GLSL shader programs and their associated vertex & pixel shaders */
     struct list glsl_shader_progs;
diff --git a/include/wine/wined3d_interface.h b/include/wine/wined3d_interface.h
index 01cc8ef..e76bc55 100644
--- a/include/wine/wined3d_interface.h
+++ b/include/wine/wined3d_interface.h
@@ -381,6 +381,7 @@ DECLARE_INTERFACE_(IWineD3DDevice,IWineD
     STDMETHOD_(HRESULT,CreatePalette)(THIS_ DWORD Flags, PALETTEENTRY *PalEnt, struct IWineD3DPalette **Palette, IUnknown *Parent);
     STDMETHOD(Init3D)(THIS_ WINED3DPRESENT_PARAMETERS* pPresentationParameters, D3DCB_CREATEADDITIONALSWAPCHAIN D3DCB_CreateAdditionalSwapChain);
     STDMETHOD(Uninit3D)(THIS);
+    STDMETHOD_(void, SetFullscreen)(THIS_ BOOL fullscreen);
     STDMETHOD(EnumDisplayModes)(THIS_ DWORD Flags, UINT Width, UINT Height, WINED3DFORMAT Format, void *context, D3DCB_ENUMDISPLAYMODESCALLBACK cb) PURE;
     STDMETHOD(EvictManagedResources)(THIS) PURE;
     STDMETHOD_(UINT, GetAvailableTextureMem)(THIS) PURE;
@@ -521,6 +522,7 @@ #define IWineD3DDevice_CreatePixelShader
 #define IWineD3DDevice_CreatePalette(p, a, b, c, d)             (p)->lpVtbl->CreatePalette(p, a, b, c, d)
 #define IWineD3DDevice_Init3D(p, a, b)                          (p)->lpVtbl->Init3D(p, a, b)
 #define IWineD3DDevice_Uninit3D(p)                              (p)->lpVtbl->Uninit3D(p)
+#define IWineD3DDevice_SetFullscreen(p, a)                      (p)->lpVtbl->SetFullscreen(p, a)
 #define IWineD3DDevice_EnumDisplayModes(p,a,b,c,d,e,f)          (p)->lpVtbl->EnumDisplayModes(p,a,b,c,d,e,f)
 #define IWineD3DDevice_EvictManagedResources(p)                 (p)->lpVtbl->EvictManagedResources(p)
 #define IWineD3DDevice_GetAvailableTextureMem(p)                (p)->lpVtbl->GetAvailableTextureMem(p)
-- 
1.4.1.1



More information about the wine-patches mailing list