Paul Gofman : wined3d: Use software decompression for converting from compressed format.
Module: wine Branch: master Commit: a73a892f46c027e1fedab513795eac3b12ba568a URL: https://source.winehq.org/git/wine.git/?a=commit;h=a73a892f46c027e1fedab5137... Author: Paul Gofman <gofmanp(a)gmail.com> Date: Fri Nov 8 14:57:23 2019 +0300 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(a)gmail.com> Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- 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 13ddf623ee..1592d2e081 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 5064fb917f..47f2e5e5f0 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 17b71c5738..8d3c25cf15 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;
participants (1)
-
Alexandre Julliard