[PATCH 5/5] wined3d: Maintain a list of textures a palette is attached to.

Stefan Dösinger stefan at codeweavers.com
Thu Apr 24 05:10:15 CDT 2014


---
 dlls/wined3d/palette.c         | 17 ++++-------------
 dlls/wined3d/texture.c         |  7 +++++++
 dlls/wined3d/wined3d_private.h |  3 +++
 3 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/dlls/wined3d/palette.c b/dlls/wined3d/palette.c
index 28fc650..24656cf 100644
--- a/dlls/wined3d/palette.c
+++ b/dlls/wined3d/palette.c
@@ -81,7 +81,7 @@ HRESULT CDECL wined3d_palette_get_entries(const struct wined3d_palette *palette,
 HRESULT CDECL wined3d_palette_set_entries(struct wined3d_palette *palette,
         DWORD flags, DWORD start, DWORD count, const PALETTEENTRY *entries)
 {
-    struct wined3d_resource *resource;
+    struct wined3d_texture *texture;
 
     TRACE("palette %p, flags %#x, start %u, count %u, entries %p.\n",
             palette, flags, start, count, entries);
@@ -116,18 +116,8 @@ HRESULT CDECL wined3d_palette_set_entries(struct wined3d_palette *palette,
             SetPaletteEntries(palette->hpal, start, count, palette->palents + start);
     }
 
-    /* If the palette is attached to the render target, update all render targets */
-    LIST_FOR_EACH_ENTRY(resource, &palette->device->resources, struct wined3d_resource, resource_list_entry)
-    {
-        enum wined3d_resource_type type = resource->type;
-        if (type == WINED3D_RTYPE_TEXTURE || type == WINED3D_RTYPE_CUBE_TEXTURE
-                || type == WINED3D_RTYPE_VOLUME_TEXTURE)
-        {
-            struct wined3d_texture *texture = wined3d_texture_from_resource(resource);
-            if (texture->palette == palette)
-                wined3d_texture_realize_palette(texture);
-        }
-    }
+    LIST_FOR_EACH_ENTRY(texture, &palette->texture_list, struct wined3d_texture, entry)
+        wined3d_texture_realize_palette(texture);
 
     return WINED3D_OK;
 }
@@ -140,6 +130,7 @@ static HRESULT wined3d_palette_init(struct wined3d_palette *palette, struct wine
     palette->ref = 1;
     palette->device = device;
     palette->flags = flags;
+    list_init(&palette->texture_list);
 
     palette->palNumEntries = entry_count;
     palette->hpal = CreatePalette((const LOGPALETTE *)&palette->palVersion);
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index b9e571e..7e8f819 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -134,6 +134,8 @@ static void wined3d_texture_cleanup(struct wined3d_texture *texture)
 
     wined3d_texture_unload_gl_texture(texture);
     HeapFree(GetProcessHeap(), 0, texture->sub_resources);
+    if (texture->palette)
+        list_remove(&texture->entry);
     resource_cleanup(&texture->resource);
 }
 
@@ -703,9 +705,14 @@ void CDECL wined3d_texture_set_palette(struct wined3d_texture *texture,
         return;
     }
 
+    if (texture->palette)
+        list_remove(&texture->entry);
     texture->palette = palette;
     if (palette)
+    {
         wined3d_texture_realize_palette(texture);
+        list_add_head(&palette->texture_list, &texture->entry);
+    }
 }
 
 void CDECL wined3d_texture_generate_mipmaps(struct wined3d_texture *texture)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 25b9ac4..a1dd944 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2117,6 +2117,7 @@ struct wined3d_texture
     DWORD color_key_flags;
 
     struct wined3d_palette *palette;
+    struct list entry;
 };
 
 static inline struct wined3d_texture *wined3d_texture_from_resource(struct wined3d_resource *resource)
@@ -2965,6 +2966,8 @@ struct wined3d_palette
     WORD                       palNumEntries;  /*|  LOGPALETTE   */
     PALETTEENTRY               palents[256];   /*|               */
     DWORD flags;
+
+    struct list                texture_list;
 };
 
 /* DirectDraw utility functions */
-- 
1.8.3.2




More information about the wine-patches mailing list