intel/blorp: Fix a couple asserts around image copy rectangles
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 26 Oct 2016 05:47:21 +0000 (22:47 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Thu, 27 Oct 2016 20:45:39 +0000 (13:45 -0700)
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 <jason@jlekstrand.net>
Reported-by: "Eero Tamminen" <eero.t.tamminen@intel.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98431
Cc: "13.0" <mesa-stable@lists.freedesktop.org>
Tested-by: "Eero Tamminen" <eero.t.tamminen@intel.com>
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
src/intel/blorp/blorp_blit.c

index 0c3ee72b11fc3a7215743db145ae2e7bbcf5c7db..9357a72a355c3a965a8ed2f81b7f881b94bfaca4 100644 (file)
@@ -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);
    }