From 875534e14c1ceccc22fbf18003ad2a5b44407a38 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Tue, 25 Oct 2016 22:47:21 -0700 Subject: intel/blorp: Fix a couple asserts around image copy rectangles With dealing with rectangles in compressed images, you can have a width or height that isn't a multiple of the corresponding compression block dimension but only if that edge of your rectangle is on the edge of the image. When we call convert_to_single_slice, it creates an 2-D image and a set of tile offsets into that image. When detecting the right-edge and bottom-edge cases, we weren't including the tile offsets so the assert would misfire. This caused crashes in a few UE4 demos Signed-off-by: Jason Ekstrand Reported-by: "Eero Tamminen" Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98431 Cc: "13.0" Tested-by: "Eero Tamminen" Reviewed-by: Iago Toral Quiroga (cherry picked from commit 4964a5149b7776ce27aaeab2be0c2ebf41ded740) --- src/intel/blorp/blorp_blit.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/intel/blorp/blorp_blit.c b/src/intel/blorp/blorp_blit.c index 0c3ee72..9357a72 100644 --- a/src/intel/blorp/blorp_blit.c +++ b/src/intel/blorp/blorp_blit.c @@ -1761,10 +1761,14 @@ surf_convert_to_uncompressed(const struct isl_device *isl_dev, surf_convert_to_single_slice(isl_dev, info); if (width || height) { +#ifndef NDEBUG + uint32_t right_edge_px = info->tile_x_sa + *x + *width; + uint32_t bottom_edge_px = info->tile_y_sa + *y + *height; assert(*width % fmtl->bw == 0 || - *x + *width == info->surf.logical_level0_px.width); + right_edge_px == info->surf.logical_level0_px.width); assert(*height % fmtl->bh == 0 || - *y + *height == info->surf.logical_level0_px.height); + bottom_edge_px == info->surf.logical_level0_px.height); +#endif *width = DIV_ROUND_UP(*width, fmtl->bw); *height = DIV_ROUND_UP(*height, fmtl->bh); } -- cgit v1.1