[PATCH 1/9] dxgi/tests: Extend test for creating swapchain.

Józef Kucia jkucia at codeweavers.com
Thu Aug 25 05:22:48 CDT 2016


Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 dlls/dxgi/tests/device.c | 173 ++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 163 insertions(+), 10 deletions(-)

diff --git a/dlls/dxgi/tests/device.c b/dlls/dxgi/tests/device.c
index f7e8274..03407ca 100644
--- a/dlls/dxgi/tests/device.c
+++ b/dlls/dxgi/tests/device.c
@@ -172,7 +172,7 @@ static void check_swapchain_fullscreen_state_(unsigned int line, IDXGISwapChain
     ok_(__FILE__, line)(fullscreen == expected_state->fullscreen, "Got fullscreen %#x, expected %#x.\n",
             fullscreen, expected_state->fullscreen);
 
-    if (!swapchain_desc.Windowed)
+    if (!swapchain_desc.Windowed && expected_state->fullscreen)
     {
         IDXGIAdapter *adapter;
         IDXGIDevice *device;
@@ -203,10 +203,33 @@ static void check_swapchain_fullscreen_state_(unsigned int line, IDXGISwapChain
     }
 }
 
-static void compute_expected_swapchain_fullscreen_state_after_fullscreen_change(
+#define compute_expected_swapchain_fullscreen_state_after_fullscreen_change(a, b, c, d, e, f) \
+        compute_expected_swapchain_fullscreen_state_after_fullscreen_change_(__LINE__, a, b, c, d, e, f)
+static void compute_expected_swapchain_fullscreen_state_after_fullscreen_change_(unsigned int line,
         struct swapchain_fullscreen_state *state, const DXGI_SWAP_CHAIN_DESC *swapchain_desc,
-        const RECT *old_monitor_rect, unsigned int new_width, unsigned int new_height)
+        const RECT *old_monitor_rect, unsigned int new_width, unsigned int new_height, IDXGIOutput *target)
 {
+    if (!new_width && !new_height)
+    {
+        RECT client_rect;
+        GetClientRect(swapchain_desc->OutputWindow, &client_rect);
+        new_width = client_rect.right - client_rect.left;
+        new_height = client_rect.bottom - client_rect.top;
+    }
+
+    if (target)
+    {
+        DXGI_MODE_DESC mode_desc = swapchain_desc->BufferDesc;
+        HRESULT hr;
+
+        mode_desc.Width = new_width;
+        mode_desc.Height = new_height;
+        hr = IDXGIOutput_FindClosestMatchingMode(target, &mode_desc, &mode_desc, NULL);
+        todo_wine ok_(__FILE__, line)(SUCCEEDED(hr), "FindClosestMatchingMode failed, hr %#x.\n", hr);
+        new_width = mode_desc.Width;
+        new_height = mode_desc.Height;
+    }
+
     state->fullscreen = TRUE;
     if (swapchain_desc->Flags & DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH)
     {
@@ -220,6 +243,9 @@ static void compute_expected_swapchain_fullscreen_state_after_fullscreen_change(
         SetRect(&state->fullscreen_state.client_rect, 0, 0, new_width, new_height);
         state->fullscreen_state.monitor_rect = new_monitor_rect;
         state->fullscreen_state.window_rect = new_monitor_rect;
+
+        if (target)
+            state->target = target;
     }
     else
     {
@@ -607,9 +633,11 @@ struct refresh_rates
 
 static void test_create_swapchain(void)
 {
-    struct swapchain_fullscreen_state initial_state;
+    struct swapchain_fullscreen_state initial_state, expected_state;
+    unsigned int  i, expected_width, expected_height;
     DXGI_SWAP_CHAIN_DESC creation_desc, result_desc;
     ULONG refcount, expected_refcount;
+    RECT *expected_client_rect;
     IDXGISwapChain *swapchain;
     IUnknown *obj, *parent;
     IDXGIAdapter *adapter;
@@ -618,7 +646,6 @@ static void test_create_swapchain(void)
     IDXGIOutput *target;
     BOOL fullscreen;
     HRESULT hr;
-    UINT i;
 
     const struct refresh_rates refresh_list[] =
     {
@@ -656,7 +683,7 @@ static void test_create_swapchain(void)
     capture_fullscreen_state(&initial_state.fullscreen_state, creation_desc.OutputWindow);
 
     hr = IDXGIDevice_QueryInterface(device, &IID_IUnknown, (void **)&obj);
-    ok(SUCCEEDED(hr), "IDXGIDevice does not implement IUnknown\n");
+    ok(SUCCEEDED(hr), "IDXGIDevice does not implement IUnknown.\n");
 
     hr = IDXGIDevice_GetAdapter(device, &adapter);
     ok(SUCCEEDED(hr), "GetAdapter failed, hr %#x.\n", hr);
@@ -822,6 +849,131 @@ static void test_create_swapchain(void)
 
     check_window_fullscreen_state(creation_desc.OutputWindow, &initial_state.fullscreen_state);
 
+    /* Test swapchain creation with backbuffer width and height equal to 0. */
+    expected_state = initial_state;
+    expected_client_rect = &expected_state.fullscreen_state.client_rect;
+
+    /* Windowed */
+    expected_width = expected_client_rect->right;
+    expected_height = expected_client_rect->bottom;
+
+    creation_desc.BufferDesc.Width = 0;
+    creation_desc.BufferDesc.Height = 0;
+    creation_desc.Windowed = TRUE;
+    creation_desc.Flags = 0;
+    hr = IDXGIFactory_CreateSwapChain(factory, obj, &creation_desc, &swapchain);
+    ok(SUCCEEDED(hr), "CreateSwapChain failed, hr %#x.\n", hr);
+    hr = IDXGISwapChain_GetDesc(swapchain, &result_desc);
+    ok(SUCCEEDED(hr), "GetDesc failed, hr %#x.\n", hr);
+    ok(result_desc.BufferDesc.Width == expected_width, "Got width %u, expected %u.\n",
+            result_desc.BufferDesc.Width, expected_width);
+    ok(result_desc.BufferDesc.Height == expected_height, "Got height %u, expected %u.\n",
+            result_desc.BufferDesc.Height, expected_height);
+    check_swapchain_fullscreen_state(swapchain, &expected_state);
+    IDXGISwapChain_Release(swapchain);
+
+    DestroyWindow(creation_desc.OutputWindow);
+    creation_desc.OutputWindow = CreateWindowA("static", "dxgi_test",
+            WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
+            0, 0, 222, 222, 0, 0, 0, 0);
+    SetRect(&expected_state.fullscreen_state.window_rect, 0, 0, 222, 222);
+    GetClientRect(creation_desc.OutputWindow, expected_client_rect);
+    expected_width = expected_client_rect->right;
+    expected_height = expected_client_rect->bottom;
+
+    hr = IDXGIFactory_CreateSwapChain(factory, obj, &creation_desc, &swapchain);
+    ok(SUCCEEDED(hr), "CreateSwapChain failed, hr %#x.\n", hr);
+    hr = IDXGISwapChain_GetDesc(swapchain, &result_desc);
+    ok(SUCCEEDED(hr), "GetDesc failed, hr %#x.\n", hr);
+    ok(result_desc.BufferDesc.Width == expected_width, "Got width %u, expected %u.\n",
+            result_desc.BufferDesc.Width, expected_width);
+    ok(result_desc.BufferDesc.Height == expected_height, "Got height %u, expected %u.\n",
+            result_desc.BufferDesc.Height, expected_height);
+    check_swapchain_fullscreen_state(swapchain, &expected_state);
+    IDXGISwapChain_Release(swapchain);
+
+    DestroyWindow(creation_desc.OutputWindow);
+    creation_desc.OutputWindow = CreateWindowA("static", "dxgi_test", 0, 0, 0, 0, 0, 0, 0, 0, 0);
+    check_window_fullscreen_state(creation_desc.OutputWindow, &initial_state.fullscreen_state);
+
+    /* Fullscreen */
+    creation_desc.Windowed = FALSE;
+    hr = IDXGIFactory_CreateSwapChain(factory, obj, &creation_desc, &swapchain);
+    ok(SUCCEEDED(hr), "CreateSwapChain failed, hr %#x.\n", hr);
+    hr = IDXGISwapChain_GetDesc(swapchain, &result_desc);
+    ok(SUCCEEDED(hr), "GetDesc failed, hr %#x.\n", hr);
+    hr = IDXGISwapChain_SetFullscreenState(swapchain, FALSE, NULL);
+    ok(SUCCEEDED(hr), "SetFullscreenState failed, hr %#x.\n", hr);
+    hr = IDXGISwapChain_GetContainingOutput(swapchain, &expected_state.target);
+    ok(SUCCEEDED(hr) || broken(hr == DXGI_ERROR_UNSUPPORTED) /* Win 7 testbot */,
+            "GetContainingOutput failed, hr %#x.\n", hr);
+    check_swapchain_fullscreen_state(swapchain, &initial_state);
+    IDXGISwapChain_Release(swapchain);
+    if (hr == DXGI_ERROR_UNSUPPORTED)
+    {
+        win_skip("GetContainingOutput() not supported.\n");
+        goto done;
+    }
+    if (result_desc.Windowed)
+    {
+        win_skip("Fullscreen not supported.\n");
+        IDXGIOutput_Release(expected_state.target);
+        goto done;
+    }
+
+    creation_desc.BufferDesc.Width = 0;
+    creation_desc.BufferDesc.Height = 0;
+    creation_desc.Windowed = FALSE;
+    creation_desc.Flags = 0;
+    compute_expected_swapchain_fullscreen_state_after_fullscreen_change(&expected_state,
+            &creation_desc, &initial_state.fullscreen_state.monitor_rect, 0, 0, expected_state.target);
+    expected_width = expected_client_rect->right - expected_client_rect->left;
+    expected_height = expected_client_rect->bottom - expected_client_rect->top;
+
+    hr = IDXGIFactory_CreateSwapChain(factory, obj, &creation_desc, &swapchain);
+    ok(SUCCEEDED(hr), "CreateSwapChain failed, hr %#x.\n", hr);
+    hr = IDXGISwapChain_GetDesc(swapchain, &result_desc);
+    ok(SUCCEEDED(hr), "GetDesc failed, hr %#x.\n", hr);
+    todo_wine ok(result_desc.BufferDesc.Width == expected_width, "Got width %u, expected %u.\n",
+            result_desc.BufferDesc.Width, expected_width);
+    todo_wine ok(result_desc.BufferDesc.Height == expected_height, "Got height %u, expected %u.\n",
+            result_desc.BufferDesc.Height, expected_height);
+    check_swapchain_fullscreen_state(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);
+    IDXGISwapChain_Release(swapchain);
+
+    /* Fullscreen and DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH */
+    creation_desc.BufferDesc.Width = 0;
+    creation_desc.BufferDesc.Height = 0;
+    creation_desc.Windowed = FALSE;
+    creation_desc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
+    compute_expected_swapchain_fullscreen_state_after_fullscreen_change(&expected_state,
+            &creation_desc, &initial_state.fullscreen_state.monitor_rect, 0, 0, expected_state.target);
+    expected_width = expected_client_rect->right - expected_client_rect->left;
+    expected_height = expected_client_rect->bottom - expected_client_rect->top;
+
+    hr = IDXGIFactory_CreateSwapChain(factory, obj, &creation_desc, &swapchain);
+    todo_wine ok(SUCCEEDED(hr), "CreateSwapChain failed, hr %#x.\n", hr);
+    if (SUCCEEDED(hr))
+    {
+        hr = IDXGISwapChain_GetDesc(swapchain, &result_desc);
+        ok(SUCCEEDED(hr), "GetDesc failed, hr %#x.\n", hr);
+        ok(result_desc.BufferDesc.Width == expected_width, "Got width %u, expected %u.\n",
+                result_desc.BufferDesc.Width, expected_width);
+        ok(result_desc.BufferDesc.Height == expected_height, "Got height %u, expected %u.\n",
+                result_desc.BufferDesc.Height, expected_height);
+        check_swapchain_fullscreen_state(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);
+        IDXGISwapChain_Release(swapchain);
+    }
+
+    IDXGIOutput_Release(expected_state.target);
+
+done:
     IUnknown_Release(obj);
     refcount = IDXGIDevice_Release(device);
     ok(!refcount, "Device has %u references left.\n", refcount);
@@ -829,6 +981,7 @@ static void test_create_swapchain(void)
     ok(!refcount, "Adapter has %u references left.\n", refcount);
     refcount = IDXGIFactory_Release(factory);
     ok(!refcount, "Factory has %u references left.\n", refcount);
+    check_window_fullscreen_state(creation_desc.OutputWindow, &initial_state.fullscreen_state);
     DestroyWindow(creation_desc.OutputWindow);
 }
 
@@ -1059,7 +1212,7 @@ static void test_swapchain_fullscreen_state(IDXGISwapChain *swapchain,
 
     expected_state = *initial_state;
     compute_expected_swapchain_fullscreen_state_after_fullscreen_change(&expected_state,
-            &swapchain_desc, &initial_state->fullscreen_state.monitor_rect, 800, 600);
+            &swapchain_desc, &initial_state->fullscreen_state.monitor_rect, 800, 600, NULL);
     hr = IDXGISwapChain_GetContainingOutput(swapchain, &expected_state.target);
     ok(SUCCEEDED(hr), "GetContainingOutput failed, hr %#x.\n", hr);
 
@@ -1122,7 +1275,7 @@ static void test_swapchain_fullscreen_state(IDXGISwapChain *swapchain,
         expected_state.fullscreen_state.monitor = output_desc.Monitor;
         expected_state.fullscreen_state.monitor_rect = orig_monitor_rect;
         compute_expected_swapchain_fullscreen_state_after_fullscreen_change(&expected_state,
-                &swapchain_desc, &orig_monitor_rect, 800, 600);
+                &swapchain_desc, &orig_monitor_rect, 800, 600, NULL);
 
         hr = IDXGISwapChain_SetFullscreenState(swapchain, TRUE, output);
         ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
@@ -1522,7 +1675,7 @@ static void test_fullscreen_resize_target(IDXGISwapChain *swapchain,
         ok(SUCCEEDED(hr), "GetDesc failed, hr %#x.\n", hr);
 
         compute_expected_swapchain_fullscreen_state_after_fullscreen_change(&expected_state,
-                &swapchain_desc, &output_desc.DesktopCoordinates, modes[i].Width, modes[i].Height);
+                &swapchain_desc, &output_desc.DesktopCoordinates, modes[i].Width, modes[i].Height, NULL);
 
         hr = IDXGISwapChain_ResizeTarget(swapchain, &modes[i]);
         ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
@@ -1627,7 +1780,7 @@ static void test_resize_target(void)
         {
             expected_state.fullscreen = TRUE;
             compute_expected_swapchain_fullscreen_state_after_fullscreen_change(&expected_state,
-                    &swapchain_desc, &initial_state.fullscreen_state.monitor_rect, 800, 600);
+                    &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);
-- 
2.7.3




More information about the wine-patches mailing list