Stefan Dösinger : wined3d: Use the adapter to read the display mode.

Alexandre Julliard julliard at winehq.org
Tue Dec 11 11:37:21 CST 2007


Module: wine
Branch: master
Commit: 7f10ee453a88bd77ad754be9bbed679200facfb9
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7f10ee453a88bd77ad754be9bbed679200facfb9

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Thu Dec  6 23:43:25 2007 +0100

wined3d: Use the adapter to read the display mode.

---

 dlls/wined3d/device.c          |   27 ++++++++++-----------------
 dlls/wined3d/directx.c         |   13 +++++++------
 dlls/wined3d/swapchain.c       |   26 +++++---------------------
 dlls/wined3d/wined3d_private.h |    1 +
 4 files changed, 23 insertions(+), 44 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 2a80636..798f310 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1402,6 +1402,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevic
     HRESULT                 hr = WINED3D_OK;
     IUnknown               *bufferParent;
     BOOL                    displaymode_set = FALSE;
+    WINED3DDISPLAYMODE      Mode;
+    const StaticPixelFormatDesc *formatDesc;
 
     TRACE("(%p) : Created Aditional Swap Chain\n", This);
 
@@ -1439,10 +1441,12 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevic
         return WINED3DERR_NOTAVAILABLE;
     }
 
-    object->orig_width = GetSystemMetrics(SM_CXSCREEN);
-    object->orig_height = GetSystemMetrics(SM_CYSCREEN);
-    object->orig_fmt = pixelformat_for_depth(GetDeviceCaps(hDc, BITSPIXEL) * GetDeviceCaps(hDc, PLANES));
-    ReleaseDC(object->win_handle, hDc);
+    /* Get info on the current display setup */
+    IWineD3D_GetAdapterDisplayMode(This->wineD3D, This->adapter->num, &Mode);
+    object->orig_width = Mode.Width;
+    object->orig_height = Mode.Height;
+    object->orig_fmt = Mode.Format;
+    formatDesc  = getFormatDescEntry(Mode.Format, NULL, NULL);
 
     /** 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
@@ -1507,14 +1511,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevic
    if (!pPresentationParameters->Windowed) {
 
         DEVMODEW devmode;
-        HDC      hdc;
         int      bpp = 0;
         RECT     clip_rc;
 
-        /* Get info on the current display setup */
-        hdc = GetDC(0);
-        bpp = GetDeviceCaps(hdc, BITSPIXEL);
-        ReleaseDC(0, hdc);
+        bpp = formatDesc->bpp * 8;
 
         /* Change the display settings */
         memset(&devmode, 0, sizeof(devmode));
