diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index de263b9e6eb..ca9900a9f5c 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -824,6 +824,19 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED } } + /* 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 5fe7c719029..6d9965753b3 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;