Module: wine Branch: master Commit: ce2c3ea6c74f7c28f0ec55e097d582b68c080d19 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ce2c3ea6c74f7c28f0ec55e097...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Sun Jan 3 21:18:26 2010 +0100
wined3d: Handle source and destination rectangles in IWineD3DSwapChainImpl_Present().
---
dlls/wined3d/swapchain.c | 63 +++++++++++++++++++++++++++------------------- 1 files changed, 37 insertions(+), 26 deletions(-)
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c index c6b0b01..6493704 100644 --- a/dlls/wined3d/swapchain.c +++ b/dlls/wined3d/swapchain.c @@ -213,6 +213,7 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface; struct wined3d_context *context; RECT src_rect, dst_rect; + BOOL render_to_fbo; unsigned int sync; int retval;
@@ -271,8 +272,6 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO IWineD3DSurface_BltFast(This->backBuffer[0], 0, 0, This->device->logo_surface, NULL, WINEDDBLTFAST_SRCCOLORKEY); }
- if (pSourceRect || pDestRect) FIXME("Unhandled present rects %s/%s\n", wine_dbgstr_rect(pSourceRect), wine_dbgstr_rect(pDestRect)); - /* TODO: If only source rect or dest rect are supplied then clip the window to match */ TRACE("presetting HDC %p\n", This->context[0]->hdc);
/* Don't call checkGLcall, as glGetError is not applicable here */ @@ -280,6 +279,36 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO IWineD3DSwapChain_SetDestWindowOverride(iface, hDestWindowOverride); }
+ render_to_fbo = This->render_to_fbo; + + if (pSourceRect) + { + src_rect = *pSourceRect; + if (!render_to_fbo && (src_rect.left || src_rect.top + || src_rect.right != This->presentParms.BackBufferWidth + || src_rect.bottom != This->presentParms.BackBufferHeight)) + { + render_to_fbo = TRUE; + } + } + else + { + src_rect.left = 0; + src_rect.top = 0; + src_rect.right = This->presentParms.BackBufferWidth; + src_rect.bottom = This->presentParms.BackBufferHeight; + } + + if (pDestRect) dst_rect = *pDestRect; + else GetClientRect(This->win_handle, &dst_rect); + + if (!render_to_fbo && (dst_rect.left || dst_rect.top + || dst_rect.right != This->presentParms.BackBufferWidth + || dst_rect.bottom != This->presentParms.BackBufferHeight)) + { + render_to_fbo = TRUE; + } + /* Rendering to a window of different size, presenting partial rectangles, * or rendering to a different window needs help from FBO_blit or a textured * draw. Render the swapchain to a FBO in the future. @@ -287,25 +316,14 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO * Note that FBO_blit from the backbuffer to the frontbuffer cannot solve * all these issues - this fails if the window is smaller than the backbuffer. */ - if(This->presentParms.Windowed && !This->render_to_fbo && - wined3d_settings.offscreen_rendering_mode == ORM_FBO) + if (!This->render_to_fbo && render_to_fbo && wined3d_settings.offscreen_rendering_mode == ORM_FBO) { - RECT window_size; - GetClientRect(This->win_handle, &window_size); - if(window_size.bottom != This->presentParms.BackBufferHeight || - window_size.right != This->presentParms.BackBufferWidth) - { - TRACE("Window size changed from %ux%u to %ux%u, switching to render-to-fbo mode\n", - This->presentParms.BackBufferWidth, This->presentParms.BackBufferHeight, - window_size.right, window_size.bottom); - - IWineD3DSurface_LoadLocation(This->backBuffer[0], SFLAG_INTEXTURE, NULL); - IWineD3DSurface_ModifyLocation(This->backBuffer[0], SFLAG_INDRAWABLE, FALSE); - This->render_to_fbo = TRUE; + IWineD3DSurface_LoadLocation(This->backBuffer[0], SFLAG_INTEXTURE, NULL); + IWineD3DSurface_ModifyLocation(This->backBuffer[0], SFLAG_INDRAWABLE, FALSE); + This->render_to_fbo = TRUE;
- /* Force the context manager to update the render target configuration next draw */ - context->current_rt = NULL; - } + /* Force the context manager to update the render target configuration next draw. */ + context->current_rt = NULL; }
if(This->render_to_fbo) @@ -322,13 +340,6 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO FIXME("Render-to-fbo with WINED3DSWAPEFFECT_FLIP\n"); }
- src_rect.left = 0; - src_rect.top = 0; - src_rect.right = This->presentParms.BackBufferWidth; - src_rect.bottom = This->presentParms.BackBufferHeight; - - GetClientRect(This->win_handle, &dst_rect); - swapchain_blit(This, context, &src_rect, &dst_rect); }