Alexander Dorofeyev : ddraw: Improve IDirect3DDevice7_Load implementation.

Alexandre Julliard julliard at winehq.org
Tue Jul 22 09:35:56 CDT 2008


Module: wine
Branch: master
Commit: e2ff077697ce0f7eb9b60e88895349effa4e979b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e2ff077697ce0f7eb9b60e88895349effa4e979b

Author: Alexander Dorofeyev <alexd4 at inbox.lv>
Date:   Sun Jul 20 23:28:44 2008 +0300

ddraw: Improve IDirect3DDevice7_Load implementation.

Copies palette and colorkey earlier in the helper function, before
copying image, also skips UpdateSurface when palette is missing. This
prevents unnecessary surface (re)loads in wined3d, and gets rid of
some wined3d palette error messages in Sacrifice.

---

 dlls/ddraw/device.c |   69 +++++++++++++++++++++++++++++---------------------
 1 files changed, 40 insertions(+), 29 deletions(-)

diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c
index 15bb6ca..6a3ecfc 100644
--- a/dlls/ddraw/device.c
+++ b/dlls/ddraw/device.c
@@ -6244,6 +6244,39 @@ static void copy_mipmap_chain(IDirect3DDeviceImpl *device,
     IDirectDrawPalette *pal = NULL, *pal_src = NULL;
     DWORD ckeyflag;
     DDCOLORKEY ddckey;
+    BOOL palette_missing = FALSE;
+
+    /* Copy palette, if possible. */
+    IDirectDrawSurface7_GetPalette(ICOM_INTERFACE(src, IDirectDrawSurface7), &pal_src);
+    IDirectDrawSurface7_GetPalette(ICOM_INTERFACE(dest, IDirectDrawSurface7), &pal);
+
+    if (pal_src != NULL && pal != NULL)
+    {
+        PALETTEENTRY palent[256];
+
+        IDirectDrawPalette_GetEntries(pal_src, 0, 0, 256, palent);
+        IDirectDrawPalette_SetEntries(pal, 0, 0, 256, palent);
+    }
+
+    if (dest->surface_desc.u4.ddpfPixelFormat.dwFlags & (DDPF_PALETTEINDEXED1 | DDPF_PALETTEINDEXED2 |
+            DDPF_PALETTEINDEXED4 | DDPF_PALETTEINDEXED8 | DDPF_PALETTEINDEXEDTO8) && !pal)
+    {
+        palette_missing = TRUE;
+    }
+
+    if (pal) IDirectDrawPalette_Release(pal);
+    if (pal_src) IDirectDrawPalette_Release(pal_src);
+
+    /* Copy colorkeys, if present. */
+    for (ckeyflag = DDCKEY_DESTBLT; ckeyflag <= DDCKEY_SRCOVERLAY; ckeyflag <<= 1)
+    {
+        hr = IDirectDrawSurface7_GetColorKey(ICOM_INTERFACE(src, IDirectDrawSurface7), ckeyflag, &ddckey);
+
+        if (SUCCEEDED(hr))
+        {
+            IDirectDrawSurface7_SetColorKey(ICOM_INTERFACE(dest, IDirectDrawSurface7), ckeyflag, &ddckey);
+        }
+    }
 
     src_level = src;
     dest_level = dest;
@@ -6256,10 +6289,14 @@ static void copy_mipmap_chain(IDirect3DDeviceImpl *device,
         if (src_level->surface_desc.dwWidth == dest_level->surface_desc.dwWidth &&
             src_level->surface_desc.dwHeight == dest_level->surface_desc.dwHeight)
         {
-            /* Try UpdateSurface that may perform a more direct opengl loading. */
-            hr = IWineD3DDevice_UpdateSurface(device->wineD3DDevice, src_level->WineD3DSurface, &rect, dest_level->WineD3DSurface,
+            /* Try UpdateSurface that may perform a more direct opengl loading. But skip this is destination is paletted texture and has no palette.
+             * Some games like Sacrifice set palette after Load, and it is a waste of effort to try to load texture without palette and generates
+             * warnings in wined3d. */
+	    if (!palette_missing)
+                hr = IWineD3DDevice_UpdateSurface(device->wineD3DDevice, src_level->WineD3DSurface, &rect, dest_level->WineD3DSurface,
                                 &point);
-            if (FAILED(hr))
+
+            if (palette_missing || FAILED(hr))
             {
                 /* UpdateSurface may fail e.g. if dest is in system memory. Fall back to BltFast that is less strict. */
                 IWineD3DSurface_BltFast(dest_level->WineD3DSurface,
@@ -6295,32 +6332,6 @@ static void copy_mipmap_chain(IDirect3DDeviceImpl *device,
 
     if (src_level && src_level != src) IDirectDrawSurface7_Release(ICOM_INTERFACE(src_level, IDirectDrawSurface7));
     if (dest_level && dest_level != dest) IDirectDrawSurface7_Release(ICOM_INTERFACE(dest_level, IDirectDrawSurface7));
-
-    /* Copy palette, if possible. */
-    IDirectDrawSurface7_GetPalette(ICOM_INTERFACE(src, IDirectDrawSurface7), &pal_src);
-    IDirectDrawSurface7_GetPalette(ICOM_INTERFACE(dest, IDirectDrawSurface7), &pal);
-
-    if (pal_src != NULL && pal != NULL)
-    {
-        PALETTEENTRY palent[256];
-
-        IDirectDrawPalette_GetEntries(pal_src, 0, 0, 256, palent);
-        IDirectDrawPalette_SetEntries(pal, 0, 0, 256, palent);
-    }
-
-    if (pal) IDirectDrawPalette_Release(pal);
-    if (pal_src) IDirectDrawPalette_Release(pal_src);
-
-    /* Copy colorkeys, if present. */
-    for (ckeyflag = DDCKEY_DESTBLT; ckeyflag <= DDCKEY_SRCOVERLAY; ckeyflag <<= 1)
-    {
-        hr = IDirectDrawSurface7_GetColorKey(ICOM_INTERFACE(src, IDirectDrawSurface7), ckeyflag, &ddckey);
-
-        if (SUCCEEDED(hr))
-        {
-            IDirectDrawSurface7_SetColorKey(ICOM_INTERFACE(dest, IDirectDrawSurface7), ckeyflag, &ddckey);
-        }
-    }
 }
 
 /*****************************************************************************




More information about the wine-cvs mailing list