dxgi/tests: Test IDXGISwapChain_GetContainingOutput() after Alt+Enter.

Signed-off-by: Zhiyi Zhang <zzhang@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
feature/deterministic
Zhiyi Zhang 2020-05-12 20:48:58 +08:00 committed by Alexandre Julliard
parent 160cb956f8
commit f904e9af1b
1 changed files with 88 additions and 1 deletions

View File

@ -2095,9 +2095,9 @@ static HMONITOR get_primary_if_right_side_secondary(const DXGI_OUTPUT_DESC *outp
static void test_get_containing_output(void)
{
unsigned int adapter_idx, output_idx, output_count;
DXGI_OUTPUT_DESC output_desc, output_desc2;
DXGI_SWAP_CHAIN_DESC swapchain_desc;
IDXGIOutput *output, *output2;
DXGI_OUTPUT_DESC output_desc;
MONITORINFOEXW monitor_info;
IDXGISwapChain *swapchain;
IDXGIFactory *factory;
@ -2369,6 +2369,93 @@ static void test_get_containing_output(void)
hr = IDXGISwapChain_SetFullscreenState(swapchain, FALSE, NULL);
ok(hr == S_OK, "SetFullscreenState failed, hr %#x.\n", hr);
/* Test GetContainingOutput after a full screen swapchain is made windowed by pressing
* Alt+Enter, then move it to another output and use Alt+Enter to enter full screen */
output = NULL;
output2 = NULL;
for (adapter_idx = 0; SUCCEEDED(IDXGIFactory_EnumAdapters(factory, adapter_idx, &adapter));
++adapter_idx)
{
for (output_idx = 0; SUCCEEDED(IDXGIAdapter_EnumOutputs(adapter, output_idx,
output ? &output2 : &output)); ++output_idx)
{
if (output2)
break;
}
IDXGIAdapter_Release(adapter);
if (output2)
break;
}
if (output && output2)
{
hr = IDXGISwapChain_SetFullscreenState(swapchain, TRUE, output);
IDXGIOutput_Release(output);
if (FAILED(hr))
{
skip("SetFullscreenState failed, hr %#x.\n", hr);
IDXGIOutput_Release(output2);
goto done;
}
/* Post an Alt + VK_RETURN WM_SYSKEYDOWN to leave full screen on the first output */
PostMessageA(swapchain_desc.OutputWindow, WM_SYSKEYDOWN, VK_RETURN,
(MapVirtualKeyA(VK_RETURN, MAPVK_VK_TO_VSC) << 16) | 0x20000001);
flush_events();
hr = IDXGISwapChain_GetFullscreenState(swapchain, &fullscreen, NULL);
ok(hr == S_OK, "GetFullscreenState failed, hr %#x.\n", hr);
ok(!fullscreen, "Expect swapchain not full screen.\n");
/* Move the swapchain output window to the second output */
hr = IDXGIOutput_GetDesc(output2, &output_desc2);
ok(hr == S_OK, "GetDesc failed, hr %#x.\n", hr);
ret = SetWindowPos(swapchain_desc.OutputWindow, 0, output_desc2.DesktopCoordinates.left,
output_desc2.DesktopCoordinates.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
ok(ret, "SetWindowPos failed.\n");
/* Post an Alt + VK_RETURN WM_SYSKEYDOWN to enter full screen on the second output */
PostMessageA(swapchain_desc.OutputWindow, WM_SYSKEYDOWN, VK_RETURN,
(MapVirtualKeyA(VK_RETURN, MAPVK_VK_TO_VSC) << 16) | 0x20000001);
flush_events();
output = NULL;
hr = IDXGISwapChain_GetFullscreenState(swapchain, &fullscreen, &output);
ok(hr == S_OK, "GetFullscreenState failed, hr %#x.\n", hr);
ok(fullscreen, "Expect swapchain full screen.\n");
ok(!!output, "Expect output not NULL.\n");
hr = IDXGIOutput_GetDesc(output, &output_desc);
ok(hr == S_OK, "GetDesc failed, hr %#x.\n", hr);
hr = IDXGIOutput_GetDesc(output2, &output_desc2);
ok(hr == S_OK, "GetDesc failed, hr %#x.\n", hr);
todo_wine ok(!lstrcmpW(output_desc.DeviceName, output_desc2.DeviceName),
"Expect device name %s, got %s.\n", wine_dbgstr_w(output_desc2.DeviceName),
wine_dbgstr_w(output_desc.DeviceName));
IDXGIOutput_Release(output);
output = NULL;
hr = IDXGISwapChain_GetContainingOutput(swapchain, &output);
ok(hr == S_OK, "GetContainingOutput failed, hr %#x.\n", hr);
hr = IDXGIOutput_GetDesc(output, &output_desc);
ok(hr == S_OK, "GetDesc failed, hr %#x.\n", hr);
hr = IDXGIOutput_GetDesc(output2, &output_desc2);
ok(hr == S_OK, "GetDesc failed, hr %#x.\n", hr);
todo_wine ok(!lstrcmpW(output_desc.DeviceName, output_desc2.DeviceName),
"Expect device name %s, got %s.\n", wine_dbgstr_w(output_desc2.DeviceName),
wine_dbgstr_w(output_desc.DeviceName));
hr = IDXGISwapChain_SetFullscreenState(swapchain, FALSE, NULL);
ok(hr == S_OK, "SetFullscreenState failed, hr %#x.\n", hr);
}
else
{
skip("This test requires two outputs.\n");
}
if (output)
IDXGIOutput_Release(output);
if (output2)
IDXGIOutput_Release(output2);
done:
refcount = IDXGISwapChain_Release(swapchain);
ok(!refcount, "IDXGISwapChain has %u references left.\n", refcount);