Alexander Dorofeyev : ddraw/tests: Add tests for surface caps memory flags.

Alexandre Julliard julliard at winehq.org
Thu Jul 17 06:37:50 CDT 2008


Module: wine
Branch: master
Commit: 2be93ce6b0374ef7ae3c3195c3efd8216d3a8bbd
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2be93ce6b0374ef7ae3c3195c3efd8216d3a8bbd

Author: Alexander Dorofeyev <alexd4 at inbox.lv>
Date:   Tue Jul 15 00:58:17 2008 +0300

ddraw/tests: Add tests for surface caps memory flags.

---

 dlls/ddraw/tests/dsurface.c |  134 +++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 134 insertions(+), 0 deletions(-)

diff --git a/dlls/ddraw/tests/dsurface.c b/dlls/ddraw/tests/dsurface.c
index 7dba28b..da66e2e 100644
--- a/dlls/ddraw/tests/dsurface.c
+++ b/dlls/ddraw/tests/dsurface.c
@@ -5,6 +5,7 @@
  * Copyright (C) 2005 Christian Costa
  * Copyright 2005 Ivan Leo Puoti
  * Copyright (C) 2007 Stefan Dösinger
+ * Copyright (C) 2008 Alexander Dorofeyev
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -2609,6 +2610,138 @@ static void StructSizeTest(void)
     IDirectDrawSurface_Release(surface1);
 }
 
