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);
|
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
|
* IDirectDraw7::SetDisplayMode
|
||||||
*
|
*
|
||||||
@ -1097,22 +1024,67 @@ static HRESULT ddraw_set_display_mode(struct ddraw *ddraw, DWORD Width, DWORD He
|
|||||||
* DD_OK on success
|
* DD_OK on success
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
static HRESULT WINAPI ddraw7_SetDisplayMode(IDirectDraw7 *iface, DWORD Width, DWORD Height,
|
static HRESULT WINAPI ddraw7_SetDisplayMode(IDirectDraw7 *iface, DWORD width, DWORD height,
|
||||||
DWORD BPP, DWORD RefreshRate, DWORD Flags)
|
DWORD bpp, DWORD refresh_rate, DWORD flags)
|
||||||
{
|
{
|
||||||
struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
|
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",
|
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)
|
if (force_refresh_rate != 0)
|
||||||
{
|
{
|
||||||
TRACE("ForceRefreshRate overriding passed-in refresh rate (%u Hz) to %u Hz\n",
|
TRACE("ForceRefreshRate overriding passed-in refresh rate (%u Hz) to %u Hz\n",
|
||||||
RefreshRate, force_refresh_rate);
|
refresh_rate, force_refresh_rate);
|
||||||
RefreshRate = 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,
|
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)
|
static HRESULT WINAPI ddraw7_RestoreDisplayMode(IDirectDraw7 *iface)
|
||||||
{
|
{
|
||||||
struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
|
struct ddraw *ddraw = impl_from_IDirectDraw7(iface);
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
TRACE("iface %p.\n", iface);
|
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)
|
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 ddraw_init(struct ddraw *ddraw, enum wined3d_device_type device_type)
|
||||||
{
|
{
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
HDC hDC;
|
|
||||||
|
|
||||||
ddraw->IDirectDraw7_iface.lpVtbl = &ddraw7_vtbl;
|
ddraw->IDirectDraw7_iface.lpVtbl = &ddraw7_vtbl;
|
||||||
ddraw->IDirectDraw_iface.lpVtbl = &ddraw1_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->numIfaces = 1;
|
||||||
ddraw->ref7 = 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);
|
ddraw->wined3d = wined3d_create(7, WINED3D_LEGACY_DEPTH_BIAS);
|
||||||
if (!ddraw->wined3d)
|
if (!ddraw->wined3d)
|
||||||
{
|
{
|
||||||
@ -5387,6 +5358,14 @@ HRESULT ddraw_init(struct ddraw *ddraw, enum wined3d_device_type device_type)
|
|||||||
return E_OUTOFMEMORY;
|
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,
|
hr = wined3d_device_create(ddraw->wined3d, WINED3DADAPTER_DEFAULT, device_type,
|
||||||
NULL, 0, 8, &ddraw->device_parent, &ddraw->wined3d_device);
|
NULL, 0, 8, &ddraw->device_parent, &ddraw->wined3d_device);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
|
@ -78,9 +78,7 @@ struct ddraw
|
|||||||
|
|
||||||
/* DirectDraw things, which are not handled by WineD3D */
|
/* DirectDraw things, which are not handled by WineD3D */
|
||||||
DWORD cooperative_level;
|
DWORD cooperative_level;
|
||||||
|
struct wined3d_display_mode original_mode;
|
||||||
DWORD orig_width, orig_height;
|
|
||||||
DWORD orig_bpp;
|
|
||||||
|
|
||||||
/* D3D things */
|
/* D3D things */
|
||||||
HWND d3d_window;
|
HWND d3d_window;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user