ddraw: Allow creating back buffer for pre-DirectX 7 interfaces. (try 2)

Roderick Colenbrander thunderbird2k at gmail.com
Wed Jul 21 17:23:46 CDT 2010


Hi Oldřich,

Not to discourage you, but in Wine tests serve as proof to show that a
patch is right, so you should first get all the tests you want in. The
bug should be fixed afterward. It is likely that the test will reveal
new issues.

Like I mentioned yesterday, checking memory location related
capabilities in the surface descriptor of the created surface might be
useful. For instance It might show that a standalone backbuffer is not
created in video memory. If that's the case then it is something
different from a backbuffer on the swapchain.

Roderick

2010/7/21 Oldřich Jedlička <oldium.pro at seznam.cz>:
> 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;
>
>
>



More information about the wine-devel mailing list