[PATCH 3/6] wined3d: Restore the display mode on focus loss (v2).

Stefan Dösinger stefan at codeweavers.com
Wed Oct 1 08:50:27 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 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;
 
-- 
1.8.5.5




More information about the wine-patches mailing list