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;
