Module: wine Branch: master Commit: 390921577350dd8cd5d6d6fba6d38055588330d2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=390921577350dd8cd5d6d6fba6...
Author: Stefan Dösinger stefan@codeweavers.com Date: Tue Jun 3 09:41:39 2014 +0200
wined3d: Remove d3dfmt_p8_init_palette.
---
dlls/wined3d/arb_program_shader.c | 18 ++++++--- dlls/wined3d/surface.c | 81 ++++++++++++++----------------------- dlls/wined3d/wined3d_private.h | 2 - 3 files changed, 44 insertions(+), 57 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index 5d23eed..fa15b1e 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -7280,12 +7280,10 @@ static GLuint gen_p8_shader(struct arbfp_blit_priv *priv, /* Context activation is done by the caller. */ static void upload_palette(const struct wined3d_surface *surface, struct wined3d_context *context) { - BYTE table[256][4]; struct wined3d_device *device = surface->resource.device; const struct wined3d_gl_info *gl_info = context->gl_info; struct arbfp_blit_priv *priv = device->blit_priv; - - d3dfmt_p8_init_palette(surface, table); + const struct wined3d_palette *palette = surface->palette;
if (!priv->palette_texture) gl_info->gl_ops.gl.p_glGenTextures(1, &priv->palette_texture); @@ -7299,9 +7297,19 @@ static void upload_palette(const struct wined3d_surface *surface, struct wined3d /* Make sure we have discrete color levels. */ gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - /* Upload the palette */ /* TODO: avoid unneeded uploads in the future by adding some SFLAG_PALETTE_DIRTY mechanism */ - gl_info->gl_ops.gl.p_glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, table); + if (palette) + { + gl_info->gl_ops.gl.p_glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 256, 0, GL_BGRA, + GL_UNSIGNED_INT_8_8_8_8_REV, palette->colors); + } + else + { + static const DWORD black; + FIXME("P8 surface loaded without a palette.\n"); + gl_info->gl_ops.gl.p_glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 1, 0, GL_BGRA, + GL_UNSIGNED_INT_8_8_8_8_REV, &black); + }
/* Switch back to unit 0 in which the 2D texture will be stored. */ context_active_texture(context, gl_info, 0); diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index f198bf0..ce95631 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -3370,38 +3370,6 @@ static BOOL color_in_range(const struct wined3d_color_key *color_key, DWORD colo && color <= color_key->color_space_high_value; }
-void d3dfmt_p8_init_palette(const struct wined3d_surface *surface, BYTE table[256][4]) -{ - const struct wined3d_palette *pal = surface->palette; - unsigned int i; - - if (!pal) - { - FIXME("No palette set.\n"); - /* Guarantees that memory representation remains correct after sysmem<->texture transfers even if - * there's no palette at this time. */ - for (i = 0; i < 256; i++) - table[i][3] = i; - } - else - { - TRACE("Using surface palette %p\n", pal); - for (i = 0; i < 256; ++i) - { - table[i][0] = pal->colors[i].rgbRed; - table[i][1] = pal->colors[i].rgbGreen; - table[i][2] = pal->colors[i].rgbBlue; - /* The palette index is stored in the alpha component. In case of a - * readback we can then read GL_ALPHA. Color keying is handled in - * surface_blt_to_drawable() using a GL_ALPHA_TEST using GL_NOT_EQUAL. - * In case of a P8 surface the color key itself is passed to - * glAlphaFunc in other cases the alpha component of pixels that - * should be masked away is set to 0. */ - table[i][3] = i; - } - } -} - static HRESULT d3dfmt_convert_surface(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height, UINT outpitch, enum wined3d_conversion_type conversion_type, struct wined3d_surface *surface) { @@ -3420,27 +3388,40 @@ static HRESULT d3dfmt_convert_surface(const BYTE *src, BYTE *dst, UINT pitch, UI }
case WINED3D_CT_PALETTED: - { - BYTE table[256][4]; - unsigned int x, y; - - d3dfmt_p8_init_palette(surface, table); - - for (y = 0; y < height; y++) + if (surface->palette) { - source = src + pitch * y; - dest = dst + outpitch * y; - /* This is an 1 bpp format, using the width here is fine */ - for (x = 0; x < width; x++) { - BYTE color = *source++; - *dest++ = table[color][0]; - *dest++ = table[color][1]; - *dest++ = table[color][2]; - *dest++ = table[color][3]; + unsigned int x, y; + const struct wined3d_palette *palette = surface->palette; + for (y = 0; y < height; y++) + { + source = src + pitch * y; + dest = dst + outpitch * y; + for (x = 0; x < width; x++) + { + BYTE color = *source++; + *dest++ = palette->colors[color].rgbRed; + *dest++ = palette->colors[color].rgbGreen; + *dest++ = palette->colors[color].rgbBlue; + *dest++ = 0; + } } } - } - break; + else + { + /* This should probably use the system palette, but unless + * the X server is running in P8 mode there is no such thing. + * The probably best solution is to set the fixed 20 colors + * from the default windows palette and set the rest to black, + * white, or some ugly pink. For now use black for the entire + * palette. Don't use pink everywhere. Age of Empires 2 draws + * a front buffer filled with zeroes without a palette when + * starting and we don't want the screen to flash in an ugly + * color. */ + FIXME("P8 surface loaded without a palette.\n"); + memset(dst, 0, height * outpitch); + } + + break;
case WINED3D_CT_CK_565: { diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index b3cb884..b1c7089 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2350,8 +2350,6 @@ enum wined3d_conversion_type WINED3D_CT_CK_ARGB32, };
-void d3dfmt_p8_init_palette(const struct wined3d_surface *surface, BYTE table[256][4]) DECLSPEC_HIDDEN; - struct wined3d_sampler { LONG refcount;