[PATCH resend 07/10] dxgi/tests: Add tests for IDXGISwapChain_GetFullscreenState() to test_create_swapchain().

Józef Kucia jkucia at codeweavers.com
Wed Aug 3 02:41:44 CDT 2016


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

diff --git a/dlls/dxgi/tests/device.c b/dlls/dxgi/tests/device.c
index 9c0aa9d..ce3d759 100644
--- a/dlls/dxgi/tests/device.c
+++ b/dlls/dxgi/tests/device.c
@@ -37,6 +37,43 @@ static ULONG get_refcount(IUnknown *iface)
     return IUnknown_Release(iface);
 }
 
+#define check_output_desc(a, b) check_output_desc_(__LINE__, a, b)
+static void check_output_desc_(unsigned int line, const DXGI_OUTPUT_DESC *desc,
+        const struct DXGI_OUTPUT_DESC *expected_desc)
+{
+    ok_(__FILE__, line)(!lstrcmpW(desc->DeviceName, expected_desc->DeviceName),
+            "Got unexpected device name %s, expected %s.\n",
+            wine_dbgstr_w(desc->DeviceName), wine_dbgstr_w(expected_desc->DeviceName));
+    ok_(__FILE__, line)(EqualRect(&desc->DesktopCoordinates, &expected_desc->DesktopCoordinates),
+            "Got unexpected desktop coordinates %s, expected %s.\n",
+            wine_dbgstr_rect(&desc->DesktopCoordinates),
+            wine_dbgstr_rect(&expected_desc->DesktopCoordinates));
+}
+
+static BOOL output_belongs_to_adapter(IDXGIOutput *output, IDXGIAdapter *adapter)
+{
+    DXGI_OUTPUT_DESC output_desc, desc;
+    unsigned int output_idx;
+    IDXGIOutput *o;
+    HRESULT hr;
+
+    hr = IDXGIOutput_GetDesc(output, &output_desc);
+    ok(SUCCEEDED(hr), "Failed to get output desc, hr %#x.\n", hr);
+
+    for (output_idx = 0; IDXGIAdapter_EnumOutputs(adapter, output_idx, &o) != DXGI_ERROR_NOT_FOUND; ++output_idx)
+    {
+        hr = IDXGIOutput_GetDesc(o, &desc);
+        ok(SUCCEEDED(hr), "Failed to get output desc, hr %#x.\n", hr);
+        IDXGIOutput_Release(o);
+
+        if (!lstrcmpW(desc.DeviceName, output_desc.DeviceName)
+                && EqualRect(&desc.DesktopCoordinates, &output_desc.DesktopCoordinates))
+            return TRUE;
+    }
+
+    return FALSE;
+}
+
 static IDXGIDevice *create_device(void)
 {
     IDXGIDevice *dxgi_device;
@@ -421,6 +458,8 @@ static void test_create_swapchain(void)
     IDXGIAdapter *adapter;
     IDXGIFactory *factory;
     IDXGIDevice *device;
+    IDXGIOutput *target;
+    BOOL fullscreen;
     HRESULT hr;
     UINT i;
 
@@ -501,40 +540,66 @@ static void test_create_swapchain(void)
     refcount = get_refcount((IUnknown *)factory);
     ok(refcount == 2, "Got unexpected refcount %u.\n", refcount);
 
-    for (i = 0; i < sizeof(refresh_list)/sizeof(refresh_list[0]); i++)
+    for (i = 0; i < sizeof(refresh_list) / sizeof(*refresh_list); ++i)
     {
         creation_desc.BufferDesc.RefreshRate.Numerator = refresh_list[i].numerator;
         creation_desc.BufferDesc.RefreshRate.Denominator = refresh_list[i].denominator;
 
         hr = IDXGIFactory_CreateSwapChain(factory, obj, &creation_desc, &swapchain);
-        ok(SUCCEEDED(hr), "CreateSwapChain failed, hr %#x.\n", hr);
+        ok(SUCCEEDED(hr), "Test %u: CreateSwapChain failed, hr %#x.\n", i, hr);
 
         hr = IDXGISwapChain_GetDesc(swapchain, &result_desc);
-        ok(SUCCEEDED(hr), "GetDesc failed, hr %#x.\n", hr);
+        ok(SUCCEEDED(hr), "Test %u: GetDesc failed, hr %#x.\n", i, hr);
+
+        ok(result_desc.Windowed == creation_desc.Windowed, "Test %u: Got unexpected windowed %#x.\n",
+                i, result_desc.Windowed);
 
         todo_wine_if (!refresh_list[i].numerator_should_pass)
             ok(result_desc.BufferDesc.RefreshRate.Numerator == refresh_list[i].numerator,
-                "Numerator %u is %u.\n", i, result_desc.BufferDesc.RefreshRate.Numerator);
+                    "Numerator %u is %u.\n", i, result_desc.BufferDesc.RefreshRate.Numerator);
 
         todo_wine_if (!refresh_list[i].denominator_should_pass)
             ok(result_desc.BufferDesc.RefreshRate.Denominator == refresh_list[i].denominator,
-                    "Denominator %u is %u.\n", i ,result_desc.BufferDesc.RefreshRate.Denominator);
+                    "Denominator %u is %u.\n", i, result_desc.BufferDesc.RefreshRate.Denominator);
+
+        fullscreen = 0xdeadbeef;
+        target = (void *)0xdeadbeef;
+        hr = IDXGISwapChain_GetFullscreenState(swapchain, &fullscreen, &target);
+        ok(hr == S_OK, "Test %u: GetFullscreenState failed, hr %#x.\n", i, hr);
+        ok(!fullscreen, "Test %u: Got unexpected fullscreen %#x.\n", i, fullscreen);
+        ok(!target, "Test %u: Got unexpected target %p.\n", i, target);
+
+        hr = IDXGISwapChain_GetFullscreenState(swapchain, NULL, NULL);
+        ok(hr == S_OK, "Test %u: Got unexpected hr %#x.\n", i, hr);
+        fullscreen = 0xdeadbeef;
+        hr = IDXGISwapChain_GetFullscreenState(swapchain, &fullscreen, NULL);
+        ok(hr == S_OK, "Test %u: Got unexpected hr %#x.\n", i, hr);
+        ok(!fullscreen, "Test %u: Got unexpected fullscreen %#x.\n", i, fullscreen);
+        target = (void *)0xdeadbeef;
+        hr = IDXGISwapChain_GetFullscreenState(swapchain, NULL, &target);
+        ok(hr == S_OK, "Test %u: Got unexpected hr %#x.\n", i, hr);
+        ok(!target, "Test %u: Got unexpected target %p.\n", i, target);
 
         IDXGISwapChain_Release(swapchain);
     }
 
     creation_desc.Windowed = FALSE;
 
