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,