[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 3a77dcd..bcf84db 100644=0A=
--- a/dlls/ddraw/ddraw.c=0A=
+++ b/dlls/ddraw/ddraw.c=0A=
@@ -2425,6 +2425,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=
@@ -2483,6 +2484,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 91669ff..9356c08 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 b39e84e..0dc03ce 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_000D_01C96C80.6059A070--
More information about the wine-patches
mailing list