Hi all,
I've made one discovery - the explicit BACKBUFFER creation (as shown in logs) works only for IID_IDirectDraw interface, not for any newer (on my Windows XP). I will do some more testing, add tests into a separate patch and send it afterwards.
Regards, Oldrich.
On Wednesday 21 July 2010 20:51:49 Oldřich Jedlička wrote:
Old DirectX interfaces allowed creation of explicit back buffers, so move the restrictive check to DirectX 7 implementation.
This fixes bug #9008.
dlls/ddraw/ddraw.c | 35 ++++++++++++++++++++++++++++------- 1 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c index e55ac5b..9f13c8b 100644 --- a/dlls/ddraw/ddraw.c +++ b/dlls/ddraw/ddraw.c @@ -2967,7 +2967,7 @@ static HRESULT ddraw_create_gdi_swapchain(IDirectDrawImpl *ddraw, IDirectDrawSur * DDERR_* if an error occurs
***/ -static HRESULT WINAPI ddraw7_CreateSurface(IDirectDraw7 *iface, +static HRESULT WINAPI CreateSurface(IDirectDraw7 *iface, DDSURFACEDESC2 *DDSD, IDirectDrawSurface7 **Surf, IUnknown *UnkOuter) { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; @@ -3030,8 +3030,8 @@ static HRESULT WINAPI ddraw7_CreateSurface(IDirectDraw7 *iface, return DDERR_NOEXCLUSIVEMODE; }
- if(DDSD->ddsCaps.dwCaps & (DDSCAPS_FRONTBUFFER | DDSCAPS_BACKBUFFER))
{ - WARN("Application tried to create an explicit front or back buffer\n"); + if(DDSD->ddsCaps.dwCaps & DDSCAPS_FRONTBUFFER) {
}WARN("Application tried to create an explicit front buffer\n"); LeaveCriticalSection(&ddraw_cs); return DDERR_INVALIDCAPS;
@@ -3391,6 +3391,27 @@ static HRESULT WINAPI ddraw7_CreateSurface(IDirectDraw7 *iface, return hr; }
+static HRESULT WINAPI ddraw7_CreateSurface(IDirectDraw7 *iface,
DDSURFACEDESC2 *surface_desc, IDirectDrawSurface7 **surface,
IUnknown *outer_unknown) +{
- TRACE("iface %p, surface_desc %p, surface %p, outer_unknown %p.\n",
iface, surface_desc, surface, outer_unknown);
- if(surface_desc->ddsCaps.dwCaps & (DDSCAPS_FRONTBUFFER |
DDSCAPS_BACKBUFFER)) + {
if (TRACE_ON(ddraw))
{
TRACE(" (%p) Requesting surface desc :\n", iface);
DDRAW_dump_surface_desc(surface_desc);
}
WARN("Application tried to create an explicit front or back
buffer\n"); + return DDERR_INVALIDCAPS;
- }
- return CreateSurface(iface, surface_desc, surface, outer_unknown);
+}
static HRESULT WINAPI ddraw4_CreateSurface(IDirectDraw4 *iface, DDSURFACEDESC2 *surface_desc, IDirectDrawSurface4 **surface, IUnknown *outer_unknown) { @@ -3401,7 +3422,7 @@ static HRESULT WINAPI ddraw4_CreateSurface(IDirectDraw4 *iface, TRACE("iface %p, surface_desc %p, surface %p, outer_unknown %p.\n", iface, surface_desc, surface, outer_unknown);
- hr = ddraw7_CreateSurface((IDirectDraw7 *)ddraw, surface_desc,
(IDirectDrawSurface7 **)surface, outer_unknown); + hr = CreateSurface((IDirectDraw7 *)ddraw, surface_desc, (IDirectDrawSurface7 **)surface, outer_unknown); impl = (IDirectDrawSurfaceImpl *)*surface; if (SUCCEEDED(hr) && impl) { @@ -3425,7 +3446,7 @@ static HRESULT WINAPI ddraw3_CreateSurface(IDirectDraw3 *iface, TRACE("iface %p, surface_desc %p, surface %p, outer_unknown %p.\n", iface, surface_desc, surface, outer_unknown);
- hr = ddraw7_CreateSurface((IDirectDraw7 *)ddraw, (DDSURFACEDESC2
*)surface_desc, &surface7, outer_unknown); + hr = CreateSurface((IDirectDraw7 *)ddraw, (DDSURFACEDESC2 *)surface_desc, &surface7, outer_unknown); if (FAILED(hr)) { *surface = NULL; @@ -3453,7 +3474,7 @@ static HRESULT WINAPI ddraw2_CreateSurface(IDirectDraw2 *iface, TRACE("iface %p, surface_desc %p, surface %p, outer_unknown %p.\n", iface, surface_desc, surface, outer_unknown);
- hr = ddraw7_CreateSurface((IDirectDraw7 *)ddraw, (DDSURFACEDESC2
*)surface_desc, &surface7, outer_unknown); + hr = CreateSurface((IDirectDraw7 *)ddraw, (DDSURFACEDESC2 *)surface_desc, &surface7, outer_unknown); if (FAILED(hr)) { *surface = NULL; @@ -3483,7 +3504,7 @@ static HRESULT WINAPI ddraw1_CreateSurface(IDirectDraw *iface, /* Remove front buffer flag, this causes failure in v7, and its added to normal * primaries anyway. */ surface_desc->ddsCaps.dwCaps &= ~DDSCAPS_FRONTBUFFER;
- hr = ddraw7_CreateSurface((IDirectDraw7 *)ddraw, (DDSURFACEDESC2
*)surface_desc, &surface7, outer_unknown); + hr = CreateSurface((IDirectDraw7 *)ddraw, (DDSURFACEDESC2 *)surface_desc, &surface7, outer_unknown); if (FAILED(hr)) { *surface = NULL;