vc4: Allow RCL blits to the edge of the surface.
authorEric Anholt <eric@anholt.net>
Mon, 7 Dec 2015 23:18:59 +0000 (15:18 -0800)
committerEric Anholt <eric@anholt.net>
Tue, 8 Dec 2015 17:49:52 +0000 (09:49 -0800)
The recent unaligned fix successfully prevented RCL blits that weren't
aligned inside of the surface, but we also want to be able to do RCL blits
for the whole surface when the width or height of the surface aren't
aligned (we don't care what renders inside of the padding).

src/gallium/drivers/vc4/vc4_blit.c

index 2aed5401f59926645488ad9c2b18bc5e444acf6a..757583c3ff72b48704cfe51817d02887144dea54 100644 (file)
@@ -70,10 +70,16 @@ vc4_tile_blit(struct pipe_context *pctx, const struct pipe_blit_info *info)
                 return false;
         }
 
+        int dst_surface_width = u_minify(info->dst.resource->width0,
+                                         info->dst.level);
+        int dst_surface_height = u_minify(info->dst.resource->height0,
+                                         info->dst.level);
         if (is_tile_unaligned(info->dst.box.x, tile_width) ||
             is_tile_unaligned(info->dst.box.y, tile_height) ||
-            is_tile_unaligned(info->dst.box.width, tile_width) ||
-            is_tile_unaligned(info->dst.box.height, tile_height)) {
+            (is_tile_unaligned(info->dst.box.width, tile_width) &&
+             info->dst.box.x + info->dst.box.width != dst_surface_width) ||
+            (is_tile_unaligned(info->dst.box.height, tile_height) &&
+             info->dst.box.y + info->dst.box.height != dst_surface_height)) {
                 return false;
         }