Stefan Dösinger : d3d9/tests: Extend color_fill_test.

Alexandre Julliard julliard at winehq.org
Tue May 31 15:58:00 CDT 2022


Module: wine
Branch: master
Commit: b4bf1fb7b2d205d5b141de4c917afc582c93c59d
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=b4bf1fb7b2d205d5b141de4c917afc582c93c59d

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Thu Apr 28 14:29:47 2022 +0300

d3d9/tests: Extend color_fill_test.

So it covers more formats and provokes the clear-to-sysmem path with the
Vulkan renderer.

Signed-off-by: Stefan Dösinger <stefan at codeweavers.com>

---

 dlls/d3d9/tests/visual.c | 132 +++++++++++++++++++++++++++++++++++++----------
 1 file changed, 106 insertions(+), 26 deletions(-)

diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c
index 2913583916a..5d8fe10fc79 100644
--- a/dlls/d3d9/tests/visual.c
+++ b/dlls/d3d9/tests/visual.c
@@ -1548,10 +1548,10 @@ done:
 
 static void color_fill_test(void)
 {
+    unsigned int fill_a, expected_a;
     IDirect3DSurface9 *surface;
     IDirect3DTexture9 *texture;
     D3DCOLOR fill_color, color;
-    DWORD fill_a, expected_a;
     IDirect3DDevice9 *device;
     IDirect3D9 *d3d;
     ULONG refcount;
@@ -1580,20 +1580,39 @@ static void color_fill_test(void)
         {
             CHECK_FILL_VALUE = 0x1,
             BLOCKS           = 0x2,
+            FLOAT_VALUES     = 0x4,
         } flags;
-        DWORD fill_value;
+        unsigned int fill_i[4];
+        float fill_f[4];
     }
     formats[] =
     {
-        {D3DFMT_A8R8G8B8, "D3DFMT_A8R8G8B8", CHECK_FILL_VALUE,                    0xdeadbeef},
+        {D3DFMT_A8R8G8B8,       "D3DFMT_A8R8G8B8", CHECK_FILL_VALUE,
+                {0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef}},
         /* D3DFMT_X8R8G8B8 either set X = A or X = 0, depending on the driver. */
-        {D3DFMT_R5G6B5,   "D3DFMT_R5G6B5",   CHECK_FILL_VALUE,                    0xadfdadfd},
-        {D3DFMT_G16R16,   "D3DFMT_G16R16",   CHECK_FILL_VALUE,                    0xbebeadad},
+        {D3DFMT_R5G6B5,         "D3DFMT_R5G6B5",   CHECK_FILL_VALUE,
+                {0xadfdadfd, 0xadfdadfd, 0xadfdadfd, 0xadfdadfd}},
+        {D3DFMT_G16R16,         "D3DFMT_G16R16",   CHECK_FILL_VALUE,
+                {0xbebeadad, 0xbebeadad, 0xbebeadad, 0xbebeadad}},
+        {D3DFMT_A16B16G16R16,   "D3DFMT_A16B16G16R16",   CHECK_FILL_VALUE,
+                {0xbebeadad, 0xdedeefef, 0xbebeadad, 0xdedeefef}},
         /* Real hardware reliably fills the surface with the blue channel but
          * the testbot fills it with 0x00. Wine incorrectly uses the alpha
          * channel. Don't bother checking the result because P8 surfaces are
          * essentially useless in d3d9. */
-        {D3DFMT_P8,       "D3DFMT_P8",       0,                                   0xefefefef},
+        {D3DFMT_P8,             "D3DFMT_P8",       0,
+                {0xefefefef, 0xefefefef, 0xefefefef, 0xefefefef}},
+        /* Float formats. */
+        {D3DFMT_R32F,           "D3DFMT_R32F",     CHECK_FILL_VALUE | FLOAT_VALUES,
+                {0, 0, 0, 0}, {0xad / 255.0f, 0xad / 255.0f, 0xad / 255.0f, 0xad / 255.0f}},
+        {D3DFMT_A32B32G32R32F,  "D3DFMT_A32B32G32R32F",  CHECK_FILL_VALUE | FLOAT_VALUES,
+                {0, 0, 0, 0}, {0xad / 255.0f, 0xbe / 255.0f, 0xef / 255.0f, 0xde / 255.0f}},
+        {D3DFMT_R16F,           "D3DFMT_R16F",     CHECK_FILL_VALUE,
+                {0x396d396d, 0x396d396d, 0x396d396d, 0x396d396d}},
+        {D3DFMT_G16R16F,        "D3DFMT_G16R16F",  CHECK_FILL_VALUE,
+                {0x39f5396d, 0x39f5396d, 0x39f5396d, 0x39f5396d}},
+        {D3DFMT_A16B16G16R16F,  "D3DFMT_A16B16G16R16F",  CHECK_FILL_VALUE,
+                {0x39f5396d, 0x3af63b7f, 0x39f5396d, 0x3af63b7f}},
         /* Windows drivers produce different results for these formats.
          * No driver produces a YUV value that matches the input RGB
          * value, and no driver produces a proper DXT compression block.
@@ -1603,17 +1622,16 @@ static void color_fill_test(void)
          *
          * The YUV tests are disabled because they produce a driver-dependent
          * result on Wine.
-         * {D3DFMT_YUY2,     "D3DFMT_YUY2",     BLOCKS,                              0},
-         * {D3DFMT_UYVY,     "D3DFMT_UYVY",     BLOCKS,                              0}, */
-        {D3DFMT_DXT1,     "D3DFMT_DXT1",     BLOCKS,                              0x00000000},
+         * {D3DFMT_YUY2,     "D3DFMT_YUY2",     BLOCKS},
+         * {D3DFMT_UYVY,     "D3DFMT_UYVY",     BLOCKS}, */
+        {D3DFMT_DXT1,     "D3DFMT_DXT1",     BLOCKS},
         /* Vendor-specific formats like ATI2N are a non-issue here since they're not
          * supported as offscreen plain surfaces and do not support D3DUSAGE_RENDERTARGET
          * when created as texture. */
     };
