From a73a892f46c027e1fedab513795eac3b12ba568a Mon Sep 17 00:00:00 2001 From: Paul Gofman Date: Fri, 8 Nov 2019 14:57:23 +0300 Subject: [PATCH] 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 Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/ddraw/tests/ddraw7.c | 2 +- dlls/wined3d/surface.c | 3 ++- dlls/wined3d/texture.c | 4 +++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c index 13ddf623ee5..1592d2e081f 100644 --- a/dlls/ddraw/tests/ddraw7.c +++ b/dlls/ddraw/tests/ddraw7.c @@ -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}, diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 5064fb917fe..47f2e5e5f03 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -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)); diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index 17b71c57381..8d3c25cf15d 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -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;