From: Stefan Dösinger Subject: [PATCH 2/7] wined3d: Restore the display mode on focus loss (v2). Message-Id: <1412595782-19231-2-git-send-email-stefan@codeweavers.com> Date: Mon, 6 Oct 2014 13:42:57 +0200 v2: Use a dedicated flag to make reset reapply the mode. Source-Engine games in d3d9ex mode call ChangeDisplaySettings to reapply their mode and do not call reset. Modifying the swapchain parameters broke rendering in this case. --- dlls/wined3d/device.c | 3 ++- dlls/wined3d/swapchain.c | 19 +++++++++++++++++++ dlls/wined3d/wined3d_private.h | 2 +- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 2791443..8faf2f5 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -4321,7 +4321,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, struct wined3d_resource *resource, *cursor; struct wined3d_swapchain *swapchain; struct wined3d_display_mode m; - BOOL DisplayModeChanged = FALSE; + BOOL DisplayModeChanged; BOOL update_desc = FALSE; UINT backbuffer_width = swapchain_desc->backbuffer_width; UINT backbuffer_height = swapchain_desc->backbuffer_height; @@ -4335,6 +4335,7 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, ERR("Failed to get the first implicit swapchain.\n"); return WINED3DERR_INVALIDCALL; } + DisplayModeChanged = swapchain->reapply_mode; if (reset_state) { diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index f308731..f27a5b6 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -1176,8 +1176,27 @@ void swapchain_update_draw_bindings(struct wined3d_swapchain *swapchain) } } +static BOOL wined3d_swapchain_mode_changed(const struct wined3d_swapchain *swapchain) +{ + return swapchain->desc.backbuffer_width != swapchain->original_mode.width + || swapchain->desc.backbuffer_height != swapchain->original_mode.height + || swapchain->desc.backbuffer_format != swapchain->original_mode.format_id + || swapchain->desc.refresh_rate != swapchain->original_mode.refresh_rate; +} + void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activate) { if (!activate) + { + if (wined3d_swapchain_mode_changed(swapchain)) + { + if (FAILED(wined3d_set_adapter_display_mode(swapchain->device->wined3d, + swapchain->device->adapter->ordinal, &swapchain->original_mode))) + ERR("Failed to set display mode.\n"); + + swapchain->reapply_mode = TRUE; + } + ShowWindow(swapchain->device_window, SW_MINIMIZE); + } } diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index aed4369..6669a3c 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2675,7 +2675,7 @@ struct wined3d_swapchain struct wined3d_swapchain_desc desc; struct wined3d_display_mode original_mode; struct wined3d_gamma_ramp orig_gamma; - BOOL render_to_fbo; + BOOL render_to_fbo, reapply_mode; const struct wined3d_format *ds_format; struct wined3d_palette *palette; -- 2.0.4