[PATCH] DDraw[ex]: Show a caps handling difference=0A=

Stefan Doesinger stefan at codeweavers.com
Thu Dec 18 17:20:28 CST 2008


=0A=
---=0A=
 dlls/ddraw/ddraw.c           |   11 +++++++++++=0A=
 dlls/ddraw/tests/dsurface.c  |   10 ++++++++++=0A=
 dlls/ddrawex/tests/surface.c |   21 +++++++++++++++++++++=0A=
 3 files changed, 42 insertions(+), 0 deletions(-)=0A=
=0A=
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c=0A=
index 286e4b3..5a24ddb 100644=0A=
--- a/dlls/ddraw/ddraw.c=0A=
+++ b/dlls/ddraw/ddraw.c=0A=
@@ -2432,6 +2432,7 @@ IDirectDrawImpl_CreateSurface(IDirectDraw7 *iface,=0A=
     LONG extra_surfaces =3D 0;=0A=
     DDSURFACEDESC2 desc2;=0A=
     WINED3DDISPLAYMODE Mode;=0A=
+    const DWORD sysvidmem =3D DDSCAPS_VIDEOMEMORY | =
DDSCAPS_SYSTEMMEMORY;=0A=
 =0A=
     TRACE("(%p)->(%p,%p,%p)\n", This, DDSD, Surf, UnkOuter);=0A=
 =0A=
@@ -2490,6 +2491,16 @@ IDirectDrawImpl_CreateSurface(IDirectDraw7 *iface,=0A=
         LeaveCriticalSection(&ddraw_cs);=0A=
         return DDERR_INVALIDCAPS;=0A=
     }=0A=
+=0A=
+    if((DDSD->ddsCaps.dwCaps & sysvidmem) =3D=3D sysvidmem)=0A=
+    {=0A=
+        /* This is a special switch in ddrawex.dll, but not allowed in =
ddraw.dll */=0A=
+        WARN("Application tries to put the surface in both system and =
video memory\n");=0A=
+        LeaveCriticalSection(&ddraw_cs);=0A=
+        *Surf =3D NULL;=0A=
+        return DDERR_INVALIDCAPS;=0A=
+    }=0A=
+=0A=
     /* Check cube maps but only if the size includes them */=0A=
     if (DDSD->dwSize >=3D sizeof(DDSURFACEDESC2))=0A=
     {=0A=
diff --git a/dlls/ddraw/tests/dsurface.c b/dlls/ddraw/tests/dsurface.c=0A=
index 68a51cd..a12b968 100644=0A=
--- a/dlls/ddraw/tests/dsurface.c=0A=
+++ b/dlls/ddraw/tests/dsurface.c=0A=
@@ -2746,6 +2746,16 @@ static void SurfaceCapsTest(void)=0A=
 =0A=
         IDirectDraw7_Release(dd7);=0A=
     }=0A=
+=0A=
+    memset(&create, 0, sizeof(create));=0A=
+    create.dwSize =3D sizeof(create);=0A=
+    create.dwFlags =3D DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;=0A=
+    create.ddsCaps.dwCaps =3D DDSCAPS_SYSTEMMEMORY | =
DDSCAPS_VIDEOMEMORY;=0A=
+    create.dwWidth =3D 64;=0A=
+    create.dwHeight =3D 64;=0A=
+    hr =3D IDirectDraw_CreateSurface(lpDD, &create, &surface1, NULL);=0A=
+    ok(hr =3D=3D DDERR_INVALIDCAPS, "Creating a SYSMEM | VIDMEM surface =
returned 0x%08x, expected DDERR_INVALIDCAPS\n", hr);=0A=
+    if(surface1) IDirectDrawSurface_Release(surface1);=0A=
 }=0A=
 =0A=
 static BOOL can_create_primary_surface(void)=0A=
diff --git a/dlls/ddrawex/tests/surface.c b/dlls/ddrawex/tests/surface.c=0A=
index 84ce2d5..54676b9 100644=0A=
--- a/dlls/ddrawex/tests/surface.c=0A=
+++ b/dlls/ddrawex/tests/surface.c=0A=
@@ -147,6 +147,26 @@ static void GetDCTest(void)=0A=
     IDirectDraw_Release(dd1);=0A=
 }=0A=
 =0A=
+static void CapsTest(void)=0A=
+{=0A=
+    DDSURFACEDESC ddsd;=0A=
+    IDirectDraw  *dd1 =3D createDD();=0A=
+    IDirectDrawSurface *surf;=0A=
+    HRESULT hr;=0A=
+=0A=
+    memset(&ddsd, 0, sizeof(ddsd));=0A=
+    ddsd.dwSize =3D sizeof(ddsd);=0A=
+    ddsd.dwFlags =3D DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;=0A=
+    ddsd.ddsCaps.dwCaps =3D DDSCAPS_SYSTEMMEMORY | DDSCAPS_VIDEOMEMORY;=0A=
+    ddsd.dwWidth =3D 64;=0A=
+    ddsd.dwHeight =3D 64;=0A=
+    hr =3D IDirectDraw_CreateSurface(dd1, &ddsd, &surf, NULL);=0A=
+    todo_wine ok(hr =3D=3D DD_OK, "Creating a SYSMEM | VIDMEM surface =
returned 0x%08x, expected DD_OK\n", hr);=0A=
+    if(surf) IDirectDrawSurface_Release(surf);=0A=
+=0A=
+    IDirectDraw_Release(dd1);=0A=
+}=0A=
+=0A=
 START_TEST(surface)=0A=
 {=0A=
     IClassFactory *classfactory =3D NULL;=0A=
@@ -169,6 +189,7 @@ START_TEST(surface)=0A=
     ok(hr =3D=3D S_OK, "Failed to create a IDirectDrawFactory\n");=0A=
 =0A=
     GetDCTest();=0A=
+    CapsTest();=0A=
 =0A=
     if(factory) {=0A=
         ref =3D IDirectDrawFactory_Release(factory);=0A=
-- =0A=
1.6.0.6=0A=
=0A=

------=_NextPart_000_001A_01C970CF.67244060--




More information about the wine-patches mailing list