Stefan Dösinger : wined3d: Do not free regularily locked surfaces.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Jan 15 07:43:06 CST 2007
Module: wine
Branch: master
Commit: 03389acc304e55f19bf5e5ddb7f340c3ad7582ed
URL: http://source.winehq.org/git/wine.git/?a=commit;h=03389acc304e55f19bf5e5ddb7f340c3ad7582ed
Author: Stefan Dösinger <stefan at 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;
More information about the wine-cvs
mailing list