[PATCH 3/5] dxgi/tests: Test IDXGISwapChain_ResizeTarget() with all outputs.

Zhiyi Zhang zzhang at codeweavers.com
Tue May 5 07:46:19 CDT 2020


Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
 dlls/dxgi/tests/dxgi.c | 178 +++++++++++++++++++++++------------------
 1 file changed, 102 insertions(+), 76 deletions(-)

diff --git a/dlls/dxgi/tests/dxgi.c b/dlls/dxgi/tests/dxgi.c
index 325a0bf07a9..f04cd2be065 100644
--- a/dlls/dxgi/tests/dxgi.c
+++ b/dlls/dxgi/tests/dxgi.c
@@ -2721,12 +2721,12 @@ static void test_windowed_resize_target(IDXGISwapChain *swapchain, HWND window,
         check_swapchain_fullscreen_state(swapchain, &expected_state);
     }
 
-    ret = MoveWindow(window, 0, 0, 0, 0, TRUE);
-    ok(ret, "Failed to move window.\n");
+    ret = SetWindowPos(window, 0, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOZORDER);
+    ok(ret, "SetWindowPos failed, error %#x.\n", GetLastError());
     GetWindowRect(window, &e->window_rect);
     GetClientRect(window, &e->client_rect);
-    ret = MoveWindow(window, 0, 0, 200, 200, TRUE);
-    ok(ret, "Failed to move window.\n");
+    ret = SetWindowPos(window, 0, 0, 0, 200, 200, SWP_NOMOVE | SWP_NOZORDER);
+    ok(ret, "SetWindowPos failed, error %#x.\n", GetLastError());
 
     memset(&mode, 0, sizeof(mode));
     hr = IDXGISwapChain_ResizeTarget(swapchain, &mode);
