[PATCH 3/5] wined3d: Restore the display mode on focus loss.

Stefan Dösinger stefan at codeweavers.com
Tue Sep 23 05:57:16 CDT 2014


---
 dlls/d3d8/directx.c            |  2 +-
 dlls/d3d9/directx.c            |  2 +-
 dlls/ddraw/ddraw.c             |  2 +-
 dlls/wined3d/device.c          |  4 ++++
 dlls/wined3d/swapchain.c       | 45 ++++++++++++++++++++++++++++++++++++++++++
 dlls/wined3d/wined3d_private.h |  1 +
 include/wine/wined3d.h         |  1 +
 7 files changed, 54 insertions(+), 3 deletions(-)

diff --git a/dlls/d3d8/directx.c b/dlls/d3d8/directx.c
index 7270881..1a32b9d 100644
--- a/dlls/d3d8/directx.c
+++ b/dlls/d3d8/directx.c
@@ -404,7 +404,7 @@ static const struct IDirect3D8Vtbl d3d8_vtbl =
 
 BOOL d3d8_init(struct d3d8 *d3d8)
 {
-    DWORD flags = WINED3D_LEGACY_DEPTH_BIAS | WINED3D_VIDMEM_ACCOUNTING;
+    DWORD flags = WINED3D_LEGACY_DEPTH_BIAS | WINED3D_VIDMEM_ACCOUNTING | WINED3D_KEEP_MODE_ON_ACTIVATE;
 
     d3d8->IDirect3D8_iface.lpVtbl = &d3d8_vtbl;
     d3d8->refcount = 1;
diff --git a/dlls/d3d9/directx.c b/dlls/d3d9/directx.c
index 6280d12..aa39cb4 100644
--- a/dlls/d3d9/directx.c
+++ b/dlls/d3d9/directx.c
@@ -639,7 +639,7 @@ BOOL d3d9_init(struct d3d9 *d3d9, BOOL extended)
     DWORD flags = WINED3D_PRESENT_CONVERSION;
 
     if (!extended)
-        flags |= WINED3D_VIDMEM_ACCOUNTING;
+        flags |= WINED3D_VIDMEM_ACCOUNTING | WINED3D_KEEP_MODE_ON_ACTIVATE;
     d3d9->IDirect3D9Ex_iface.lpVtbl = &d3d9_vtbl;
     d3d9->refcount = 1;
 
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 18c30da..f1b4486 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -4869,7 +4869,7 @@ HRESULT ddraw_init(struct ddraw *ddraw, enum wined3d_device_type device_type)
     ddraw->numIfaces = 1;
     ddraw->ref7 = 1;
 
-    flags = WINED3D_LEGACY_DEPTH_BIAS | WINED3D_VIDMEM_ACCOUNTING;
+    flags = WINED3D_LEGACY_DEPTH_BIAS | WINED3D_VIDMEM_ACCOUNTING | WINED3D_KEEP_MODE_ON_ACTIVATE;
     if (!(ddraw->wined3d = wined3d_create(flags)))
     {
         if (!(ddraw->wined3d = wined3d_create(flags | WINED3D_NO3D)))
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index a214442..cb51b4d 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -4984,6 +4984,10 @@ LRESULT device_process_message(struct wined3d_device *device, HWND window, BOOL
     }
     else if (message == WM_ACTIVATEAPP)
     {
+        UINT i;
+
+        for (i = 0; i < device->swapchain_count; i++)
+            wined3d_swapchain_activate_app(device->swapchains[i], wparam);
         device->device_parent->ops->activate(device->device_parent, wparam);
     }
 
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 1eb2abb..79318ef 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -1175,3 +1175,48 @@ void swapchain_update_draw_bindings(struct wined3d_swapchain *swapchain)
         wined3d_resource_update_draw_binding(&swapchain->back_buffers[i]->resource);
     }
 }
+
+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_app(struct wined3d_swapchain *swapchain, BOOL activate)
+{
+    HRESULT hr;
+
+    if (!wined3d_swapchain_mode_changed(swapchain))
+        return;
+
+    if (!activate)
+    {
+        hr = wined3d_set_adapter_display_mode(swapchain->device->wined3d,
+                swapchain->device->adapter->ordinal, &swapchain->original_mode);
+    }
+    else if (swapchain->device->wined3d->flags & WINED3D_KEEP_MODE_ON_ACTIVATE)
+    {
+        /* Make sure the next reset restores the mode */
+        swapchain->desc.backbuffer_width = 0;
+        swapchain->desc.backbuffer_height = 0;
+        hr = WINED3D_OK;
+    }
+    else
+    {
+        struct wined3d_display_mode m =
+        {
+            swapchain->desc.backbuffer_width,
+            swapchain->desc.backbuffer_height,
+            swapchain->desc.refresh_rate,
+            swapchain->desc.backbuffer_format,
+            WINED3D_SCANLINE_ORDERING_UNKNOWN
+        };
+
+        hr = wined3d_set_adapter_display_mode(swapchain->device->wined3d,
+                swapchain->device->adapter->ordinal, &m);
+    }
+    if (FAILED(hr))
+        ERR("Failed to set display mode.\n");
+}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 30a3321..2b22a99 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2706,6 +2706,7 @@ void swapchain_destroy_contexts(struct wined3d_swapchain *swapchain) DECLSPEC_HI
 HDC swapchain_get_backup_dc(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
 void swapchain_update_draw_bindings(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
 void swapchain_update_render_to_fbo(struct wined3d_swapchain *swapchain) DECLSPEC_HIDDEN;
+void wined3d_swapchain_activate_app(struct wined3d_swapchain *swapchain, BOOL activate) DECLSPEC_HIDDEN;
 
 /*****************************************************************************
  * Utility function prototypes
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index bd41106..b6debfc 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -1230,6 +1230,7 @@ enum wined3d_display_rotation
 #define WINED3D_NO3D                                            0x00000002
 #define WINED3D_VIDMEM_ACCOUNTING                               0x00000004
 #define WINED3D_PRESENT_CONVERSION                              0x00000008
+#define WINED3D_KEEP_MODE_ON_ACTIVATE                           0x00000010
 
 #define WINED3D_RESZ_CODE                                       0x7fa05000
 
-- 
1.8.5.5




More information about the wine-patches mailing list