-    for (i = 0; i < sizeof(refresh_list)/sizeof(refresh_list[0]); i++)
+    for (i = 0; i < sizeof(refresh_list) / sizeof(*refresh_list); ++i)
     {
         creation_desc.BufferDesc.RefreshRate.Numerator = refresh_list[i].numerator;
         creation_desc.BufferDesc.RefreshRate.Denominator = refresh_list[i].denominator;
 
         hr = IDXGIFactory_CreateSwapChain(factory, obj, &creation_desc, &swapchain);
-        ok(SUCCEEDED(hr), "CreateSwapChain failed, hr %#x.\n", hr);
+        ok(SUCCEEDED(hr), "Test %u: CreateSwapChain failed, hr %#x.\n", i, hr);
 
         hr = IDXGISwapChain_GetDesc(swapchain, &result_desc);
-        ok(SUCCEEDED(hr), "GetDesc failed, hr %#x.\n", hr);
+        ok(SUCCEEDED(hr), "Test %u: GetDesc failed, hr %#x.\n", i, hr);
+
+        /* When numerator is non-zero and denominator is zero, the windowed mode is used.
+         * Additionally, some versions of WARP seem to always fail to change fullscreen state. */
+        if (result_desc.Windowed != creation_desc.Windowed)
+            trace("Test %u: Failed to change fullscreen state.\n", i);
 
         todo_wine_if (!refresh_list[i].numerator_should_pass)
             ok(result_desc.BufferDesc.RefreshRate.Numerator == refresh_list[i].numerator,
@@ -542,10 +607,51 @@ static void test_create_swapchain(void)
 
         todo_wine_if (!refresh_list[i].denominator_should_pass)
             ok(result_desc.BufferDesc.RefreshRate.Denominator == refresh_list[i].denominator,
-                    "Denominator %u is %u.\n", i ,result_desc.BufferDesc.RefreshRate.Denominator);
+                    "Denominator %u is %u.\n", i, result_desc.BufferDesc.RefreshRate.Denominator);
+
+        fullscreen = FALSE;
+        target = NULL;
+        hr = IDXGISwapChain_GetFullscreenState(swapchain, &fullscreen, &target);
+        ok(hr == S_OK, "Test %u: GetFullscreenState failed, hr %#x.\n", i, hr);
+        ok(fullscreen == !result_desc.Windowed, "Test %u: Got fullscreen %#x, expected %#x.\n",
+                i, fullscreen, result_desc.Windowed);
+        ok(result_desc.Windowed ? !target : !!target, "Test %u: Got unexpected target %p.\n", i, target);
+        if (!result_desc.Windowed)
+        {
+            IDXGIOutput *containing_output;
+            hr = IDXGISwapChain_GetContainingOutput(swapchain, &containing_output);
+            ok(SUCCEEDED(hr), "Test %u: GetContainingOutput failed, hr %#x.\n", i, hr);
+            ok(containing_output == target, "Test %u: Got unexpected containing output pointer %p.\n",
+                    i, containing_output);
+            IDXGIOutput_Release(containing_output);
+
+            ok(output_belongs_to_adapter(target, adapter),
+                    "Test %u: Output %p doesn't belong to adapter %p.\n",
+                    i, target, adapter);
+            IDXGIOutput_Release(target);
+
+            hr = IDXGISwapChain_GetFullscreenState(swapchain, NULL, NULL);
+            ok(hr == S_OK, "Test %u: Got unexpected hr %#x.\n", i, hr);
+            fullscreen = FALSE;
+            hr = IDXGISwapChain_GetFullscreenState(swapchain, &fullscreen, NULL);
+            ok(hr == S_OK, "Test %u: Got unexpected hr %#x.\n", i, hr);
+            ok(fullscreen, "Test %u: Got unexpected fullscreen %#x.\n", i, fullscreen);
+            target = NULL;
+            hr = IDXGISwapChain_GetFullscreenState(swapchain, NULL, &target);
+            ok(hr == S_OK, "Test %u: Got unexpected hr %#x.\n", i, hr);
+            ok(!!target, "Test %u: Got unexpected target %p.\n", i, target);
+            IDXGIOutput_Release(target);
+        }
 
         hr = IDXGISwapChain_SetFullscreenState(swapchain, FALSE, NULL);
-        ok(SUCCEEDED(hr), "SetFullscreenState failed, hr %#x.\n", hr);
+        ok(SUCCEEDED(hr), "Test %u: SetFullscreenState failed, hr %#x.\n", i, hr);
+
+        fullscreen = 0xdeadbeef;
+        target = (void *)0xdeadbeef;
+        hr = IDXGISwapChain_GetFullscreenState(swapchain, &fullscreen, &target);
+        ok(hr == S_OK, "Test %u: GetFullscreenState failed, hr %#x.\n", i, hr);
+        ok(!fullscreen, "Test %u: Got unexpected fullscreen %#x.\n", i, fullscreen);
+        ok(!target, "Test %u: Got unexpected target %p.\n", i, target);
 
         IDXGISwapChain_Release(swapchain);
     }
