[PATCH 6/9] dxgi/tests: Add test for IDXGIOutput_FindClosestMatchingMode().

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


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

diff --git a/dlls/dxgi/tests/device.c b/dlls/dxgi/tests/device.c
index 8ec65e2..d533af4 100644
--- a/dlls/dxgi/tests/device.c
+++ b/dlls/dxgi/tests/device.c
@@ -38,6 +38,53 @@ static ULONG get_refcount(IUnknown *iface)
     return IUnknown_Release(iface);
 }
 
+#define MODE_DESC_IGNORE_RESOLUTION        0x00000001u
+#define MODE_DESC_IGNORE_REFRESH_RATE      0x00000002u
+#define MODE_DESC_IGNORE_FORMAT            0x00000004u
+#define MODE_DESC_IGNORE_SCANLINE_ORDERING 0x00000008u
+#define MODE_DESC_IGNORE_SCALING           0x00000010u
+
+#define MODE_DESC_CHECK_RESOLUTION         (~MODE_DESC_IGNORE_RESOLUTION)
+#define MODE_DESC_CHECK_FORMAT             (~MODE_DESC_IGNORE_FORMAT)
+
+#define check_mode_desc(a, b, c) check_mode_desc_(__LINE__, a, b, c)
+static void check_mode_desc_(unsigned int line, const DXGI_MODE_DESC *desc,
+        const DXGI_MODE_DESC *expected_desc, unsigned int ignore_flags)
+{
+    if (!(ignore_flags & MODE_DESC_IGNORE_RESOLUTION))
+    {
+        ok_(__FILE__, line)(desc->Width == expected_desc->Width
+                && desc->Height == expected_desc->Height,
+                "Got resolution %ux%u, expected %ux%u.\n",
+                desc->Width, desc->Height, expected_desc->Width, expected_desc->Height);
+    }
+    if (!(ignore_flags & MODE_DESC_IGNORE_REFRESH_RATE))
+    {
+        ok_(__FILE__, line)(desc->RefreshRate.Numerator == expected_desc->RefreshRate.Numerator
+                && desc->RefreshRate.Denominator == expected_desc->RefreshRate.Denominator,
+                "Got refresh rate %u / %u, expected %u / %u.\n",
+                desc->RefreshRate.Numerator, desc->RefreshRate.Denominator,
+                expected_desc->RefreshRate.Denominator, expected_desc->RefreshRate.Denominator);
+    }
+    if (!(ignore_flags & MODE_DESC_IGNORE_FORMAT))
+    {
+        ok_(__FILE__, line)(desc->Format == expected_desc->Format,
+                "Got format %#x, expected %#x.\n", desc->Format, expected_desc->Format);
+    }
+    if (!(ignore_flags & MODE_DESC_IGNORE_SCANLINE_ORDERING))
+    {
+        ok_(__FILE__, line)(desc->ScanlineOrdering == expected_desc->ScanlineOrdering,
+                "Got scanline ordering %#x, expected %#x.\n",
+                desc->ScanlineOrdering, expected_desc->ScanlineOrdering);
+    }
+    if (!(ignore_flags & MODE_DESC_IGNORE_SCALING))
+    {
+        ok_(__FILE__, line)(desc->Scaling == expected_desc->Scaling,
+                "Got scaling %#x, expected %#x.\n",
+                desc->Scaling, expected_desc->Scaling);
+    }
+}
+
 #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)
@@ -623,6 +670,187 @@ static void test_output(void)
     ok(!refcount, "Device has %u references left.\n", refcount);
 }
 
