ddraw: Allow creating back buffer for pre-DirectX 7 interfaces.
Oldřich Jedlička
oldium.pro at seznam.cz
Mon Jul 19 12:27:16 CDT 2010
This fixes bug #9008.
---
dlls/ddraw/ddraw.c | 25 +++++++++++++++++++++----
dlls/ddraw/ddraw_private.h | 3 +++
dlls/ddraw/ddraw_thunks.c | 24 ++++++++++++------------
3 files changed, 36 insertions(+), 16 deletions(-)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 05c8c62..cf90c39 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -2295,6 +2295,7 @@ static HRESULT IDirectDrawImpl_CreateGDISwapChain(IDirectDrawImpl *ddraw, IDirec
* Surf: Address to store the interface pointer at
* UnkOuter: Basically for aggregation support, but ddraw doesn't support
* aggregation, so it has to be NULL
+ * AllowBackBuffer: Allow (TRUE) creation of explicit back buffer
*
* Returns:
* DD_OK on success
@@ -2302,11 +2303,12 @@ static HRESULT IDirectDrawImpl_CreateGDISwapChain(IDirectDrawImpl *ddraw, IDirec
* DDERR_* if an error occurs
*
*****************************************************************************/
-static HRESULT WINAPI
+HRESULT WINAPI
IDirectDrawImpl_CreateSurface(IDirectDraw7 *iface,
DDSURFACEDESC2 *DDSD,
IDirectDrawSurface7 **Surf,
- IUnknown *UnkOuter)
+ IUnknown *UnkOuter,
+ BOOL AllowBackBuffer)
{
IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
IDirectDrawSurfaceImpl *object = NULL;
@@ -2368,7 +2370,13 @@ IDirectDrawImpl_CreateSurface(IDirectDraw7 *iface,
return DDERR_NOEXCLUSIVEMODE;
}
- if(DDSD->ddsCaps.dwCaps & (DDSCAPS_FRONTBUFFER | DDSCAPS_BACKBUFFER)) {
+ if(AllowBackBuffer && (DDSD->ddsCaps.dwCaps & (DDSCAPS_FRONTBUFFER))) {
+ WARN("Application tried to create an explicit front buffer\n");
+ LeaveCriticalSection(&ddraw_cs);
+ return DDERR_INVALIDCAPS;
+ }
+
+ if (!AllowBackBuffer && (DDSD->ddsCaps.dwCaps & (DDSCAPS_FRONTBUFFER | DDSCAPS_BACKBUFFER))) {
WARN("Application tried to create an explicit front or back buffer\n");
LeaveCriticalSection(&ddraw_cs);
return DDERR_INVALIDCAPS;
@@ -2727,6 +2735,15 @@ IDirectDrawImpl_CreateSurface(IDirectDraw7 *iface,
return hr;
}
+static HRESULT WINAPI
+IDirectDraw7Impl_CreateSurface(IDirectDraw7 *iface,
+ DDSURFACEDESC2 *DDSD,
+ IDirectDrawSurface7 **Surf,
+ IUnknown *UnkOuter)
+{
+ return IDirectDrawImpl_CreateSurface(iface, DDSD, Surf, UnkOuter, FALSE);
+}
+
#define DDENUMSURFACES_SEARCHTYPE (DDENUMSURFACES_CANBECREATED|DDENUMSURFACES_DOESEXIST)
#define DDENUMSURFACES_MATCHTYPE (DDENUMSURFACES_ALL|DDENUMSURFACES_MATCH|DDENUMSURFACES_NOMATCH)
@@ -3105,7 +3122,7 @@ const IDirectDraw7Vtbl IDirectDraw7_Vtbl =
IDirectDrawImpl_Compact,
IDirectDrawImpl_CreateClipper,
IDirectDrawImpl_CreatePalette,
- IDirectDrawImpl_CreateSurface,
+ IDirectDraw7Impl_CreateSurface,
IDirectDrawImpl_DuplicateSurface,
IDirectDrawImpl_EnumDisplayModes,
IDirectDrawImpl_EnumSurfaces,
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index 3de8668..9810c6f 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -303,6 +303,9 @@ extern const IDirectDrawGammaControlVtbl IDirectDrawGammaControl_Vtbl DECLSPEC_H
extern const IDirect3DTexture2Vtbl IDirect3DTexture2_Vtbl DECLSPEC_HIDDEN;
extern const IDirect3DTextureVtbl IDirect3DTexture1_Vtbl DECLSPEC_HIDDEN;
+HRESULT WINAPI IDirectDrawImpl_CreateSurface(IDirectDraw7 *iface, DDSURFACEDESC2 *DDSD,
+ IDirectDrawSurface7 **Surf, IUnknown *UnkOuter, BOOL AllowBackBuffer) DECLSPEC_HIDDEN;
+
HRESULT WINAPI IDirectDrawSurfaceImpl_AddAttachedSurface(IDirectDrawSurfaceImpl *This,
IDirectDrawSurfaceImpl *Surf) DECLSPEC_HIDDEN;
void IDirectDrawSurfaceImpl_Destroy(IDirectDrawSurfaceImpl *This) DECLSPEC_HIDDEN;
diff --git a/dlls/ddraw/ddraw_thunks.c b/dlls/ddraw/ddraw_thunks.c
index 2c205e9..7d6396c 100644
--- a/dlls/ddraw/ddraw_thunks.c
+++ b/dlls/ddraw/ddraw_thunks.c
@@ -331,9 +331,9 @@ static void set_surf_version(IDirectDrawSurfaceImpl *surf, int version)
}
static HRESULT WINAPI
-IDirectDrawImpl_CreateSurface(LPDIRECTDRAW This, LPDDSURFACEDESC pSDesc,
- LPDIRECTDRAWSURFACE *ppSurface,
- IUnknown *pUnkOuter)
+IDirectDraw1Impl_CreateSurface(LPDIRECTDRAW This, LPDDSURFACEDESC pSDesc,
+ LPDIRECTDRAWSURFACE *ppSurface,
+ IUnknown *pUnkOuter)
{
LPDIRECTDRAWSURFACE7 pSurface7;
IDirectDrawSurfaceImpl *impl;
@@ -345,8 +345,8 @@ IDirectDrawImpl_CreateSurface(LPDIRECTDRAW This, LPDDSURFACEDESC pSDesc,
pSDesc->ddsCaps.dwCaps &= ~DDSCAPS_FRONTBUFFER;
/* the LPDDSURFACEDESC -> LPDDSURFACEDESC2 conversion should be ok,
* since the data layout is the same */
- hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw1(This),
- (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
+ hr = IDirectDrawImpl_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw1(This),
+ (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter, TRUE);
if (FAILED(hr))
{
*ppSurface = NULL;
@@ -371,8 +371,8 @@ IDirectDraw2Impl_CreateSurface(LPDIRECTDRAW2 This, LPDDSURFACEDESC pSDesc,
IDirectDrawSurfaceImpl *impl;
HRESULT hr;
- hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw2(This),
- (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
+ hr = IDirectDrawImpl_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw2(This),
+ (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter, TRUE);
if (FAILED(hr))
{
*ppSurface = NULL;
@@ -397,8 +397,8 @@ IDirectDraw3Impl_CreateSurface(LPDIRECTDRAW3 This, LPDDSURFACEDESC pSDesc,
IDirectDrawSurfaceImpl *impl;
HRESULT hr;
- hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw3(This),
- (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
+ hr = IDirectDrawImpl_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw3(This),
+ (LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter, TRUE);
if (FAILED(hr))
{
*ppSurface = NULL;
@@ -423,8 +423,8 @@ IDirectDraw4Impl_CreateSurface(LPDIRECTDRAW4 This, LPDDSURFACEDESC2 pSDesc,
HRESULT hr;
IDirectDrawSurfaceImpl *impl;
- hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw4(This),
- pSDesc, (LPDIRECTDRAWSURFACE7 *)ppSurface, pUnkOuter);
+ hr = IDirectDrawImpl_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw4(This),
+ pSDesc, (LPDIRECTDRAWSURFACE7 *)ppSurface, pUnkOuter, TRUE);
impl = (IDirectDrawSurfaceImpl *)*ppSurface;
if(SUCCEEDED(hr) && impl)
{
@@ -1092,7 +1092,7 @@ const IDirectDrawVtbl IDirectDraw1_Vtbl =
IDirectDrawImpl_Compact,
IDirectDrawImpl_CreateClipper,
IDirectDrawImpl_CreatePalette,
- IDirectDrawImpl_CreateSurface,
+ IDirectDraw1Impl_CreateSurface,
IDirectDrawImpl_DuplicateSurface,
IDirectDrawImpl_EnumDisplayModes,
IDirectDrawImpl_EnumSurfaces,
--
1.7.1.1
More information about the wine-patches
mailing list