d3d9/tests: Add more get display mode tests.

Signed-off-by: Zhiyi Zhang <zzhang@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zhiyi Zhang 2020-05-11 15:34:53 +08:00 committed by Alexandre Julliard
parent 6ca5dbf599
commit b3b6e36f92
1 changed files with 114 additions and 1 deletions

View File

@ -13549,14 +13549,21 @@ static void test_vertex_buffer_read_write(void)
static void test_get_display_mode(void) static void test_get_display_mode(void)
{ {
static const DWORD creation_flags[] = {0, CREATE_DEVICE_FULLSCREEN};
unsigned int adapter_idx, adapter_count, mode_idx, test_idx;
IDirect3DSwapChain9 *swapchain; IDirect3DSwapChain9 *swapchain;
RECT previous_monitor_rect;
unsigned int width, height;
IDirect3DDevice9 *device; IDirect3DDevice9 *device;
MONITORINFO monitor_info;
struct device_desc desc; struct device_desc desc;
D3DDISPLAYMODE mode; D3DDISPLAYMODE mode;
HMONITOR monitor;
IDirect3D9 *d3d; IDirect3D9 *d3d;
ULONG refcount; ULONG refcount;
HWND window; HWND window;
HRESULT hr; HRESULT hr;
BOOL ret;
window = create_window(); window = create_window();
d3d = Direct3DCreate9(D3D_SDK_VERSION); d3d = Direct3DCreate9(D3D_SDK_VERSION);
@ -13620,8 +13627,114 @@ static void test_get_display_mode(void)
refcount = IDirect3DDevice9_Release(device); refcount = IDirect3DDevice9_Release(device);
ok(!refcount, "Device has %u references left.\n", refcount); ok(!refcount, "Device has %u references left.\n", refcount);
IDirect3D9_Release(d3d);
DestroyWindow(window); DestroyWindow(window);
/* D3D9 uses adapter indices to determine which adapter to use to get the display mode */
adapter_count = IDirect3D9_GetAdapterCount(d3d);
for (adapter_idx = 0; adapter_idx < adapter_count; ++adapter_idx)
{
if (!adapter_idx)
{
desc.width = 640;
desc.height = 480;
}
else
{
/* Find a mode different than that of the previous adapter, so that tests can be sure
* that they are comparing to the current adapter display mode */
monitor = IDirect3D9_GetAdapterMonitor(d3d, adapter_idx - 1);
ok(!!monitor, "Adapter %u: GetAdapterMonitor failed.\n", adapter_idx - 1);
monitor_info.cbSize = sizeof(monitor_info);
ret = GetMonitorInfoW(monitor, &monitor_info);
ok(ret, "Adapter %u: GetMonitorInfoW failed, error %#x.\n", adapter_idx - 1,
GetLastError());
previous_monitor_rect = monitor_info.rcMonitor;
desc.width = monitor_info.rcMonitor.right - monitor_info.rcMonitor.left;
desc.height = monitor_info.rcMonitor.bottom - monitor_info.rcMonitor.top;
for (mode_idx = 0; SUCCEEDED(IDirect3D9_EnumAdapterModes(d3d, adapter_idx,
D3DFMT_X8R8G8B8, mode_idx, &mode)); ++mode_idx)
{
if (mode.Width < 640 || mode.Height < 480)
continue;
if (mode.Width != desc.width && mode.Height != desc.height)
break;
}
ok(mode.Width != desc.width && mode.Height != desc.height,
"Adapter %u: Failed to find a different mode than %ux%u.\n", adapter_idx,
desc.width, desc.height);
desc.width = mode.Width;
desc.height = mode.Height;
}
for (test_idx = 0; test_idx < ARRAY_SIZE(creation_flags); ++test_idx)
{
window = create_window();
desc.adapter_ordinal = adapter_idx;
desc.device_window = window;
desc.flags = creation_flags[test_idx];
if (!(device = create_device(d3d, window, &desc)))
{
skip("Adapter %u test %u: Failed to create a D3D device.\n", adapter_idx, test_idx);
DestroyWindow(window);
continue;
}
monitor = IDirect3D9_GetAdapterMonitor(d3d, adapter_idx);
ok(!!monitor, "Adapter %u test %u: GetAdapterMonitor failed.\n", adapter_idx, test_idx);
monitor_info.cbSize = sizeof(monitor_info);
ret = GetMonitorInfoW(monitor, &monitor_info);
ok(ret, "Adapter %u test %u: GetMonitorInfoW failed, error %#x.\n", adapter_idx,
test_idx, GetLastError());
width = monitor_info.rcMonitor.right - monitor_info.rcMonitor.left;
height = monitor_info.rcMonitor.bottom - monitor_info.rcMonitor.top;
if (adapter_idx)
{
/* Move the device window to the previous monitor to test that the device window
* position doesn't affect which adapter to use to get the display mode */
ret = SetWindowPos(window, 0, previous_monitor_rect.left, previous_monitor_rect.top,
0, 0, SWP_NOZORDER | SWP_NOSIZE);
ok(ret, "Adapter %u test %u: SetWindowPos failed, error %#x.\n", adapter_idx,
test_idx, GetLastError());
}
hr = IDirect3D9_GetAdapterDisplayMode(d3d, adapter_idx, &mode);
ok(hr == D3D_OK, "Adapter %u test %u: GetAdapterDisplayMode failed, hr %#x.\n",
adapter_idx, test_idx, hr);
ok(mode.Width == width, "Adapter %u test %u: Expect width %u, got %u.\n", adapter_idx,
test_idx, width, mode.Width);
ok(mode.Height == height, "Adapter %u test %u: Expect height %u, got %u.\n",
adapter_idx, test_idx, height, mode.Height);
hr = IDirect3DDevice9_GetDisplayMode(device, 0, &mode);
ok(hr == D3D_OK, "Adapter %u test %u: GetDisplayMode failed, hr %#x.\n", adapter_idx,
test_idx, hr);
ok(mode.Width == width, "Adapter %u test %u: Expect width %u, got %u.\n", adapter_idx,
test_idx, width, mode.Width);
ok(mode.Height == height, "Adapter %u test %u: Expect height %u, got %u.\n",
adapter_idx, test_idx, height, mode.Height);
hr = IDirect3DDevice9_GetSwapChain(device, 0, &swapchain);
ok(hr == D3D_OK, "Adapter %u test %u: GetSwapChain failed, hr %#x.\n", adapter_idx,
test_idx, hr);
hr = IDirect3DSwapChain9_GetDisplayMode(swapchain, &mode);
ok(hr == D3D_OK, "Adapter %u test %u: GetDisplayMode failed, hr %#x.\n", adapter_idx,
test_idx, hr);
ok(mode.Width == width, "Adapter %u test %u: Expect width %u, got %u.\n", adapter_idx,
test_idx, width, mode.Width);
ok(mode.Height == height, "Adapter %u test %u: Expect height %u, got %u.\n",
adapter_idx, test_idx, height, mode.Height);
IDirect3DSwapChain9_Release(swapchain);
refcount = IDirect3DDevice9_Release(device);
ok(!refcount, "Adapter %u test %u: Device has %u references left.\n", adapter_idx,
test_idx, refcount);
DestroyWindow(window);
}
}
IDirect3D9_Release(d3d);
} }
static void test_multi_adapter(void) static void test_multi_adapter(void)