ddraw: Just implement ddraw7_RestoreDisplayMode() on top of wined3d_set_adapter_display_mode().
This commit is contained in:
parent
4a5ed44d79
commit
1fab14af9e
|
@ -1002,79 +1002,6 @@ static HRESULT WINAPI ddraw1_SetCooperativeLevel(IDirectDraw *iface, HWND window
|
|||
return ddraw7_SetCooperativeLevel(&ddraw->IDirectDraw7_iface, window, flags);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* 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
|
||||
*
|
||||
|
@ -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))
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue