From cb8dd231919119a68c36243ffb6af474553ea8ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20D=C3=B6singer?= Date: Tue, 20 Oct 2009 14:13:26 +0200 Subject: [PATCH 01/10] WineD3D: Add a usage flag for vertex buffer optimization --- dlls/d3d8/device.c | 2 +- dlls/d3d9/device.c | 2 +- dlls/ddraw/device.c | 6 ++++-- dlls/ddraw/direct3d.c | 14 ++------------ dlls/wined3d/device.c | 6 +++--- include/wine/wined3d.idl | 3 ++- 6 files changed, 13 insertions(+), 20 deletions(-) diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c index d0504ed..e6c1f5b 100644 --- a/dlls/d3d8/device.c +++ b/dlls/d3d8/device.c @@ -1005,7 +1005,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_SetRenderTarget(LPDIRECT3DDEVICE8 ifa { hr = IWineD3DDevice_SetDepthStencilSurface(This->WineD3DDevice, pZSurface ? pZSurface->wineD3DSurface : NULL); if (SUCCEEDED(hr) && pSurface) - hr = IWineD3DDevice_SetRenderTarget(This->WineD3DDevice, 0, pSurface->wineD3DSurface); + hr = IWineD3DDevice_SetRenderTarget(This->WineD3DDevice, 0, pSurface->wineD3DSurface, TRUE); if (FAILED(hr)) IWineD3DDevice_SetDepthStencilSurface(This->WineD3DDevice, original_ds); } if (original_ds) IWineD3DSurface_Release(original_ds); diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index 5aacbc8..bb63270 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -1042,7 +1042,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_SetRenderTarget(LPDIRECT3DDEVICE9EX } wined3d_mutex_lock(); - hr = IWineD3DDevice_SetRenderTarget(This->WineD3DDevice, RenderTargetIndex, pSurface ? pSurface->wineD3DSurface : NULL); + hr = IWineD3DDevice_SetRenderTarget(This->WineD3DDevice, RenderTargetIndex, pSurface ? pSurface->wineD3DSurface : NULL, TRUE); wined3d_mutex_unlock(); return hr; diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c index 1883a5d..68b149e 100644 --- a/dlls/ddraw/device.c +++ b/dlls/ddraw/device.c @@ -348,7 +348,8 @@ IDirect3DDeviceImpl_7_Release(IDirect3DDevice7 *iface) * vanish soon. */ IWineD3DDevice_SetRenderTarget(This->wineD3DDevice, 0, - This->ddraw->d3d_target->WineD3DSurface); + This->ddraw->d3d_target->WineD3DSurface, + FALSE); /* This->target is the offscreen target. * This->ddraw->d3d_target is the target used by DDraw */ @@ -1984,7 +1985,8 @@ IDirect3DDeviceImpl_7_SetRenderTarget(IDirect3DDevice7 *iface, hr = IWineD3DDevice_SetRenderTarget(This->wineD3DDevice, 0, - Target ? Target->WineD3DSurface : NULL); + Target ? Target->WineD3DSurface : NULL, + FALSE); if(hr != D3D_OK) { LeaveCriticalSection(&ddraw_cs); diff --git a/dlls/ddraw/direct3d.c b/dlls/ddraw/direct3d.c index 42884e5..798518a 100644 --- a/dlls/ddraw/direct3d.c +++ b/dlls/ddraw/direct3d.c @@ -865,7 +865,6 @@ 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, @@ -875,17 +874,8 @@ IDirect3DImpl_7_CreateDevice(IDirect3D7 *iface, /* Render to the back buffer */ 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); - + target->WineD3DSurface, + TRUE); object->OffScreenTarget = TRUE; } else diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index a1b8944..f212a9d 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -6184,9 +6184,9 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED context_release(context); } -static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderTarget(IWineD3DDevice *iface, DWORD RenderTargetIndex, IWineD3DSurface *pRenderTarget) { +static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderTarget(IWineD3DDevice *iface, DWORD RenderTargetIndex, IWineD3DSurface *pRenderTarget, + BOOL set_viewport) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - int dxVersion = ( (IWineD3DImpl *) This->wineD3D)->dxVersion; TRACE("(%p) : Setting rendertarget %d to %p\n", This, RenderTargetIndex, pRenderTarget); @@ -6220,7 +6220,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderTarget(IWineD3DDevice *iface, This->render_targets[RenderTargetIndex] = pRenderTarget; /* Render target 0 is special */ - if(RenderTargetIndex == 0 && dxVersion > 7) { + if(RenderTargetIndex == 0 && set_viewport) { /* Finally, reset the viewport and scissor rect as the MSDN states. * Tests show that stateblock recording is ignored, the change goes * directly into the primary stateblock. diff --git a/include/wine/wined3d.idl b/include/wine/wined3d.idl index b690b39..25a4870 100644 --- a/include/wine/wined3d.idl +++ b/include/wine/wined3d.idl @@ -3205,7 +3205,8 @@ interface IWineD3DDevice : IWineD3DBase ); HRESULT SetRenderTarget( [in] DWORD render_target_idx, - [in] IWineD3DSurface *render_target + [in] IWineD3DSurface *render_target, + [in] BOOL set_viewport ); HRESULT GetRenderTarget( [in] DWORD render_target_idx, -- 1.6.4.4