Module: wine Branch: master Commit: 5e4145d0ffc9856d3aceb4f5260f233a18a1ee3d URL: http://source.winehq.org/git/wine.git/?a=commit;h=5e4145d0ffc9856d3aceb4f526...
Author: Henri Verbeet hverbeet@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);