[PATCH] ddraw/tests: Skip A4R4G4B4 ckey tests on Nvidia (v3)

Stefan Dösinger stefandoesinger at gmx.at
Sun Jul 10 16:55:44 CDT 2016


Signed-off-by: Stefan Dösinger <stefandoesinger at gmx.at>

---

Version 3: Skip the tests only on Nvidia, run them on other hardware.
Replace WARP detection with the new ddraw_is_warp function.

Version 2: Don't remove the misbehavior detection as it also filters out
a related bug on WARP on R5G6B5.

They're more broken on Nvidia + Win10 than they used to be on Nvidia +
Win7. I can't find a way to detect the problem without putting the driver
into a broken state.

The annoying part of this is that we lose 4 bit precision tests. X4R4G4B4
doesn't seem to exist everywhere.
---
 dlls/ddraw/tests/ddraw1.c | 63 ++++++++++++++++++++++++++++---------------
 dlls/ddraw/tests/ddraw2.c | 63 ++++++++++++++++++++++++++++---------------
 dlls/ddraw/tests/ddraw4.c | 69 ++++++++++++++++++++++++++++-------------------
 dlls/ddraw/tests/ddraw7.c | 65 ++++++++++++++++++++++++++++----------------
 4 files changed, 166 insertions(+), 94 deletions(-)

diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index 752bfb8..923aea3 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -7590,6 +7590,23 @@ done:
     DestroyWindow(window);
 }
 
