st/mesa: generalize fallback_copy_image for compressed textures
authorMarek Olšák <marek.olsak@amd.com>
Wed, 14 Feb 2018 00:49:33 +0000 (01:49 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 31 Jul 2018 22:09:57 +0000 (18:09 -0400)
in order to support ASTC

Tested-by: Mike Lothian <mike@fireburn.co.uk>
Tested-By: Gert Wollny<gert.wollny@collabora.com>
Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de>
Reviewed-By: Gert Wollny <gw.fossdev@gmail.com>
src/mesa/state_tracker/st_cb_copyimage.c

index 5230b61877f5fc1a35a4bc1b868ce7a2e32d005c..f5d8c0478008a80695165b11abfdb4bd07ce0571 100644 (file)
@@ -532,7 +532,6 @@ copy_image(struct pipe_context *pipe,
                  src_box);
 }
 
-/* Note, the only allowable compressed format for this function is ETC */
 static void
 fallback_copy_image(struct st_context *st,
                     struct gl_texture_image *dst_image,
@@ -551,19 +550,25 @@ fallback_copy_image(struct st_context *st,
    bool dst_is_compressed = dst_image && _mesa_is_format_compressed(dst_image->TexFormat);
    bool src_is_compressed = src_image && _mesa_is_format_compressed(src_image->TexFormat);
 
+   unsigned dst_blk_w = 1, dst_blk_h = 1, src_blk_w = 1, src_blk_h = 1;
+   if (dst_image)
+      _mesa_get_format_block_size(dst_image->TexFormat, &dst_blk_w, &dst_blk_h);
+   if (src_image)
+      _mesa_get_format_block_size(src_image->TexFormat, &src_blk_w, &src_blk_h);
+
    unsigned dst_w = src_w;
    unsigned dst_h = src_h;
    unsigned lines = src_h;
 
    if (src_is_compressed && !dst_is_compressed) {
-      dst_w = DIV_ROUND_UP(dst_w, 4);
-      dst_h = DIV_ROUND_UP(dst_h, 4);
+      dst_w = DIV_ROUND_UP(dst_w, src_blk_w);
+      dst_h = DIV_ROUND_UP(dst_h, src_blk_h);
    } else if (!src_is_compressed && dst_is_compressed) {
-      dst_w *= 4;
-      dst_h *= 4;
+      dst_w *= dst_blk_w;
+      dst_h *= dst_blk_h;
    }
    if (src_is_compressed) {
-      lines = DIV_ROUND_UP(lines, 4);
+      lines = DIV_ROUND_UP(lines, src_blk_h);
    }
 
    if (src_image)