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