Module: Mesa
Branch: main
Commit: 6ababdcd1051719cc76f27f275917cd6d5176fcd
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=6ababdcd1051719cc76f27f275917cd6d5176fcd

Author: David Rosca <[email protected]>
Date:   Wed Aug 30 14:17:21 2023 +0200

radeonsi: Fix plane size in si_copy_multi_plane_texture

Size was wrong and also need to scale sbox xy.

Fixes: 4f047c9583a ("radeonsi: Copy all planes with multi-plane staging 
textures")

Reviewed-by: Pierre-Eric Pelloux-Prayer <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25737>

---

 src/gallium/drivers/radeonsi/si_texture.c | 24 +++++++++++-------------
 1 file changed, 11 insertions(+), 13 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_texture.c 
b/src/gallium/drivers/radeonsi/si_texture.c
index 57bf0f6a5ed..6f9fc2d6bf6 100644
--- a/src/gallium/drivers/radeonsi/si_texture.c
+++ b/src/gallium/drivers/radeonsi/si_texture.c
@@ -71,11 +71,10 @@ static bool si_copy_multi_plane_texture(struct pipe_context 
*ctx, struct pipe_re
                                         struct pipe_resource *src, unsigned 
src_level,
                                         const struct pipe_box *src_box)
 {
-   unsigned i;
+   unsigned i, dx, dy;
    struct si_texture *src_tex = (struct si_texture *)src;
    struct si_texture *dst_tex = (struct si_texture *)dst;
    struct pipe_box sbox;
-   const struct util_format_description *desc;
 
    if (src_tex->multi_plane_format == PIPE_FORMAT_NONE || src_tex->plane_index 
!= 0)
       return false;
@@ -84,20 +83,19 @@ static bool si_copy_multi_plane_texture(struct pipe_context 
*ctx, struct pipe_re
    assert(dst_tex->plane_index == 0 && src_tex->num_planes == 
dst_tex->num_planes);
 
    sbox = *src_box;
-   desc = util_format_description(src_tex->multi_plane_format);
 
-   for (i = 0; i < src_tex->num_planes; ++i) {
-      if (!src || !dst)
-         break;
-      si_resource_copy_region(ctx, dst, dst_level, dstx, dsty, dstz, src, 
src_level, &sbox);
+   for (i = 0; i < src_tex->num_planes && src && dst; ++i) {
+      dx = util_format_get_plane_width(src_tex->multi_plane_format, i, dstx);
+      dy = util_format_get_plane_height(src_tex->multi_plane_format, i, dsty);
+      sbox.x = util_format_get_plane_width(src_tex->multi_plane_format, i, 
src_box->x);
+      sbox.y = util_format_get_plane_height(src_tex->multi_plane_format, i, 
src_box->y);
+      sbox.width = util_format_get_plane_width(src_tex->multi_plane_format, i, 
src_box->width);
+      sbox.height = util_format_get_plane_height(src_tex->multi_plane_format, 
i, src_box->height);
+
+      si_resource_copy_region(ctx, dst, dst_level, dx, dy, dstz, src, 
src_level, &sbox);
+
       src = src->next;
       dst = dst->next;
-      if (i == 0) {
-         dstx /= desc->block.width;
-         dsty /= desc->block.height;
-         sbox.width /= desc->block.width;
-         sbox.height /= desc->block.height;
-      }
    }
 
    return true;

Reply via email to