[PATCH 1/5] wined3d: Store the original display mode in the swapchain.
Henri Verbeet
hverbeet at codeweavers.com
Tue Aug 20 03:20:09 CDT 2013
The main point of this patch is avoiding making up a refresh rate when
restoring the display mode.
---
dlls/wined3d/device.c | 6 +-----
dlls/wined3d/swapchain.c | 39 ++++++++++++---------------------------
dlls/wined3d/wined3d_private.h | 3 +--
3 files changed, 14 insertions(+), 34 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 1db04b4..1ab93a3 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -5012,11 +5012,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device,
}
else if (swapchain_desc->windowed)
{
- m.width = swapchain->orig_width;
- m.height = swapchain->orig_height;
- m.refresh_rate = 0;
- m.format_id = swapchain->desc.backbuffer_format;
- m.scanline_ordering = WINED3D_SCANLINE_ORDERING_UNKNOWN;
+ m = swapchain->original_mode;
}
else
{
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index f6cfc2e..47ee901 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -30,7 +30,6 @@ WINE_DECLARE_DEBUG_CHANNEL(fps);
/* Do not call while under the GL lock. */
static void swapchain_cleanup(struct wined3d_swapchain *swapchain)
{
- struct wined3d_display_mode mode;
HRESULT hr;
UINT i;
@@ -76,13 +75,8 @@ static void swapchain_cleanup(struct wined3d_swapchain *swapchain)
* orig_height will be equal to the modes in the presentation params. */
if (!swapchain->desc.windowed && swapchain->desc.auto_restore_display_mode)
{
- mode.width = swapchain->orig_width;
- mode.height = swapchain->orig_height;
- mode.refresh_rate = 0;
- mode.format_id = swapchain->orig_fmt;
- mode.scanline_ordering = WINED3D_SCANLINE_ORDERING_UNKNOWN;
if (FAILED(hr = wined3d_set_adapter_display_mode(swapchain->device->wined3d,
- swapchain->device->adapter->ordinal, &mode)))
+ swapchain->device->adapter->ordinal, &swapchain->original_mode)))
ERR("Failed to restore display mode, hr %#x.\n", hr);
}
@@ -818,8 +812,6 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
{
const struct wined3d_adapter *adapter = device->adapter;
struct wined3d_resource_desc surface_desc;
- const struct wined3d_format *format;
- struct wined3d_display_mode mode;
BOOL displaymode_set = FALSE;
RECT client_rect;
HWND window;
@@ -853,11 +845,12 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
swapchain->win_handle = window;
swapchain->device_window = window;
- wined3d_get_adapter_display_mode(device->wined3d, adapter->ordinal, &mode, NULL);
- swapchain->orig_width = mode.width;
- swapchain->orig_height = mode.height;
- swapchain->orig_fmt = mode.format_id;
- format = wined3d_get_format(&adapter->gl_info, mode.format_id);
+ if (FAILED(hr = wined3d_get_adapter_display_mode(device->wined3d,
+ adapter->ordinal, &swapchain->original_mode, NULL)))
+ {
+ ERR("Failed to get current display mode, hr %#x.\n", hr);
+ goto err;
+ }
GetClientRect(window, &client_rect);
if (desc->windowed
@@ -879,8 +872,8 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
if (desc->backbuffer_format == WINED3DFMT_UNKNOWN)
{
- desc->backbuffer_format = swapchain->orig_fmt;
- TRACE("Updating format to %s.\n", debug_d3dformat(swapchain->orig_fmt));
+ desc->backbuffer_format = swapchain->original_mode.format_id;
+ TRACE("Updating format to %s.\n", debug_d3dformat(swapchain->original_mode.format_id));
}
}
swapchain->desc = *desc;
@@ -1040,18 +1033,10 @@ static HRESULT swapchain_init(struct wined3d_swapchain *swapchain, struct wined3
err:
if (displaymode_set)
{
- DEVMODEW devmode;
-
+ if (FAILED(wined3d_set_adapter_display_mode(device->wined3d,
+ adapter->ordinal, &swapchain->original_mode)))
+ ERR("Failed to restore display mode.\n");
ClipCursor(NULL);
-
- /* Change the display settings */
- memset(&devmode, 0, sizeof(devmode));
- devmode.dmSize = sizeof(devmode);
- devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
- devmode.dmBitsPerPel = format->byte_count * CHAR_BIT;
- devmode.dmPelsWidth = swapchain->orig_width;
- devmode.dmPelsHeight = swapchain->orig_height;
- ChangeDisplaySettingsExW(adapter->DeviceName, &devmode, NULL, CDS_FULLSCREEN, NULL);
}
if (swapchain->back_buffers)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index cee9651..49aacc1 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2543,8 +2543,7 @@ struct wined3d_swapchain
struct wined3d_surface **back_buffers;
struct wined3d_surface *front_buffer;
struct wined3d_swapchain_desc desc;
- DWORD orig_width, orig_height;
- enum wined3d_format_id orig_fmt;
+ struct wined3d_display_mode original_mode;
struct wined3d_gamma_ramp orig_gamma;
BOOL render_to_fbo;
const struct wined3d_format *ds_format;
--
1.8.1.5
More information about the wine-patches
mailing list