Henri Verbeet : ddraw: Just implement ddraw7_RestoreDisplayMode() on top of wined3d_set_adapter_display_mode().
Alexandre Julliard
julliard at winehq.org
Tue Oct 16 15:27:46 CDT 2012
Module: wine
Branch: master
Commit: 1fab14af9e2ecdc26c9cf7b72b28c74b1f98ad6f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1fab14af9e2ecdc26c9cf7b72b28c74b1f98ad6f
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Mon Oct 15 22:26:21 2012 +0200
ddraw: Just implement ddraw7_RestoreDisplayMode() on top of wined3d_set_adapter_display_mode().
---
dlls/ddraw/ddraw.c | 155 +++++++++++++++++++-------------------------
dlls/ddraw/ddraw_private.h | 4 +-
2 files changed, 68 insertions(+), 91 deletions(-)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 1ef06d0..9d2a78a 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -1003,79 +1003,6 @@ static HRESULT WINAPI ddraw1_SetCooperativeLevel(IDirectDraw *iface, HWND window
}
/*****************************************************************************
- *
- * Helper function for SetDisplayMode and RestoreDisplayMode
- *
- * Implements DirectDraw's SetDisplayMode, but ignores the value of
- * ForceRefreshRate, since it is already handled by
- * ddraw7_SetDisplayMode. RestoreDisplayMode can use this function
- * without worrying that ForceRefreshRate will override the refresh rate. For
- * argument and return value documentation, see
- * ddraw7_SetDisplayMode.
- *
- *****************************************************************************/
-static HRESULT ddraw_set_display_mode(struct ddraw *ddraw, DWORD Width, DWORD Height,
- DWORD BPP, DWORD RefreshRate, DWORD Flags)
-{
- struct wined3d_display_mode mode;
- enum wined3d_format_id format;
- HRESULT hr;
-
- TRACE("ddraw %p, width %u, height %u, bpp %u, refresh_rate %u, flags %#x.\n", ddraw, Width,
- Height, BPP, RefreshRate, Flags);
-
- wined3d_mutex_lock();
- if( !Width || !Height )
- {
- ERR("Width %u, Height %u, what to do?\n", Width, Height);
- /* It looks like Need for Speed Porsche Unleashed expects DD_OK here */
- wined3d_mutex_unlock();
- 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;
- }
-
- /* Check the exclusive mode
- if(!(ddraw->cooperative_level & DDSCL_EXCLUSIVE))
- return DDERR_NOEXCLUSIVEMODE;
- * This is WRONG. Don't know if the SDK is completely
- * wrong and if there are any conditions when DDERR_NOEXCLUSIVE
- * is returned, but Half-Life 1.1.1.1 (Steam version)
- * depends on this
- */
-
- mode.width = Width;
- mode.height = Height;
- mode.refresh_rate = RefreshRate;
- mode.format_id = format;
- mode.scanline_ordering = WINED3D_SCANLINE_ORDERING_UNKNOWN;
-
- /* TODO: The possible return values from msdn suggest that
- * the screen mode can't be changed if a surface is locked
- * or some drawing is in progress
- */
-
- /* TODO: Lose the primary surface */
- hr = wined3d_set_adapter_display_mode(ddraw->wined3d, WINED3DADAPTER_DEFAULT, &mode);
-
- wined3d_mutex_unlock();
-
- switch(hr)
- {
- case WINED3DERR_NOTAVAILABLE: return DDERR_UNSUPPORTED;
- default: return hr;
- }
-}
-
-/*****************************************************************************
* IDirectDraw7::SetDisplayMode
*
* Sets the display screen resolution, color depth and refresh frequency
@@ -1097,22 +1024,67 @@ static HRESULT ddraw_set_display_mode(struct ddraw *ddraw, DWORD Width, DWORD He
* DD_OK on success
*
*****************************************************************************/
-static HRESULT WINAPI ddraw7_SetDisplayMode(IDirectDraw7 *iface, DWORD Width, DWORD Height,
- DWORD BPP, DWORD RefreshRate, DWORD Flags)
+static HRESULT WINAPI ddraw7_SetDisplayMode(IDirectDraw7 *iface, DWORD width, DWORD height,
+ DWORD bpp, DWORD refresh_rate, DWORD flags)
{
struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
+ struct wined3d_display_mode mode;
+ enum wined3d_format_id format;
+ HRESULT hr;
TRACE("iface %p, width %u, height %u, bpp %u, refresh_rate %u, flags %#x.\n",
- iface, Width, Height, BPP, RefreshRate, Flags);
+ iface, width, height, bpp, refresh_rate, flags);
if (force_refresh_rate != 0)
{
TRACE("ForceRefreshRate overriding passed-in refresh rate (%u Hz) to %u Hz\n",
- RefreshRate, force_refresh_rate);
- RefreshRate = force_refresh_rate;
+ refresh_rate, force_refresh_rate);
+ refresh_rate = force_refresh_rate;
}
- return ddraw_set_display_mode(ddraw, Width, Height, BPP, RefreshRate, Flags);
+ wined3d_mutex_lock();
+
+ if (!width || !height)
+ {
+ /* It looks like Need for Speed Porsche Unleashed expects DD_OK here. */
+ wined3d_mutex_unlock();
+ 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;
+ }
+
+ /* Check the exclusive mode.
+ * if(!(ddraw->cooperative_level & DDSCL_EXCLUSIVE))
+ * return DDERR_NOEXCLUSIVEMODE;
+ * This is WRONG. Don't know if the SDK is completely wrong and if there
+ * are any conditions when DDERR_NOEXCLUSIVE is returned, but Half-Life
+ * 1.1.1.1 (Steam version) depends on this. */
+ mode.width = width;
+ mode.height = height;
+ mode.refresh_rate = refresh_rate;
+ mode.format_id = format;
+ mode.scanline_ordering = WINED3D_SCANLINE_ORDERING_UNKNOWN;
+
+ /* TODO: The possible return values from msdn suggest that the screen mode
+ * can't be changed if a surface is locked or some drawing is in progress. */
+ /* TODO: Lose the primary surface. */
+ hr = wined3d_set_adapter_display_mode(ddraw->wined3d, WINED3DADAPTER_DEFAULT, &mode);
+
+ wined3d_mutex_unlock();
+
+ switch (hr)
+ {
+ case WINED3DERR_NOTAVAILABLE: return DDERR_UNSUPPORTED;
+ default: return hr;
+ }
}
static HRESULT WINAPI ddraw4_SetDisplayMode(IDirectDraw4 *iface, DWORD width, DWORD height,
@@ -1170,10 +1142,17 @@ static HRESULT WINAPI ddraw1_SetDisplayMode(IDirectDraw *iface, DWORD width, DWO
static HRESULT WINAPI ddraw7_RestoreDisplayMode(IDirectDraw7 *iface)
{
struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
+ HRESULT hr;
TRACE("iface %p.\n", iface);
- return ddraw_set_display_mode(ddraw, ddraw->orig_width, ddraw->orig_height, ddraw->orig_bpp, 0, 0);
+ wined3d_mutex_lock();
+
+ hr = wined3d_set_adapter_display_mode(ddraw->wined3d, WINED3DADAPTER_DEFAULT, &ddraw->original_mode);
+
+ wined3d_mutex_unlock();
+
+ return hr;
}
static HRESULT WINAPI ddraw4_RestoreDisplayMode(IDirectDraw4 *iface)
@@ -5359,7 +5338,6 @@ static const struct wined3d_device_parent_ops ddraw_wined3d_device_parent_ops =
HRESULT ddraw_init(struct ddraw *ddraw, enum wined3d_device_type device_type)
{
HRESULT hr;
- HDC hDC;
ddraw->IDirectDraw7_iface.lpVtbl = &ddraw7_vtbl;
ddraw->IDirectDraw_iface.lpVtbl = &ddraw1_vtbl;
@@ -5373,13 +5351,6 @@ HRESULT ddraw_init(struct ddraw *ddraw, enum wined3d_device_type device_type)
ddraw->numIfaces = 1;
ddraw->ref7 = 1;
- /* Get the current screen settings. */
- hDC = GetDC(0);
- ddraw->orig_bpp = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
- ReleaseDC(0, hDC);
- ddraw->orig_width = GetSystemMetrics(SM_CXSCREEN);
- ddraw->orig_height = GetSystemMetrics(SM_CYSCREEN);
-
ddraw->wined3d = wined3d_create(7, WINED3D_LEGACY_DEPTH_BIAS);
if (!ddraw->wined3d)
{
@@ -5387,6 +5358,14 @@ HRESULT ddraw_init(struct ddraw *ddraw, enum wined3d_device_type device_type)
return E_OUTOFMEMORY;
}
+ if (FAILED(hr = wined3d_get_adapter_display_mode(ddraw->wined3d,
+ WINED3DADAPTER_DEFAULT, &ddraw->original_mode, NULL)))
+ {
+ ERR("Failed to get display mode, hr %#x.\n", hr);
+ wined3d_decref(ddraw->wined3d);
+ return hr;
+ }
+
hr = wined3d_device_create(ddraw->wined3d, WINED3DADAPTER_DEFAULT, device_type,
NULL, 0, 8, &ddraw->device_parent, &ddraw->wined3d_device);
if (FAILED(hr))
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index 563377f..0d15727 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -78,9 +78,7 @@ struct ddraw
/* DirectDraw things, which are not handled by WineD3D */
DWORD cooperative_level;
-
- DWORD orig_width, orig_height;
- DWORD orig_bpp;
+ struct wined3d_display_mode original_mode;
/* D3D things */
HWND d3d_window;
More information about the wine-cvs
mailing list