[PATCH 01/10] ddraw/tests: New CreateSurface for DDSCAPS_BACKBUFFER tests. (try 2)

Oldřich Jedlička oldium.pro at seznam.cz
Mon Aug 2 15:05:37 CDT 2010


---
 dlls/ddraw/tests/dsurface.c |   91 +++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 87 insertions(+), 4 deletions(-)

diff --git a/dlls/ddraw/tests/dsurface.c b/dlls/ddraw/tests/dsurface.c
index 20e8634..b5f6f2c 100644
--- a/dlls/ddraw/tests/dsurface.c
+++ b/dlls/ddraw/tests/dsurface.c
@@ -30,6 +30,7 @@
 #include "unknwn.h"
 
 static LPDIRECTDRAW lpDD = NULL;
+static DDCAPS ddcaps;
 
 static BOOL CreateDirectDraw(void)
 {
@@ -2851,16 +2852,12 @@ static void SurfaceCapsTest(void)
         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))
     {
@@ -3378,6 +3375,83 @@ static void GetDCFormatTest(void)
     IDirectDraw7_Release(dd7);
 }
 
+static void BackBufferCreateSurfaceTest(void)
+{
+    DDSURFACEDESC ddsd;
+    DDSURFACEDESC created_ddsd;
+    DDSURFACEDESC2 ddsd2;
+    IDirectDrawSurface *surf;
+    IDirectDrawSurface4 *surf4;
+    IDirectDrawSurface7 *surf7;
+    HRESULT hr;
+    IDirectDraw2 *dd2;
+    IDirectDraw4 *dd4;
+    IDirectDraw7 *dd7;
+
+    const DWORD caps = DDSCAPS_BACKBUFFER;
+    const DWORD expected_caps = DDSCAPS_BACKBUFFER | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM;
+
+    if (!(ddcaps.ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY))
+    {
+        skip("DDraw reported no VIDEOMEMORY cap. Broken video driver? Skipping surface caps tests.\n");
+        return ;
+    }
+
+    memset(&ddsd, 0, sizeof(ddsd));
+    ddsd.dwSize = sizeof(ddsd);
+    ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
+    ddsd.dwWidth = 64;
+    ddsd.dwHeight = 64;
+    ddsd.ddsCaps.dwCaps = caps;
+    memset(&ddsd2, 0, sizeof(ddsd2));
+    ddsd2.dwSize = sizeof(ddsd2);
+    ddsd2.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
+    ddsd2.dwWidth = 64;
+    ddsd2.dwHeight = 64;
+    ddsd2.ddsCaps.dwCaps = caps;
+    memset(&created_ddsd, 0, sizeof(created_ddsd));
+    created_ddsd.dwSize = sizeof(DDSURFACEDESC);
+
+    hr = IDirectDraw_CreateSurface(lpDD, &ddsd, &surf, NULL);
+    todo_wine ok(SUCCEEDED(hr), "IDirectDraw_CreateSurface failed: 0x%08x\n", hr);
+    if (surf != NULL)
+    {
+        hr = IDirectDrawSurface_GetSurfaceDesc(surf, &created_ddsd);
+        ok(SUCCEEDED(hr), "IDirectDraw_GetSurfaceDesc failed: 0x%08x\n", hr);
+        ok(created_ddsd.ddsCaps.dwCaps == expected_caps,
+           "GetSurfaceDesc returned caps %x, expected %x\n", created_ddsd.ddsCaps.dwCaps,
+           expected_caps);
+        IDirectDrawSurface_Release(surf);
+    }
+
+    hr = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw2, (void **) &dd2);
+    ok(SUCCEEDED(hr), "IDirectDraw_QueryInterface failed: 0x%08x\n", hr);
+
+    hr = IDirectDraw2_CreateSurface(dd2, &ddsd, &surf, NULL);
+    ok(hr == DDERR_INVALIDCAPS, "IDirectDraw2_CreateSurface didn't return %x08x, but %x08x\n",
+       DDERR_INVALIDCAPS, hr);
+
+    IDirectDraw2_Release(dd2);
+
+    hr = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw4, (void **) &dd4);
+    ok(SUCCEEDED(hr), "IDirectDraw_QueryInterface failed: 0x%08x\n", hr);
+
+    hr = IDirectDraw4_CreateSurface(dd4, &ddsd2, &surf4, NULL);
+    ok(hr == DDERR_INVALIDCAPS, "IDirectDraw4_CreateSurface didn't return %x08x, but %x08x\n",
+       DDERR_INVALIDCAPS, hr);
+
+    IDirectDraw4_Release(dd4);
+
+    hr = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw7, (void **) &dd7);
+    ok(SUCCEEDED(hr), "IDirectDraw_QueryInterface failed: 0x%08x\n", hr);
+
+    hr = IDirectDraw7_CreateSurface(dd7, &ddsd2, &surf7, NULL);
+    ok(hr == DDERR_INVALIDCAPS, "IDirectDraw7_CreateSurface didn't return %x08x, but %x08x\n",
+       DDERR_INVALIDCAPS, hr);
+
+    IDirectDraw7_Release(dd7);
+}
+
 START_TEST(dsurface)
 {
     HRESULT ret;
@@ -3401,6 +3475,14 @@ START_TEST(dsurface)
         return;
     }
 
+    ddcaps.dwSize = sizeof(DDCAPS);
+    ret = IDirectDraw_GetCaps(lpDD, &ddcaps, NULL);
+    if (ret != DD_OK)
+    {
+        skip("IDirectDraw_GetCaps failed with %08x\n", ret);
+        return;
+    }
+
     MipMapCreationTest();
     SrcColorKey32BlitTest();
     QueryInterface();
@@ -3423,5 +3505,6 @@ START_TEST(dsurface)
     SurfaceCapsTest();
     GetDCTest();
     GetDCFormatTest();
+    BackBufferCreateSurfaceTest();
     ReleaseDirectDraw();
 }
-- 
1.7.2




More information about the wine-patches mailing list