@@ -1641,23 +1641,16 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateAdditionalSwapChain(IWineD3DDevic
 error:
     if (displaymode_set) {
         DEVMODEW devmode;
-        HDC      hdc;
-        int      bpp = 0;
         RECT     clip_rc;
 
         SetRect(&clip_rc, 0, 0, object->orig_width, object->orig_height);
         ClipCursor(NULL);
 
-        /* Get info on the current display setup */
-        hdc = GetDC(0);
-        bpp = GetDeviceCaps(hdc, BITSPIXEL);
-        ReleaseDC(0, hdc);
-
         /* Change the display settings */
         memset(&devmode, 0, sizeof(devmode));
         devmode.dmSize       = sizeof(devmode);
         devmode.dmFields     = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
-        devmode.dmBitsPerPel = (bpp >= 24) ? 32 : bpp; /* Stupid XVidMode cannot change bpp */
+        devmode.dmBitsPerPel = (formatDesc->bpp >= 3) ? 32 : formatDesc->bpp * 8; /* Stupid XVidMode cannot change bpp */
         devmode.dmPelsWidth  = object->orig_width;
         devmode.dmPelsHeight = object->orig_height;
         ChangeDisplaySettingsExW(This->adapter->DeviceName, &devmode, NULL, CDS_FULLSCREEN, NULL);
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 43d2a79..71525a0 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -2698,7 +2698,7 @@ static HRESULT  WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter,
 
     IWineD3DDeviceImpl *object  = NULL;
     IWineD3DImpl       *This    = (IWineD3DImpl *)iface;
-    HDC hDC;
+    WINED3DDISPLAYMODE  mode;
     int i;
 
     /* Validate the adapter number. If no adapters are available(no GL), ignore the adapter
@@ -2762,11 +2762,11 @@ static HRESULT  WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter,
     object->state = WINED3D_OK;
 
     /* Get the initial screen setup for ddraw */
-    object->ddraw_width = GetSystemMetrics(SM_CXSCREEN);
-    object->ddraw_height = GetSystemMetrics(SM_CYSCREEN);
-    hDC = GetDC(0);
-    object->ddraw_format = pixelformat_for_depth(GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES));
-    ReleaseDC(0, hDC);
+    IWineD3DImpl_GetAdapterDisplayMode(iface, Adapter, &mode);
+
+    object->ddraw_width = mode.Width;
+    object->ddraw_height = mode.Height;
+    object->ddraw_format = mode.Format;
 
     for(i = 0; i < PATCHMAP_SIZE; i++) {
         list_init(&object->patches[i]);
@@ -2933,6 +2933,7 @@ BOOL InitAdapters(void) {
         HDC hdc;
 
         TRACE("Initializing default adapter\n");
+        Adapters[0].num = 0;
         Adapters[0].monitorPoint.x = -1;
         Adapters[0].monitorPoint.y = -1;
 
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index d27e707..28fd54b 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -464,30 +464,14 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_GetRasterStatus(IWineD3DSwapChain *i
 
 static HRESULT WINAPI IWineD3DSwapChainImpl_GetDisplayMode(IWineD3DSwapChain *iface, WINED3DDISPLAYMODE*pMode) {
     IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface;
-    HDC                 hdc;
-    int                 bpp = 0;
-
-    pMode->Width        = GetSystemMetrics(SM_CXSCREEN);
-    pMode->Height       = GetSystemMetrics(SM_CYSCREEN);
-    pMode->RefreshRate  = 85; /* FIXME: How to identify? */
-
-    hdc = GetDC(0);
-    bpp = GetDeviceCaps(hdc, BITSPIXEL);
-    ReleaseDC(0, hdc);
-
-    switch (bpp) {
-    case  8: pMode->Format       = WINED3DFMT_R8G8B8; break;
-    case 16: pMode->Format       = WINED3DFMT_R5G6B5; break;
-    case 24: /*pMode->Format       = WINED3DFMT_R8G8B8; break; */ /* 32bpp and 24bpp can be aliased for X */
-    case 32: pMode->Format       = WINED3DFMT_A8R8G8B8; break;
-    default:
-       FIXME("Unrecognized display mode format\n");
-       pMode->Format       = WINED3DFMT_UNKNOWN;
-    }
+    HRESULT hr;
+
+    TRACE("(%p)->(%p): Calling GetAdapterDisplayMode\n", This, pMode);
+    hr = IWineD3D_GetAdapterDisplayMode(This->wineD3DDevice->wineD3D, This->wineD3DDevice->adapter->num, pMode);
 
     TRACE("(%p) : returning w(%d) h(%d) rr(%d) fmt(%u,%s)\n", This, pMode->Width, pMode->Height, pMode->RefreshRate,
     pMode->Format, debug_d3dformat(pMode->Format));
-    return WINED3D_OK;
+    return hr;
 }
 
 static HRESULT WINAPI IWineD3DSwapChainImpl_GetDevice(IWineD3DSwapChain *iface, IWineD3DDevice**ppDevice) {
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 6806bfe..6207162 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -574,6 +574,7 @@ typedef struct WineD3D_PixelFormat
 typedef struct GLPixelFormatDesc GLPixelFormatDesc;
 struct WineD3DAdapter
 {
+    UINT                    num;
     POINT                   monitorPoint;
     WineD3D_GL_Info         gl_info;
     const char              *driver;




More information about the wine-cvs mailing list