[PATCH 4/8] d3d8/tests: Test display mode restoration.
Mostly to test that when doing mode restoration, all display outputs get restored to their display settings in the registry, not just one output gets restored. Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com> --- dlls/d3d8/tests/device.c | 383 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 372 insertions(+), 11 deletions(-) diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c index f48a51cee85..8c7737f6601 100644 --- a/dlls/d3d8/tests/device.c +++ b/dlls/d3d8/tests/device.c @@ -114,6 +114,14 @@ static BOOL adapter_is_warp(const D3DADAPTER_IDENTIFIER8 *identifier) return !strcmp(identifier->Driver, "d3d10warp.dll"); } +static BOOL equal_mode_rect(const DEVMODEW *mode1, const DEVMODEW *mode2) +{ + return mode1->dmPosition.x == mode2->dmPosition.x + && mode1->dmPosition.y == mode2->dmPosition.y + && mode1->dmPelsWidth == mode2->dmPelsWidth + && mode1->dmPelsHeight == mode2->dmPelsHeight; +} + /* Free original_modes after finished using it */ static BOOL save_display_modes(DEVMODEW **original_modes, unsigned int *display_count) { @@ -4176,13 +4184,17 @@ static void test_unsupported_shaders(void) static void test_mode_change(void) { + DEVMODEW old_devmode, devmode, devmode2, *original_modes = NULL; + struct device_desc device_desc, device_desc2; + WCHAR second_monitor_name[CCHDEVICENAME]; + IDirect3DDevice8 *device, *device2; + unsigned int display_count = 0; RECT d3d_rect, focus_rect, r; - struct device_desc device_desc; IDirect3DSurface8 *backbuffer; - IDirect3DDevice8 *device; + MONITORINFOEXW monitor_info; + HMONITOR second_monitor; D3DSURFACE_DESC desc; IDirect3D8 *d3d8; - DEVMODEW devmode; ULONG refcount; UINT adapter_mode_count, i; HRESULT hr; @@ -4191,6 +4203,15 @@ static void test_mode_change(void) D3DDISPLAYMODE d3ddm; DWORD d3d_width = 0, d3d_height = 0, user32_width = 0, user32_height = 0; + memset(&devmode, 0, sizeof(devmode)); + devmode.dmSize = sizeof(devmode); + ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode); + ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError()); + ok(equal_mode_rect(&devmode, ®istry_mode), "Got a different mode.\n"); + ret = EnumDisplaySettingsW(NULL, ENUM_REGISTRY_SETTINGS, &devmode); + ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError()); + ok(equal_mode_rect(&devmode, ®istry_mode), "Got a different mode.\n"); + d3d8 = Direct3DCreate8(D3D_SDK_VERSION); ok(!!d3d8, "Failed to create a D3D object.\n"); @@ -4245,6 +4266,9 @@ static void test_mode_change(void) return; } + ret = save_display_modes(&original_modes, &display_count); + ok(ret, "Failed to save original display modes.\n"); + memset(&devmode, 0, sizeof(devmode)); devmode.dmSize = sizeof(devmode); devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; @@ -4271,8 +4295,6 @@ static void test_mode_change(void) if (!(device = create_device(d3d8, focus_window, &device_desc))) { skip("Failed to create a D3D device, skipping tests.\n"); - change_ret = ChangeDisplaySettingsW(NULL, CDS_FULLSCREEN); - ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); goto done; } @@ -4324,8 +4346,13 @@ static void test_mode_change(void) device_desc.width = registry_mode.dmPelsWidth; device_desc.height = registry_mode.dmPelsHeight; device_desc.flags = CREATE_DEVICE_FULLSCREEN; - ok(!!(device = create_device(d3d8, focus_window, &device_desc)), "Failed to create a D3D device.\n"); + if (!(device = create_device(d3d8, focus_window, &device_desc))) + { + skip("Failed to create a D3D device, skipping tests.\n"); + goto done; + } + devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; devmode.dmPelsWidth = user32_width; devmode.dmPelsHeight = user32_height; change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN); @@ -4334,17 +4361,351 @@ static void test_mode_change(void) refcount = IDirect3DDevice8_Release(device); ok(!refcount, "Device has %u references left.\n", refcount); - ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode); + memset(&devmode2, 0, sizeof(devmode2)); + devmode2.dmSize = sizeof(devmode2); + ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode2); ok(ret, "Failed to get display mode.\n"); - 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); + ok(devmode2.dmPelsWidth == registry_mode.dmPelsWidth + && devmode2.dmPelsHeight == registry_mode.dmPelsHeight, + "Expected resolution %ux%u, got %ux%u.\n", registry_mode.dmPelsWidth, + registry_mode.dmPelsHeight, devmode2.dmPelsWidth, devmode2.dmPelsHeight); + ret = restore_display_modes(original_modes, display_count); + ok(ret, "Failed to restore display modes.\n"); + + /* Test that no mode restorations if no mode changes happened */ + change_ret = ChangeDisplaySettingsW(&devmode, CDS_UPDATEREGISTRY | CDS_NORESET); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsW failed with %d.\n", change_ret); + + device_desc.adapter_ordinal = D3DADAPTER_DEFAULT; + device_desc.device_window = device_window; + device_desc.width = d3d_width; + device_desc.height = d3d_height; + device_desc.flags = 0; + device = create_device(d3d8, device_window, &device_desc); + ok(!!device, "Failed to create a D3D device.\n"); + refcount = IDirect3DDevice8_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); + + ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode2); + ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError()); + ok(equal_mode_rect(&devmode2, ®istry_mode), "Got a different mode.\n"); + ret = restore_display_modes(original_modes, display_count); + ok(ret, "Failed to restore display modes.\n"); + + /* Test that mode restorations use display settings in the registry with a fullscreen device */ + change_ret = ChangeDisplaySettingsW(&devmode, CDS_UPDATEREGISTRY | CDS_NORESET); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsW failed with %d.\n", change_ret); + + device_desc.adapter_ordinal = D3DADAPTER_DEFAULT; + device_desc.device_window = device_window; + device_desc.width = registry_mode.dmPelsWidth; + device_desc.height = registry_mode.dmPelsHeight; + device_desc.flags = CREATE_DEVICE_FULLSCREEN; + if (!(device = create_device(d3d8, device_window, &device_desc))) + { + skip("Failed to create a D3D device, skipping tests.\n"); + goto done; + } + refcount = IDirect3DDevice8_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); + + 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"); + 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"); + ret = restore_display_modes(original_modes, display_count); + ok(ret, "Failed to restore display modes.\n"); + + /* Test that mode restorations use display settings in the registry with a fullscreen device + * having the same display mode and then reset to a different mode */ + change_ret = ChangeDisplaySettingsW(&devmode, CDS_UPDATEREGISTRY | CDS_NORESET); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsW failed with %d.\n", change_ret); + + device_desc.adapter_ordinal = D3DADAPTER_DEFAULT; + device_desc.device_window = device_window; + device_desc.width = registry_mode.dmPelsWidth; + device_desc.height = registry_mode.dmPelsHeight; + device_desc.flags = CREATE_DEVICE_FULLSCREEN; + if (!(device = create_device(d3d8, device_window, &device_desc))) + { + skip("Failed to create a D3D device, skipping tests.\n"); + goto done; + } + + device_desc.width = d3d_width; + device_desc.height = d3d_height; + hr = reset_device(device, &device_desc); + ok(hr == D3D_OK, "Failed to reset device, hr %#x.\n", hr); + ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode2); + ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError()); + ok(devmode2.dmPelsWidth == d3d_width && devmode2.dmPelsHeight == d3d_height, + "Expected resolution %ux%u, got %ux%u.\n", d3d_width, d3d_height, + devmode2.dmPelsWidth, devmode2.dmPelsHeight); + + refcount = IDirect3DDevice8_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); + + 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"); + 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"); + ret = restore_display_modes(original_modes, display_count); + ok(ret, "Failed to restore display modes.\n"); + + if (IDirect3D8_GetAdapterCount(d3d8) < 2) + { + skip("Following tests require two adapters.\n"); + goto done; + } + + second_monitor = IDirect3D8_GetAdapterMonitor(d3d8, 1); + monitor_info.cbSize = sizeof(monitor_info); + ret = GetMonitorInfoW(second_monitor, (MONITORINFO *)&monitor_info); + ok(ret, "GetMonitorInfoW failed, error %#x.\n", GetLastError()); + lstrcpyW(second_monitor_name, monitor_info.szDevice); + + memset(&old_devmode, 0, sizeof(old_devmode)); + old_devmode.dmSize = sizeof(old_devmode); + ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &old_devmode); + ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError()); + + i = 0; + d3d_width = 0; + d3d_height = 0; + user32_width = 0; + user32_height = 0; + while (EnumDisplaySettingsW(second_monitor_name, i++, &devmode)) + { + if (devmode.dmPelsWidth == old_devmode.dmPelsWidth + && devmode.dmPelsHeight == old_devmode.dmPelsHeight) + continue; + + if (!d3d_width && !d3d_height) + { + d3d_width = devmode.dmPelsWidth; + d3d_height = devmode.dmPelsHeight; + continue; + } + + if (devmode.dmPelsWidth == d3d_width && devmode.dmPelsHeight == d3d_height) + continue; + + user32_width = devmode.dmPelsWidth; + user32_height = devmode.dmPelsHeight; + break; + } + if (!user32_width || !user32_height) + { + skip("Failed to find three different display modes for the second monitor.\n"); + goto done; + } + + /* Test that mode restorations also happen for non-primary monitors on device resets */ + device_desc.adapter_ordinal = D3DADAPTER_DEFAULT; + device_desc.device_window = device_window; + device_desc.width = registry_mode.dmPelsWidth; + device_desc.height = registry_mode.dmPelsHeight; + device_desc.flags = CREATE_DEVICE_FULLSCREEN; + if (!(device = create_device(d3d8, device_window, &device_desc))) + { + skip("Failed to create a D3D device.\n"); + goto done; + } + + change_ret = ChangeDisplaySettingsExW(second_monitor_name, &devmode, NULL, CDS_RESET, NULL); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsExW failed with %d.\n", change_ret); + ret = EnumDisplaySettingsW(second_monitor_name, ENUM_CURRENT_SETTINGS, &devmode2); + ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError()); + if (devmode2.dmPelsWidth == old_devmode.dmPelsWidth + && devmode2.dmPelsHeight == old_devmode.dmPelsHeight) + { + skip("Failed to change display settings of the second monitor.\n"); + refcount = IDirect3DDevice8_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); + goto done; + } + + device_desc.flags = 0; + hr = reset_device(device, &device_desc); + ok(hr == D3D_OK, "Failed to reset device, hr %#x.\n", hr); + + 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"); + 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", + old_devmode.dmPelsWidth, d3ddm.Width); + todo_wine ok(d3ddm.Height == old_devmode.dmPelsHeight, "Expected height %u, got %u.\n", + old_devmode.dmPelsHeight, d3ddm.Height); + + refcount = IDirect3DDevice8_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); + ret = restore_display_modes(original_modes, display_count); + ok(ret, "Failed to restore display modes.\n"); + + /* Test that mode restorations happen for non-primary monitors on device releases */ + device_desc.adapter_ordinal = D3DADAPTER_DEFAULT; + device_desc.device_window = device_window; + device_desc.width = registry_mode.dmPelsWidth; + device_desc.height = registry_mode.dmPelsHeight; + device_desc.flags = CREATE_DEVICE_FULLSCREEN; + if (!(device = create_device(d3d8, device_window, &device_desc))) + { + skip("Failed to create a D3D device.\n"); + goto done; + } + + change_ret = ChangeDisplaySettingsExW(second_monitor_name, &devmode, NULL, CDS_RESET, NULL); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsExW failed with %d.\n", change_ret); + + refcount = IDirect3DDevice8_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); + + 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"); + 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", + old_devmode.dmPelsWidth, d3ddm.Width); + todo_wine 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"); + + /* Test that mode restorations for non-primary monitors use display settings in the registry */ + if (!(device = create_device(d3d8, device_window, &device_desc))) + { + skip("Failed to create a D3D device.\n"); + goto done; + } + + change_ret = ChangeDisplaySettingsExW(second_monitor_name, &devmode, NULL, + CDS_UPDATEREGISTRY | CDS_NORESET, NULL); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsExW failed with %d.\n", change_ret); + + refcount = IDirect3DDevice8_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); + + 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, + "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); + ok(ret, "EnumDisplaySettingsW failed, error %#x.\n", GetLastError()); + 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); + 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, + "Expected resolution %ux%u, got %ux%u.\n", devmode.dmPelsWidth, devmode.dmPelsHeight, + d3ddm.Width, d3ddm.Height); + ret = restore_display_modes(original_modes, display_count); + ok(ret, "Failed to restore display modes.\n"); + + /* Test mode restorations when there are two fullscreen devices and one of them got reset */ + if (!(device = create_device(d3d8, focus_window, &device_desc))) + { + skip("Failed to create a D3D device.\n"); + goto done; + } + + device_desc2.adapter_ordinal = 1; + device_desc2.device_window = device_window; + device_desc2.width = d3d_width; + device_desc2.height = d3d_height; + device_desc2.flags = CREATE_DEVICE_FULLSCREEN; + if (!(device2 = create_device(d3d8, focus_window, &device_desc2))) + { + skip("Failed to create a D3D device.\n"); + refcount = IDirect3DDevice8_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); + goto done; + } + + change_ret = ChangeDisplaySettingsExW(second_monitor_name, &devmode, NULL, CDS_RESET, NULL); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsExW failed with %d.\n", change_ret); + + device_desc.flags = 0; + hr = reset_device(device, &device_desc); + ok(hr == D3D_OK, "Failed to reset device, hr %#x.\n", hr); + + 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"); + 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, + "Expected resolution %ux%u, got %ux%u.\n", old_devmode.dmPelsWidth, + old_devmode.dmPelsHeight, d3ddm.Width, d3ddm.Height); + + refcount = IDirect3DDevice8_Release(device2); + ok(!refcount, "Device has %u references left.\n", refcount); + refcount = IDirect3DDevice8_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); + ret = restore_display_modes(original_modes, display_count); + ok(ret, "Failed to restore display modes.\n"); + + /* Test mode restoration when there are two fullscreen devices and one of them got released */ + device_desc.flags = CREATE_DEVICE_FULLSCREEN; + if (!(device = create_device(d3d8, focus_window, &device_desc))) + { + skip("Failed to create a D3D device.\n"); + goto done; + } + + if (!(device2 = create_device(d3d8, focus_window, &device_desc2))) + { + skip("Failed to create a D3D device.\n"); + refcount = IDirect3DDevice8_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); + goto done; + } + + change_ret = ChangeDisplaySettingsExW(second_monitor_name, &devmode, NULL, CDS_RESET, NULL); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "ChangeDisplaySettingsExW failed with %d.\n", change_ret); + + refcount = IDirect3DDevice8_Release(device); + ok(!refcount, "Device has %u references left.\n", refcount); + + 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"); + 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, + "Expected resolution %ux%u, got %ux%u.\n", old_devmode.dmPelsWidth, + old_devmode.dmPelsHeight, d3ddm.Width, d3ddm.Height); + + refcount = IDirect3DDevice8_Release(device2); + ok(!refcount, "Device has %u references left.\n", refcount); done: DestroyWindow(device_window); DestroyWindow(focus_window); IDirect3D8_Release(d3d8); + ret = restore_display_modes(original_modes, display_count); + ok(ret, "Failed to restore display modes.\n"); + heap_free(original_modes); } static void test_device_window_reset(void) -- 2.27.0
On Wed, 28 Oct 2020 at 10:08, Zhiyi Zhang <zzhang(a)codeweavers.com> wrote:
@@ -4324,8 +4346,13 @@ static void test_mode_change(void) device_desc.width = registry_mode.dmPelsWidth; device_desc.height = registry_mode.dmPelsHeight; device_desc.flags = CREATE_DEVICE_FULLSCREEN; - ok(!!(device = create_device(d3d8, focus_window, &device_desc)), "Failed to create a D3D device.\n"); + if (!(device = create_device(d3d8, focus_window, &device_desc))) + { + skip("Failed to create a D3D device, skipping tests.\n"); + goto done; + } If creating a D3D device succeeded the first time (i.e., we didn't skip the entire test) it should succeed again here.
participants (2)
-
Henri Verbeet -
Zhiyi Zhang