[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