Stefan Dösinger : wined3d: More efficient color keying dirtifying.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Jul 26 09:00:50 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 3b10a021db902bdacea78afec656be5e37401a9d
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=3b10a021db902bdacea78afec656be5e37401a9d

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Tue Jul 25 16:41:41 2006 +0200

wined3d: More efficient color keying dirtifying.

Instead of blindly dirtifying the surface LoadTexture keeps track of
the color key that was used when creating the opengl texture and
reloads the surface if the color key has changed.

---

 dlls/wined3d/surface.c         |   58 ++++++++++++++--------------------------
 dlls/wined3d/wined3d_private.h |    2 +
 2 files changed, 23 insertions(+), 37 deletions(-)

diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index df35fc6..8a5a8a8 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -1402,9 +1402,9 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceI
                 *type = GL_UNSIGNED_BYTE;
                 *target_bpp = 4;
                 if(colorkey_active) {
-                    *convert = CONVERT_PALETTED;
-                } else {
                     *convert = CONVERT_PALETTED_CK;
+                } else {
+                    *convert = CONVERT_PALETTED;
                 }
             }
 
@@ -1632,7 +1632,18 @@ static HRESULT WINAPI IWineD3DSurfaceImp
         TRACE("Surface already in texture\n");
         return WINED3D_OK;
     }