@@ -643,15 +749,7 @@ static void test_get_containing_output(void)
     ok(SUCCEEDED(hr), "GetDesc failed, hr %#x.\n", hr);
     hr = IDXGIOutput_GetDesc(output2, &output_desc2);
     ok(SUCCEEDED(hr), "GetDesc failed, hr %#x.\n", hr);
-
-    ok(!lstrcmpW(output_desc.DeviceName, output_desc2.DeviceName),
-            "Got unexpected device name %s, expected %s.\n",
-            wine_dbgstr_w(output_desc.DeviceName), wine_dbgstr_w(output_desc2.DeviceName));
-    ok(!memcmp(&output_desc.DesktopCoordinates, &output_desc2.DesktopCoordinates,
-            sizeof(output_desc.DesktopCoordinates)),
-            "Got unexpected desktop coordinates %s, expected %s.\n",
-            wine_dbgstr_rect(&output_desc.DesktopCoordinates),
-            wine_dbgstr_rect(&output_desc2.DesktopCoordinates));
+    check_output_desc(&output_desc, &output_desc2);
 
     refcount = IDXGIOutput_Release(output2);
     ok(!refcount, "IDXGIOuput has %u references left.\n", refcount);
@@ -1348,7 +1446,8 @@ static void test_swapchain_parameters(void)
 
             hr = IDXGIResource_GetUsage(resource, &usage);
             ok(SUCCEEDED(hr), "Failed to get resource usage, hr %#x, test %u, buffer %u.\n", hr, i, j);
-            ok(usage == expected_usage || broken(usage == broken_usage), "Got usage %x, expected %x, test %u, buffer %u.\n",
+            ok(usage == expected_usage || broken(usage == broken_usage),
+                    "Got usage %x, expected %x, test %u, buffer %u.\n",
                     usage, expected_usage, i, j);
 
             IDXGIResource_Release(resource);
@@ -1487,7 +1586,7 @@ static void test_output_desc(void)
             ok(ret, "Failed to get monitor info.\n");
             ok(!lstrcmpW(desc.DeviceName, monitor_info.szDevice), "Got unexpected device name %s, expected %s.\n",
                     wine_dbgstr_w(desc.DeviceName), wine_dbgstr_w(monitor_info.szDevice));
-            ok(!memcmp(&desc.DesktopCoordinates, &monitor_info.rcMonitor, sizeof(desc.DesktopCoordinates)),
+            ok(EqualRect(&desc.DesktopCoordinates, &monitor_info.rcMonitor),
                     "Got unexpected desktop coordinates %s, expected %s.\n",
                     wine_dbgstr_rect(&desc.DesktopCoordinates),
                     wine_dbgstr_rect(&monitor_info.rcMonitor));
-- 
2.7.3




More information about the wine-patches mailing list