Paul Gofman : ddraw/tests: Add test for stretching compressed format surfaces.

Alexandre Julliard julliard at winehq.org
Mon Dec 2 17:10:15 CST 2019


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

Author: Paul Gofman <gofmanp at gmail.com>
Date:   Mon Dec  2 16:27:11 2019 +0300

ddraw/tests: Add test for stretching compressed format surfaces.

Signed-off-by: Paul Gofman <gofmanp at gmail.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ddraw/tests/ddraw7.c | 220 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 220 insertions(+)

diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index 536a626eda..f4a709711b 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -16902,6 +16902,225 @@ static void test_surface_format_conversion_alpha(void)
     DestroyWindow(window);
 }
 
+static void test_compressed_surface_stretch(void)
+{
+    static const struct
+    {
+        unsigned int src_width, src_height;
+        unsigned int dst_width, dst_height;
+        unsigned int src_x, src_y;
+        unsigned int dst_x, dst_y;
+        BOOL todo_src, todo_dst;
+    }
+    test_sizes[] =
+    {
+        {4, 4, 8, 8},
+        {8, 8, 4, 4},
+        {4, 4, 2, 2, 0, 0, 0, 0, FALSE, TRUE},
+        {4, 4, 6, 6, 0, 0, 0, 0, FALSE, TRUE},
+        {4, 4, 8, 8, 2, 2, 2, 2, TRUE, TRUE},
+    };
+
+    static const struct
+    {
+        DWORD src_caps, dst_caps;
+    }
+    test_caps[] =
+    {
+#if 0
+        /* Broken on Windows. */
+        {DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY,  DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY},
+#endif
+        {DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY, DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY},
+        {DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY, DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY},
+        {DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY,  DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY},
+    };
+
+    static struct
+    {
+        DDPIXELFORMAT fmt;
+        const char *name;
+        DWORD support_flag;
+    }
+    test_formats[] =
+    {
+        {
+            {
+                sizeof(DDPIXELFORMAT), DDPF_RGB | DDPF_ALPHAPIXELS, 0,
+                {16}, {0x00007c00}, {0x000003e0}, {0x0000001f}, {0x00008000}
+            },
+            "R5G5B5A1",
+        },
+        {
+            {
+                sizeof(DDPIXELFORMAT), DDPF_FOURCC, MAKEFOURCC('D', 'X', 'T', '1'),
+                {0}, {0}, {0}, {0}, {0}
+            },
+            "DXT1", SUPPORT_DXT1,
+        },
+        {
+            {
+                sizeof(DDPIXELFORMAT), DDPF_FOURCC, MAKEFOURCC('D', 'X', 'T', '3'),
+                {0}, {0}, {0}, {0}, {0}
+            },
+            "DXT3", SUPPORT_DXT3,
+        },
+    };
+
+    unsigned int i, j, k, l, x, y, pitch;
+    DDSURFACEDESC2 rb_surface_desc, src_surface_desc, dst_surface_desc, lock;
+    IDirectDrawSurface7 *src_surf, *dst_surf, *rb_surf;
+    IDirect3DDevice7 *device;
+    RECT src_rect, dst_rect;
+    DWORD supported_fmts;
+    unsigned short *data;
+    IDirectDraw7 *ddraw;
+    ULONG refcount;
+    HWND window;
+    BOOL passed;
+    DDBLTFX fx;
+    HRESULT hr;
+
+    window = create_window();
+    if (!(device = create_device(window, DDSCL_NORMAL)))
+    {
+        skip("Failed to create a 3D device, skipping test.\n");
+        DestroyWindow(window);
+        return;
+    }
+
+    ddraw = create_ddraw();
+    ok(!!ddraw, "Failed to create a ddraw object.\n");
+    hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
+    ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
+
+    hr = IDirect3DDevice7_EnumTextureFormats(device, test_block_formats_creation_cb,
+            &supported_fmts);
+    ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
+
+    memset(&src_surface_desc, 0, sizeof(src_surface_desc));
+    src_surface_desc.dwSize = sizeof(src_surface_desc);
+    src_surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
+    dst_surface_desc = src_surface_desc;
+
+    memset(&rb_surface_desc, 0, sizeof(rb_surface_desc));
+    rb_surface_desc.dwSize = sizeof(rb_surface_desc);
+    rb_surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
+    U4(rb_surface_desc).ddpfPixelFormat.dwSize = sizeof(U4(rb_surface_desc).ddpfPixelFormat);
+    U4(rb_surface_desc).ddpfPixelFormat.dwFlags = DDPF_RGB | DDPF_ALPHAPIXELS;
+    U1(U4(rb_surface_desc).ddpfPixelFormat).dwRGBBitCount = 16;
+    U2(U4(rb_surface_desc).ddpfPixelFormat).dwRBitMask = 0x00007c00;
+    U3(U4(rb_surface_desc).ddpfPixelFormat).dwGBitMask = 0x000003e0;
+    U4(U4(rb_surface_desc).ddpfPixelFormat).dwBBitMask = 0x0000001f;
+    U5(U4(rb_surface_desc).ddpfPixelFormat).dwRGBAlphaBitMask = 0x00008000;
+    rb_surface_desc.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY;
+
+    memset(&fx, 0, sizeof(fx));
+    fx.dwSize = sizeof(fx);
+
+    for (i = 0; i < ARRAY_SIZE(test_caps); ++i)
+    {
+        src_surface_desc.ddsCaps.dwCaps = test_caps[i].src_caps;
+        dst_surface_desc.ddsCaps.dwCaps = test_caps[i].dst_caps;
+
+        for (j = 0; j < ARRAY_SIZE(test_sizes); ++j)
+        {
+            SetRect(&src_rect, test_sizes[j].src_x, test_sizes[j].src_y,
+                    test_sizes[j].src_width, test_sizes[j].src_height);
+            SetRect(&dst_rect, test_sizes[j].dst_x, test_sizes[j].dst_y,
+                    test_sizes[j].dst_width, test_sizes[j].dst_height);
+
+            src_surface_desc.dwWidth = test_sizes[j].src_width;
+            src_surface_desc.dwHeight = test_sizes[j].src_height;
+
+            dst_surface_desc.dwWidth = (test_sizes[j].dst_width + 3) & ~3;
+            dst_surface_desc.dwHeight = (test_sizes[j].dst_height + 3) & ~3;
+
+            rb_surface_desc.dwWidth = max(src_surface_desc.dwWidth, dst_surface_desc.dwWidth);
+            rb_surface_desc.dwHeight = max(src_surface_desc.dwHeight, dst_surface_desc.dwHeight);
+
+            hr = IDirectDraw7_CreateSurface(ddraw, &rb_surface_desc, &rb_surf, NULL);
+            ok(hr == DD_OK, "Test (%u, %u), got unexpected hr %#x.\n", i, j, hr);
+
+            for (k = 0; k < ARRAY_SIZE(test_formats); ++k)
+            {
+                U4(src_surface_desc).ddpfPixelFormat = test_formats[k].fmt;
+                hr = IDirectDraw7_CreateSurface(ddraw, &src_surface_desc, &src_surf, NULL);
+                ok(hr == DD_OK, "Test (%u, %u, %u, %u), got unexpected hr %#x.\n", i, j, k, l, hr);
+
+                U5(fx).dwFillColor = 0x801f;
+                hr = IDirectDrawSurface7_Blt(rb_surf, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
+                ok(hr == DD_OK, "Test (%u, %u, %u, %u), got unexpected hr %#x.\n", i, j, k, l, hr);
+
+                hr = IDirectDrawSurface7_Blt(src_surf, &src_rect, rb_surf, &src_rect, DDBLT_WAIT, NULL);
+
+                todo_wine_if(test_formats[k].fmt.dwFlags == DDPF_FOURCC && test_sizes[j].todo_src)
+                ok(hr == DD_OK, "Test (%u, %u, %u, %u), got unexpected hr %#x.\n", i, j, k, l, hr);
+                if (FAILED(hr))
+                {
+                    IDirectDrawSurface7_Release(src_surf);
+                    continue;
+                }
+
+                for (l = 0; l < ARRAY_SIZE(test_formats); ++l)
+                {
+                    if (~supported_fmts & test_formats[l].support_flag)
+                    {
+                        skip("%s format is not supported, skipping test %u.\n", test_formats[l].name, i);
+                        continue;
+                    }
+
+                    U4(dst_surface_desc).ddpfPixelFormat = test_formats[l].fmt;
+
+                    hr = IDirectDraw7_CreateSurface(ddraw, &dst_surface_desc, &dst_surf, NULL);
+                    ok(hr == DD_OK, "Test (%u, %u, %u, %u), got unexpected hr %#x.\n", i, j, k, l, hr);
+
+                    hr = IDirectDrawSurface7_Blt(dst_surf, &dst_rect, src_surf, &src_rect, DDBLT_WAIT, NULL);
+                    todo_wine_if(test_formats[l].fmt.dwFlags == DDPF_FOURCC && test_sizes[j].todo_dst)
+                    ok(hr == DD_OK, "Test (%u, %u, %u, %u), got unexpected hr %#x.\n", i, j, k, l, hr);
+                    if (FAILED(hr))
+                    {
+                        IDirectDrawSurface7_Release(dst_surf);
+                        continue;
+                    }
+
+                    U5(fx).dwFillColor = 0xffffffff;
+                    hr = IDirectDrawSurface7_Blt(rb_surf, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
+                    ok(hr == DD_OK, "Test (%u, %u, %u, %u), got unexpected hr %#x.\n", i, j, k, l, hr);
+
+                    hr = IDirectDrawSurface7_Blt(rb_surf, &dst_rect, dst_surf, &dst_rect, DDBLT_WAIT, NULL);
+                    ok(hr == DD_OK, "Test (%u, %u, %u, %u), got unexpected hr %#x.\n", i, j, k, l, hr);
+                    hr = IDirectDrawSurface7_Lock(rb_surf, NULL, &lock, 0, NULL);
+                    ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
+                    pitch = U1(lock).lPitch;
+
+                    passed = TRUE;
+                    for (y = dst_rect.top; y < dst_rect.bottom && passed; ++y)
+                    {
+                        data = (unsigned short *)((BYTE *)lock.lpSurface + y * pitch);
+
+                        for (x = dst_rect.left; x < dst_rect.right && passed; ++x)
+                        {
+                            passed = data[x] == 0x801f;
+                            ok(passed, "Test (%u, %u, %u, %u), x %u, y %u, "
+                                    "got unexpected colour 0x%04x.\n", i, j, k, l, x, y, data[x]);
+                        }
+                    }
+                    hr = IDirectDrawSurface7_Unlock(rb_surf, NULL);
+                    IDirectDrawSurface7_Release(dst_surf);
+                }
+                IDirectDrawSurface7_Release(src_surf);
+            }
+            IDirectDrawSurface7_Release(rb_surf);
+        }
+    }
+
+    IDirect3DDevice7_Release(device);
+    refcount = IDirectDraw7_Release(ddraw);
+    ok(!refcount, "%u references left.\n", refcount);
+    DestroyWindow(window);
+}
+
 START_TEST(ddraw7)
 {
     DDDEVICEIDENTIFIER2 identifier;
@@ -17051,4 +17270,5 @@ START_TEST(ddraw7)
     test_caps();
     test_d32_support();
     test_surface_format_conversion_alpha();
+    test_compressed_surface_stretch();
 }




More information about the wine-cvs mailing list