Henri Verbeet : ddraw: Skip redundant mode setting calls.

Alexandre Julliard julliard at winehq.org
Wed May 11 13:02:55 CDT 2011


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue May 10 21:18:46 2011 +0200

ddraw: Skip redundant mode setting calls.

---

 dlls/ddraw/ddraw.c     |   34 ++++++++++++++++++++++++++--------
 dlls/ddraw/tests/d3d.c |    2 +-
 2 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 9b87b95..fb032cb 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -830,6 +830,7 @@ static HRESULT WINAPI ddraw1_SetCooperativeLevel(IDirectDraw *iface, HWND window
 static HRESULT ddraw_set_display_mode(IDirectDrawImpl *ddraw, DWORD Width, DWORD Height,
         DWORD BPP, DWORD RefreshRate, DWORD Flags)
 {
+    enum wined3d_format_id format;
     WINED3DDISPLAYMODE Mode;
     HRESULT hr;
 
@@ -845,6 +846,30 @@ static HRESULT ddraw_set_display_mode(IDirectDrawImpl *ddraw, DWORD Width, DWORD
         return DD_OK;
     }
 
+    switch(BPP)
+    {
+        case 8:  format = WINED3DFMT_P8_UINT;          break;
+        case 15: format = WINED3DFMT_B5G5R5X1_UNORM;   break;
+        case 16: format = WINED3DFMT_B5G6R5_UNORM;     break;
+        case 24: format = WINED3DFMT_B8G8R8_UNORM;     break;
+        case 32: format = WINED3DFMT_B8G8R8X8_UNORM;   break;
+        default: format = WINED3DFMT_UNKNOWN;          break;
+    }
+
+    if (FAILED(hr = IWineD3DDevice_GetDisplayMode(ddraw->wineD3DDevice, 0, &Mode)))
+    {
+        ERR("Failed to get current display mode, hr %#x.\n", hr);
+    }
+    else if (Mode.Width == Width
+            && Mode.Height == Height
+            && Mode.Format == format
+            && Mode.RefreshRate == RefreshRate)
+    {
+        TRACE("Skipping redundant mode setting call.\n");
+        LeaveCriticalSection(&ddraw_cs);
+        return DD_OK;
+    }
+
     /* Check the exclusive mode
     if(!(ddraw->cooperative_level & DDSCL_EXCLUSIVE))
         return DDERR_NOEXCLUSIVEMODE;
@@ -857,14 +882,7 @@ static HRESULT ddraw_set_display_mode(IDirectDrawImpl *ddraw, DWORD Width, DWORD
     Mode.Width = Width;
     Mode.Height = Height;
     Mode.RefreshRate = RefreshRate;
-    switch(BPP)
-    {
-        case 8:  Mode.Format = WINED3DFMT_P8_UINT;          break;
-        case 15: Mode.Format = WINED3DFMT_B5G5R5X1_UNORM;   break;
-        case 16: Mode.Format = WINED3DFMT_B5G6R5_UNORM;     break;
-        case 24: Mode.Format = WINED3DFMT_B8G8R8_UNORM;     break;
-        case 32: Mode.Format = WINED3DFMT_B8G8R8X8_UNORM;   break;
-    }
+    Mode.Format = format;
 
     /* TODO: The possible return values from msdn suggest that
      * the screen mode can't be changed if a surface is locked
diff --git a/dlls/ddraw/tests/d3d.c b/dlls/ddraw/tests/d3d.c
index e301fff..6511a26 100644
--- a/dlls/ddraw/tests/d3d.c
+++ b/dlls/ddraw/tests/d3d.c
@@ -3974,7 +3974,7 @@ static void test_redundant_mode_set(void)
     ok(SUCCEEDED(hr), "SetDipslayMode failed, hr %#x.\n", hr);
 
     GetWindowRect(window, &s);
-    todo_wine ok(EqualRect(&r, &s), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n",
+    ok(EqualRect(&r, &s), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n",
             r.left, r.top, r.right, r.bottom,
             s.left, s.top, s.right, s.bottom);
 




More information about the wine-cvs mailing list