Module: wine Branch: master Commit: 742260d418293e57afcb05e8c1fdc71ec4d99258 URL: http://source.winehq.org/git/wine.git/?a=commit;h=742260d418293e57afcb05e8c1...
Author: Stefan Dösinger stefan@codeweavers.com Date: Sat Apr 28 14:50:15 2007 +0200
ddraw: Adjust the d3d viewport when changing the back buffer.
WineD3D sets up the viewport according to the front buffer, so this needs to be changed to the values of the render target passed when the d3d7 device is created and this device turns out not to be the known front or back buffer.
---
dlls/ddraw/device.c | 11 +++++++++++ dlls/ddraw/direct3d.c | 10 ++++++++++ 2 files changed, 21 insertions(+), 0 deletions(-)
diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c index 30f80ad..42e44d8 100644 --- a/dlls/ddraw/device.c +++ b/dlls/ddraw/device.c @@ -306,6 +306,17 @@ IDirect3DDeviceImpl_7_Release(IDirect3DDevice7 *iface) /* 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. */ diff --git a/dlls/ddraw/direct3d.c b/dlls/ddraw/direct3d.c index 9f7e136..0ccb2c3 100644 --- a/dlls/ddraw/direct3d.c +++ b/dlls/ddraw/direct3d.c @@ -844,6 +844,7 @@ IDirect3DImpl_7_CreateDevice(IDirect3D7 *iface, if(!(target->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) && (This->d3d_target != target)) { + WINED3DVIEWPORT vp; TRACE("(%p) Using %p as front buffer, %p as back buffer\n", This, This->d3d_target, target); hr = IWineD3DDevice_SetFrontBackBuffers(This->wineD3DDevice, This->d3d_target->WineD3DSurface, @@ -855,6 +856,15 @@ IDirect3DImpl_7_CreateDevice(IDirect3D7 *iface, IWineD3DDevice_SetRenderTarget(This->wineD3DDevice, 0, target->WineD3DSurface);
+ vp.X = 0; + vp.Y = 0; + vp.Width = target->surface_desc.dwWidth; + vp.Height = target->surface_desc.dwHeight; + vp.MinZ = 0.0; + vp.MaxZ = 1.0; + IWineD3DDevice_SetViewport(This->wineD3DDevice, + &vp); + object->OffScreenTarget = TRUE; } else