Paul Gofman : wined3d: Use software decompression for converting from compressed format.

Alexandre Julliard julliard at winehq.org
Mon Nov 11 16:20:22 CST 2019


Module: wine
Branch: master
Commit: a73a892f46c027e1fedab513795eac3b12ba568a
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=a73a892f46c027e1fedab513795eac3b12ba568a

Author: Paul Gofman <gofmanp at 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 at gmail.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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;




More information about the wine-cvs mailing list