[PATCH 8/8] wined3d: Restore display modes for all outputs when doing mode restoration.

Zhiyi Zhang zzhang at codeweavers.com
Wed Oct 28 01:38:55 CDT 2020


Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
 dlls/d3d8/tests/device.c  | 30 ++++++-------
 dlls/d3d9/tests/device.c  | 30 ++++++-------
 dlls/ddraw/ddraw.c        |  2 +-
 dlls/ddraw/tests/ddraw1.c | 10 ++---
 dlls/ddraw/tests/ddraw2.c | 10 ++---
 dlls/ddraw/tests/ddraw4.c | 10 ++---
 dlls/ddraw/tests/ddraw7.c | 10 ++---
 dlls/dxgi/tests/dxgi.c    | 14 +++---
 dlls/wined3d/directx.c    | 93 +++++++++++++++++++++++++--------------
 dlls/wined3d/swapchain.c  | 55 +++++++++++++----------
 dlls/wined3d/wined3d.spec |  1 +
 include/wine/wined3d.h    |  1 +
 12 files changed, 151 insertions(+), 115 deletions(-)

diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c
index 8c7737f6601..80de1ec9dbb 100644
--- a/dlls/d3d8/tests/device.c
+++ b/dlls/d3d8/tests/device.c
@@ -4331,7 +4331,7 @@ static void test_mode_change(void)
 
     ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode);
     ok(ret, "Failed to get display mode.\n");
