[PATCH 03/10] wined3d: Restore the display mode on focus loss (v2).
Stefan Dösinger
stefan at codeweavers.com
Thu Sep 25 07:24:19 CDT 2014
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 2a5f59b..5b50149 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 46ac6b3..9097a45 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2683,7 +2683,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;
--
1.8.5.5
More information about the wine-patches
mailing list