[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