wined3d: Use software decompression for converting from compressed format.

The motivation under this is not just supporting conversion between
compressed formats. Currently fallback CPU blitter cannot convert
from DXTn formats at all, this patch allows for that if software
decompression function is available.

Signed-off-by: Paul Gofman <gofmanp@gmail.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Paul Gofman 2019-11-08 14:57:23 +03:00 committed by Alexandre Julliard
parent 3c9b843175
commit a73a892f46
3 changed files with 6 additions and 3 deletions

View File

@ -16626,7 +16626,7 @@ static void test_surface_format_conversion_alpha(void)
{FMT_RGBX, rgbx_data, FMT_DXT2, dxt2_data, TRUE},
{FMT_RGBA, rgba_data, FMT_DXT3, dxt2_data},
{FMT_RGBX, rgbx_data, FMT_DXT3, dxt2_data, TRUE},
{FMT_DXT1, dxt1_data, FMT_DXT2, dxt2_data, TRUE},
{FMT_DXT1, dxt1_data, FMT_DXT2, dxt2_data},
{FMT_DXT1, dxt1_data, FMT_RGBA, rgba_data},
{FMT_DXT1, dxt1_data, FMT_RGBX, rgba_data},
{FMT_DXT3, dxt2_data, FMT_RGBA, rgba_data},

View File

@ -610,7 +610,8 @@ static struct wined3d_texture *surface_convert_format(struct wined3d_texture *sr
if (!(conv = find_converter(src_format->id, dst_format->id)) && (!device->d3d_initialized
|| !is_identity_fixup(src_format->color_fixup) || src_format->conv_byte_count
|| !is_identity_fixup(dst_format->color_fixup) || dst_format->conv_byte_count
|| (src_format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_COMPRESSED)))
|| ((src_format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_COMPRESSED)
&& !src_format->decompress)))
{
FIXME("Cannot find a conversion function from format %s to %s.\n",
debug_d3dformat(src_format->id), debug_d3dformat(dst_format->id));

View File

@ -2043,7 +2043,9 @@ static void wined3d_texture_gl_upload_data(struct wined3d_context *context,
bo.addr += src_box->left * src_format->byte_count;
}
decompress = dst_texture->resource.format_flags & WINED3DFMT_FLAG_DECOMPRESS;
decompress = (dst_texture->resource.format_flags & WINED3DFMT_FLAG_DECOMPRESS)
|| (src_format->decompress && src_format->id != dst_texture->resource.format->id);
if (src_format->upload || decompress)
{
const struct wined3d_format *compressed_format = src_format;