From 5fa84c56c344927dcb13b12409fbf64d738438f4 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Tue, 5 Oct 2010 14:32:35 +0200 Subject: [PATCH] ddraw: Remove another hack. It breaks actual front buffer / back buffer flips. --- dlls/ddraw/ddraw_private.h | 1 - dlls/ddraw/device.c | 78 +++++----------------------------- dlls/wined3d/device.c | 86 -------------------------------------- include/wine/wined3d.idl | 4 -- 4 files changed, 11 insertions(+), 158 deletions(-) diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h index 9b3f6140551..f9b9a4830f6 100644 --- a/dlls/ddraw/ddraw_private.h +++ b/dlls/ddraw/ddraw_private.h @@ -359,7 +359,6 @@ struct IDirect3DDeviceImpl IDirectDrawImpl *ddraw; IWineD3DBuffer *indexbuffer; IDirectDrawSurfaceImpl *target; - BOOL OffScreenTarget; /* Viewport management */ IDirect3DViewportImpl *viewport_list; diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c index 30109e9971d..0056a405805 100644 --- a/dlls/ddraw/device.c +++ b/dlls/ddraw/device.c @@ -311,34 +311,10 @@ IDirect3DDeviceImpl_7_Release(IDirect3DDevice7 *iface) * IDirect3DVertexBuffer::Release will unset it. */ - /* Restore the render targets */ - if(This->OffScreenTarget) - { - WINED3DVIEWPORT vp; - - vp.X = 0; - vp.Y = 0; - vp.Width = This->ddraw->d3d_target->surface_desc.dwWidth; - vp.Height = This->ddraw->d3d_target->surface_desc.dwHeight; - vp.MinZ = 0.0; - vp.MaxZ = 1.0; - IWineD3DDevice_SetViewport(This->wineD3DDevice, - &vp); - - /* Set the device up to render to the front buffer since the back buffer will - * vanish soon. - */ - IWineD3DDevice_SetRenderTarget(This->wineD3DDevice, 0, - This->ddraw->d3d_target->WineD3DSurface, - FALSE); - /* This->target is the offscreen target. - * This->ddraw->d3d_target is the target used by DDraw - */ - TRACE("(%p) Release: Using %p as front buffer, %p as back buffer\n", This, This->ddraw->d3d_target, NULL); - IWineD3DDevice_SetFrontBackBuffers(This->wineD3DDevice, - This->ddraw->d3d_target->WineD3DSurface, - NULL); - } + /* Set the device up to render to the front buffer since the back + * buffer will vanish soon. */ + IWineD3DDevice_SetRenderTarget(This->wineD3DDevice, 0, + This->ddraw->d3d_target->WineD3DSurface, TRUE); /* Release the WineD3DDevice. This won't destroy it */ if(IWineD3DDevice_Release(This->wineD3DDevice) <= 0) @@ -7024,46 +7000,14 @@ HRESULT d3d_device_init(IDirect3DDeviceImpl *device, IDirectDrawImpl *ddraw, IDi device->wineD3DDevice = ddraw->wineD3DDevice; IWineD3DDevice_AddRef(ddraw->wineD3DDevice); - /* This is for apps which create a non-flip, non-d3d primary surface - * and an offscreen D3DDEVICE surface, then render to the offscreen surface - * and do a Blt from the offscreen to the primary surface. - * - * Set the offscreen D3DDDEVICE surface(=target) as the back buffer, - * and the primary surface(=This->d3d_target) as the front buffer. - * - * This way the app will render to the D3DDEVICE surface and WineD3D - * will catch the Blt was Back Buffer -> Front buffer blt and perform - * a flip instead. This way we don't have to deal with a mixed GL / GDI - * environment. - * - * This should be checked against windowed apps. The only app tested with - * this is moto racer 2 during the loading screen. - */ - TRACE("Is rendertarget: %s, d3d_target %p.\n", - target->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE ? "true" : "false", ddraw->d3d_target); - - if (!(target->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) - && ddraw->d3d_target != target) + /* Render to the back buffer */ + hr = IWineD3DDevice_SetRenderTarget(ddraw->wineD3DDevice, 0, target->WineD3DSurface, TRUE); + if (FAILED(hr)) { - TRACE("Using %p as front buffer, %p as back buffer.\n", ddraw->d3d_target, target); - - hr = IWineD3DDevice_SetFrontBackBuffers(ddraw->wineD3DDevice, - ddraw->d3d_target->WineD3DSurface, target->WineD3DSurface); - if (FAILED(hr)) - { - ERR("Failed to set front and back buffer, hr %#x.\n", hr); - IParent_Release((IParent *)index_buffer_parent); - ddraw_handle_table_destroy(&device->handle_table); - return hr; - } - - /* Render to the back buffer */ - IWineD3DDevice_SetRenderTarget(ddraw->wineD3DDevice, 0, target->WineD3DSurface, TRUE); - device->OffScreenTarget = TRUE; - } - else - { - device->OffScreenTarget = FALSE; + ERR("Failed to set render target, hr %#x.\n", hr); + IParent_Release((IParent *)index_buffer_parent); + ddraw_handle_table_destroy(&device->handle_table); + return hr; } /* FIXME: This is broken. The target AddRef() makes some sense, because diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index ea4f69e9d82..1e42409d1ac 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -5636,91 +5636,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetRenderTarget(IWineD3DDevice *iface, return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_SetFrontBackBuffers(IWineD3DDevice *iface, - IWineD3DSurface *front, IWineD3DSurface *back) -{ - IWineD3DSurfaceImpl *front_impl = (IWineD3DSurfaceImpl *)front; - IWineD3DSurfaceImpl *back_impl = (IWineD3DSurfaceImpl *)back; - IWineD3DSwapChainImpl *swapchain; - HRESULT hr; - - TRACE("iface %p, front %p, back %p.\n", iface, front, back); - - if (FAILED(hr = IWineD3DDevice_GetSwapChain(iface, 0, (IWineD3DSwapChain **)&swapchain))) - { - ERR("Failed to get the swapchain, hr %#x.\n", hr); - return hr; - } - - if (front_impl && !(front_impl->resource.usage & WINED3DUSAGE_RENDERTARGET)) - { - ERR("Trying to set a front buffer which doesn't have WINED3DUSAGE_RENDERTARGET usage.\n"); - IWineD3DSwapChain_Release((IWineD3DSwapChain *)swapchain); - return WINED3DERR_INVALIDCALL; - } - - if (back_impl) - { - if (!(back_impl->resource.usage & WINED3DUSAGE_RENDERTARGET)) - { - ERR("Trying to set a back buffer which doesn't have WINED3DUSAGE_RENDERTARGET usage.\n"); - IWineD3DSwapChain_Release((IWineD3DSwapChain *)swapchain); - return WINED3DERR_INVALIDCALL; - } - - if (!swapchain->back_buffers) - { - swapchain->back_buffers = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*swapchain->back_buffers)); - if (!swapchain->back_buffers) - { - ERR("Failed to allocate back buffer array memory.\n"); - IWineD3DSwapChain_Release((IWineD3DSwapChain *)swapchain); - return E_OUTOFMEMORY; - } - } - } - - if (swapchain->front_buffer != front_impl) - { - TRACE("Changing the front buffer from %p to %p.\n", swapchain->front_buffer, front_impl); - - if (swapchain->front_buffer) - surface_set_container(swapchain->front_buffer, WINED3D_CONTAINER_NONE, NULL); - swapchain->front_buffer = front_impl; - - if (front_impl) - surface_set_container(front_impl, WINED3D_CONTAINER_SWAPCHAIN, (IWineD3DBase *)swapchain); - } - - if (swapchain->back_buffers[0] != back_impl) - { - TRACE("Changing the back buffer from %p to %p.\n", swapchain->back_buffers[0], back_impl); - - if (swapchain->back_buffers[0]) - surface_set_container(swapchain->back_buffers[0], WINED3D_CONTAINER_NONE, NULL); - swapchain->back_buffers[0] = back_impl; - - if (back_impl) - { - swapchain->presentParms.BackBufferWidth = back_impl->currentDesc.Width; - swapchain->presentParms.BackBufferHeight = back_impl->currentDesc.Height; - swapchain->presentParms.BackBufferFormat = back_impl->resource.format->id; - swapchain->presentParms.BackBufferCount = 1; - - surface_set_container(back_impl, WINED3D_CONTAINER_SWAPCHAIN, (IWineD3DBase *)swapchain); - } - else - { - swapchain->presentParms.BackBufferCount = 0; - HeapFree(GetProcessHeap(), 0, swapchain->back_buffers); - swapchain->back_buffers = NULL; - } - } - - IWineD3DSwapChain_Release((IWineD3DSwapChain *)swapchain); - return WINED3D_OK; -} - static HRESULT WINAPI IWineD3DDeviceImpl_GetDepthStencilSurface(IWineD3DDevice *iface, IWineD3DSurface **depth_stencil) { IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)iface; @@ -6803,7 +6718,6 @@ static const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl = IWineD3DDeviceImpl_GetRenderState, IWineD3DDeviceImpl_SetRenderTarget, IWineD3DDeviceImpl_GetRenderTarget, - IWineD3DDeviceImpl_SetFrontBackBuffers, IWineD3DDeviceImpl_SetSamplerState, IWineD3DDeviceImpl_GetSamplerState, IWineD3DDeviceImpl_SetScissorRect, diff --git a/include/wine/wined3d.idl b/include/wine/wined3d.idl index 548a08ab2cd..d990f707dfe 100644 --- a/include/wine/wined3d.idl +++ b/include/wine/wined3d.idl @@ -3137,10 +3137,6 @@ interface IWineD3DDevice : IUnknown [in] DWORD render_target_idx, [out] IWineD3DSurface **render_target ); - HRESULT SetFrontBackBuffers( - [in] IWineD3DSurface *front, - [in] IWineD3DSurface *back - ); HRESULT SetSamplerState( [in] DWORD sampler_idx, [in] WINED3DSAMPLERSTATETYPE state,