Henri Verbeet : wined3d: Avoid loading the destination surface in stretch_rect_fbo() if it will be completely overwritten.
Alexandre Julliard
julliard at winehq.org
Fri Jul 23 10:05:45 CDT 2010
Module: wine
Branch: master
Commit: 2f028f034044c80e69f59b67ca1bc76e40119690
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2f028f034044c80e69f59b67ca1bc76e40119690
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Fri Jul 23 11:31:05 2010 +0200
wined3d: Avoid loading the destination surface in stretch_rect_fbo() if it will be completely overwritten.
---
dlls/wined3d/device.c | 19 +++++++++++++++----
1 files changed, 15 insertions(+), 4 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 17a4b83..df9e1d6 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -5743,6 +5743,15 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetDepthStencilSurface(IWineD3DDevice
}
}
+static BOOL surface_is_full_rect(IWineD3DSurfaceImpl *surface, const RECT *r)
+{
+ if ((r->left && r->right) || abs(r->right - r->left) != surface->currentDesc.Width)
+ return FALSE;
+ if ((r->top && r->bottom) || abs(r->bottom - r->top) != surface->currentDesc.Height)
+ return FALSE;
+ return TRUE;
+}
+
void stretch_rect_fbo(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *src_surface, const RECT *src_rect_in,
IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect_in, const WINED3DTEXTUREFILTERTYPE filter)
{
@@ -5772,11 +5781,13 @@ void stretch_rect_fbo(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *src_surfa
break;
}
- /* Make sure the drawables are up-to-date. Note that loading the
- * destination surface isn't strictly required if we overwrite the
- * entire surface. */
+ /* Make sure the drawables are up-to-date. Loading the destination
+ * surface isn't required if the entire surface is overwritten. (And is
+ * in fact harmful if we're being called by surface_load_location() with
+ * the purpose of loading the destination surface.) */
surface_load_location(src_surface, SFLAG_INDRAWABLE, NULL);
- surface_load_location(dst_surface, SFLAG_INDRAWABLE, NULL);
+ if (!surface_is_full_rect(dst_surface, &dst_rect))
+ surface_load_location(dst_surface, SFLAG_INDRAWABLE, NULL);
if (!surface_is_offscreen(src_surface)) context = context_acquire(device, src_surface);
else if (!surface_is_offscreen(dst_surface)) context = context_acquire(device, dst_surface);
More information about the wine-cvs
mailing list