+static void test_find_closest_matching_mode(void)
+{
+    DXGI_MODE_DESC *modes, mode, matching_mode;
+    unsigned int i, mode_count;
+    IDXGIAdapter *adapter;
+    IDXGIDevice *device;
+    IDXGIOutput *output;
+    ULONG refcount;
+    HRESULT hr;
+
+    if (!(device = create_device()))
+    {
+        skip("Failed to create device.\n");
+        return;
+    }
+
+    hr = IDXGIDevice_GetAdapter(device, &adapter);
+    ok(SUCCEEDED(hr), "GetAdapter failed, hr %#x.\n", hr);
+
+    hr = IDXGIAdapter_EnumOutputs(adapter, 0, &output);
+    if (hr == DXGI_ERROR_NOT_FOUND)
+    {
+        win_skip("Adapter doesn't have any outputs.\n");
+        IDXGIAdapter_Release(adapter);
+        IDXGIDevice_Release(device);
+        return;
+    }
+    ok(SUCCEEDED(hr), "EnumOutputs failed, hr %#x.\n", hr);
+
+    memset(&mode, 0, sizeof(mode));
+    hr = IDXGIOutput_FindClosestMatchingMode(output, &mode, &matching_mode, NULL);
+    ok(hr == DXGI_ERROR_INVALID_CALL || broken(hr == DXGI_ERROR_NOT_CURRENTLY_AVAILABLE), /* Win 7 testbot */
+            "Got unexpected hr %#x.\n", hr);
+    if (hr == DXGI_ERROR_NOT_CURRENTLY_AVAILABLE)
+    {
+        win_skip("FindClosestMatchingMode() not supported.\n");
+        goto done;
+    }
+
+    memset(&mode, 0, sizeof(mode));
+    hr = IDXGIOutput_FindClosestMatchingMode(output, &mode, &matching_mode, (IUnknown *)device);
+    todo_wine ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+
+    hr = IDXGIOutput_GetDisplayModeList(output, DXGI_FORMAT_R8G8B8A8_UNORM, 0, &mode_count, NULL);
+    ok(SUCCEEDED(hr), "Failed to list modes, hr %#x.\n", hr);
+
+    modes = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*modes) * mode_count);
+
+    hr = IDXGIOutput_GetDisplayModeList(output, DXGI_FORMAT_R8G8B8A8_UNORM, 0, &mode_count, modes);
+    ok(SUCCEEDED(hr), "Failed to list modes, hr %#x.\n", hr);
+
+    for (i = 0; i < mode_count; ++i)
+    {
+        mode = modes[i];
+        hr = IDXGIOutput_FindClosestMatchingMode(output, &mode, &matching_mode, NULL);
+        ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+        check_mode_desc(&matching_mode, &modes[i], MODE_DESC_IGNORE_SCALING);
+
+        mode.Format = DXGI_FORMAT_UNKNOWN;
+        hr = IDXGIOutput_FindClosestMatchingMode(output, &mode, &matching_mode, NULL);
+        ok(hr == DXGI_ERROR_INVALID_CALL, "Got unexpected hr %#x.\n", hr);
+
+        mode = modes[i];
+        mode.Width = 0;
+        hr = IDXGIOutput_FindClosestMatchingMode(output, &mode, &matching_mode, NULL);
+        ok(hr == DXGI_ERROR_INVALID_CALL, "Got unexpected hr %#x.\n", hr);
+
+        mode = modes[i];
+        mode.Height = 0;
+        hr = IDXGIOutput_FindClosestMatchingMode(output, &mode, &matching_mode, NULL);
+        ok(hr == DXGI_ERROR_INVALID_CALL, "Got unexpected hr %#x.\n", hr);
+
+        mode = modes[i];
+        mode.Width = mode.Height = 0;
+        hr = IDXGIOutput_FindClosestMatchingMode(output, &mode, &matching_mode, NULL);
+        ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+        check_mode_desc(&matching_mode, &modes[i], MODE_DESC_IGNORE_SCALING | MODE_DESC_IGNORE_RESOLUTION);
+        ok(matching_mode.Width > 0 && matching_mode.Height > 0, "Got unexpected resolution %ux%u.\n",
+                matching_mode.Width, matching_mode.Height);
+
+        mode = modes[i];
+        mode.RefreshRate.Numerator = mode.RefreshRate.Denominator = 0;
+        hr = IDXGIOutput_FindClosestMatchingMode(output, &mode, &matching_mode, NULL);
+        ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+        check_mode_desc(&matching_mode, &modes[i], MODE_DESC_IGNORE_SCALING | MODE_DESC_IGNORE_REFRESH_RATE);
+        ok(matching_mode.RefreshRate.Numerator > 0 && matching_mode.RefreshRate.Denominator > 0,
+                "Got unexpected refresh rate %u / %u.\n",
+                matching_mode.RefreshRate.Numerator, matching_mode.RefreshRate.Denominator);
+
+        mode = modes[i];
+        mode.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
+        hr = IDXGIOutput_FindClosestMatchingMode(output, &mode, &matching_mode, NULL);
+        ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+        check_mode_desc(&matching_mode, &modes[i], MODE_DESC_IGNORE_SCALING | MODE_DESC_IGNORE_SCANLINE_ORDERING);
+        ok(matching_mode.ScanlineOrdering, "Got unexpected scanline ordering %#x.\n",
+                matching_mode.ScanlineOrdering);
+
+        memset(&mode, 0, sizeof(mode));
+        mode.Width = modes[i].Width;
+        mode.Height = modes[i].Height;
+        mode.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+        hr = IDXGIOutput_FindClosestMatchingMode(output, &mode, &matching_mode, NULL);
+        ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+        check_mode_desc(&matching_mode, &modes[i], MODE_DESC_CHECK_RESOLUTION & MODE_DESC_CHECK_FORMAT);
+
+        memset(&mode, 0, sizeof(mode));
+        mode.Width = modes[i].Width - 1;
+        mode.Height = modes[i].Height - 1;
+        mode.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+        hr = IDXGIOutput_FindClosestMatchingMode(output, &mode, &matching_mode, NULL);
+        ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+        check_mode_desc(&matching_mode, &modes[i], MODE_DESC_CHECK_RESOLUTION & MODE_DESC_CHECK_FORMAT);
+
+        memset(&mode, 0, sizeof(mode));
+        mode.Width = modes[i].Width + 1;
+        mode.Height = modes[i].Height + 1;
+        mode.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+        hr = IDXGIOutput_FindClosestMatchingMode(output, &mode, &matching_mode, NULL);
+        ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+        check_mode_desc(&matching_mode, &modes[i], MODE_DESC_CHECK_RESOLUTION & MODE_DESC_CHECK_FORMAT);
+    }
+
+    memset(&mode, 0, sizeof(mode));
+    mode.Width = mode.Height = 10;
+    mode.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+    hr = IDXGIOutput_FindClosestMatchingMode(output, &mode, &matching_mode, NULL);
+    ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+    /* Find mode for the lowest resolution. */
+    mode = modes[0];
+    for (i = 0; i < mode_count; ++i)
+    {
+        if (mode.Width >= modes[i].Width && mode.Height >= modes[i].Height)
+            mode = modes[i];
+    }
+    check_mode_desc(&matching_mode, &mode, MODE_DESC_CHECK_RESOLUTION & MODE_DESC_CHECK_FORMAT);
+
+    memset(&mode, 0, sizeof(mode));
+    mode.Width = modes[0].Width;
+    mode.Height = modes[0].Height;
+    mode.Format = modes[0].Format;
+    mode.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UPPER_FIELD_FIRST;
+    hr = IDXGIOutput_FindClosestMatchingMode(output, &mode, &matching_mode, NULL);
+    ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+    check_mode_desc(&matching_mode, &modes[0], MODE_DESC_CHECK_RESOLUTION & MODE_DESC_CHECK_FORMAT);
+
+    memset(&mode, 0, sizeof(mode));
+    mode.Width = modes[0].Width;
+    mode.Height = modes[0].Height;
+    mode.Format = modes[0].Format;
+    mode.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_LOWER_FIELD_FIRST;
+    hr = IDXGIOutput_FindClosestMatchingMode(output, &mode, &matching_mode, NULL);
+    ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+    check_mode_desc(&matching_mode, &modes[0], MODE_DESC_CHECK_RESOLUTION & MODE_DESC_CHECK_FORMAT);
+
+    memset(&mode, 0, sizeof(mode));
+    mode.Width = modes[0].Width;
+    mode.Height = modes[0].Height;
+    mode.Format = modes[0].Format;
+    mode.Scaling = DXGI_MODE_SCALING_CENTERED;
+    hr = IDXGIOutput_FindClosestMatchingMode(output, &mode, &matching_mode, NULL);
+    ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+    check_mode_desc(&matching_mode, &modes[0], MODE_DESC_CHECK_RESOLUTION & MODE_DESC_CHECK_FORMAT);
+
+    memset(&mode, 0, sizeof(mode));
+    mode.Width = modes[0].Width;
+    mode.Height = modes[0].Height;
+    mode.Format = modes[0].Format;
+    mode.Scaling = DXGI_MODE_SCALING_STRETCHED;
+    hr = IDXGIOutput_FindClosestMatchingMode(output, &mode, &matching_mode, NULL);
+    ok(hr == S_OK, "Got unexpected hr %#x.\n", hr);
+    check_mode_desc(&matching_mode, &modes[0], MODE_DESC_CHECK_RESOLUTION & MODE_DESC_CHECK_FORMAT);
+
+    HeapFree(GetProcessHeap(), 0, modes);
+
+done:
+    IDXGIOutput_Release(output);
+    IDXGIAdapter_Release(adapter);
+    refcount = IDXGIDevice_Release(device);
+    ok(!refcount, "Device has %u references left.\n", refcount);
+}
+
 struct refresh_rates
 {
     UINT numerator;
@@ -2868,6 +3096,7 @@ START_TEST(device)
     test_create_surface();
     test_parents();
     test_output();
+    test_find_closest_matching_mode();
     test_create_swapchain();
     test_get_containing_output();
     test_set_fullscreen();
-- 
2.7.3




More information about the wine-patches mailing list