-    if (!(This->Flags & SFLAG_DIRTY)) {
+    if (This->Flags & SFLAG_DIRTY) {
+        TRACE("Reloading because surface is dirty\n");
+    } else if(/* Reload: gl texture has ck, now no ckey is set OR */
+              (This->Flags & SFLAG_GLCKEY && !(This->CKeyFlags & DDSD_CKSRCBLT)) ||
+              /* Reload: vice versa  OR */
+              (!(This->Flags & SFLAG_GLCKEY) && !This->CKeyFlags & DDSD_CKSRCBLT) ||
+              /* Also reload: Color key is active AND the color key has changed */
+              (This->CKeyFlags & DDSD_CKSRCBLT) && (
+                This->glCKey.dwColorSpaceLowValue != This->SrcBltCKey.dwColorSpaceLowValue ||
+                This->glCKey.dwColorSpaceHighValue != This->SrcBltCKey.dwColorSpaceHighValue)) {
+        TRACE("Reloading because of color keying\n");
+    } else {
         TRACE("surface isn't dirty\n");
         return WINED3D_OK;
     }
@@ -1731,6 +1742,11 @@ static HRESULT WINAPI IWineD3DSurfaceImp
         int bpp;
         BYTE *mem;
 
+        if(This->CKeyFlags & DDSD_CKSRCBLT) { 
+            This->Flags |= SFLAG_GLCKEY;
+            This->glCKey = This->SrcBltCKey;
+        }
+        else This->Flags &= ~SFLAG_GLCKEY;
         d3dfmt_get_conv(This, TRUE /* We need color keying */, &format, &internal, &type, &convert, &bpp);
 
         if((convert != NO_CONVERSION) &&
@@ -2323,11 +2339,10 @@ static HRESULT IWineD3DSurfaceImpl_BltOv
             oldCKey = Src->CKeyFlags;
             if(!(Flags & DDBLT_KEYSRC) && 
                Src->CKeyFlags & DDSD_CKSRCBLT) {
-                /* Ok, the surface has a color key, but we shall not use it - 
-                 * Deactivate it for now and dirtify the surface to reload it
+                /* Ok, the surface has a color key, but we shall not use it -
+                 * Deactivate it for now, LoadTexture will catch this
                  */
                 Src->CKeyFlags &= ~DDSD_CKSRCBLT;
-                Src->Flags |= SFLAG_DIRTY;
             }
 
             /* Now load the surface */
@@ -2494,7 +2509,6 @@ static HRESULT IWineD3DSurfaceImpl_BltOv
             /* Restore the color key */
             if(oldCKey != Src->CKeyFlags) {
                 Src->CKeyFlags = oldCKey;
-                Src->Flags |= SFLAG_DIRTY;
             }
 
             LEAVE_GL();
@@ -2847,7 +2861,6 @@ HRESULT WINAPI IWineD3DSurfaceImpl_SetPa
 
 HRESULT WINAPI IWineD3DSurfaceImpl_SetColorKey(IWineD3DSurface *iface, DWORD Flags, DDCOLORKEY *CKey) {
     IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
-    BOOL dirtify = FALSE;
     TRACE("(%p)->(%08lx,%p)\n", This, Flags, CKey);
 
     if ((Flags & DDCKEY_COLORSPACE) != 0) {
@@ -2859,41 +2872,21 @@ HRESULT WINAPI IWineD3DSurfaceImpl_SetCo
     if(CKey) {
         switch (Flags & ~DDCKEY_COLORSPACE) {
             case DDCKEY_DESTBLT:
-                if(!(This->CKeyFlags & DDSD_CKDESTBLT)) {
-                    dirtify = TRUE;
-                } else {
-                    dirtify = memcmp(&This->DestBltCKey, CKey, sizeof(*CKey) ) != 0;
-                }
                 This->DestBltCKey = *CKey;
                 This->CKeyFlags |= DDSD_CKDESTBLT;
                 break;
 
             case DDCKEY_DESTOVERLAY:
-                if(!(This->CKeyFlags & DDSD_CKDESTOVERLAY)) {
-                    dirtify = TRUE;
-                } else {
-                    dirtify = memcmp(&This->DestOverlayCKey, CKey, sizeof(*CKey)) != 0;
-                }
                 This->DestOverlayCKey = *CKey;
                 This->CKeyFlags |= DDSD_CKDESTOVERLAY;
                 break;
 
             case DDCKEY_SRCOVERLAY:
-                if(!(This->CKeyFlags & DDSD_CKSRCOVERLAY)) {
-                    dirtify = TRUE;
-                } else {
-                    dirtify = memcmp(&This->SrcOverlayCKey, CKey, sizeof(*CKey)) != 0;
-                }
                 This->SrcOverlayCKey = *CKey;
                 This->CKeyFlags |= DDSD_CKSRCOVERLAY;
                 break;
 
             case DDCKEY_SRCBLT:
-                if(!(This->CKeyFlags & DDSD_CKSRCBLT)) {
-                    dirtify = TRUE;
-                } else {
-                    dirtify = memcmp(&This->SrcBltCKey, CKey, sizeof(*CKey)) != 0;
-                }
                 This->SrcBltCKey = *CKey;
                 This->CKeyFlags |= DDSD_CKSRCBLT;
                 break;
@@ -2902,32 +2895,23 @@ HRESULT WINAPI IWineD3DSurfaceImpl_SetCo
     else {
         switch (Flags & ~DDCKEY_COLORSPACE) {
             case DDCKEY_DESTBLT:
-                dirtify = This->CKeyFlags & DDSD_CKDESTBLT;
                 This->CKeyFlags &= ~DDSD_CKDESTBLT;
                 break;
 
             case DDCKEY_DESTOVERLAY:
-                dirtify = This->CKeyFlags & DDSD_CKDESTOVERLAY;
                 This->CKeyFlags &= ~DDSD_CKDESTOVERLAY;
                 break;
 
             case DDCKEY_SRCOVERLAY:
-                dirtify = This->CKeyFlags & DDSD_CKSRCOVERLAY;
                 This->CKeyFlags &= ~DDSD_CKSRCOVERLAY;
                 break;
 
             case DDCKEY_SRCBLT:
-                dirtify = This->CKeyFlags & DDSD_CKSRCBLT;
                 This->CKeyFlags &= ~DDSD_CKSRCBLT;
                 break;
         }
     }
 
-    if(dirtify) {
-        TRACE("Color key changed, dirtifying surface\n");
-        This->Flags |= SFLAG_DIRTY;
-    }
-
     return WINED3D_OK;
 }
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index d0fb485..f4ae19d 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -885,6 +885,7 @@ #endif
     DDCOLORKEY                SrcBltCKey;
     DWORD                     CKeyFlags;
 
+    DDCOLORKEY                glCKey;
 };
 
 extern const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl;
@@ -950,6 +951,7 @@ #define SFLAG_GLDIRTY     0x00004000 /* 
 #define SFLAG_LOST        0x00008000 /* Surface lost flag for DDraw */
 #define SFLAG_FORCELOAD   0x00010000 /* To force PreLoading of a scratch cursor */
 #define SFLAG_USERPTR     0x00020000 /* The application allocated the memory for this surface */
+#define SFLAG_GLCKEY      0x00040000 /* The gl texture was created with a color key */
 
 /* In some conditions the surface memory must not be freed:
  * SFLAG_OVERSIZE: Not all data can be kept in GL




More information about the wine-cvs mailing list