Commit 92a6c583 authored by Józef Kucia's avatar Józef Kucia Committed by Alexandre Julliard

wined3d: Optionally use closest matching mode in wined3d_swapchain_set_fullscreen().

parent 09a49574
...@@ -1450,35 +1450,44 @@ HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapcha ...@@ -1450,35 +1450,44 @@ HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapcha
const struct wined3d_swapchain_desc *swapchain_desc, const struct wined3d_display_mode *mode) const struct wined3d_swapchain_desc *swapchain_desc, const struct wined3d_display_mode *mode)
{ {
struct wined3d_device *device = swapchain->device; struct wined3d_device *device = swapchain->device;
struct wined3d_display_mode default_mode; struct wined3d_display_mode actual_mode;
unsigned int width, height;
HRESULT hr; HRESULT hr;
TRACE("swapchain %p, desc %p, mode %p.\n", swapchain, swapchain_desc, mode); TRACE("swapchain %p, desc %p, mode %p.\n", swapchain, swapchain_desc, mode);
if (swapchain->desc.flags & WINED3D_SWAPCHAIN_ALLOW_MODE_SWITCH) if (swapchain->desc.flags & WINED3D_SWAPCHAIN_ALLOW_MODE_SWITCH)
{ {
width = swapchain_desc->backbuffer_width; if (mode)
height = swapchain_desc->backbuffer_height; {
actual_mode = *mode;
if (!mode) }
else
{ {
if (!swapchain_desc->windowed) if (!swapchain_desc->windowed)
{ {
default_mode.width = swapchain_desc->backbuffer_width; actual_mode.width = swapchain_desc->backbuffer_width;
default_mode.height = swapchain_desc->backbuffer_height; actual_mode.height = swapchain_desc->backbuffer_height;
default_mode.refresh_rate = swapchain_desc->refresh_rate; actual_mode.refresh_rate = swapchain_desc->refresh_rate;
default_mode.format_id = swapchain_desc->backbuffer_format; actual_mode.format_id = swapchain_desc->backbuffer_format;
default_mode.scanline_ordering = WINED3D_SCANLINE_ORDERING_UNKNOWN; actual_mode.scanline_ordering = WINED3D_SCANLINE_ORDERING_UNKNOWN;
} }
else else
{ {
default_mode = swapchain->original_mode; actual_mode = swapchain->original_mode;
} }
mode = &default_mode;
} }
if (FAILED(hr = wined3d_set_adapter_display_mode(device->wined3d, device->adapter->ordinal, mode))) if (swapchain->desc.flags & WINED3D_SWAPCHAIN_USE_CLOSEST_MATCHING_MODE)
{
if (FAILED(hr = wined3d_find_closest_matching_adapter_mode(device->wined3d,
device->adapter->ordinal, &actual_mode)))
{
WARN("Failed to find closest matching mode, hr %#x.\n", hr);
}
}
if (FAILED(hr = wined3d_set_adapter_display_mode(device->wined3d,
device->adapter->ordinal, &actual_mode)))
{ {
WARN("Failed to set display mode, hr %#x.\n", hr); WARN("Failed to set display mode, hr %#x.\n", hr);
return WINED3DERR_INVALIDCALL; return WINED3DERR_INVALIDCALL;
...@@ -1490,19 +1499,18 @@ HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapcha ...@@ -1490,19 +1499,18 @@ HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapcha
WARN("WINED3D_SWAPCHAIN_ALLOW_MODE_SWITCH is not set, ignoring mode.\n"); WARN("WINED3D_SWAPCHAIN_ALLOW_MODE_SWITCH is not set, ignoring mode.\n");
if (FAILED(hr = wined3d_get_adapter_display_mode(device->wined3d, device->adapter->ordinal, if (FAILED(hr = wined3d_get_adapter_display_mode(device->wined3d, device->adapter->ordinal,
&default_mode, NULL))) &actual_mode, NULL)))
{ {
ERR("Failed to get display mode, hr %#x.\n", hr); ERR("Failed to get display mode, hr %#x.\n", hr);
return WINED3DERR_INVALIDCALL; return WINED3DERR_INVALIDCALL;
} }
mode = &default_mode;
width = mode->width;
height = mode->height;
} }
if (!swapchain_desc->windowed) if (!swapchain_desc->windowed)
{ {
unsigned int width = actual_mode.width;
unsigned int height = actual_mode.height;
if (swapchain->desc.windowed) if (swapchain->desc.windowed)
{ {
HWND focus_window = device->create_parms.focus_window; HWND focus_window = device->create_parms.focus_window;
...@@ -1522,7 +1530,7 @@ HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapcha ...@@ -1522,7 +1530,7 @@ HRESULT CDECL wined3d_swapchain_set_fullscreen(struct wined3d_swapchain *swapcha
/* Fullscreen -> fullscreen mode change */ /* Fullscreen -> fullscreen mode change */
MoveWindow(swapchain->device_window, 0, 0, width, height, TRUE); MoveWindow(swapchain->device_window, 0, 0, width, height, TRUE);
} }
swapchain->d3d_mode = *mode; swapchain->d3d_mode = actual_mode;
} }
else if (!swapchain->desc.windowed) else if (!swapchain->desc.windowed)
{ {
......
...@@ -829,7 +829,8 @@ enum wined3d_display_rotation ...@@ -829,7 +829,8 @@ enum wined3d_display_rotation
#define WINED3D_SWAPCHAIN_NOAUTOROTATE 0x00000020u #define WINED3D_SWAPCHAIN_NOAUTOROTATE 0x00000020u
#define WINED3D_SWAPCHAIN_UNPRUNEDMODE 0x00000040u #define WINED3D_SWAPCHAIN_UNPRUNEDMODE 0x00000040u
#define WINED3D_SWAPCHAIN_ALLOW_MODE_SWITCH 0x00001000u #define WINED3D_SWAPCHAIN_ALLOW_MODE_SWITCH 0x00001000u
#define WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT 0x00002000u #define WINED3D_SWAPCHAIN_USE_CLOSEST_MATCHING_MODE 0x00002000u
#define WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT 0x00004000u
#define WINED3DDP_MAXTEXCOORD 8 #define WINED3DDP_MAXTEXCOORD 8
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment