[PATCH 2/8] wined3d: Deactivate the device before minimizing the window.
Stefan Dösinger
stefan at codeweavers.com
Sat Oct 13 18:13:51 CDT 2018
This fixes tabbing out of Deus Ex Game of the Year edition.
Signed-off-by: Stefan Dösinger <stefan at codeweavers.com>
---
This patch ignores that d3d9 has different behavior than ddraw. D3d9's
behavior matches what we currently have (the device state during focus
loss is D3DERR_DEVICENOTRESET, and only the final WM_ACTIVATEAPP message
has D3DERR_DEVICELOST). This could be handled via a create flag. I am
not doing it for now because I think it is less likely for a d3d9 app to
depend on it (you can't destroy the device until the very end, but still
can't do anything due to D3DERR_DEVICENOTRESET).
---
dlls/wined3d/device.c | 2 --
dlls/wined3d/swapchain.c | 14 ++++++++++++++
2 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index abb2a893637..70d43e07e39 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -5319,8 +5319,6 @@ LRESULT device_process_message(struct wined3d_device *device, HWND window, BOOL
for (i = 0; i < device->swapchain_count; i++)
wined3d_swapchain_activate(device->swapchains[i], wparam);
-
- device->device_parent->ops->activate(device->device_parent, wparam);
}
else if (message == WM_SYSCOMMAND)
{
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index b068cf164cd..9c48de2193c 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -1162,6 +1162,9 @@ void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activa
device->adapter->ordinal, &swapchain->d3d_mode)))
ERR("Failed to set display mode.\n");
}
+
+ if (swapchain == device->swapchains[0])
+ device->device_parent->ops->activate(device->device_parent, TRUE);
}
else
{
@@ -1171,6 +1174,17 @@ void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activa
swapchain->reapply_mode = TRUE;
+ /* Some DDraw apps (Deus Ex: GOTY, and presumably all UT 1 based games) destroy the device
+ * during window minimization. Do our housekeeping now, as the device may not exist after
+ * the ShowWindow call.
+ *
+ * In d3d9, the device is marked lost after the window is minimized. If we find an app
+ * that needs this behavior (e.g. because it calls TestCooperativeLevel in the window proc)
+ * we'll have to control this via a create flag. Note that the device and swapchain are not
+ * safe to access after the ShowWindow call. */
+ if (swapchain == device->swapchains[0])
+ device->device_parent->ops->activate(device->device_parent, FALSE);
+
if (!(device->create_parms.flags & WINED3DCREATE_NOWINDOWCHANGES)
&& IsWindowVisible(swapchain->device_window))
ShowWindow(swapchain->device_window, SW_MINIMIZE);
--
2.18.1
More information about the wine-devel
mailing list