Module: wine Branch: master Commit: 03389acc304e55f19bf5e5ddb7f340c3ad7582ed URL: http://source.winehq.org/git/wine.git/?a=commit;h=03389acc304e55f19bf5e5ddb7...
Author: Stefan Dösinger stefan@codeweavers.com Date: Fri Jan 12 18:57:26 2007 +0100
wined3d: Do not free regularily locked surfaces.
---
dlls/wined3d/surface.c | 13 +++++++++++++ dlls/wined3d/wined3d_private.h | 2 ++ 2 files changed, 15 insertions(+), 0 deletions(-)
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index de263b9..ca9900a 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -824,6 +824,19 @@ static HRESULT WINAPI IWineD3DSurfaceImp } }
+ /* Performance optimization: Count how often a surface is locked, if it is locked regularly do not throw away the system memory copy. + * This avoids the need to download the surface from opengl all the time. The surface is still downloaded if the opengl texture is + * changed + */ + if(!(This->Flags & SFLAG_DYNLOCK)) { + This->lockCount++; + /* MAXLOCKCOUNT is defined in wined3d_private.h */ + if(This->lockCount > MAXLOCKCOUNT) { + TRACE("Surface is locked regularily, not freeing the system memory copy any more\n"); + This->Flags |= SFLAG_DYNLOCK; + } + } + TRACE("returning memory@%p, pitch(%d) dirtyfied(%d)\n", pLockedRect->pBits, pLockedRect->Pitch, This->Flags & SFLAG_DIRTY ? 0 : 1);
This->Flags |= SFLAG_LOCKED; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 5fe7c71..6d99657 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -984,6 +984,8 @@ struct IWineD3DSurfaceImpl
RECT lockedRect; RECT dirtyRect; + int lockCount; +#define MAXLOCKCOUNT 50 /* After this amount of locks do not free the sysmem copy */
glDescriptor glDescription;