zink: ignore no-op image copies
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Thu, 11 May 2023 15:07:45 +0000 (11:07 -0400)
committerMarge Bot <emma+marge@anholt.net>
Mon, 15 May 2023 22:52:57 +0000 (22:52 +0000)
rare, but it happens and is illegal

affects:
GTF-GL46.gtf30.GLCoverage.CoverageGL30

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22960>

src/gallium/drivers/zink/zink_context.c

index 719428a..dc5f151 100644 (file)
@@ -4389,7 +4389,9 @@ zink_resource_copy_region(struct pipe_context *pctx,
    struct zink_resource *src = zink_resource(psrc);
    struct zink_context *ctx = zink_context(pctx);
    if (dst->base.b.target != PIPE_BUFFER && src->base.b.target != PIPE_BUFFER) {
-      VkImageCopy region = {0};
+      VkImageCopy region;
+      /* fill struct holes */
+      memset(&region, 0, sizeof(region));
       if (util_format_get_num_planes(src->base.b.format) == 1 &&
           util_format_get_num_planes(dst->base.b.format) == 1) {
       /* If neither the calling command’s srcImage nor the calling command’s dstImage
@@ -4470,6 +4472,12 @@ zink_resource_copy_region(struct pipe_context *pctx,
       region.extent.width = src_box->width;
       region.extent.height = src_box->height;
 
+      /* ignore no-op copies */
+      if (src == dst &&
+          !memcmp(&region.dstOffset, &region.srcOffset, sizeof(region.srcOffset)) &&
+          !memcmp(&region.dstSubresource, &region.srcSubresource, sizeof(region.srcSubresource)))
+         return;
+
       zink_fb_clears_apply_or_discard(ctx, pdst, (struct u_rect){dstx, dstx + src_box->width, dsty, dsty + src_box->height}, false);
       zink_fb_clears_apply_region(ctx, psrc, zink_rect_from_box(src_box));