Stefan Dösinger : ddraw: Double buffered primary surfaces can only be created in EXLUSIVE mode.
Alexandre Julliard
julliard at wine.codeweavers.com
Sun Sep 10 03:28:27 CDT 2006
Module: wine
Branch: master
Commit: 2d5b19c182b5c73dc7b4e2903ba220a53e1f291f
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=2d5b19c182b5c73dc7b4e2903ba220a53e1f291f
Author: Stefan Dösinger <stefandoesinger at gmx.at>
Date: Sat Sep 9 13:35:50 2006 +0200
ddraw: Double buffered primary surfaces can only be created in EXLUSIVE mode.
---
dlls/ddraw/ddcomimpl.h | 2 +-
dlls/ddraw/ddraw.c | 8 ++++++++
dlls/ddraw/tests/ddrawmodes.c | 15 +++++++++++++++
3 files changed, 24 insertions(+), 1 deletions(-)
diff --git a/dlls/ddraw/ddcomimpl.h b/dlls/ddraw/ddcomimpl.h
index 594d541..553d29f 100644
--- a/dlls/ddraw/ddcomimpl.h
+++ b/dlls/ddraw/ddcomimpl.h
@@ -45,7 +45,7 @@ #define ICOM_THIS_FROM(impltype, ifacena
/* Given an object and interface name, returns a pointer to that interface. */
#define ICOM_INTERFACE(implobj, iface) \
- (&((implobj)->ICOM_VFIELD_MULTI_NAME(iface)))
+ (implobj == NULL ? NULL :&((implobj)->ICOM_VFIELD_MULTI_NAME(iface)))
#define ICOM_INIT_INTERFACE(implobj, ifacename, vtblname) \
do { \
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 44fe5a0..5e4a909 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -2132,6 +2132,14 @@ IDirectDrawImpl_CreateSurface(IDirectDra
DDSD->dwFlags &= ~DDSD_LPSURFACE;
}
+ if((DDSD->ddsCaps.dwCaps & (DDSCAPS_FLIP | DDSCAPS_PRIMARYSURFACE)) == (DDSCAPS_FLIP | DDSCAPS_PRIMARYSURFACE) &&
+ !(This->cooperative_level & DDSCL_EXCLUSIVE))
+ {
+ TRACE("(%p): Attempt to create a flipable primary surface without DDSCL_EXCLUSIVE set\n", This);
+ *Surf = NULL;
+ return DDERR_NOEXCLUSIVEMODE;
+ }
+
if (Surf == NULL)
{
FIXME("(%p) You want to get back a surface? Don't give NULL ptrs!\n", This);
diff --git a/dlls/ddraw/tests/ddrawmodes.c b/dlls/ddraw/tests/ddrawmodes.c
index 4b2bf17..fd00bb6 100644
--- a/dlls/ddraw/tests/ddrawmodes.c
+++ b/dlls/ddraw/tests/ddrawmodes.c
@@ -222,6 +222,15 @@ static void testdisplaymodes(void)
static void testcooperativelevels_normal(void)
{
HRESULT rc;
+ DDSURFACEDESC surfacedesc;
+ IDirectDrawSurface *surface = (IDirectDrawSurface *) 0xdeadbeef;
+
+ memset(&surfacedesc, 0, sizeof(surfacedesc));
+ surfacedesc.dwSize = sizeof(surfacedesc);
+ surfacedesc.ddpfPixelFormat.dwSize = sizeof(surfacedesc.ddpfPixelFormat);
+ surfacedesc.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
+ surfacedesc.dwBackBufferCount = 1;
+ surfacedesc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
/* Do some tests with DDSCL_NORMAL mode */
@@ -229,6 +238,12 @@ static void testcooperativelevels_normal
hwnd, DDSCL_NORMAL);
ok(rc==DD_OK,"SetCooperativeLevel(DDSCL_NORMAL) returned: %lx\n",rc);
+ /* Try creating a double buffered primary in normal mode */
+ rc = IDirectDraw_CreateSurface(lpDD, &surfacedesc, &surface, NULL);
+ ok(rc == DDERR_NOEXCLUSIVEMODE, "IDirectDraw_CreateSurface returned %08lx\n", rc);
+ ok(surface == NULL, "Returned surface pointer is %p\n", surface);
+ if(surface) IDirectDrawSurface_Release(surface);
+
/* Set the focus window */
rc = IDirectDraw_SetCooperativeLevel(lpDD,
hwnd, DDSCL_SETFOCUSWINDOW);
More information about the wine-cvs
mailing list