ddraw: Allow creating back buffer for pre-DirectX 7 interfaces.

Oldřich Jedlička oldium.pro at seznam.cz
Mon Jul 19 14:24:21 CDT 2010


Hi Stefan,

On Monday 19 July 2010 20:56:35 Stefan Dösinger wrote:
> Allowing the creation of the surface is most likely not enough, the
> backbuffer has to be useable after it has been created. Specifically, when
> the app attaches the backbuffer to the frontbuffer(assuming this works,
> needs a test) wined3d has to be made aware of the change - there's a
> SetFrontBackBuffers method in the wined3d device to reconfigure the
> primary swapchain.

There is at least one game verified to work with CreateSurface method that 
allows creation of back buffers - Bulanci (Combat Pillows, bug #9008). But I 
have to admit that I don't know the internals of WineD3D, nor DirectX.

Oldrich.

> 
> Am 19.07.2010 um 19:27 schrieb Oldřich Jedlička:
> > 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,



More information about the wine-devel mailing list