-    unsigned int i;
-    D3DLOCKED_RECT locked_rect;
-    DWORD *surface_data;
     static const RECT rect = {4, 4, 8, 8}, rect2 = {5, 5, 7, 7};
+    D3DLOCKED_RECT locked_rect;
+    unsigned int i, j;
 
     window = create_window();
     d3d = Direct3DCreate9(D3D_SDK_VERSION);
@@ -1732,22 +1750,84 @@ static void color_fill_test(void)
                 ok(SUCCEEDED(hr), "Failed to color fill, hr %#x, fmt=%s.\n", hr, formats[i].name);
         }
 
-        if (formats[i].flags & CHECK_FILL_VALUE)
+        if (!(formats[i].flags & CHECK_FILL_VALUE))
         {
-            hr = IDirect3DSurface9_LockRect(surface, &locked_rect, NULL, D3DLOCK_READONLY);
-            ok(SUCCEEDED(hr), "Failed to lock surface, hr %#x, fmt=%s.\n", hr, formats[i].name);
-            surface_data = locked_rect.pBits;
-            fill_a = (surface_data[0] & 0xff000000) >> 24;
-            expected_a = (formats[i].fill_value & 0xff000000) >> 24;
-            /* Windows drivers disagree on how to promote the 8 bit per channel
-             * input argument to 16 bit for D3DFMT_G16R16. */
-            ok(color_match(surface_data[0], formats[i].fill_value, 2) &&
-                    compare_uint(expected_a, fill_a, 2),
-                    "Expected clear value 0x%08x, got 0x%08x, fmt=%s.\n",
-                    formats[i].fill_value, surface_data[0], formats[i].name);
-            hr = IDirect3DSurface9_UnlockRect(surface);
-            ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, fmt=%s.\n", hr, formats[i].name);
+            IDirect3DSurface9_Release(surface);
+            continue;
+        }
+
+        hr = IDirect3DSurface9_LockRect(surface, &locked_rect, NULL, 0);
+        ok(SUCCEEDED(hr), "Failed to lock surface, hr %#x, fmt=%s.\n", hr, formats[i].name);
+        /* Windows drivers disagree on how to promote the 8 bit per channel
+         * input argument to 16 bit for D3DFMT_G16R16. */
+        if (formats[i].flags & FLOAT_VALUES)
+        {
+            const struct vec4 *surface_data = locked_rect.pBits;
+            ok(compare_vec4(surface_data, formats[i].fill_f[0], formats[i].fill_f[1],
+                    formats[i].fill_f[2], formats[i].fill_f[3], 1),
+                    "Expected clear values %f %f %f %f, got %f %f %f %f, fmt=%s\n",
+                    formats[i].fill_f[0], formats[i].fill_f[1],
+                    formats[i].fill_f[2], formats[i].fill_f[3],
+                    surface_data->x, surface_data->y, surface_data->z, surface_data->w,
+                    formats[i].name);
         }