+static void SurfaceCapsTest(void)
+{
+    DDSURFACEDESC create;
+    DDSURFACEDESC desc;
+    HRESULT hr;
+    IDirectDrawSurface *surface1 = NULL;
+    DDSURFACEDESC2 create2, desc2;
+    IDirectDrawSurface7 *surface7 = NULL;
+    IDirectDraw7 *dd7 = NULL;
+    DWORD create_caps[] = {
+        DDSCAPS_OFFSCREENPLAIN,
+        DDSCAPS_TEXTURE,
+        DDSCAPS_TEXTURE | DDSCAPS_ALLOCONLOAD,
+        0,
+        DDSCAPS_TEXTURE | DDSCAPS_ALLOCONLOAD | DDSCAPS_SYSTEMMEMORY,
+        DDSCAPS_PRIMARYSURFACE,
+        DDSCAPS_PRIMARYSURFACE | DDSCAPS_SYSTEMMEMORY
+    };
+    DWORD expected_caps[] = {
+        DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM,
+        DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM,
+        DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM | DDSCAPS_ALLOCONLOAD,
+        DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM,
+        DDSCAPS_TEXTURE | DDSCAPS_ALLOCONLOAD | DDSCAPS_SYSTEMMEMORY,
+        DDSCAPS_PRIMARYSURFACE | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM | DDSCAPS_VISIBLE,
+        DDSCAPS_PRIMARYSURFACE | DDSCAPS_SYSTEMMEMORY | DDSCAPS_VISIBLE
+    };
+    UINT i;
+    DDCAPS ddcaps;
+
+    /* Tests various surface flags, what changes do they undergo during surface creation. Forsaken
+     * engine expects texture surfaces without memory flag to get a video memory flag right after
+     * creation. Currently, Wine adds DDSCAPS_FRONTBUFFER to primary surface, but native doesn't do this
+     * for single buffered primaries. Because of this primary surface creation tests are todo_wine. No real
+     * app is known so far to care about this. */
+    ddcaps.dwSize = sizeof(DDCAPS);
+    hr = IDirectDraw_GetCaps(lpDD, &ddcaps, NULL);
+    ok(hr == DD_OK, "IDirectDraw_GetCaps failed with %08x\n", hr);
+
+    if (!(ddcaps.ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY))
+    {
+        skip("DDraw reported no VIDEOMEMORY cap. Broken video driver? Skipping surface caps tests.\n");
+        return ;
+    }
+
+    for (i = 0; i < sizeof(create_caps) / sizeof(DWORD); i++)
+    {
+        memset(&create, 0, sizeof(create));
+        create.dwSize = sizeof(create);
+        create.ddsCaps.dwCaps = create_caps[i];
+        create.dwFlags = DDSD_CAPS;
+
+        if (!(create.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE))
+        {
+            create.dwFlags |= DDSD_HEIGHT | DDSD_WIDTH;
+            create.dwHeight = 128;
+            create.dwWidth = 128;
+        }
+
+        hr = IDirectDraw_CreateSurface(lpDD, &create, &surface1, NULL);
+        ok(hr == DD_OK, "IDirectDraw_CreateSurface failed with %08x\n", hr);
+
+        if (SUCCEEDED(hr))
+        {
+            memset(&desc, 0, sizeof(desc));
+            desc.dwSize = sizeof(DDSURFACEDESC);
+            hr = IDirectDrawSurface_GetSurfaceDesc(surface1, &desc);
+            ok(hr == DD_OK, "IDirectDrawSurface_GetSurfaceDesc failed with %08x\n", hr);
+
+            if (!(create_caps[i] & DDSCAPS_PRIMARYSURFACE))
+                ok(desc.ddsCaps.dwCaps == expected_caps[i],
+                    "GetSurfaceDesc returned caps %x, expected %x\n", desc.ddsCaps.dwCaps,
+                    expected_caps[i]);
+            else
+                todo_wine ok(desc.ddsCaps.dwCaps == expected_caps[i],
+                                "GetSurfaceDesc returned caps %x, expected %x\n", desc.ddsCaps.dwCaps,
+                                expected_caps[i]);
+
+            IDirectDrawSurface_Release(surface1);
+        }
+    }
+
+    /* Test for differences in ddraw 7 */
+    hr = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw7, (void **) &dd7);
+    ok(hr == DD_OK, "IDirectDraw_QueryInterface returned %08x\n", hr);
+    if (FAILED(hr))
+    {
+        skip("Failed to get IDirectDraw7 interface, skipping tests\n");
+    }
+    else
+    {
+        for (i = 0; i < sizeof(create_caps) / sizeof(DWORD); i++)
+        {
+            memset(&create2, 0, sizeof(create2));
+            create2.dwSize = sizeof(create2);
+            create2.ddsCaps.dwCaps = create_caps[i];
+            create2.dwFlags = DDSD_CAPS;
+
+            if (!(create2.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE))
+            {
+                create2.dwFlags |= DDSD_HEIGHT | DDSD_WIDTH;
+                create2.dwHeight = 128;
+                create2.dwWidth = 128;
+            }
+
+            hr = IDirectDraw7_CreateSurface(dd7, &create2, &surface7, NULL);
+            ok(hr==DD_OK,"CreateSurface returned: %x\n",hr);
+
+            if (SUCCEEDED(hr))
+            {
+                memset(&desc2, 0, sizeof(desc2));
+                desc2.dwSize = sizeof(DDSURFACEDESC2);
+                hr = IDirectDrawSurface7_GetSurfaceDesc(surface7, &desc2);
+                ok(hr == DD_OK, "IDirectDrawSurface_GetSurfaceDesc failed with %08x\n", hr);
+
+                if (!(create_caps[i] & DDSCAPS_PRIMARYSURFACE))
+                    ok(desc2.ddsCaps.dwCaps == expected_caps[i],
+                        "GetSurfaceDesc returned caps %x, expected %x\n", desc2.ddsCaps.dwCaps,
+                        expected_caps[i]);
+                else
+                    todo_wine ok(desc2.ddsCaps.dwCaps == expected_caps[i],
+                                    "GetSurfaceDesc returned caps %x, expected %x\n", desc2.ddsCaps.dwCaps,
+                                    expected_caps[i]);
+
+                IDirectDrawSurface7_Release(surface7);
+            }
+        }
+
+        IDirectDraw7_Release(dd7);
+    }
+}
+
 START_TEST(dsurface)
 {
     if (!CreateDirectDraw())
@@ -2631,5 +2764,6 @@ START_TEST(dsurface)
     BltParamTest();
     StructSizeTest();
     PaletteTest();
+    SurfaceCapsTest();
     ReleaseDirectDraw();
 }




More information about the wine-cvs mailing list