Alexandre Julliard : ddraw: De-duplicate display modes even when returning the refresh rate.

Alexandre Julliard julliard at winehq.org
Wed Apr 10 14:16:14 CDT 2013


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Apr  9 21:27:57 2013 +0200

ddraw: De-duplicate display modes even when returning the refresh rate.

---

 dlls/ddraw/ddraw.c |   73 +++++++++++++++++++--------------------------------
 1 files changed, 27 insertions(+), 46 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 266c779..a459e5f 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -2069,7 +2069,7 @@ static HRESULT WINAPI ddraw7_EnumDisplayModes(IDirectDraw7 *iface, DWORD Flags,
     struct wined3d_display_mode mode;
     unsigned int modenum, fmt;
     DDSURFACEDESC2 callback_sd;
-    unsigned enum_mode_count = 0, enum_mode_array_size = 0;
+    unsigned enum_mode_count = 0, enum_mode_array_size = 16;
     DDPIXELFORMAT pixelformat;
 
     static const enum wined3d_format_id checkFormatList[] =
@@ -2085,18 +2085,10 @@ static HRESULT WINAPI ddraw7_EnumDisplayModes(IDirectDraw7 *iface, DWORD Flags,
     if (!cb)
         return DDERR_INVALIDPARAMS;
 
+    enum_modes = HeapAlloc(GetProcessHeap(), 0, sizeof(*enum_modes) * enum_mode_array_size);
+    if (!enum_modes) return DDERR_OUTOFMEMORY;
+
     wined3d_mutex_lock();
-    if(!(Flags & DDEDM_REFRESHRATES))
-    {
-        enum_mode_array_size = 16;
-        enum_modes = HeapAlloc(GetProcessHeap(), 0, sizeof(*enum_modes) * enum_mode_array_size);
-        if (!enum_modes)
-        {
-            ERR("Out of memory\n");
-            wined3d_mutex_unlock();
-            return DDERR_OUTOFMEMORY;
-        }
-    }
 
     pixelformat.dwSize = sizeof(pixelformat);
     for(fmt = 0; fmt < (sizeof(checkFormatList) / sizeof(checkFormatList[0])); fmt++)
@@ -2105,6 +2097,9 @@ static HRESULT WINAPI ddraw7_EnumDisplayModes(IDirectDraw7 *iface, DWORD Flags,
         while (wined3d_enum_adapter_modes(ddraw->wined3d, WINED3DADAPTER_DEFAULT, checkFormatList[fmt],
                 WINED3D_SCANLINE_ORDERING_UNKNOWN, modenum++, &mode) == WINED3D_OK)
         {
+            BOOL found = FALSE;
+            unsigned i;
+
             PixelFormat_WineD3DtoDD(&pixelformat, mode.format_id);
             if (DDSD)
             {
@@ -2119,27 +2114,18 @@ static HRESULT WINAPI ddraw7_EnumDisplayModes(IDirectDraw7 *iface, DWORD Flags,
                     continue;
             }
 
-            if(!(Flags & DDEDM_REFRESHRATES))
+            /* DX docs state EnumDisplayMode should return only unique modes */
+            for (i = 0; i < enum_mode_count; i++)
             {
-                /* DX docs state EnumDisplayMode should return only unique modes. If DDEDM_REFRESHRATES is not set, refresh
-                 * rate doesn't matter when determining if the mode is unique. So modes only differing in refresh rate have
-                 * to be reduced to a single unique result in such case.
-                 */
-                BOOL found = FALSE;
-                unsigned i;
-
-                for (i = 0; i < enum_mode_count; i++)
+                if (enum_modes[i].width == mode.width && enum_modes[i].height == mode.height
+                    && enum_modes[i].format_id == mode.format_id
+                    && (enum_modes[i].refresh_rate == mode.refresh_rate || !(Flags & DDEDM_REFRESHRATES)))
                 {
-                    if (enum_modes[i].width == mode.width && enum_modes[i].height == mode.height
-                            && enum_modes[i].format_id == mode.format_id)
-                    {
-                        found = TRUE;
-                        break;
-                    }
+                    found = TRUE;
+                    break;
                 }
-
-                if(found) continue;
             }
+            if(found) continue;
 
             memset(&callback_sd, 0, sizeof(callback_sd));
             callback_sd.dwSize = sizeof(callback_sd);
@@ -2169,28 +2155,23 @@ static HRESULT WINAPI ddraw7_EnumDisplayModes(IDirectDraw7 *iface, DWORD Flags,
                 return DD_OK;
             }
 
-            if(!(Flags & DDEDM_REFRESHRATES))
+            if (enum_mode_count == enum_mode_array_size)
             {
-                if (enum_mode_count == enum_mode_array_size)
+                struct wined3d_display_mode *new_enum_modes;
+
+                enum_mode_array_size *= 2;
+                new_enum_modes = HeapReAlloc(GetProcessHeap(), 0, enum_modes,
+                                             sizeof(*new_enum_modes) * enum_mode_array_size);
+                if (!new_enum_modes)
                 {
-                    struct wined3d_display_mode *new_enum_modes;
-
-                    enum_mode_array_size *= 2;
-                    new_enum_modes = HeapReAlloc(GetProcessHeap(), 0, enum_modes,
-                            sizeof(*new_enum_modes) * enum_mode_array_size);
-                    if (!new_enum_modes)
-                    {
-                        ERR("Out of memory\n");
-                        HeapFree(GetProcessHeap(), 0, enum_modes);
-                        wined3d_mutex_unlock();
-                        return DDERR_OUTOFMEMORY;
-                    }
-
-                    enum_modes = new_enum_modes;
+                    HeapFree(GetProcessHeap(), 0, enum_modes);
+                    wined3d_mutex_unlock();
+                    return DDERR_OUTOFMEMORY;
                 }
 
-                enum_modes[enum_mode_count++] = mode;
+                enum_modes = new_enum_modes;
             }
+            enum_modes[enum_mode_count++] = mode;
         }
     }
 




More information about the wine-cvs mailing list