Stefan Dösinger : d3d: Enumerate palettized formats for ddraw.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Apr 16 07:08:41 CDT 2007


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

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Fri Apr 13 16:38:10 2007 +0200

d3d: Enumerate palettized formats for ddraw.

---

 dlls/d3d9/directx.c    |   10 +++++-
 dlls/ddraw/ddraw.c     |   83 +++++++++++++++++++++++++++++++++---------------
 dlls/wined3d/directx.c |   11 ++++++
 3 files changed, 76 insertions(+), 28 deletions(-)

diff --git a/dlls/d3d9/directx.c b/dlls/d3d9/directx.c
index f15aa4d..ec4f7aa 100644
--- a/dlls/d3d9/directx.c
+++ b/dlls/d3d9/directx.c
@@ -98,14 +98,20 @@ static HRESULT WINAPI IDirect3D9Impl_GetAdapterIdentifier(LPDIRECT3D9 iface, UIN
 
 static UINT WINAPI IDirect3D9Impl_GetAdapterModeCount(LPDIRECT3D9 iface, UINT Adapter, D3DFORMAT Format) {
     IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
+
+    /* Others than that not supported by d3d9, but reported by wined3d for ddraw. Filter them out */
+    if(Format != D3DFMT_X8R8G8B8 && Format != D3DFMT_R5G6B5 && Format != D3DFMT_UNKNOWN) {
+        return 0;
+    }
+
     return IWineD3D_GetAdapterModeCount(This->WineD3D, Adapter, Format);
 }
 
 static HRESULT WINAPI IDirect3D9Impl_EnumAdapterModes(LPDIRECT3D9 iface, UINT Adapter, D3DFORMAT Format, UINT Mode, D3DDISPLAYMODE* pMode) {
     IDirect3D9Impl *This = (IDirect3D9Impl *)iface;
-    /* We can't pass this to WineD3D, otherwise it'll think it came from D3D8.
+    /* We can't pass this to WineD3D, otherwise it'll think it came from D3D8 or DDraw.
        It's supposed to fail anyway, so no harm returning failure. */
-    if(Format == D3DFMT_UNKNOWN)
+    if(Format != WINED3DFMT_X8R8G8B8 && Format != WINED3DFMT_R5G6B5)
         return D3DERR_INVALIDCALL;
     return IWineD3D_EnumAdapterModes(This->WineD3D, Adapter, Format, Mode, (WINED3DDISPLAYMODE *) pMode);
 }
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index ac95ddf..4255adb 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -1166,11 +1166,31 @@ IDirectDrawImpl_EnumDisplayModes(IDirectDraw7 *iface,
                                  LPDDENUMMODESCALLBACK2 cb)
 {
     ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw7, iface);
-    unsigned int modenum = 0;
+    unsigned int modenum, fmt;
     WINED3DFORMAT pixelformat = WINED3DFMT_UNKNOWN;
     WINED3DDISPLAYMODE mode;
     DDSURFACEDESC2 callback_sd;
 
+    WINED3DFORMAT checkFormatList[] =
+    {
+        WINED3DFMT_R8G8B8,
+        WINED3DFMT_A8R8G8B8,
+        WINED3DFMT_X8R8G8B8,
+        WINED3DFMT_R5G6B5,
+        WINED3DFMT_X1R5G5B5,
+        WINED3DFMT_A1R5G5B5,
+        WINED3DFMT_A4R4G4B4,
+        WINED3DFMT_R3G3B2,
+        WINED3DFMT_A8R3G3B2,
+        WINED3DFMT_X4R4G4B4,
+        WINED3DFMT_A2B10G10R10,
+        WINED3DFMT_A8B8G8R8,
+        WINED3DFMT_X8B8G8R8,
+        WINED3DFMT_A2R10G10B10,
+        WINED3DFMT_A8P8,
+        WINED3DFMT_P8
+    };
+
     TRACE("(%p)->(%p,%p,%p): Relay\n", This, DDSD, Context, cb);
 
     /* This looks sane */
@@ -1182,41 +1202,52 @@ IDirectDrawImpl_EnumDisplayModes(IDirectDraw7 *iface,
             pixelformat = PixelFormat_DD2WineD3D(&DDSD->u4.ddpfPixelFormat);
     }
 
-    while(IWineD3D_EnumAdapterModes(This->wineD3D,
-                                    WINED3DADAPTER_DEFAULT,
-                                    pixelformat,
-                                    modenum++,
-                                    &mode) == WINED3D_OK) {
-        if(DDSD)
+    for(fmt = 0; fmt < (sizeof(checkFormatList) / sizeof(checkFormatList[0])); fmt++)
+    {
+        if(pixelformat != WINED3DFMT_UNKNOWN && checkFormatList[fmt] != pixelformat)
         {
-            if(DDSD->dwFlags & DDSD_WIDTH && mode.Width != DDSD->dwWidth) continue;
-            if(DDSD->dwFlags & DDSD_HEIGHT && mode.Height != DDSD->dwHeight) continue;
+            continue;
         }
 
-        memset(&callback_sd, 0, sizeof(callback_sd));
-        callback_sd.dwSize = sizeof(callback_sd);
-        callback_sd.u4.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
-
-        callback_sd.dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT|DDSD_PITCH;
-        if(Flags & DDEDM_REFRESHRATES)
+        modenum = 0;
+        while(IWineD3D_EnumAdapterModes(This->wineD3D,
+                                        WINED3DADAPTER_DEFAULT,
+                                        checkFormatList[fmt],
+                                        modenum++,
+                                        &mode) == WINED3D_OK)
         {
-            callback_sd.dwFlags |= DDSD_REFRESHRATE;
-            callback_sd.u2.dwRefreshRate = mode.RefreshRate;
-        }
+            if(DDSD)
+            {
+                if(DDSD->dwFlags & DDSD_WIDTH && mode.Width != DDSD->dwWidth) continue;
+                if(DDSD->dwFlags & DDSD_HEIGHT && mode.Height != DDSD->dwHeight) continue;
+            }
 
-        callback_sd.dwWidth = mode.Width;
-        callback_sd.dwHeight = mode.Height;
+            memset(&callback_sd, 0, sizeof(callback_sd));
+            callback_sd.dwSize = sizeof(callback_sd);
+            callback_sd.u4.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
 
-        PixelFormat_WineD3DtoDD(&callback_sd.u4.ddpfPixelFormat, mode.Format);
+            callback_sd.dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT|DDSD_PITCH;
+            if(Flags & DDEDM_REFRESHRATES)
+            {
+                callback_sd.dwFlags |= DDSD_REFRESHRATE;
+                callback_sd.u2.dwRefreshRate = mode.RefreshRate;
+            }
 
-        TRACE("Enumerating %dx%d@%d\n", callback_sd.dwWidth, callback_sd.dwHeight, callback_sd.u4.ddpfPixelFormat.u1.dwRGBBitCount);
+            callback_sd.dwWidth = mode.Width;
+            callback_sd.dwHeight = mode.Height;
 
-        if(cb(&callback_sd, Context) == DDENUMRET_CANCEL)
-        {
-            TRACE("Application asked to terminate the enumeration\n");
-            return DD_OK;
+            PixelFormat_WineD3DtoDD(&callback_sd.u4.ddpfPixelFormat, mode.Format);
+
+            TRACE("Enumerating %dx%d@%d\n", callback_sd.dwWidth, callback_sd.dwHeight, callback_sd.u4.ddpfPixelFormat.u1.dwRGBBitCount);
+
+            if(cb(&callback_sd, Context) == DDENUMRET_CANCEL)
+            {
+                TRACE("Application asked to terminate the enumeration\n");
+                return DD_OK;
+            }
         }
     }
+
     TRACE("End of enumeration\n");
     return DD_OK;
 }
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index e90e2ce..8f9998c 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -1117,6 +1117,7 @@ static UINT     WINAPI IWineD3DImpl_GetAdapterModeCount(IWineD3D *iface, UINT Ad
                 switch (Format)
                 {
                     case WINED3DFMT_UNKNOWN:
+                        /* This is for D3D8, do not enumerate P8 here */
                         if (DevModeW.dmBitsPerPel == 32 ||
                             DevModeW.dmBitsPerPel == 16) i++;
                         break;
@@ -1126,6 +1127,9 @@ static UINT     WINAPI IWineD3DImpl_GetAdapterModeCount(IWineD3D *iface, UINT Ad
                     case WINED3DFMT_R5G6B5:
                         if (DevModeW.dmBitsPerPel == 16) i++;
                         break;
+                    case WINED3DFMT_P8:
+                        if (DevModeW.dmBitsPerPel == 8) i++;
+                        break;
                     default:
                         /* Skip other modes as they do not match the requested format */
                         break;
@@ -1169,6 +1173,7 @@ static HRESULT WINAPI IWineD3DImpl_EnumAdapterModes(IWineD3D *iface, UINT Adapte
             switch (Format)
             {
                 case WINED3DFMT_UNKNOWN:
+                    /* This is D3D8. Do not enumerate P8 here */
                     if (DevModeW.dmBitsPerPel == 32 ||
                         DevModeW.dmBitsPerPel == 16) i++;
                     break;
@@ -1178,6 +1183,9 @@ static HRESULT WINAPI IWineD3DImpl_EnumAdapterModes(IWineD3D *iface, UINT Adapte
                 case WINED3DFMT_R5G6B5:
                     if (DevModeW.dmBitsPerPel == 16) i++;
                     break;
+                case WINED3DFMT_P8:
+                    if (DevModeW.dmBitsPerPel == 8) i++;
+                    break;
                 default:
                     /* Modes that don't match what we support can get an early-out */
                     TRACE_(d3d_caps)("Searching for %s, returning D3DERR_INVALIDCALL\n", debug_d3dformat(Format));
@@ -1203,6 +1211,9 @@ static HRESULT WINAPI IWineD3DImpl_EnumAdapterModes(IWineD3D *iface, UINT Adapte
             {
                 switch (DevModeW.dmBitsPerPel)
                 {
+                    case 8:
+                        pMode->Format = WINED3DFMT_P8;
+                        break;
                     case 16:
                         pMode->Format = WINED3DFMT_R5G6B5;
                         break;




More information about the wine-cvs mailing list