From: Stefan Dösinger Subject: [PATCH 2/3] d3d8/tests: The device restores the mode settings from the registry (v2). Message-Id: <1414449248-4732-2-git-send-email-stefan@codeweavers.com> Date: Mon, 27 Oct 2014 23:34:07 +0100 --- dlls/d3d8/tests/device.c | 150 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 113 insertions(+), 37 deletions(-) diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c index 5f8f52a..fb53ee9 100644 --- a/dlls/d3d8/tests/device.c +++ b/dlls/d3d8/tests/device.c @@ -2977,56 +2977,134 @@ static void test_unsupported_shaders(void) static void test_mode_change(void) { - RECT fullscreen_rect, focus_rect, r; + RECT d3d_rect, focus_rect, r; struct device_desc device_desc; IDirect3DSurface8 *backbuffer; IDirect3DDevice8 *device; D3DSURFACE_DESC desc; IDirect3D8 *d3d8; DEVMODEW devmode; - UINT refcount; + ULONG refcount; + UINT mode_count = 0, adapter_mode_count, i; HRESULT hr; - DWORD ret; + BOOL ret; + LONG change_ret; + D3DDISPLAYMODE d3ddm, d3ddm2; + struct + { + UINT w; + UINT h; + } *modes = NULL; - focus_window = CreateWindowA("d3d8_test_wc", "d3d8_test", WS_OVERLAPPEDWINDOW, - 0, 0, screen_width / 2, screen_height / 2, 0, 0, 0, 0); - device_window = CreateWindowA("d3d8_test_wc", "d3d8_test", WS_OVERLAPPEDWINDOW, - 0, 0, screen_width / 2, screen_height / 2, 0, 0, 0, 0); d3d8 = Direct3DCreate8(D3D_SDK_VERSION); ok(!!d3d8, "Failed to create a D3D object.\n"); - SetRect(&fullscreen_rect, 0, 0, screen_width, screen_height); + IDirect3D8_GetAdapterDisplayMode(d3d8, D3DADAPTER_DEFAULT, &d3ddm); + adapter_mode_count = IDirect3D8_GetAdapterModeCount(d3d8, D3DADAPTER_DEFAULT); + modes = HeapAlloc(GetProcessHeap(), 0, sizeof(*modes) * adapter_mode_count); + for (i = 0; i < adapter_mode_count; ++i) + { + UINT j; + + hr = IDirect3D8_EnumAdapterModes(d3d8, D3DADAPTER_DEFAULT, i, &d3ddm2); + ok(SUCCEEDED(hr), "Failed to enumerate display mode, hr %#x.\n", hr); + + if (d3ddm2.Format != d3ddm.Format) + continue; + if (d3ddm2.Width == screen_width && d3ddm2.Height == screen_height) + continue; + /* The r200 driver on Windows XP enumerates modes like 320x200 and 320x240 but + * refuses to create a device at these sizes. */ + if (d3ddm2.Width < 640 || d3ddm2.Height < 480) + continue; + + for (j = 0; j < mode_count; ++j) + { + if (modes[j].w == d3ddm2.Width && modes[j].h == d3ddm2.Height) + break; + } + if (j == mode_count) + { + modes[j].w = d3ddm2.Width; + modes[j].h = d3ddm2.Height; + ++mode_count; + } + } + + /* Make sure the d3d mode is smaller or equal in both width and height + * than the mode passed to ChangeDisplaySettings. Otherwise Windows + * shrinks the window to the ChangeDisplaySettings parameters + 12. */ + d3ddm.Width = d3ddm.Height = d3ddm2.Width = d3ddm2.Height = ~0U; + for (i = 0; i < mode_count; i++) + { + if (modes[i].w < d3ddm.Width && modes[i].h < d3ddm.Height) + { + d3ddm.Width = modes[i].w; + d3ddm.Height = modes[i].h; + } + } + for (i = 0; i < mode_count; i++) + { + if (modes[i].w < d3ddm.Width || modes[i].h < d3ddm.Height) + continue; + if (modes[i].w == d3ddm.Width && modes[i].h == d3ddm.Height) + continue; + d3ddm2.Width = modes[i].w; + d3ddm2.Height = modes[i].h; + break; + } + + HeapFree(GetProcessHeap(), 0, modes); + if (d3ddm2.Width == ~0U) + { + skip("Could not find adequate modes, skipping mode tests.\n"); + IDirect3D8_Release(d3d8); + return; + } + + memset(&devmode, 0, sizeof(devmode)); + devmode.dmSize = sizeof(devmode); + devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; + devmode.dmPelsWidth = d3ddm2.Width; + devmode.dmPelsHeight = d3ddm2.Height; + change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); + + focus_window = CreateWindowA("d3d8_test_wc", "d3d8_test", WS_OVERLAPPEDWINDOW, + 0, 0, d3ddm2.Width / 2, d3ddm2.Height / 2, 0, 0, 0, 0); + device_window = CreateWindowA("d3d8_test_wc", "d3d8_test", WS_OVERLAPPEDWINDOW, + 0, 0, d3ddm2.Width / 2, d3ddm2.Height / 2, 0, 0, 0, 0); + + SetRect(&d3d_rect, 0, 0, d3ddm.Width, d3ddm.Height); GetWindowRect(focus_window, &focus_rect); device_desc.device_window = device_window; - device_desc.width = screen_width; - device_desc.height = screen_height; + device_desc.width = d3ddm.Width; + device_desc.height = d3ddm.Height; device_desc.flags = CREATE_DEVICE_FULLSCREEN; 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; } - memset(&devmode, 0, sizeof(devmode)); - devmode.dmSize = sizeof(devmode); - devmode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; - devmode.dmPelsWidth = 640; - devmode.dmPelsHeight = 480; - - ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN); - ok(ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", ret); + devmode.dmPelsWidth = d3ddm2.Width; + devmode.dmPelsHeight = d3ddm2.Height; + change_ret = ChangeDisplaySettingsW(&devmode, CDS_FULLSCREEN); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); - memset(&devmode, 0, sizeof(devmode)); - devmode.dmSize = sizeof(devmode); ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode); ok(ret, "Failed to get display mode.\n"); - ok(devmode.dmPelsWidth == 640, "Got unexpect width %u.\n", devmode.dmPelsWidth); - ok(devmode.dmPelsHeight == 480, "Got unexpect height %u.\n", devmode.dmPelsHeight); + ok(devmode.dmPelsWidth == d3ddm2.Width, "Got unexpect width %u, expected %u.\n", + devmode.dmPelsWidth, d3ddm2.Width); + ok(devmode.dmPelsHeight == d3ddm2.Height, "Got unexpect height %u, expected %u.\n", + devmode.dmPelsHeight, d3ddm2.Height); GetWindowRect(device_window, &r); - ok(EqualRect(&r, &fullscreen_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", - fullscreen_rect.left, fullscreen_rect.top, fullscreen_rect.right, fullscreen_rect.bottom, + ok(EqualRect(&r, &d3d_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", + d3d_rect.left, d3d_rect.top, d3d_rect.right, d3d_rect.bottom, r.left, r.top, r.right, r.bottom); GetWindowRect(focus_window, &r); ok(EqualRect(&r, &focus_rect), "Expected {%d, %d, %d, %d}, got {%d, %d, %d, %d}.\n", @@ -3037,31 +3115,29 @@ static void test_mode_change(void) ok(SUCCEEDED(hr), "Failed to get backbuffer, hr %#x.\n", hr); hr = IDirect3DSurface8_GetDesc(backbuffer, &desc); ok(SUCCEEDED(hr), "Failed to get backbuffer desc, hr %#x.\n", hr); - ok(desc.Width == screen_width, "Got unexpected backbuffer width %u.\n", desc.Width); - ok(desc.Height == screen_height, "Got unexpected backbuffer height %u.\n", desc.Height); + ok(desc.Width == d3ddm.Width, "Got unexpected backbuffer width %u, expected %u.\n", + desc.Width, d3ddm.Width); + ok(desc.Height == d3ddm.Height, "Got unexpected backbuffer height %u, expected %u.\n", + desc.Height, d3ddm.Height); IDirect3DSurface8_Release(backbuffer); refcount = IDirect3DDevice8_Release(device); ok(!refcount, "Device has %u references left.\n", refcount); - memset(&devmode, 0, sizeof(devmode)); - devmode.dmSize = sizeof(devmode); ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode); ok(ret, "Failed to get display mode.\n"); - ok(devmode.dmPelsWidth == screen_width, "Got unexpect width %u.\n", devmode.dmPelsWidth); - ok(devmode.dmPelsHeight == screen_height, "Got unexpect height %u.\n", devmode.dmPelsHeight); + todo_wine ok(devmode.dmPelsWidth == screen_width, "Got unexpect width %u, expected %u.\n", + devmode.dmPelsWidth, screen_width); + todo_wine ok(devmode.dmPelsHeight == screen_height, "Got unexpect height %u, expected %u.\n", + devmode.dmPelsHeight, screen_height); + + change_ret = ChangeDisplaySettingsW(NULL, CDS_FULLSCREEN); + ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#x.\n", change_ret); done: DestroyWindow(device_window); DestroyWindow(focus_window); IDirect3D8_Release(d3d8); - - memset(&devmode, 0, sizeof(devmode)); - devmode.dmSize = sizeof(devmode); - ret = EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &devmode); - ok(ret, "Failed to get display mode.\n"); - ok(devmode.dmPelsWidth == screen_width, "Got unexpect width %u.\n", devmode.dmPelsWidth); - ok(devmode.dmPelsHeight == screen_height, "Got unexpect height %u.\n", devmode.dmPelsHeight); } static void test_device_window_reset(void) -- 2.0.4