From: Dave Airlie Date: Sun, 1 Nov 2020 23:42:59 +0000 (+1000) Subject: lavapipe: fix 3d compressed texture copies. X-Git-Tag: upstream/21.0.0~3017 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c871ac04a158401f36c0cc4f9b030509f3cab6d8;p=platform%2Fupstream%2Fmesa.git lavapipe: fix 3d compressed texture copies. The img stride was being calculated incorrectly. Fixes crashes in: dEQP-VK.api.copy_and_blit.core.image_to_image.all_formats.color.3d.bc1_rgb_srgb_block.bc1_rgb_srgb_block.general_general Reviewed-by: Adam Jackson Part-of: --- diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c index 30fe031..3441df6 100644 --- a/src/gallium/frontends/lavapipe/lvp_execute.c +++ b/src/gallium/frontends/lavapipe/lvp_execute.c @@ -1566,9 +1566,10 @@ static void handle_copy_image_to_buffer(struct lvp_cmd_buffer_entry *cmd, if (buffer_image_height == 0) buffer_image_height = copycmd->regions[i].imageExtent.height; + unsigned img_stride = util_format_get_2d_size(dst_format, buffer_row_len, buffer_image_height); if (src_format != dst_format) { copy_depth_box(dst_data, dst_format, - buffer_row_len, buffer_row_len * buffer_image_height, + buffer_row_len, img_stride, 0, 0, 0, copycmd->regions[i].imageExtent.width, copycmd->regions[i].imageExtent.height, @@ -1576,7 +1577,7 @@ static void handle_copy_image_to_buffer(struct lvp_cmd_buffer_entry *cmd, src_data, src_format, src_t->stride, src_t->layer_stride, 0, 0, 0); } else { util_copy_box((ubyte *)dst_data, src_format, - buffer_row_len, buffer_row_len * buffer_image_height, + buffer_row_len, img_stride, 0, 0, 0, copycmd->regions[i].imageExtent.width, copycmd->regions[i].imageExtent.height, @@ -1646,6 +1647,7 @@ static void handle_copy_buffer_to_image(struct lvp_cmd_buffer_entry *cmd, if (buffer_image_height == 0) buffer_image_height = copycmd->regions[i].imageExtent.height; + unsigned img_stride = util_format_get_2d_size(src_format, buffer_row_len, buffer_image_height); if (src_format != dst_format) { copy_depth_box(dst_data, dst_format, dst_t->stride, dst_t->layer_stride, @@ -1654,7 +1656,7 @@ static void handle_copy_buffer_to_image(struct lvp_cmd_buffer_entry *cmd, copycmd->regions[i].imageExtent.height, box.depth, src_data, src_format, - buffer_row_len, buffer_row_len * buffer_image_height, 0, 0, 0); + buffer_row_len, img_stride, 0, 0, 0); } else { util_copy_box(dst_data, dst_format, dst_t->stride, dst_t->layer_stride, @@ -1663,7 +1665,7 @@ static void handle_copy_buffer_to_image(struct lvp_cmd_buffer_entry *cmd, copycmd->regions[i].imageExtent.height, box.depth, src_data, - buffer_row_len, buffer_row_len * buffer_image_height, 0, 0, 0); + buffer_row_len, img_stride, 0, 0, 0); } state->pctx->transfer_unmap(state->pctx, src_t); state->pctx->transfer_unmap(state->pctx, dst_t);