+static BOOL ddraw_is_nvidia(IDirectDraw *ddraw)
+{
+    IDirectDraw4 *ddraw4;
+    DDDEVICEIDENTIFIER identifier;
+    HRESULT hr;
+
+    if (!strcmp(winetest_platform, "wine"))
+        return FALSE;
+
+    hr = IDirectDraw_QueryInterface(ddraw, &IID_IDirectDraw4, (void **)&ddraw4);
+    ok(SUCCEEDED(hr), "Failed to get IDirectDraw4 interface, hr %#x.\n", hr);
+    hr = IDirectDraw4_GetDeviceIdentifier(ddraw4, &identifier, 0);
+    ok(SUCCEEDED(hr), "Failed to get device identifier, hr %#x.\n", hr);
+    IDirectDraw4_Release(ddraw4);
+    return identifier.dwVendorId == 0x10de;
+}
+
 static void test_colorkey_precision(void)
 {
     static D3DTLVERTEX quad[] =
@@ -7621,18 +7638,18 @@ static void test_colorkey_precision(void)
     DDCOLORKEY ckey;
     DDBLTFX fx;
     DWORD data[4] = {0}, color_mask;
-    D3DDEVICEDESC device_desc, hel_desc;
-    BOOL warp;
+    BOOL is_nvidia, is_warp;
     static const struct
     {
         unsigned int max, shift, bpp, clear;
         const char *name;
+        BOOL skip_nv;
         DDPIXELFORMAT fmt;
     }
     tests[] =
     {
         {
-            255, 0, 4, 0x00345678, "D3DFMT_X8R8G8B8",
+            255, 0, 4, 0x00345678, "D3DFMT_X8R8G8B8", FALSE,
             {
                 sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
                 {32}, {0x00ff0000}, {0x0000ff00}, {0x000000ff}, {0x00000000}
@@ -7640,7 +7657,7 @@ static void test_colorkey_precision(void)
 
         },
         {
-            63, 5, 2, 0x5678, "D3DFMT_R5G6B5, G channel",
+            63, 5, 2, 0x5678, "D3DFMT_R5G6B5, G channel", FALSE,
             {
                 sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
                 {16}, {0xf800}, {0x07e0}, {0x001f}, {0x0000}
@@ -7648,7 +7665,7 @@ static void test_colorkey_precision(void)
 
         },
         {
-            31, 0, 2, 0x5678, "D3DFMT_R5G6B5, B channel",
+            31, 0, 2, 0x5678, "D3DFMT_R5G6B5, B channel", FALSE,
             {
                 sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
                 {16}, {0xf800}, {0x07e0}, {0x001f}, {0x0000}
@@ -7656,12 +7673,11 @@ static void test_colorkey_precision(void)
 
         },
         {
-            15, 0, 2, 0x0678, "D3DFMT_A4R4G4B4",
+            15, 0, 2, 0x0678, "D3DFMT_A4R4G4B4", TRUE,
             {
                 sizeof(DDPIXELFORMAT), DDPF_RGB | DDPF_ALPHAPIXELS, 0,
                 {16}, {0x0f00}, {0x00f0}, {0x000f}, {0xf000}
             }
-
         },
     };
 
@@ -7679,20 +7695,14 @@ static void test_colorkey_precision(void)
     hr = IDirect3DDevice_QueryInterface(device, &IID_IDirectDrawSurface, (void **)&rt);
     ok(SUCCEEDED(hr), "Failed to get render target, hr %#x.\n", hr);
 
+    is_nvidia = ddraw_is_nvidia(ddraw);
     /* The Windows 8 WARP driver has plenty of false negatives in X8R8G8B8
      * (color key doesn't match although the values are equal), and a false
      * positive when the color key is 0 and the texture contains the value 1.
      * I don't want to mark this broken unconditionally since this would
-     * essentially disable the test on Windows. Try to detect WARP (and I
-     * guess mismatch other SW renderers) by its ability to texture from
-     * system memory. Also on random occasions 254 == 255 and 255 != 255.*/
-    memset(&device_desc, 0, sizeof(device_desc));
-    device_desc.dwSize = sizeof(device_desc);
-    memset(&hel_desc, 0, sizeof(hel_desc));
-    hel_desc.dwSize = sizeof(hel_desc);
-    hr = IDirect3DDevice_GetCaps(device, &device_desc, &hel_desc);
-    ok(SUCCEEDED(hr), "Failed to get device caps, hr %#x.\n", hr);
-    warp = !!(device_desc.dwDevCaps & D3DDEVCAPS_TEXTURESYSTEMMEMORY);
+     * essentially disable the test on Windows. Also on random occasions
+     * 254 == 255 and 255 != 255.*/
+    is_warp = ddraw_is_warp(ddraw);
 
     green = create_diffuse_material(device, 0.0f, 1.0f, 0.0f, 0.0f);
     viewport = create_viewport(device, 0, 0, 640, 480);
@@ -7713,6 +7723,12 @@ static void test_colorkey_precision(void)
 
     for (t = 0; t < sizeof(tests) / sizeof(*tests); ++t)
     {
+        if (is_nvidia && tests[t].skip_nv)
+        {
+            win_skip("Skipping test %s on Nvidia Windows drivers.\n", tests[t].name);
+            continue;
+        }
+
         memset(&surface_desc, 0, sizeof(surface_desc));
         surface_desc.dwSize = sizeof(surface_desc);
         surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
@@ -7849,6 +7865,9 @@ static void test_colorkey_precision(void)
                      * so we can detect the bug by looking at the otherwise unused 4th texel. It should
                      * never be masked out by the key.
                      *
+                     * On Windows 10 the problem is worse, Blt just hangs. For this reason the ARGB4444
+                     * test is disabled entirely.
+                     *
                      * Also appears to affect the testbot in some way with R5G6B5. Color keying is
                      * terrible on WARP. */
                     skip("Nvidia A4R4G4B4 color keying blit bug detected, skipping.\n");
@@ -7884,26 +7903,26 @@ static void test_colorkey_precision(void)
 
             color = get_surface_color(rt, 80, 240);
             if (!c)
-                ok(compare_color(color, 0x0000ff00, 1) || broken(warp && compare_color(color, 0x00000000, 1)),
+                ok(compare_color(color, 0x0000ff00, 1) || broken(is_warp && compare_color(color, 0x00000000, 1)),
                         "Got unexpected color 0x%08x, format %s, c=%u.\n",
                         color, tests[t].name, c);
             else
-                ok(compare_color(color, 0x00000000, 1) || broken(warp && compare_color(color, 0x0000ff00, 1)),
+                ok(compare_color(color, 0x00000000, 1) || broken(is_warp && compare_color(color, 0x0000ff00, 1)),
                         "Got unexpected color 0x%08x, format %s, c=%u.\n",
                         color, tests[t].name, c);
 
             color = get_surface_color(rt, 240, 240);
-            ok(compare_color(color, 0x0000ff00, 1) || broken(warp && compare_color(color, 0x00000000, 1)),
+            ok(compare_color(color, 0x0000ff00, 1) || broken(is_warp && compare_color(color, 0x00000000, 1)),
                     "Got unexpected color 0x%08x, format %s, c=%u.\n",
                     color, tests[t].name, c);
 
             color = get_surface_color(rt, 400, 240);
             if (c == tests[t].max)
-                ok(compare_color(color, 0x0000ff00, 1) || broken(warp && compare_color(color, 0x00000000, 1)),
+                ok(compare_color(color, 0x0000ff00, 1) || broken(is_warp && compare_color(color, 0x00000000, 1)),
                         "Got unexpected color 0x%08x, format %s, c=%u.\n",
                         color, tests[t].name, c);
             else
-                ok(compare_color(color, 0x00000000, 1) || broken(warp && compare_color(color, 0x0000ff00, 1)),
+                ok(compare_color(color, 0x00000000, 1) || broken(is_warp && compare_color(color, 0x0000ff00, 1)),
                         "Got unexpected color 0x%08x, format %s, c=%u.\n",
                         color, tests[t].name, c);
 
diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c
index 363133d..fda7ffd 100644
--- a/dlls/ddraw/tests/ddraw2.c
+++ b/dlls/ddraw/tests/ddraw2.c
@@ -8749,6 +8749,23 @@ done:
     DestroyWindow(window);
 }
 
+static BOOL ddraw_is_nvidia(IDirectDraw2 *ddraw)
+{
+    IDirectDraw4 *ddraw4;
+    DDDEVICEIDENTIFIER identifier;
+    HRESULT hr;
+
+    if (!strcmp(winetest_platform, "wine"))
+        return FALSE;
+
+    hr = IDirectDraw2_QueryInterface(ddraw, &IID_IDirectDraw4, (void **)&ddraw4);
+    ok(SUCCEEDED(hr), "Failed to get IDirectDraw4 interface, hr %#x.\n", hr);
+    hr = IDirectDraw4_GetDeviceIdentifier(ddraw4, &identifier, 0);
+    ok(SUCCEEDED(hr), "Failed to get device identifier, hr %#x.\n", hr);
+    IDirectDraw4_Release(ddraw4);
+    return identifier.dwVendorId == 0x10de;
+}
+
 static void test_colorkey_precision(void)
 {
     static D3DLVERTEX quad[] =
@@ -8776,18 +8793,18 @@ static void test_colorkey_precision(void)
     DDCOLORKEY ckey;
     DDBLTFX fx;
     DWORD data[4] = {0}, color_mask;
-    D3DDEVICEDESC device_desc, hel_desc;
-    BOOL warp;
+    BOOL is_nvidia, is_warp;
     static const struct
     {
         unsigned int max, shift, bpp, clear;
         const char *name;
+        BOOL skip_nv;
         DDPIXELFORMAT fmt;
     }
     tests[] =
     {
         {
-            255, 0, 4, 0x00345678, "D3DFMT_X8R8G8B8",
+            255, 0, 4, 0x00345678, "D3DFMT_X8R8G8B8", FALSE,
             {
                 sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
                 {32}, {0x00ff0000}, {0x0000ff00}, {0x000000ff}, {0x00000000}
@@ -8795,7 +8812,7 @@ static void test_colorkey_precision(void)
 
         },
         {
-            63, 5, 2, 0x5678, "D3DFMT_R5G6B5, G channel",
+            63, 5, 2, 0x5678, "D3DFMT_R5G6B5, G channel", FALSE,
             {
                 sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
                 {16}, {0xf800}, {0x07e0}, {0x001f}, {0x0000}
@@ -8803,7 +8820,7 @@ static void test_colorkey_precision(void)
 
         },
         {
-            31, 0, 2, 0x5678, "D3DFMT_R5G6B5, B channel",
+            31, 0, 2, 0x5678, "D3DFMT_R5G6B5, B channel", FALSE,
             {
                 sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
                 {16}, {0xf800}, {0x07e0}, {0x001f}, {0x0000}
@@ -8811,12 +8828,11 @@ static void test_colorkey_precision(void)
 
         },
         {
-            15, 0, 2, 0x0678, "D3DFMT_A4R4G4B4",
+            15, 0, 2, 0x0678, "D3DFMT_A4R4G4B4", TRUE,
             {
                 sizeof(DDPIXELFORMAT), DDPF_RGB | DDPF_ALPHAPIXELS, 0,
                 {16}, {0x0f00}, {0x00f0}, {0x000f}, {0xf000}
             }
-
         },
     };
 
@@ -8834,20 +8850,14 @@ static void test_colorkey_precision(void)
     hr = IDirect3DDevice2_GetRenderTarget(device, &rt);
     ok(SUCCEEDED(hr), "Failed to get render target, hr %#x.\n", hr);
 
+    is_nvidia = ddraw_is_nvidia(ddraw);
     /* The Windows 8 WARP driver has plenty of false negatives in X8R8G8B8
      * (color key doesn't match although the values are equal), and a false
      * positive when the color key is 0 and the texture contains the value 1.
      * I don't want to mark this broken unconditionally since this would
-     * essentially disable the test on Windows. Try to detect WARP (and I
-     * guess mismatch other SW renderers) by its ability to texture from
-     * system memory. Also on random occasions 254 == 255 and 255 != 255.*/
-    memset(&device_desc, 0, sizeof(device_desc));
-    device_desc.dwSize = sizeof(device_desc);
-    memset(&hel_desc, 0, sizeof(hel_desc));
-    hel_desc.dwSize = sizeof(hel_desc);
-    hr = IDirect3DDevice2_GetCaps(device, &device_desc, &hel_desc);
-    ok(SUCCEEDED(hr), "Failed to get device caps, hr %#x.\n", hr);
-    warp = !!(device_desc.dwDevCaps & D3DDEVCAPS_TEXTURESYSTEMMEMORY);
+     * essentially disable the test on Windows. Also on random occasions
+     * 254 == 255 and 255 != 255.*/
+    is_warp = ddraw_is_warp(ddraw);
 
     green = create_diffuse_material(device, 0.0f, 1.0f, 0.0f, 0.0f);
     viewport = create_viewport(device, 0, 0, 640, 480);
@@ -8871,6 +8881,12 @@ static void test_colorkey_precision(void)
 
     for (t = 0; t < sizeof(tests) / sizeof(*tests); ++t)
     {
+        if (is_nvidia && tests[t].skip_nv)
+        {
+            win_skip("Skipping test %s on Nvidia Windows drivers.\n", tests[t].name);
+            continue;
+        }
+
         memset(&surface_desc, 0, sizeof(surface_desc));
         surface_desc.dwSize = sizeof(surface_desc);
         surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
@@ -8980,6 +8996,9 @@ static void test_colorkey_precision(void)
                      * so we can detect the bug by looking at the otherwise unused 4th texel. It should
                      * never be masked out by the key.
                      *
+                     * On Windows 10 the problem is worse, Blt just hangs. For this reason the ARGB4444
+                     * test is disabled entirely.
+                     *
                      * Also appears to affect the testbot in some way with R5G6B5. Color keying is
                      * terrible on WARP. */
                     skip("Nvidia A4R4G4B4 color keying blit bug detected, skipping.\n");
@@ -9015,26 +9034,26 @@ static void test_colorkey_precision(void)
 
             color = get_surface_color(rt, 80, 240);
             if (!c)
-                ok(compare_color(color, 0x0000ff00, 1) || broken(warp && compare_color(color, 0x00000000, 1)),
+                ok(compare_color(color, 0x0000ff00, 1) || broken(is_warp && compare_color(color, 0x00000000, 1)),
                         "Got unexpected color 0x%08x, format %s, c=%u.\n",
                         color, tests[t].name, c);
             else
-                ok(compare_color(color, 0x00000000, 1) || broken(warp && compare_color(color, 0x0000ff00, 1)),
+                ok(compare_color(color, 0x00000000, 1) || broken(is_warp && compare_color(color, 0x0000ff00, 1)),
                         "Got unexpected color 0x%08x, format %s, c=%u.\n",
                         color, tests[t].name, c);
 
             color = get_surface_color(rt, 240, 240);
-            ok(compare_color(color, 0x0000ff00, 1) || broken(warp && compare_color(color, 0x00000000, 1)),
+            ok(compare_color(color, 0x0000ff00, 1) || broken(is_warp && compare_color(color, 0x00000000, 1)),
                     "Got unexpected color 0x%08x, format %s, c=%u.\n",
                     color, tests[t].name, c);
 
             color = get_surface_color(rt, 400, 240);
             if (c == tests[t].max)
-                ok(compare_color(color, 0x0000ff00, 1) || broken(warp && compare_color(color, 0x00000000, 1)),
+                ok(compare_color(color, 0x0000ff00, 1) || broken(is_warp && compare_color(color, 0x00000000, 1)),
                         "Got unexpected color 0x%08x, format %s, c=%u.\n",
                         color, tests[t].name, c);
             else
-                ok(compare_color(color, 0x00000000, 1) || broken(warp && compare_color(color, 0x0000ff00, 1)),
+                ok(compare_color(color, 0x00000000, 1) || broken(is_warp && compare_color(color, 0x0000ff00, 1)),
                         "Got unexpected color 0x%08x, format %s, c=%u.\n",
                         color, tests[t].name, c);
 
diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
index 2fd565d..efb485f 100644
--- a/dlls/ddraw/tests/ddraw4.c
+++ b/dlls/ddraw/tests/ddraw4.c
@@ -9884,6 +9884,19 @@ static void test_texcoordindex(void)
     DestroyWindow(window);
 }
 
+static BOOL ddraw_is_nvidia(IDirectDraw4 *ddraw)
+{
+    DDDEVICEIDENTIFIER identifier;
+    HRESULT hr;
+
+    if (!strcmp(winetest_platform, "wine"))
+        return FALSE;
+
+    hr = IDirectDraw4_GetDeviceIdentifier(ddraw, &identifier, 0);
+    ok(SUCCEEDED(hr), "Failed to get device identifier, hr %#x.\n", hr);
+    return identifier.dwVendorId == 0x10de;
+}
+
 static void test_colorkey_precision(void)
 {
     static struct
@@ -9915,18 +9928,18 @@ static void test_colorkey_precision(void)
     DDBLTFX fx;
     DWORD data[4] = {0}, color_mask;
     D3DRECT clear_rect = {{0}, {0}, {640}, {480}};
-    D3DDEVICEDESC device_desc, hel_desc;
-    BOOL warp;
+    BOOL is_nvidia, is_warp;
     static const struct
     {
         unsigned int max, shift, bpp, clear;
         const char *name;
+        BOOL skip_nv;
         DDPIXELFORMAT fmt;
     }
     tests[] =
     {
         {
-            255, 0, 4, 0x00345678, "D3DFMT_X8R8G8B8",
+            255, 0, 4, 0x00345678, "D3DFMT_X8R8G8B8", FALSE,
             {
                 sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
                 {32}, {0x00ff0000}, {0x0000ff00}, {0x000000ff}, {0x00000000}
@@ -9934,7 +9947,7 @@ static void test_colorkey_precision(void)
 
         },
         {
-            63, 5, 2, 0x5678, "D3DFMT_R5G6B5, G channel",
+            63, 5, 2, 0x5678, "D3DFMT_R5G6B5, G channel", FALSE,
             {
                 sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
                 {16}, {0xf800}, {0x07e0}, {0x001f}, {0x0000}
@@ -9942,7 +9955,7 @@ static void test_colorkey_precision(void)
 
         },
         {
-            31, 0, 2, 0x5678, "D3DFMT_R5G6B5, B channel",
+            31, 0, 2, 0x5678, "D3DFMT_R5G6B5, B channel", FALSE,
             {
                 sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
                 {16}, {0xf800}, {0x07e0}, {0x001f}, {0x0000}
@@ -9950,12 +9963,11 @@ static void test_colorkey_precision(void)
 
         },
         {
-            15, 0, 2, 0x0678, "D3DFMT_A4R4G4B4",
+            15, 0, 2, 0x0678, "D3DFMT_A4R4G4B4", TRUE,
             {
                 sizeof(DDPIXELFORMAT), DDPF_RGB | DDPF_ALPHAPIXELS, 0,
                 {16}, {0x0f00}, {0x00f0}, {0x000f}, {0xf000}
             }
-
         },
     };
 
@@ -9968,21 +9980,6 @@ static void test_colorkey_precision(void)
         return;
     }
 
-    /* The Windows 8 WARP driver has plenty of false negatives in X8R8G8B8
-     * (color key doesn't match although the values are equal), and a false
-     * positive when the color key is 0 and the texture contains the value 1.
-     * I don't want to mark this broken unconditionally since this would
-     * essentially disable the test on Windows. Try to detect WARP (and I
-     * guess mismatch other SW renderers) by its ability to texture from
-     * system memory. Also on random occasions 254 == 255 and 255 != 255.*/
-    memset(&device_desc, 0, sizeof(device_desc));
-    device_desc.dwSize = sizeof(device_desc);
-    memset(&hel_desc, 0, sizeof(hel_desc));
-    hel_desc.dwSize = sizeof(hel_desc);
-    hr = IDirect3DDevice3_GetCaps(device, &device_desc, &hel_desc);
-    ok(SUCCEEDED(hr), "Failed to get device caps, hr %#x.\n", hr);
-    warp = !!(device_desc.dwDevCaps & D3DDEVCAPS_TEXTURESYSTEMMEMORY);
-
     hr = IDirect3DDevice3_GetDirect3D(device, &d3d);
     ok(SUCCEEDED(hr), "Failed to get Direct3D3 interface, hr %#x.\n", hr);
     hr = IDirect3D3_QueryInterface(d3d, &IID_IDirectDraw4, (void **)&ddraw);
@@ -9991,6 +9988,15 @@ static void test_colorkey_precision(void)
     hr = IDirect3DDevice3_GetRenderTarget(device, &rt);
     ok(SUCCEEDED(hr), "Failed to get render target, hr %#x.\n", hr);
 
+    is_nvidia = ddraw_is_nvidia(ddraw);
+    /* The Windows 8 WARP driver has plenty of false negatives in X8R8G8B8
+     * (color key doesn't match although the values are equal), and a false
+     * positive when the color key is 0 and the texture contains the value 1.
+     * I don't want to mark this broken unconditionally since this would
+     * essentially disable the test on Windows. Also on random occasions
+     * 254 == 255 and 255 != 255.*/
+    is_warp = ddraw_is_warp(ddraw);
+
     viewport = create_viewport(device, 0, 0, 640, 480);
     hr = IDirect3DDevice3_SetCurrentViewport(device, viewport);
     ok(SUCCEEDED(hr), "Failed to set current viewport, hr %#x.\n", hr);
@@ -10021,6 +10027,12 @@ static void test_colorkey_precision(void)
 
     for (t = 0; t < sizeof(tests) / sizeof(*tests); ++t)
     {
+        if (is_nvidia && tests[t].skip_nv)
+        {
+            win_skip("Skipping test %s on Nvidia Windows drivers.\n", tests[t].name);
+            continue;
+        }
+
         memset(&surface_desc, 0, sizeof(surface_desc));
         surface_desc.dwSize = sizeof(surface_desc);
         surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
@@ -10126,6 +10138,9 @@ static void test_colorkey_precision(void)
                      * so we can detect the bug by looking at the otherwise unused 4th texel. It should
                      * never be masked out by the key.
                      *
+                     * On Windows 10 the problem is worse, Blt just hangs. For this reason the ARGB4444
+                     * test is disabled entirely.
+                     *
                      * Also appears to affect the testbot in some way with R5G6B5. Color keying is
                      * terrible on WARP. */
                     skip("Nvidia A4R4G4B4 color keying blit bug detected, skipping.\n");
@@ -10162,26 +10177,26 @@ static void test_colorkey_precision(void)
 
             color = get_surface_color(rt, 80, 240);
             if (!c)
-                ok(compare_color(color, 0x0000ff00, 1) || broken(warp && compare_color(color, 0x00000000, 1)),
+                ok(compare_color(color, 0x0000ff00, 1) || broken(is_warp && compare_color(color, 0x00000000, 1)),
                         "Got unexpected color 0x%08x, format %s, c=%u.\n",
                         color, tests[t].name, c);
             else
-                ok(compare_color(color, 0x00000000, 1) || broken(warp && compare_color(color, 0x0000ff00, 1)),
+                ok(compare_color(color, 0x00000000, 1) || broken(is_warp && compare_color(color, 0x0000ff00, 1)),
                         "Got unexpected color 0x%08x, format %s, c=%u.\n",
                         color, tests[t].name, c);
 
             color = get_surface_color(rt, 240, 240);
-            ok(compare_color(color, 0x0000ff00, 1) || broken(warp && compare_color(color, 0x00000000, 1)),
+            ok(compare_color(color, 0x0000ff00, 1) || broken(is_warp && compare_color(color, 0x00000000, 1)),
                     "Got unexpected color 0x%08x, format %s, c=%u.\n",
                     color, tests[t].name, c);
 
             color = get_surface_color(rt, 400, 240);
             if (c == tests[t].max)
-                ok(compare_color(color, 0x0000ff00, 1) || broken(warp && compare_color(color, 0x00000000, 1)),
+                ok(compare_color(color, 0x0000ff00, 1) || broken(is_warp && compare_color(color, 0x00000000, 1)),
                         "Got unexpected color 0x%08x, format %s, c=%u.\n",
                         color, tests[t].name, c);
             else
-                ok(compare_color(color, 0x00000000, 1) || broken(warp && compare_color(color, 0x0000ff00, 1)),
+                ok(compare_color(color, 0x00000000, 1) || broken(is_warp && compare_color(color, 0x0000ff00, 1)),
                         "Got unexpected color 0x%08x, format %s, c=%u.\n",
                         color, tests[t].name, c);
 
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index d808ad3..bcd2021 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -10219,6 +10219,19 @@ static void test_texcoordindex(void)
     DestroyWindow(window);
 }
 
+static BOOL ddraw_is_nvidia(IDirectDraw7 *ddraw)
+{
+    DDDEVICEIDENTIFIER2 identifier;
+    HRESULT hr;
+
+    if (!strcmp(winetest_platform, "wine"))
+        return FALSE;
+
+    hr = IDirectDraw7_GetDeviceIdentifier(ddraw, &identifier, 0);
+    ok(SUCCEEDED(hr), "Failed to get device identifier, hr %#x.\n", hr);
+    return identifier.dwVendorId == 0x10de;
+}
+
 static void test_colorkey_precision(void)
 {
     static struct
@@ -10247,18 +10260,18 @@ static void test_colorkey_precision(void)
     DDCOLORKEY ckey;
     DDBLTFX fx;
     DWORD data[4] = {0}, color_mask;
-    D3DDEVICEDESC7 device_desc;
-    BOOL warp;
+    BOOL is_nvidia, is_warp;
     static const struct
     {
         unsigned int max, shift, bpp, clear;
         const char *name;
+        BOOL skip_nv;
         DDPIXELFORMAT fmt;
     }
     tests[] =
     {
         {
-            255, 0, 4, 0x00345678, "D3DFMT_X8R8G8B8",
+            255, 0, 4, 0x00345678, "D3DFMT_X8R8G8B8", FALSE,
             {
                 sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
                 {32}, {0x00ff0000}, {0x0000ff00}, {0x000000ff}, {0x00000000}
@@ -10266,7 +10279,7 @@ static void test_colorkey_precision(void)
 
         },
         {
-            63, 5, 2, 0x5678, "D3DFMT_R5G6B5, G channel",
+            63, 5, 2, 0x5678, "D3DFMT_R5G6B5, G channel", FALSE,
             {
                 sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
                 {16}, {0xf800}, {0x07e0}, {0x001f}, {0x0000}
@@ -10274,7 +10287,7 @@ static void test_colorkey_precision(void)
 
         },
         {
-            31, 0, 2, 0x5678, "D3DFMT_R5G6B5, B channel",
+            31, 0, 2, 0x5678, "D3DFMT_R5G6B5, B channel", FALSE,
             {
                 sizeof(DDPIXELFORMAT), DDPF_RGB, 0,
                 {16}, {0xf800}, {0x07e0}, {0x001f}, {0x0000}
@@ -10282,12 +10295,11 @@ static void test_colorkey_precision(void)
 
         },
         {
-            15, 0, 2, 0x0678, "D3DFMT_A4R4G4B4",
+            15, 0, 2, 0x0678, "D3DFMT_A4R4G4B4", TRUE,
             {
                 sizeof(DDPIXELFORMAT), DDPF_RGB | DDPF_ALPHAPIXELS, 0,
                 {16}, {0x0f00}, {0x00f0}, {0x000f}, {0xf000}
             }
-
         },
     };
 
@@ -10300,17 +10312,6 @@ static void test_colorkey_precision(void)
         return;
     }
 
-    /* The Windows 8 WARP driver has plenty of false negatives in X8R8G8B8
-     * (color key doesn't match although the values are equal), and a false
-     * positive when the color key is 0 and the texture contains the value 1.
-     * I don't want to mark this broken unconditionally since this would
-     * essentially disable the test on Windows. Try to detect WARP (and I
-     * guess mismatch other SW renderers) by its ability to texture from
-     * system memory. Also on random occasions 254 == 255 and 255 != 255.*/
-    hr = IDirect3DDevice7_GetCaps(device, &device_desc);
-    ok(SUCCEEDED(hr), "Failed to get device caps, hr %#x.\n", hr);
-    warp = !!(device_desc.dwDevCaps & D3DDEVCAPS_TEXTURESYSTEMMEMORY);
-
     hr = IDirect3DDevice7_GetDirect3D(device, &d3d);
     ok(SUCCEEDED(hr), "Failed to get Direct3D7 interface, hr %#x.\n", hr);
     hr = IDirect3D7_QueryInterface(d3d, &IID_IDirectDraw7, (void **)&ddraw);
@@ -10319,6 +10320,15 @@ static void test_colorkey_precision(void)
     hr = IDirect3DDevice7_GetRenderTarget(device, &rt);
     ok(SUCCEEDED(hr), "Failed to get render target, hr %#x.\n", hr);
 
+    is_nvidia = ddraw_is_nvidia(ddraw);
+    /* The Windows 8 WARP driver has plenty of false negatives in X8R8G8B8
+     * (color key doesn't match although the values are equal), and a false
+     * positive when the color key is 0 and the texture contains the value 1.
+     * I don't want to mark this broken unconditionally since this would
+     * essentially disable the test on Windows. Also on random occasions
+     * 254 == 255 and 255 != 255.*/
+    is_warp = ddraw_is_warp(ddraw);
+
     hr = IDirect3DDevice7_SetRenderState(device, D3DRENDERSTATE_LIGHTING, FALSE);
     ok(SUCCEEDED(hr), "Failed to disable lighting, hr %#x.\n", hr);
     hr = IDirect3DDevice7_SetRenderState(device, D3DRENDERSTATE_ZENABLE, D3DZB_FALSE);
@@ -10345,6 +10355,12 @@ static void test_colorkey_precision(void)
 
     for (t = 0; t < sizeof(tests) / sizeof(*tests); ++t)
     {
+        if (is_nvidia && tests[t].skip_nv)
+        {
+            win_skip("Skipping test %s on Nvidia Windows drivers.\n", tests[t].name);
+            continue;
+        }
+
         memset(&surface_desc, 0, sizeof(surface_desc));
         surface_desc.dwSize = sizeof(surface_desc);
         surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
@@ -10448,6 +10464,9 @@ static void test_colorkey_precision(void)
                      * so we can detect the bug by looking at the otherwise unused 4th texel. It should
                      * never be masked out by the key.
                      *
+                     * On Windows 10 the problem is worse, Blt just hangs. For this reason the ARGB4444
+                     * test is disabled on Nvidia.
+                     *
                      * Also appears to affect the testbot in some way with R5G6B5. Color keying is
                      * terrible on WARP. */
                     skip("Nvidia A4R4G4B4 color keying blit bug detected, skipping.\n");
@@ -10483,26 +10502,26 @@ static void test_colorkey_precision(void)
 
             color = get_surface_color(rt, 80, 240);
             if (!c)
-                ok(compare_color(color, 0x0000ff00, 1) || broken(warp && compare_color(color, 0x00000000, 1)),
+                ok(compare_color(color, 0x0000ff00, 1) || broken(is_warp && compare_color(color, 0x00000000, 1)),
                         "Got unexpected color 0x%08x, format %s, c=%u.\n",
                         color, tests[t].name, c);
             else
-                ok(compare_color(color, 0x00000000, 1) || broken(warp && compare_color(color, 0x0000ff00, 1)),
+                ok(compare_color(color, 0x00000000, 1) || broken(is_warp && compare_color(color, 0x0000ff00, 1)),
                         "Got unexpected color 0x%08x, format %s, c=%u.\n",
                         color, tests[t].name, c);
 
             color = get_surface_color(rt, 240, 240);
-            ok(compare_color(color, 0x0000ff00, 1) || broken(warp && compare_color(color, 0x00000000, 1)),
+            ok(compare_color(color, 0x0000ff00, 1) || broken(is_warp && compare_color(color, 0x00000000, 1)),
                     "Got unexpected color 0x%08x, format %s, c=%u.\n",
                     color, tests[t].name, c);
 
             color = get_surface_color(rt, 400, 240);
             if (c == tests[t].max)
-                ok(compare_color(color, 0x0000ff00, 1) || broken(warp && compare_color(color, 0x00000000, 1)),
+                ok(compare_color(color, 0x0000ff00, 1) || broken(is_warp && compare_color(color, 0x00000000, 1)),
                         "Got unexpected color 0x%08x, format %s, c=%u.\n",
                         color, tests[t].name, c);
             else
-                ok(compare_color(color, 0x00000000, 1) || broken(warp && compare_color(color, 0x0000ff00, 1)),
+                ok(compare_color(color, 0x00000000, 1) || broken(is_warp && compare_color(color, 0x0000ff00, 1)),
                         "Got unexpected color 0x%08x, format %s, c=%u.\n",
                         color, tests[t].name, c);
 
-- 
2.7.3




More information about the wine-patches mailing list