From 7c6ca2077ffef55a69f1605bb819d2595fc802da Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Mon, 27 Jan 2014 10:07:52 +0100 Subject: [PATCH] ddraw: Allow attaching surfaces other than depth buffers in ddraw_surface4_AddAttachedSurface(). --- dlls/ddraw/surface.c | 84 +++++++++++++++++---------------------- dlls/ddraw/tests/ddraw4.c | 14 +++---- 2 files changed, 43 insertions(+), 55 deletions(-) diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index f569ae818c8..c50399279c0 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -1670,106 +1670,94 @@ static HRESULT WINAPI ddraw_surface7_AddAttachedSurface(IDirectDrawSurface7 *ifa static HRESULT WINAPI ddraw_surface4_AddAttachedSurface(IDirectDrawSurface4 *iface, IDirectDrawSurface4 *attachment) { - struct ddraw_surface *This = impl_from_IDirectDrawSurface4(iface); + struct ddraw_surface *surface = impl_from_IDirectDrawSurface4(iface); struct ddraw_surface *attachment_impl = unsafe_impl_from_IDirectDrawSurface4(attachment); HRESULT hr; TRACE("iface %p, attachment %p.\n", iface, attachment); - hr = ddraw_surface7_AddAttachedSurface(&This->IDirectDrawSurface7_iface, - attachment_impl ? &attachment_impl->IDirectDrawSurface7_iface : NULL); - if (FAILED(hr)) - { - return hr; - } - attachment_impl->attached_iface = (IUnknown *)attachment; - IUnknown_AddRef(attachment_impl->attached_iface); - ddraw_surface7_Release(&attachment_impl->IDirectDrawSurface7_iface); - return hr; -} -static HRESULT WINAPI ddraw_surface3_AddAttachedSurface(IDirectDrawSurface3 *iface, IDirectDrawSurface3 *attachment) -{ - struct ddraw_surface *This = impl_from_IDirectDrawSurface3(iface); - struct ddraw_surface *attachment_impl = unsafe_impl_from_IDirectDrawSurface3(attachment); - HRESULT hr; - - TRACE("iface %p, attachment %p.\n", iface, attachment); - /* Tests suggest that * -> offscreen plain surfaces can be attached to other offscreen plain surfaces * -> offscreen plain surfaces can be attached to primaries * -> primaries can be attached to offscreen plain surfaces * -> z buffers can be attached to primaries */ - if (This->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_OFFSCREENPLAIN) + if (surface->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_OFFSCREENPLAIN) && attachment_impl->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_OFFSCREENPLAIN)) { /* Sizes have to match */ - if (attachment_impl->surface_desc.dwWidth != This->surface_desc.dwWidth - || attachment_impl->surface_desc.dwHeight != This->surface_desc.dwHeight) + if (attachment_impl->surface_desc.dwWidth != surface->surface_desc.dwWidth + || attachment_impl->surface_desc.dwHeight != surface->surface_desc.dwHeight) { WARN("Surface sizes do not match.\n"); return DDERR_CANNOTATTACHSURFACE; } - /* OK */ } - else if (This->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE) - && attachment_impl->surface_desc.ddsCaps.dwCaps & (DDSCAPS_ZBUFFER)) - { - /* OK */ - } - else + else if (!(surface->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE)) + || !(attachment_impl->surface_desc.ddsCaps.dwCaps & (DDSCAPS_ZBUFFER))) { WARN("Invalid attachment combination.\n"); return DDERR_CANNOTATTACHSURFACE; } - hr = ddraw_surface_attach_surface(This, attachment_impl); - if (FAILED(hr)) - { + if (FAILED(hr = ddraw_surface_attach_surface(surface, attachment_impl))) return hr; - } + attachment_impl->attached_iface = (IUnknown *)attachment; IUnknown_AddRef(attachment_impl->attached_iface); return hr; } +static HRESULT WINAPI ddraw_surface3_AddAttachedSurface(IDirectDrawSurface3 *iface, IDirectDrawSurface3 *attachment) +{ + struct ddraw_surface *surface = impl_from_IDirectDrawSurface3(iface); + struct ddraw_surface *attachment_impl = unsafe_impl_from_IDirectDrawSurface3(attachment); + HRESULT hr; + + TRACE("iface %p, attachment %p.\n", iface, attachment); + + if (FAILED(hr = ddraw_surface4_AddAttachedSurface(&surface->IDirectDrawSurface4_iface, + attachment_impl ? &attachment_impl->IDirectDrawSurface4_iface : NULL))) + return hr; + + attachment_impl->attached_iface = (IUnknown *)attachment; + IUnknown_AddRef(attachment_impl->attached_iface); + ddraw_surface4_Release(&attachment_impl->IDirectDrawSurface4_iface); + return hr; +} + static HRESULT WINAPI ddraw_surface2_AddAttachedSurface(IDirectDrawSurface2 *iface, IDirectDrawSurface2 *attachment) { - struct ddraw_surface *This = impl_from_IDirectDrawSurface2(iface); + struct ddraw_surface *surface = impl_from_IDirectDrawSurface2(iface); struct ddraw_surface *attachment_impl = unsafe_impl_from_IDirectDrawSurface2(attachment); HRESULT hr; TRACE("iface %p, attachment %p.\n", iface, attachment); - hr = ddraw_surface3_AddAttachedSurface(&This->IDirectDrawSurface3_iface, - attachment_impl ? &attachment_impl->IDirectDrawSurface3_iface : NULL); - if (FAILED(hr)) - { + if (FAILED(hr = ddraw_surface4_AddAttachedSurface(&surface->IDirectDrawSurface4_iface, + attachment_impl ? &attachment_impl->IDirectDrawSurface4_iface : NULL))) return hr; - } + attachment_impl->attached_iface = (IUnknown *)attachment; IUnknown_AddRef(attachment_impl->attached_iface); - ddraw_surface3_Release(&attachment_impl->IDirectDrawSurface3_iface); + ddraw_surface4_Release(&attachment_impl->IDirectDrawSurface4_iface); return hr; } static HRESULT WINAPI ddraw_surface1_AddAttachedSurface(IDirectDrawSurface *iface, IDirectDrawSurface *attachment) { - struct ddraw_surface *This = impl_from_IDirectDrawSurface(iface); + struct ddraw_surface *surface = impl_from_IDirectDrawSurface(iface); struct ddraw_surface *attachment_impl = unsafe_impl_from_IDirectDrawSurface(attachment); HRESULT hr; TRACE("iface %p, attachment %p.\n", iface, attachment); - hr = ddraw_surface3_AddAttachedSurface(&This->IDirectDrawSurface3_iface, - attachment_impl ? &attachment_impl->IDirectDrawSurface3_iface : NULL); - if (FAILED(hr)) - { + if (FAILED(hr = ddraw_surface4_AddAttachedSurface(&surface->IDirectDrawSurface4_iface, + attachment_impl ? &attachment_impl->IDirectDrawSurface4_iface : NULL))) return hr; - } + attachment_impl->attached_iface = (IUnknown *)attachment; IUnknown_AddRef(attachment_impl->attached_iface); - ddraw_surface3_Release(&attachment_impl->IDirectDrawSurface3_iface); + ddraw_surface4_Release(&attachment_impl->IDirectDrawSurface4_iface); return hr; } diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c index 939a9b611eb..04d50495ff3 100644 --- a/dlls/ddraw/tests/ddraw4.c +++ b/dlls/ddraw/tests/ddraw4.c @@ -6005,25 +6005,25 @@ static void test_surface_attachment(void) ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr); hr = IDirectDrawSurface4_AddAttachedSurface(surface1, surface2); - todo_wine ok(SUCCEEDED(hr), "Failed to attach surface, hr %#x.\n", hr); + ok(SUCCEEDED(hr), "Failed to attach surface, hr %#x.\n", hr); /* Try the reverse without detaching first. */ hr = IDirectDrawSurface4_AddAttachedSurface(surface2, surface1); - todo_wine ok(hr == DDERR_SURFACEALREADYATTACHED, "Got unexpected hr %#x.\n", hr); + ok(hr == DDERR_SURFACEALREADYATTACHED, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface4_DeleteAttachedSurface(surface1, 0, surface2); - todo_wine ok(SUCCEEDED(hr), "Failed to detach surface, hr %#x.\n", hr); + ok(SUCCEEDED(hr), "Failed to detach surface, hr %#x.\n", hr); hr = IDirectDrawSurface4_AddAttachedSurface(surface2, surface1); - todo_wine ok(SUCCEEDED(hr), "Failed to attach surface, hr %#x.\n", hr); + ok(SUCCEEDED(hr), "Failed to attach surface, hr %#x.\n", hr); /* Try to detach reversed. */ hr = IDirectDrawSurface4_DeleteAttachedSurface(surface1, 0, surface2); ok(hr == DDERR_CANNOTDETACHSURFACE, "Got unexpected hr %#x.\n", hr); hr = IDirectDrawSurface4_DeleteAttachedSurface(surface2, 0, surface1); - todo_wine ok(SUCCEEDED(hr), "Failed to detach surface, hr %#x.\n", hr); + ok(SUCCEEDED(hr), "Failed to detach surface, hr %#x.\n", hr); hr = IDirectDrawSurface4_AddAttachedSurface(surface2, surface3); - todo_wine ok(SUCCEEDED(hr), "Failed to attach surface, hr %#x.\n", hr); + ok(SUCCEEDED(hr), "Failed to attach surface, hr %#x.\n", hr); hr = IDirectDrawSurface4_DeleteAttachedSurface(surface2, 0, surface3); - todo_wine ok(SUCCEEDED(hr), "Failed to detach surface, hr %#x.\n", hr); + ok(SUCCEEDED(hr), "Failed to detach surface, hr %#x.\n", hr); hr = IDirectDrawSurface4_AddAttachedSurface(surface1, surface4); ok(hr == DDERR_CANNOTATTACHSURFACE, "Got unexpected hr %#x.\n", hr);