freedreno/a6xx: compressed blit fixes
authorRob Clark <robdclark@chromium.org>
Thu, 27 Feb 2020 18:16:43 +0000 (10:16 -0800)
committerKristian H. Kristensen <hoegsberg@google.com>
Thu, 7 May 2020 00:11:34 +0000 (17:11 -0700)
width/height are not necessarily aligned to block boundaries, so we need
to round up.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4868>

src/gallium/drivers/freedreno/a6xx/fd6_blitter.c

index 21d5249451bae40982c0d515c2110707a72c0a29..ce423af3684d18430d306c3b3c88c006985010c9 100644 (file)
@@ -801,15 +801,26 @@ handle_compressed_blit(struct fd_context *ctx, const struct pipe_blit_info *info
        int bw = util_format_get_blockwidth(info->src.format);
        int bh = util_format_get_blockheight(info->src.format);
 
+       /* NOTE: x/y *must* be aligned to block boundary (ie. in
+        * glCompressedTexSubImage2D()) but width/height may not
+        * be:
+        */
+
+       debug_assert((blit.src.box.x % bw) == 0);
+       debug_assert((blit.src.box.y % bh) == 0);
+
        blit.src.box.x /= bw;
        blit.src.box.y /= bh;
-       blit.src.box.width /= bw;
-       blit.src.box.height /= bh;
+       blit.src.box.width  = DIV_ROUND_UP(blit.src.box.width, bw);
+       blit.src.box.height = DIV_ROUND_UP(blit.src.box.height, bh);
+
+       debug_assert((blit.dst.box.x % bw) == 0);
+       debug_assert((blit.dst.box.y % bh) == 0);
 
        blit.dst.box.x /= bw;
        blit.dst.box.y /= bh;
-       blit.dst.box.width /= bw;
-       blit.dst.box.height /= bh;
+       blit.dst.box.width  = DIV_ROUND_UP(blit.dst.box.width, bw);
+       blit.dst.box.height = DIV_ROUND_UP(blit.dst.box.height, bh);
 
        return do_rewritten_blit(ctx, &blit);
 }