wined3d: Move EXT_PALETTED_TEXTURE code over to ffp_blit.
This commit is contained in:
parent
3b6aea5934
commit
69902ab6d0
|
@ -2857,29 +2857,6 @@ static HRESULT d3dfmt_convert_surface(const BYTE *src, BYTE *dst, UINT pitch, UI
|
||||||
return WINED3D_OK;
|
return WINED3D_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This function is used in case of 8bit paletted textures to upload the palette.
|
|
||||||
It supports GL_EXT_paletted_texture and GL_ARB_fragment_program, support for other
|
|
||||||
extensions like ATI_fragment_shaders is possible.
|
|
||||||
*/
|
|
||||||
/* Context activation is done by the caller. */
|
|
||||||
static void d3dfmt_p8_upload_palette(IWineD3DSurface *iface,
|
|
||||||
const struct wined3d_gl_info *gl_info, CONVERT_TYPES convert)
|
|
||||||
{
|
|
||||||
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
|
|
||||||
BYTE table[256][4];
|
|
||||||
|
|
||||||
d3dfmt_p8_init_palette(This, table, (convert == CONVERT_PALETTED_CK));
|
|
||||||
|
|
||||||
/* Try to use the paletted texture extension */
|
|
||||||
if (gl_info->supported[EXT_PALETTED_TEXTURE])
|
|
||||||
{
|
|
||||||
TRACE("Using GL_EXT_PALETTED_TEXTURE for 8-bit paletted texture support\n");
|
|
||||||
ENTER_GL();
|
|
||||||
GL_EXTCALL(glColorTableEXT(This->texture_target, GL_RGBA, 256, GL_RGBA, GL_UNSIGNED_BYTE, table));
|
|
||||||
LEAVE_GL();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOL palette9_changed(IWineD3DSurfaceImpl *This)
|
BOOL palette9_changed(IWineD3DSurfaceImpl *This)
|
||||||
{
|
{
|
||||||
IWineD3DDeviceImpl *device = This->resource.device;
|
IWineD3DDeviceImpl *device = This->resource.device;
|
||||||
|
@ -4317,18 +4294,14 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_RealizePalette(IWineD3DSurface *iface)
|
||||||
if((This->resource.usage & WINED3DUSAGE_RENDERTARGET) &&
|
if((This->resource.usage & WINED3DUSAGE_RENDERTARGET) &&
|
||||||
device->blitter->color_fixup_supported(&device->adapter->gl_info, This->resource.format_desc->color_fixup))
|
device->blitter->color_fixup_supported(&device->adapter->gl_info, This->resource.format_desc->color_fixup))
|
||||||
{
|
{
|
||||||
struct wined3d_context *context;
|
|
||||||
|
|
||||||
/* Make sure the texture is up to date. This call doesn't do anything if the texture is already up to date. */
|
/* Make sure the texture is up to date. This call doesn't do anything if the texture is already up to date. */
|
||||||
IWineD3DSurface_LoadLocation(iface, SFLAG_INTEXTURE, NULL);
|
IWineD3DSurface_LoadLocation(iface, SFLAG_INTEXTURE, NULL);
|
||||||
|
|
||||||
/* We want to force a palette refresh, so mark the drawable as not being up to date */
|
/* We want to force a palette refresh, so mark the drawable as not being up to date */
|
||||||
IWineD3DSurface_ModifyLocation(iface, SFLAG_INDRAWABLE, FALSE);
|
IWineD3DSurface_ModifyLocation(iface, SFLAG_INDRAWABLE, FALSE);
|
||||||
|
|
||||||
/* Re-upload the palette */
|
/* Force a palette refresh by re-uploading to the drawable */
|
||||||
context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
|
IWineD3DSurface_LoadLocation(iface, SFLAG_INDRAWABLE, NULL);
|
||||||
d3dfmt_p8_upload_palette(iface, context->gl_info, NO_CONVERSION);
|
|
||||||
context_release(context);
|
|
||||||
} else {
|
} else {
|
||||||
if(!(This->Flags & SFLAG_INSYSMEM)) {
|
if(!(This->Flags & SFLAG_INSYSMEM)) {
|
||||||
TRACE("Palette changed with surface that does not have an up to date system memory copy\n");
|
TRACE("Palette changed with surface that does not have an up to date system memory copy\n");
|
||||||
|
@ -4937,12 +4910,6 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
|
||||||
return WINED3DERR_OUTOFVIDEOMEMORY;
|
return WINED3DERR_OUTOFVIDEOMEMORY;
|
||||||
}
|
}
|
||||||
d3dfmt_convert_surface(This->resource.allocatedMemory, mem, pitch, width, height, outpitch, convert, This);
|
d3dfmt_convert_surface(This->resource.allocatedMemory, mem, pitch, width, height, outpitch, convert, This);
|
||||||
}
|
|
||||||
else if (This->resource.format_desc->format == WINED3DFMT_P8_UINT
|
|
||||||
&& (device->blitter->color_fixup_supported(gl_info, This->resource.format_desc->color_fixup)))
|
|
||||||
{
|
|
||||||
d3dfmt_p8_upload_palette(iface, gl_info, convert);
|
|
||||||
mem = This->resource.allocatedMemory;
|
|
||||||
} else {
|
} else {
|
||||||
mem = This->resource.allocatedMemory;
|
mem = This->resource.allocatedMemory;
|
||||||
}
|
}
|
||||||
|
@ -5119,9 +5086,34 @@ static HRESULT ffp_blit_alloc(IWineD3DDevice *iface) { return WINED3D_OK; }
|
||||||
/* Context activation is done by the caller. */
|
/* Context activation is done by the caller. */
|
||||||
static void ffp_blit_free(IWineD3DDevice *iface) { }
|
static void ffp_blit_free(IWineD3DDevice *iface) { }
|
||||||
|
|
||||||
|
/* This function is used in case of 8bit paletted textures using GL_EXT_paletted_texture */
|
||||||
|
/* Context activation is done by the caller. */
|
||||||
|
static void ffp_blit_p8_upload_palette(IWineD3DSurfaceImpl *surface, const struct wined3d_gl_info *gl_info)
|
||||||
|
{
|
||||||
|
BYTE table[256][4];
|
||||||
|
BOOL colorkey_active = (surface->CKeyFlags & WINEDDSD_CKSRCBLT) ? TRUE : FALSE;
|
||||||
|
|
||||||
|
d3dfmt_p8_init_palette(surface, table, colorkey_active);
|
||||||
|
|
||||||
|
TRACE("Using GL_EXT_PALETTED_TEXTURE for 8-bit paletted texture support\n");
|
||||||
|
ENTER_GL();
|
||||||
|
GL_EXTCALL(glColorTableEXT(surface->texture_target, GL_RGBA, 256, GL_RGBA, GL_UNSIGNED_BYTE, table));
|
||||||
|
LEAVE_GL();
|
||||||
|
}
|
||||||
|
|
||||||
/* Context activation is done by the caller. */
|
/* Context activation is done by the caller. */
|
||||||
static HRESULT ffp_blit_set(IWineD3DDevice *iface, IWineD3DSurfaceImpl *surface)
|
static HRESULT ffp_blit_set(IWineD3DDevice *iface, IWineD3DSurfaceImpl *surface)
|
||||||
{
|
{
|
||||||
|
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) iface;
|
||||||
|
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
|
||||||
|
enum complex_fixup fixup = get_complex_fixup(surface->resource.format_desc->color_fixup);
|
||||||
|
|
||||||
|
/* When EXT_PALETTED_TEXTURE is around, palette conversion is done by the GPU
|
||||||
|
* else the surface is converted in software at upload time in LoadLocation.
|
||||||
|
*/
|
||||||
|
if(fixup == COMPLEX_FIXUP_P8 && gl_info->supported[EXT_PALETTED_TEXTURE])
|
||||||
|
ffp_blit_p8_upload_palette(surface, gl_info);
|
||||||
|
|
||||||
ENTER_GL();
|
ENTER_GL();
|
||||||
glEnable(surface->texture_target);
|
glEnable(surface->texture_target);
|
||||||
checkGLcall("glEnable(surface->texture_target)");
|
checkGLcall("glEnable(surface->texture_target)");
|
||||||
|
|
Loading…
Reference in New Issue