-    todo_wine ok(devmode.dmPelsWidth == registry_mode.dmPelsWidth
+    ok(devmode.dmPelsWidth == registry_mode.dmPelsWidth
             && devmode.dmPelsHeight == registry_mode.dmPelsHeight,
             "Expected resolution %ux%u, got %ux%u.\n",
             registry_mode.dmPelsWidth, registry_mode.dmPelsHeight, devmode.dmPelsWidth, devmode.dmPelsHeight);
@@ -4411,7 +4411,7 @@ static void test_mode_change(void)
 
     ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
+    ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(NULL, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
@@ -4449,7 +4449,7 @@ static void test_mode_change(void)
 
     ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
+    ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(NULL, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
@@ -4535,15 +4535,15 @@ static void test_mode_change(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     hr = IDirect3D8_GetAdapterDisplayMode(d3d8, 1, &d3ddm);
     ok(hr == S_OK, "GetAdapterDisplayMode failed, hr %#x.\n", hr);
-    todo_wine ok(d3ddm.Width == old_devmode.dmPelsWidth, "Expected width %u, got %u.\n",
+    ok(d3ddm.Width == old_devmode.dmPelsWidth, "Expected width %u, got %u.\n",
             old_devmode.dmPelsWidth, d3ddm.Width);
-    todo_wine ok(d3ddm.Height == old_devmode.dmPelsHeight, "Expected height %u, got %u.\n",
+    ok(d3ddm.Height == old_devmode.dmPelsHeight, "Expected height %u, got %u.\n",
             old_devmode.dmPelsHeight, d3ddm.Height);
 
     refcount = IDirect3DDevice8_Release(device);
@@ -4571,15 +4571,15 @@ static void test_mode_change(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     hr = IDirect3D8_GetAdapterDisplayMode(d3d8, 1, &d3ddm);
     ok(hr == S_OK, "GetAdapterDisplayMode failed, hr %#x.\n", hr);
-    todo_wine ok(d3ddm.Width == old_devmode.dmPelsWidth, "Expected width %u, got %u.\n",
+    ok(d3ddm.Width == old_devmode.dmPelsWidth, "Expected width %u, got %u.\n",
             old_devmode.dmPelsWidth, d3ddm.Width);
-    todo_wine ok(d3ddm.Height == old_devmode.dmPelsHeight, "Expected height %u, got %u.\n",
+    ok(d3ddm.Height == old_devmode.dmPelsHeight, "Expected height %u, got %u.\n",
             old_devmode.dmPelsHeight, d3ddm.Height);
     ret = restore_display_modes(original_modes, display_count);
     ok(ret, "Failed to restore display modes.\n");
@@ -4600,7 +4600,7 @@ static void test_mode_change(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
+    ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
             "Expected resolution %ux%u, got %ux%u.\n", devmode.dmPelsWidth, devmode.dmPelsHeight,
             devmode2.dmPelsWidth, devmode2.dmPelsHeight);
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
@@ -4610,7 +4610,7 @@ static void test_mode_change(void)
             devmode2.dmPelsWidth, devmode2.dmPelsHeight);
     hr = IDirect3D8_GetAdapterDisplayMode(d3d8, 1, &d3ddm);
     ok(hr == S_OK, "GetAdapterDisplayMode failed, hr %#x.\n", hr);
-    todo_wine ok(d3ddm.Width == devmode.dmPelsWidth && d3ddm.Height == devmode.dmPelsHeight,
+    ok(d3ddm.Width == devmode.dmPelsWidth && d3ddm.Height == devmode.dmPelsHeight,
             "Expected resolution %ux%u, got %ux%u.\n", devmode.dmPelsWidth, devmode.dmPelsHeight,
             d3ddm.Width, d3ddm.Height);
     ret = restore_display_modes(original_modes, display_count);
@@ -4645,13 +4645,13 @@ static void test_mode_change(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     hr = IDirect3D8_GetAdapterDisplayMode(d3d8, 1, &d3ddm);
     ok(hr == S_OK, "GetAdapterDisplayMode failed, hr %#x.\n", hr);
-    todo_wine ok(d3ddm.Width == old_devmode.dmPelsWidth && d3ddm.Height == old_devmode.dmPelsHeight,
+    ok(d3ddm.Width == old_devmode.dmPelsWidth && d3ddm.Height == old_devmode.dmPelsHeight,
             "Expected resolution %ux%u, got %ux%u.\n", old_devmode.dmPelsWidth,
             old_devmode.dmPelsHeight, d3ddm.Width, d3ddm.Height);
 
@@ -4686,13 +4686,13 @@ static void test_mode_change(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     hr = IDirect3D8_GetAdapterDisplayMode(d3d8, 1, &d3ddm);
     ok(hr == S_OK, "GetAdapterDisplayMode failed, hr %#x.\n", hr);
-    todo_wine ok(d3ddm.Width == old_devmode.dmPelsWidth && d3ddm.Height == old_devmode.dmPelsHeight,
+    ok(d3ddm.Width == old_devmode.dmPelsWidth && d3ddm.Height == old_devmode.dmPelsHeight,
             "Expected resolution %ux%u, got %ux%u.\n", old_devmode.dmPelsWidth,
             old_devmode.dmPelsHeight, d3ddm.Width, d3ddm.Height);
 
diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c
index d7b71152b03..bc9e1d32d11 100644
--- a/dlls/d3d9/tests/device.c
+++ b/dlls/d3d9/tests/device.c
@@ -5418,7 +5418,7 @@ static void test_mode_change(void)
 
     ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode);
     ok(ret, "Failed to get display mode.\n");
-    todo_wine ok(devmode.dmPelsWidth == registry_mode.dmPelsWidth
+    ok(devmode.dmPelsWidth == registry_mode.dmPelsWidth
             && devmode.dmPelsHeight == registry_mode.dmPelsHeight,
             "Expected resolution %ux%u, got %ux%u.\n",
             registry_mode.dmPelsWidth, registry_mode.dmPelsHeight, devmode.dmPelsWidth, devmode.dmPelsHeight);
@@ -5498,7 +5498,7 @@ static void test_mode_change(void)
 
     ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
+    ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(NULL, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
@@ -5536,7 +5536,7 @@ static void test_mode_change(void)
 
     ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
+    ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(NULL, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
@@ -5622,15 +5622,15 @@ static void test_mode_change(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     hr = IDirect3D9_GetAdapterDisplayMode(d3d9, 1, &d3ddm);
     ok(hr == S_OK, "GetAdapterDisplayMode failed, hr %#x.\n", hr);
-    todo_wine ok(d3ddm.Width == old_devmode.dmPelsWidth, "Expected width %u, got %u.\n",
+    ok(d3ddm.Width == old_devmode.dmPelsWidth, "Expected width %u, got %u.\n",
             old_devmode.dmPelsWidth, d3ddm.Width);
-    todo_wine ok(d3ddm.Height == old_devmode.dmPelsHeight, "Expected height %u, got %u.\n",
+    ok(d3ddm.Height == old_devmode.dmPelsHeight, "Expected height %u, got %u.\n",
             old_devmode.dmPelsHeight, d3ddm.Height);
 
     refcount = IDirect3DDevice9_Release(device);
@@ -5658,15 +5658,15 @@ static void test_mode_change(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     hr = IDirect3D9_GetAdapterDisplayMode(d3d9, 1, &d3ddm);
     ok(hr == S_OK, "GetAdapterDisplayMode failed, hr %#x.\n", hr);
-    todo_wine ok(d3ddm.Width == old_devmode.dmPelsWidth, "Expected width %u, got %u.\n",
+    ok(d3ddm.Width == old_devmode.dmPelsWidth, "Expected width %u, got %u.\n",
             old_devmode.dmPelsWidth, d3ddm.Width);
-    todo_wine ok(d3ddm.Height == old_devmode.dmPelsHeight, "Expected height %u, got %u.\n",
+    ok(d3ddm.Height == old_devmode.dmPelsHeight, "Expected height %u, got %u.\n",
             old_devmode.dmPelsHeight, d3ddm.Height);
     ret = restore_display_modes(original_modes, display_count);
     ok(ret, "Failed to restore display modes.\n");
@@ -5687,7 +5687,7 @@ static void test_mode_change(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
+    ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
             "Expected resolution %ux%u, got %ux%u.\n", devmode.dmPelsWidth, devmode.dmPelsHeight,
             devmode2.dmPelsWidth, devmode2.dmPelsHeight);
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
@@ -5697,7 +5697,7 @@ static void test_mode_change(void)
             devmode2.dmPelsWidth, devmode2.dmPelsHeight);
     hr = IDirect3D9_GetAdapterDisplayMode(d3d9, 1, &d3ddm);
     ok(hr == S_OK, "GetAdapterDisplayMode failed, hr %#x.\n", hr);
-    todo_wine ok(d3ddm.Width == devmode.dmPelsWidth && d3ddm.Height == devmode.dmPelsHeight,
+    ok(d3ddm.Width == devmode.dmPelsWidth && d3ddm.Height == devmode.dmPelsHeight,
             "Expected resolution %ux%u, got %ux%u.\n", devmode.dmPelsWidth, devmode.dmPelsHeight,
             d3ddm.Width, d3ddm.Height);
     ret = restore_display_modes(original_modes, display_count);
@@ -5732,13 +5732,13 @@ static void test_mode_change(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     hr = IDirect3D9_GetAdapterDisplayMode(d3d9, 1, &d3ddm);
     ok(hr == S_OK, "GetAdapterDisplayMode failed, hr %#x.\n", hr);
-    todo_wine ok(d3ddm.Width == old_devmode.dmPelsWidth && d3ddm.Height == old_devmode.dmPelsHeight,
+    ok(d3ddm.Width == old_devmode.dmPelsWidth && d3ddm.Height == old_devmode.dmPelsHeight,
             "Expected resolution %ux%u, got %ux%u.\n", old_devmode.dmPelsWidth,
             old_devmode.dmPelsHeight, d3ddm.Width, d3ddm.Height);
 
@@ -5773,13 +5773,13 @@ static void test_mode_change(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     hr = IDirect3D9_GetAdapterDisplayMode(d3d9, 1, &d3ddm);
     ok(hr == S_OK, "GetAdapterDisplayMode failed, hr %#x.\n", hr);
-    todo_wine ok(d3ddm.Width == old_devmode.dmPelsWidth && d3ddm.Height == old_devmode.dmPelsHeight,
+    ok(d3ddm.Width == old_devmode.dmPelsWidth && d3ddm.Height == old_devmode.dmPelsHeight,
             "Expected resolution %ux%u, got %ux%u.\n", old_devmode.dmPelsWidth,
             old_devmode.dmPelsHeight, d3ddm.Width, d3ddm.Height);
 
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 11a16f8d535..f78d344c085 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -698,7 +698,7 @@ static HRESULT WINAPI ddraw7_RestoreDisplayMode(IDirectDraw7 *iface)
         return DDERR_NOEXCLUSIVEMODE;
     }
 
-    if (SUCCEEDED(hr = wined3d_output_set_display_mode(ddraw->wined3d_output, NULL)))
+    if (SUCCEEDED(hr = wined3d_restore_display_modes(ddraw->wined3d)))
     {
         ddraw->flags &= ~DDRAW_RESTORE_MODE;
         if (ddraw->cooperative_level & DDSCL_EXCLUSIVE &&
diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index 783c1b961a0..e1a315f291f 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -3784,7 +3784,7 @@ static void test_coop_level_mode_set_multi(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -3805,7 +3805,7 @@ static void test_coop_level_mode_set_multi(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -3830,7 +3830,7 @@ static void test_coop_level_mode_set_multi(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
+    ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
             "Expected resolution %ux%u, got %ux%u.\n", devmode.dmPelsWidth, devmode.dmPelsHeight,
             devmode2.dmPelsWidth, devmode2.dmPelsHeight);
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
@@ -3860,7 +3860,7 @@ static void test_coop_level_mode_set_multi(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -3891,7 +3891,7 @@ static void test_coop_level_mode_set_multi(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c
index 23d3e0c1f02..849d510a349 100644
--- a/dlls/ddraw/tests/ddraw2.c
+++ b/dlls/ddraw/tests/ddraw2.c
@@ -3944,7 +3944,7 @@ static void test_coop_level_mode_set_multi(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -3965,7 +3965,7 @@ static void test_coop_level_mode_set_multi(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -3990,7 +3990,7 @@ static void test_coop_level_mode_set_multi(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
+    ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
             "Expected resolution %ux%u, got %ux%u.\n", devmode.dmPelsWidth, devmode.dmPelsHeight,
             devmode2.dmPelsWidth, devmode2.dmPelsHeight);
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
@@ -4020,7 +4020,7 @@ static void test_coop_level_mode_set_multi(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -4051,7 +4051,7 @@ static void test_coop_level_mode_set_multi(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index 12cfbc3784f..56a4777add5 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -4172,7 +4172,7 @@ static void test_coop_level_mode_set_multi(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -4193,7 +4193,7 @@ static void test_coop_level_mode_set_multi(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -4218,7 +4218,7 @@ static void test_coop_level_mode_set_multi(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
+    ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
             "Expected resolution %ux%u, got %ux%u.\n", devmode.dmPelsWidth, devmode.dmPelsHeight,
             devmode2.dmPelsWidth, devmode2.dmPelsHeight);
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
@@ -4248,7 +4248,7 @@ static void test_coop_level_mode_set_multi(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -4279,7 +4279,7 @@ static void test_coop_level_mode_set_multi(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index c214cbc221e..c9ba50287be 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -3819,7 +3819,7 @@ static void test_coop_level_mode_set_multi(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -3840,7 +3840,7 @@ static void test_coop_level_mode_set_multi(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -3865,7 +3865,7 @@ static void test_coop_level_mode_set_multi(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
+    ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
             "Expected resolution %ux%u, got %ux%u.\n", devmode.dmPelsWidth, devmode.dmPelsHeight,
             devmode2.dmPelsWidth, devmode2.dmPelsHeight);
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
@@ -3895,7 +3895,7 @@ static void test_coop_level_mode_set_multi(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
@@ -3926,7 +3926,7 @@ static void test_coop_level_mode_set_multi(void)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(compare_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
diff --git a/dlls/dxgi/tests/dxgi.c b/dlls/dxgi/tests/dxgi.c
index 4d9677b3762..e6c8e0eb8c4 100644
--- a/dlls/dxgi/tests/dxgi.c
+++ b/dlls/dxgi/tests/dxgi.c
@@ -7097,7 +7097,7 @@ static void test_mode_change(IUnknown *device, BOOL is_d3d12)
 
     ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
+    ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(NULL, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(equal_mode_rect(&devmode2, &devmode), "Got a different mode.\n");
@@ -7196,16 +7196,16 @@ static void test_mode_change(IUnknown *device, BOOL is_d3d12)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
+    ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
     ok(equal_mode_rect(&devmode2, &old_devmode), "Got a different mode.\n");
     hr = IDXGIOutput_GetDesc(second_output, &output_desc);
     ok(hr == S_OK, "GetDesc failed, hr %#x.\n", hr);
-    todo_wine ok(output_desc.DesktopCoordinates.right - output_desc.DesktopCoordinates.left ==
+    ok(output_desc.DesktopCoordinates.right - output_desc.DesktopCoordinates.left ==
             old_devmode.dmPelsWidth, "Expected width %u, got %u.\n", old_devmode.dmPelsWidth,
             output_desc.DesktopCoordinates.right - output_desc.DesktopCoordinates.left);
-    todo_wine ok(output_desc.DesktopCoordinates.bottom - output_desc.DesktopCoordinates.top ==
+    ok(output_desc.DesktopCoordinates.bottom - output_desc.DesktopCoordinates.top ==
             old_devmode.dmPelsHeight, "Expected height %u, got %u.\n", old_devmode.dmPelsHeight,
             output_desc.DesktopCoordinates.bottom - output_desc.DesktopCoordinates.top);
 
@@ -7228,7 +7228,7 @@ static void test_mode_change(IUnknown *device, BOOL is_d3d12)
 
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2);
     ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError());
-    todo_wine ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
+    ok(devmode2.dmPelsWidth == devmode.dmPelsWidth && devmode2.dmPelsHeight == devmode.dmPelsHeight,
             "Expected resolution %ux%u, got %ux%u.\n", devmode.dmPelsWidth, devmode.dmPelsHeight,
             devmode2.dmPelsWidth, devmode2.dmPelsHeight);
     ret = EnumDisplaySettingsW(second_monitor_name, ENUM_REGISTRY_SETTINGS, &devmode2);
@@ -7238,10 +7238,10 @@ static void test_mode_change(IUnknown *device, BOOL is_d3d12)
             devmode2.dmPelsWidth, devmode2.dmPelsHeight);
     hr = IDXGIOutput_GetDesc(second_output, &output_desc);
     ok(hr == S_OK, "GetDesc failed, hr %#x.\n", hr);
-    todo_wine ok(output_desc.DesktopCoordinates.right - output_desc.DesktopCoordinates.left ==
+    ok(output_desc.DesktopCoordinates.right - output_desc.DesktopCoordinates.left ==
             devmode.dmPelsWidth, "Expected width %u, got %u.\n", devmode.dmPelsWidth,
             output_desc.DesktopCoordinates.right - output_desc.DesktopCoordinates.left);
-    todo_wine ok(output_desc.DesktopCoordinates.bottom - output_desc.DesktopCoordinates.top ==
+    ok(output_desc.DesktopCoordinates.bottom - output_desc.DesktopCoordinates.top ==
             devmode.dmPelsHeight, "Expected height %u, got %u.\n", devmode.dmPelsHeight,
             output_desc.DesktopCoordinates.bottom - output_desc.DesktopCoordinates.top);
 
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index c11fa22cc38..aa257de44ee 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -1320,54 +1320,79 @@ HRESULT CDECL wined3d_output_get_display_mode(const struct wined3d_output *outpu
     return WINED3D_OK;
 }
 
+HRESULT CDECL wined3d_restore_display_modes(struct wined3d *wined3d)
+{
+    unsigned int adapter_idx, output_idx;
+    struct wined3d_adapter *adapter;
+    struct wined3d_output *output;
+    DEVMODEW devmode;
+    LONG ret;
+
+    TRACE("wined3d %p.\n", wined3d);
+
+    ret = ChangeDisplaySettingsExW(NULL, NULL, NULL, 0, NULL);
+    if (ret != DISP_CHANGE_SUCCESSFUL)
+    {
+        ERR("Failed to restore all outputs to their registry display settings, error %d.\n", ret);
+        return WINED3DERR_NOTAVAILABLE;
+    }
+
+    memset(&devmode, 0, sizeof(devmode));
+    devmode.dmSize = sizeof(devmode);
+    for (adapter_idx = 0; adapter_idx < wined3d->adapter_count; ++adapter_idx)
+    {
+        adapter = wined3d->adapters[adapter_idx];
+        for (output_idx = 0; output_idx < adapter->output_count; ++output_idx)
+        {
+            output = &adapter->outputs[output_idx];
+
+            if (!EnumDisplaySettingsExW(output->device_name, ENUM_CURRENT_SETTINGS, &devmode, 0))
+            {
+                ERR("Failed to read the current display mode for %s.\n",
+                        wine_dbgstr_w(output->device_name));
+                return WINED3DERR_NOTAVAILABLE;
+            }
+
+            output->screen_format = pixelformat_for_depth(devmode.dmBitsPerPel);
+        }
+    }
+
+    return WINED3D_OK;
+}
+
 HRESULT CDECL wined3d_output_set_display_mode(struct wined3d_output *output,
         const struct wined3d_display_mode *mode)
 {
+    enum wined3d_format_id new_format_id;
+    const struct wined3d_format *format;
     DEVMODEW new_mode, current_mode;
     LONG ret;
-    enum wined3d_format_id new_format_id;
 
     TRACE("output %p, mode %p.\n", output, mode);
+    TRACE("mode %ux%u@%u %s %#x.\n", mode->width, mode->height, mode->refresh_rate,
+            debug_d3dformat(mode->format_id), mode->scanline_ordering);
 
     memset(&new_mode, 0, sizeof(new_mode));
     new_mode.dmSize = sizeof(new_mode);
     memset(&current_mode, 0, sizeof(current_mode));
     current_mode.dmSize = sizeof(current_mode);
-    if (mode)
+
+    format = wined3d_get_format(output->adapter, mode->format_id, WINED3D_BIND_RENDER_TARGET);
+
+    new_mode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
+    new_mode.dmBitsPerPel = format->byte_count * CHAR_BIT;
+    new_mode.dmPelsWidth = mode->width;
+    new_mode.dmPelsHeight = mode->height;
+    new_mode.dmDisplayFrequency = mode->refresh_rate;
+    if (mode->refresh_rate)
+        new_mode.dmFields |= DM_DISPLAYFREQUENCY;
+    if (mode->scanline_ordering != WINED3D_SCANLINE_ORDERING_UNKNOWN)
     {
-        const struct wined3d_format *format;
-
-        TRACE("mode %ux%u@%u %s %#x.\n", mode->width, mode->height, mode->refresh_rate,
-                debug_d3dformat(mode->format_id), mode->scanline_ordering);
-
-        format = wined3d_get_format(output->adapter, mode->format_id, WINED3D_BIND_RENDER_TARGET);
-
-        new_mode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
-        new_mode.dmBitsPerPel = format->byte_count * CHAR_BIT;
-        new_mode.dmPelsWidth = mode->width;
-        new_mode.dmPelsHeight = mode->height;
-
-        new_mode.dmDisplayFrequency = mode->refresh_rate;
-        if (mode->refresh_rate)
-            new_mode.dmFields |= DM_DISPLAYFREQUENCY;
-
-        if (mode->scanline_ordering != WINED3D_SCANLINE_ORDERING_UNKNOWN)
-        {
-            new_mode.dmFields |= DM_DISPLAYFLAGS;
-            if (mode->scanline_ordering == WINED3D_SCANLINE_ORDERING_INTERLACED)
-                new_mode.u2.dmDisplayFlags |= DM_INTERLACED;
-        }
-        new_format_id = mode->format_id;
-    }
-    else
-    {
-        if (!EnumDisplaySettingsW(output->device_name, ENUM_REGISTRY_SETTINGS, &new_mode))
-        {
-            ERR("Failed to read mode from registry.\n");
-            return WINED3DERR_NOTAVAILABLE;
-        }
-        new_format_id = pixelformat_for_depth(new_mode.dmBitsPerPel);
+        new_mode.dmFields |= DM_DISPLAYFLAGS;
+        if (mode->scanline_ordering == WINED3D_SCANLINE_ORDERING_INTERLACED)
+            new_mode.u2.dmDisplayFlags |= DM_INTERLACED;
     }
+    new_format_id = mode->format_id;
 
     /* Only change the mode if necessary. */
     if (!EnumDisplaySettingsW(output->device_name, ENUM_CURRENT_SETTINGS, &current_mode))
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 847907c6d4c..7e46e5c6150 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -28,8 +28,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d);
 
 void wined3d_swapchain_cleanup(struct wined3d_swapchain *swapchain)
 {
-    struct wined3d_output *output;
-    HRESULT hr = E_FAIL;
+    HRESULT hr;
     UINT i;
 
     TRACE("Destroying swapchain %p.\n", swapchain);
@@ -71,9 +70,7 @@ void wined3d_swapchain_cleanup(struct wined3d_swapchain *swapchain)
     {
         if (swapchain->state.desc.auto_restore_display_mode)
         {
-            output = wined3d_swapchain_get_output(swapchain);
-            if (!output || FAILED(hr = wined3d_output_set_display_mode(output,
-                    &swapchain->state.original_mode)))
+            if (FAILED(hr = wined3d_restore_display_modes(swapchain->device->wined3d)))
                 ERR("Failed to restore display mode, hr %#x.\n", hr);
 
             if (swapchain->state.desc.flags & WINED3D_SWAPCHAIN_RESTORE_WINDOW_RECT)
@@ -1543,8 +1540,7 @@ static HRESULT wined3d_swapchain_init(struct wined3d_swapchain *swapchain, struc
 err:
     if (displaymode_set)
     {
-        if (FAILED(wined3d_output_set_display_mode(desc->output,
-                &swapchain->state.original_mode)))
+        if (FAILED(wined3d_restore_display_modes(device->wined3d)))
             ERR("Failed to restore display mode.\n");
     }
 
@@ -1791,13 +1787,6 @@ void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activa
     if (!(focus_messages = device->wined3d->flags & WINED3D_FOCUS_MESSAGES))
         filter = wined3d_filter_messages(window, TRUE);
 
-    output = wined3d_swapchain_get_output(swapchain);
-    if (!output)
-    {
-        ERR("Failed to get output from swapchain %p.\n", swapchain);
-        return;
-    }
-
     if (activate)
     {
         SystemParametersInfoW(SPI_GETSCREENSAVEACTIVE, 0, &screensaver_active, 0);
@@ -1813,6 +1802,13 @@ void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activa
              *
              * Guild Wars 1 wants a WINDOWPOSCHANGED message on the device window to
              * resume drawing after a focus loss. */
+            output = wined3d_swapchain_get_output(swapchain);
+            if (!output)
+            {
+                ERR("Failed to get output from swapchain %p.\n", swapchain);
+                return;
+            }
+
             if (SUCCEEDED(hr = wined3d_output_get_desc(output, &output_desc)))
                 SetWindowPos(window, NULL, output_desc.desktop_rect.left,
                         output_desc.desktop_rect.top, swapchain->state.desc.backbuffer_width,
@@ -1823,6 +1819,13 @@ void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activa
 
         if (device->wined3d->flags & WINED3D_RESTORE_MODE_ON_ACTIVATE)
         {
+            output = wined3d_swapchain_get_output(swapchain);
+            if (!output)
+            {
+                ERR("Failed to get output from swapchain %p.\n", swapchain);
+                return;
+            }
+
             if (FAILED(hr = wined3d_output_set_display_mode(output,
                     &swapchain->state.d3d_mode)))
                 ERR("Failed to set display mode, hr %#x.\n", hr);
@@ -1839,8 +1842,8 @@ void wined3d_swapchain_activate(struct wined3d_swapchain *swapchain, BOOL activa
             device->restore_screensaver = FALSE;
         }
 
-        if (FAILED(hr = wined3d_output_set_display_mode(output, NULL)))
-            ERR("Failed to set display mode, hr %#x.\n", hr);
+        if (FAILED(hr = wined3d_restore_display_modes(device->wined3d)))
+            ERR("Failed to restore display modes, hr %#x.\n", hr);
 
         swapchain->reapply_mode = TRUE;
 
@@ -1974,9 +1977,9 @@ static HRESULT wined3d_swapchain_state_set_display_mode(struct wined3d_swapchain
 
     if (output != state->desc.output)
     {
-        if (FAILED(hr = wined3d_output_set_display_mode(state->desc.output, &state->original_mode)))
+        if (FAILED(hr = wined3d_restore_display_modes(state->wined3d)))
         {
-            WARN("Failed to set display mode, hr %#x.\n", hr);
+            WARN("Failed to restore display modes, hr %#x.\n", hr);
             return hr;
         }
 
@@ -2199,6 +2202,9 @@ HRESULT CDECL wined3d_swapchain_state_set_fullscreen(struct wined3d_swapchain_st
         if (mode)
         {
             actual_mode = *mode;
+            if (FAILED(hr = wined3d_swapchain_state_set_display_mode(state, swapchain_desc->output,
+                    &actual_mode)))
+                return hr;
         }
         else
         {
@@ -2210,16 +2216,19 @@ HRESULT CDECL wined3d_swapchain_state_set_fullscreen(struct wined3d_swapchain_st
                 actual_mode.format_id = adapter_format_from_backbuffer_format(swapchain_desc->output->adapter,
                         swapchain_desc->backbuffer_format);
                 actual_mode.scanline_ordering = WINED3D_SCANLINE_ORDERING_UNKNOWN;
+                if (FAILED(hr = wined3d_swapchain_state_set_display_mode(state, swapchain_desc->output,
+                        &actual_mode)))
+                    return hr;
             }
             else
             {
-                actual_mode = state->original_mode;
+                if (FAILED(hr = wined3d_restore_display_modes(state->wined3d)))
+                {
+                    WARN("Failed to restore display modes for all outputs, hr %#x.\n", hr);
+                    return hr;
+                }
             }
         }
-
-        if (FAILED(hr = wined3d_swapchain_state_set_display_mode(state, swapchain_desc->output,
-                &actual_mode)))
-            return hr;
     }
     else
     {
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index e4ff1161bce..44008119a8d 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -15,6 +15,7 @@
 @ cdecl wined3d_incref(ptr)
 @ cdecl wined3d_register_software_device(ptr ptr)
 @ cdecl wined3d_register_window(ptr ptr ptr long)
+@ cdecl wined3d_restore_display_modes(ptr)
 @ cdecl wined3d_unregister_windows(ptr)
 
 @ cdecl wined3d_adapter_get_identifier(ptr long ptr)
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 62ea3960118..4a06b511211 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2313,6 +2313,7 @@ ULONG __cdecl wined3d_incref(struct wined3d *wined3d);
 HRESULT __cdecl wined3d_register_software_device(struct wined3d *wined3d, void *init_function);
 BOOL __cdecl wined3d_register_window(struct wined3d *wined3d, HWND window,
         struct wined3d_device *device, unsigned int flags);
+HRESULT __cdecl wined3d_restore_display_modes(struct wined3d *wined3d);
 void __cdecl wined3d_unregister_windows(struct wined3d *wined3d);
 
 HRESULT __cdecl wined3d_adapter_get_identifier(const struct wined3d_adapter *adapter,
-- 
2.27.0



More information about the wine-devel mailing list