+        else
+        {
+            const unsigned int *surface_data = locked_rect.pBits;
+            for (j = 0; j < 4; ++j)
+            {
+                fill_a = (surface_data[j] & 0xff000000) >> 24;
+                expected_a = (formats[i].fill_i[j] & 0xff000000) >> 24;
+                ok(color_match(surface_data[j], formats[i].fill_i[j], 2) &&
+                        compare_uint(expected_a, fill_a, 2),
+                        "Expected clear value 0x%08x, got 0x%08x, fmt=%s, j=%u.\n",
+                        formats[i].fill_i[j], surface_data[j], formats[i].name, j);
+            }
+        }
+
+        /* Fill the surface with something else to make sure the test below doesn't pass
+         * due to stale contents by accident. */
+        memset(locked_rect.pBits, 0x55, locked_rect.Pitch * 32);
+
+        hr = IDirect3DSurface9_UnlockRect(surface);
+        ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, fmt=%s.\n", hr, formats[i].name);
+
+        /* Test clearing "to sysmem". Wined3d's delayed clear will perform the actual clear
+         * in the lock call and try to fill the sysmem buffer instead of clearing on the
+         * GPU and downloading it. */
+        hr = IDirect3DDevice9_ColorFill(device, surface, NULL, 0xdeadbeef);
+        ok(SUCCEEDED(hr), "Failed to color fill, hr %#x, fmt=%s.\n", hr, formats[i].name);
+        hr = IDirect3DSurface9_LockRect(surface, &locked_rect, NULL, D3DLOCK_READONLY);
+        ok(SUCCEEDED(hr), "Failed to lock surface, hr %#x, fmt=%s.\n", hr, formats[i].name);
+
+        if (formats[i].flags & FLOAT_VALUES)
+        {
+            const struct vec4 *surface_data = locked_rect.pBits;
+            ok(compare_vec4(surface_data, formats[i].fill_f[0], formats[i].fill_f[1],
+                    formats[i].fill_f[2], formats[i].fill_f[3], 1),
+                    "Expected clear values %f %f %f %f, got %f %f %f %f, fmt=%s\n",
+                    formats[i].fill_f[0], formats[i].fill_f[1],
+                    formats[i].fill_f[2], formats[i].fill_f[3],
+                    surface_data->x, surface_data->y, surface_data->z, surface_data->w,
+                    formats[i].name);
+        }
+        else
+        {
+            const unsigned int *surface_data = locked_rect.pBits;
+            for (j = 0; j < 4; ++j)
+            {
+                fill_a = (surface_data[j] & 0xff000000) >> 24;
+                expected_a = (formats[i].fill_i[j] & 0xff000000) >> 24;
+                ok(color_match(surface_data[j], formats[i].fill_i[j], 2) &&
+                        compare_uint(expected_a, fill_a, 2),
+                        "Expected clear value 0x%08x, got 0x%08x, fmt=%s, j=%u.\n",
+                        formats[i].fill_i[j], surface_data[j], formats[i].name, j);
+            }
+        }
+
+
+        hr = IDirect3DSurface9_UnlockRect(surface);
+        ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, fmt=%s.\n", hr, formats[i].name);
 
         IDirect3DSurface9_Release(surface);
     }




More information about the wine-cvs mailing list