@@ -2809,10 +2809,13 @@ static void test_fullscreen_resize_target(IDXGISwapChain *swapchain,
 static void test_resize_target(IUnknown *device, BOOL is_d3d12)
 {
     struct swapchain_fullscreen_state initial_state, expected_state;
+    unsigned int adapter_idx, output_idx, test_idx;
     DXGI_SWAP_CHAIN_DESC swapchain_desc;
+    DXGI_OUTPUT_DESC output_desc;
     IDXGISwapChain *swapchain;
     IDXGIFactory *factory;
-    unsigned int i;
+    IDXGIAdapter *adapter;
+    IDXGIOutput *output;
     ULONG refcount;
     HRESULT hr;
 
@@ -2856,85 +2859,108 @@ static void test_resize_target(IUnknown *device, BOOL is_d3d12)
     swapchain_desc.SwapEffect = is_d3d12 ? DXGI_SWAP_EFFECT_FLIP_DISCARD : DXGI_SWAP_EFFECT_DISCARD;
     swapchain_desc.Flags = 0;
 
-    for (i = 0; i < ARRAY_SIZE(tests); ++i)
+    for (adapter_idx = 0; SUCCEEDED(IDXGIFactory_EnumAdapters(factory, adapter_idx, &adapter));
+            ++adapter_idx)
     {
-        swapchain_desc.Flags = tests[i].flags;
-        swapchain_desc.OutputWindow = CreateWindowA("static", "dxgi_test", 0,
-                tests[i].origin.x, tests[i].origin.y, 400, 200, 0, 0, 0, 0);
-        if (tests[i].menu)
+        for (output_idx = 0; SUCCEEDED(IDXGIAdapter_EnumOutputs(adapter, output_idx, &output));
+                ++output_idx)
         {
-            HMENU menu_bar = CreateMenu();
-            HMENU menu = CreateMenu();
-            AppendMenuA(menu_bar, MF_POPUP, (UINT_PTR)menu, "Menu");
-            SetMenu(swapchain_desc.OutputWindow, menu_bar);
-        }
+            hr = IDXGIOutput_GetDesc(output, &output_desc);
+            ok(hr == S_OK, "Adapter %u output %u: GetDesc failed, hr %#x.\n", adapter_idx,
+                    output_idx, hr);
 
-        memset(&initial_state, 0, sizeof(initial_state));
-        capture_fullscreen_state(&initial_state.fullscreen_state, swapchain_desc.OutputWindow);
-
-        hr = IDXGIFactory_CreateSwapChain(factory, device, &swapchain_desc, &swapchain);
-        ok(SUCCEEDED(hr), "CreateSwapChain failed, hr %#x.\n", hr);
-        check_swapchain_fullscreen_state(swapchain, &initial_state);
-
-        expected_state = initial_state;
-        if (tests[i].fullscreen)
-        {
-            expected_state.fullscreen = TRUE;
-            compute_expected_swapchain_fullscreen_state_after_fullscreen_change(&expected_state,
-                    &swapchain_desc, &initial_state.fullscreen_state.monitor_rect, 800, 600, NULL);
-            hr = IDXGISwapChain_GetContainingOutput(swapchain, &expected_state.target);
-            ok(SUCCEEDED(hr) || broken(hr == DXGI_ERROR_UNSUPPORTED) /* Win 7 testbot */,
-                    "GetContainingOutput failed, hr %#x.\n", hr);
-            if (hr == DXGI_ERROR_UNSUPPORTED)
+            for (test_idx = 0; test_idx < ARRAY_SIZE(tests); ++test_idx)
             {
-                win_skip("GetContainingOutput() not supported.\n");
-                IDXGISwapChain_Release(swapchain);
+                swapchain_desc.Flags = tests[test_idx].flags;
+                swapchain_desc.OutputWindow = CreateWindowA("static", "dxgi_test", 0,
+                        output_desc.DesktopCoordinates.left + tests[test_idx].origin.x,
+                        output_desc.DesktopCoordinates.top + tests[test_idx].origin.y,
+                        400, 200, 0, 0, 0, 0);
+                if (tests[test_idx].menu)
+                {
+                    HMENU menu_bar = CreateMenu();
+                    HMENU menu = CreateMenu();
+                    AppendMenuA(menu_bar, MF_POPUP, (UINT_PTR)menu, "Menu");
+                    SetMenu(swapchain_desc.OutputWindow, menu_bar);
+                }
+
+                memset(&initial_state, 0, sizeof(initial_state));
+                capture_fullscreen_state(&initial_state.fullscreen_state, swapchain_desc.OutputWindow);
+
+                hr = IDXGIFactory_CreateSwapChain(factory, device, &swapchain_desc, &swapchain);
+                ok(SUCCEEDED(hr), "Adapter %u output %u test %u: CreateSwapChain failed, hr %#x.\n",
+                        adapter_idx, output_idx, test_idx, hr);
+                check_swapchain_fullscreen_state(swapchain, &initial_state);
+
+                expected_state = initial_state;
+                if (tests[test_idx].fullscreen)
+                {
+                    expected_state.fullscreen = TRUE;
+                    compute_expected_swapchain_fullscreen_state_after_fullscreen_change(&expected_state,
+                            &swapchain_desc, &initial_state.fullscreen_state.monitor_rect, 800, 600, NULL);
+                    hr = IDXGISwapChain_GetContainingOutput(swapchain, &expected_state.target);
+                    ok(SUCCEEDED(hr) || broken(hr == DXGI_ERROR_UNSUPPORTED) /* Win 7 testbot */,
+                            "Adapter %u output %u test %u: GetContainingOutput failed, hr %#x.\n",
+                            adapter_idx, output_idx, test_idx, hr);
+                    if (hr == DXGI_ERROR_UNSUPPORTED)
+                    {
+                        win_skip("Adapter %u output %u test %u: GetContainingOutput() not supported.\n",
+                                adapter_idx, output_idx, test_idx);
+                        IDXGISwapChain_Release(swapchain);
+                        DestroyWindow(swapchain_desc.OutputWindow);
+                        continue;
+                    }
+
+                    hr = IDXGISwapChain_SetFullscreenState(swapchain, TRUE, NULL);
+                    ok(SUCCEEDED(hr) || hr == DXGI_ERROR_NOT_CURRENTLY_AVAILABLE,
+                            "Adapter %u output %u test %u: SetFullscreenState failed, hr %#x.\n",
+                            adapter_idx, output_idx, test_idx, hr);
+                    if (hr == DXGI_ERROR_NOT_CURRENTLY_AVAILABLE)
+                    {
+                        skip("Adapter %u output %u test %u: Could not change fullscreen state.\n",
+                                adapter_idx, output_idx, test_idx);
+                        IDXGIOutput_Release(expected_state.target);
+                        IDXGISwapChain_Release(swapchain);
+                        DestroyWindow(swapchain_desc.OutputWindow);
+                        continue;
+                    }
+                }
+                check_swapchain_fullscreen_state(swapchain, &expected_state);
+
+                hr = IDXGISwapChain_ResizeTarget(swapchain, NULL);
+                ok(hr == DXGI_ERROR_INVALID_CALL, "Adapter %u output %u test %u: Got unexpected hr %#x.\n",
+                        adapter_idx, output_idx, test_idx, hr);
+                check_swapchain_fullscreen_state(swapchain, &expected_state);
+
+                if (tests[test_idx].fullscreen)
+                {
+                    test_fullscreen_resize_target(swapchain, &expected_state);
+
+                    hr = IDXGISwapChain_SetFullscreenState(swapchain, FALSE, NULL);
+                    ok(SUCCEEDED(hr), "Adapter %u output %u test %u: SetFullscreenState failed, hr %#x.\n",
+                            adapter_idx, output_idx, test_idx, hr);
+                    check_swapchain_fullscreen_state(swapchain, &initial_state);
+                    IDXGIOutput_Release(expected_state.target);
+                    check_swapchain_fullscreen_state(swapchain, &initial_state);
+                    expected_state = initial_state;
+                }
+                else
+                {
+                    test_windowed_resize_target(swapchain, swapchain_desc.OutputWindow, &expected_state);
+
+                    check_swapchain_fullscreen_state(swapchain, &expected_state);
+                }
+
+                refcount = IDXGISwapChain_Release(swapchain);
+                ok(!refcount, "Adapter %u output %u test %u: IDXGISwapChain has %u references left.\n",
+                        adapter_idx, output_idx, test_idx, refcount);
+                check_window_fullscreen_state(swapchain_desc.OutputWindow, &expected_state.fullscreen_state);
                 DestroyWindow(swapchain_desc.OutputWindow);
-                continue;
-            }
-
-            hr = IDXGISwapChain_SetFullscreenState(swapchain, TRUE, NULL);
-            ok(SUCCEEDED(hr) || hr == DXGI_ERROR_NOT_CURRENTLY_AVAILABLE,
-                    "SetFullscreenState failed, hr %#x.\n", hr);
-            if (hr == DXGI_ERROR_NOT_CURRENTLY_AVAILABLE)
-            {
-                skip("Could not change fullscreen state.\n");
-                IDXGIOutput_Release(expected_state.target);
-                IDXGISwapChain_Release(swapchain);
-                DestroyWindow(swapchain_desc.OutputWindow);
-                continue;
             }
+            IDXGIOutput_Release(output);
         }
-        check_swapchain_fullscreen_state(swapchain, &expected_state);
-
-        hr = IDXGISwapChain_ResizeTarget(swapchain, NULL);
-        ok(hr == DXGI_ERROR_INVALID_CALL, "Got unexpected hr %#x.\n", hr);
-        check_swapchain_fullscreen_state(swapchain, &expected_state);
-
-        if (tests[i].fullscreen)
-        {
-            test_fullscreen_resize_target(swapchain, &expected_state);
-
-            hr = IDXGISwapChain_SetFullscreenState(swapchain, FALSE, NULL);
-            ok(SUCCEEDED(hr), "SetFullscreenState failed, hr %#x.\n", hr);
-            check_swapchain_fullscreen_state(swapchain, &initial_state);
-            IDXGIOutput_Release(expected_state.target);
-            check_swapchain_fullscreen_state(swapchain, &initial_state);
-            expected_state = initial_state;
-        }
-        else
-        {
-            test_windowed_resize_target(swapchain, swapchain_desc.OutputWindow, &expected_state);
-
-            check_swapchain_fullscreen_state(swapchain, &expected_state);
-        }
-
-        refcount = IDXGISwapChain_Release(swapchain);
-        ok(!refcount, "IDXGISwapChain has %u references left.\n", refcount);
-        check_window_fullscreen_state(swapchain_desc.OutputWindow, &expected_state.fullscreen_state);
-        DestroyWindow(swapchain_desc.OutputWindow);
+        IDXGIAdapter_Release(adapter);
     }
-
     refcount = IDXGIFactory_Release(factory);
     ok(refcount == !is_d3d12, "Got unexpected refcount %u.\n", refcount);
 }
-- 
2.25.1




More information about the wine-devel mailing list