[PATCH 2/5] wined3d: Use software decompression for converting from compressed format.

Paul Gofman gofmanp at gmail.com
Fri Nov 8 05:57:23 CST 2019


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>
---
 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 4861bc0888..6c8d9eaf1c 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -620,7 +620,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;
-- 
2.23.0




More information about the wine-devel mailing list