[PATCH 2/5] d3d8/tests: Port test_display_formats() to d3d8.

Henri Verbeet hverbeet at codeweavers.com
Wed Jan 29 12:28:36 CST 2014


---
 dlls/d3d8/tests/device.c |   80 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 80 insertions(+)

diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c
index f5afbc4..6bcd05e 100644
--- a/dlls/d3d8/tests/device.c
+++ b/dlls/d3d8/tests/device.c
@@ -984,6 +984,85 @@ static void test_shader_versions(void)
     }
 }
 
+static void test_display_formats(void)
+{
+    D3DDEVTYPE device_type = D3DDEVTYPE_HAL;
+    unsigned int backbuffer, display;
+    unsigned int windowed, i;
+    D3DDISPLAYMODE mode;
+    IDirect3D8 *d3d8;
+    BOOL should_pass;
+    BOOL has_modes;
+    HRESULT hr;
+
+    static const struct
+    {
+        const char *name;
+        D3DFORMAT format;
+        D3DFORMAT alpha_format;
+        BOOL display;
+        BOOL windowed;
+    }
+    formats[] =
+    {
+        {"D3DFMT_R5G6B5",   D3DFMT_R5G6B5,      0,                  TRUE,   TRUE},
+        {"D3DFMT_X1R5G5B5", D3DFMT_X1R5G5B5,    D3DFMT_A1R5G5B5,    TRUE,   TRUE},
+        {"D3DFMT_A1R5G5B5", D3DFMT_A1R5G5B5,    D3DFMT_A1R5G5B5,    FALSE,  FALSE},
+        {"D3DFMT_X8R8G8B8", D3DFMT_X8R8G8B8,    D3DFMT_A8R8G8B8,    TRUE,   TRUE},
+        {"D3DFMT_A8R8G8B8", D3DFMT_A8R8G8B8,    D3DFMT_A8R8G8B8,    FALSE,  FALSE},
+        {"D3DFMT_UNKNOWN",  D3DFMT_UNKNOWN,     0,                  FALSE,  FALSE},
+    };
+
+    if (!(d3d8 = pDirect3DCreate8(D3D_SDK_VERSION)))
+    {
+        skip("Failed to create an IDirect3D8 object, skipping test.\n");
+        return;
+    }
+
+    for (display = 0; display < sizeof(formats) / sizeof(*formats); ++display)
+    {
+        for (i = 0, has_modes = FALSE; SUCCEEDED(IDirect3D8_EnumAdapterModes(d3d8, D3DADAPTER_DEFAULT, i, &mode)); ++i)
+        {
+            if (mode.Format == formats[display].format)
+            {
+                has_modes = TRUE;
+                break;
+            }
+        }
+
+        for (windowed = 0; windowed <= 1; ++windowed)
+        {
+            for (backbuffer = 0; backbuffer < sizeof(formats) / sizeof(*formats); ++backbuffer)
+            {
+                should_pass = FALSE;
+
+                if (formats[display].display && (formats[display].windowed || !windowed) && (has_modes || windowed))
+                {
+                    D3DFORMAT backbuffer_format;
+
+                    if (windowed && formats[backbuffer].format == D3DFMT_UNKNOWN)
+                        backbuffer_format = formats[display].format;
+                    else
+                        backbuffer_format = formats[backbuffer].format;
+
+                    hr = IDirect3D8_CheckDeviceFormat(d3d8, D3DADAPTER_DEFAULT, device_type, formats[display].format,
+                            D3DUSAGE_RENDERTARGET, D3DRTYPE_SURFACE, backbuffer_format);
+                    should_pass = (hr == D3D_OK) && (formats[display].format == formats[backbuffer].format
+                            || (formats[display].alpha_format
+                            && formats[display].alpha_format == formats[backbuffer].alpha_format));
+                }
+
+                hr = IDirect3D8_CheckDeviceType(d3d8, D3DADAPTER_DEFAULT, device_type,
+                        formats[display].format, formats[backbuffer].format, windowed);
+                ok(SUCCEEDED(hr) == should_pass,
+                        "Got unexpected hr %#x for %s / %s, windowed %#x, should_pass %#x.\n",
+                        hr, formats[display].name, formats[backbuffer].name, windowed, should_pass);
+            }
+        }
+    }
+
+    IDirect3D8_Release(d3d8);
+}
 
 /* Test adapter display modes */
 static void test_display_modes(void)
@@ -5793,6 +5872,7 @@ START_TEST(device)
         screen_height = GetSystemMetrics(SM_CYSCREEN);
 
         test_fpu_setup();
+        test_display_formats();
         test_display_modes();
         test_shader_versions();
         test_swapchain();
-- 
1.7.10.4




More information about the wine-patches mailing list