zink: double check layouts for possible feedback loop images
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Sat, 18 Mar 2023 12:41:00 +0000 (08:41 -0400)
committerMarge Bot <emma+marge@anholt.net>
Mon, 20 Mar 2023 02:26:19 +0000 (02:26 +0000)
if a feedback loop hasn't yet been added for an image with both
descriptor and fb binds, queue a check for that to avoid mismatch

affects godot-tps-gles3-high.trace

cc: mesa-stable

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

src/gallium/drivers/zink/zink_context.c

index fb9a6f5..463065f 100644 (file)
@@ -1655,10 +1655,15 @@ check_for_layout_update(struct zink_context *ctx, struct zink_resource *res, boo
 {
    VkImageLayout layout = res->bind_count[is_compute] ? zink_descriptor_util_image_layout_eval(ctx, res, is_compute) : VK_IMAGE_LAYOUT_UNDEFINED;
    VkImageLayout other_layout = res->bind_count[!is_compute] ? zink_descriptor_util_image_layout_eval(ctx, res, !is_compute) : VK_IMAGE_LAYOUT_UNDEFINED;
-   if (res->bind_count[is_compute] && layout && res->layout != layout)
-      _mesa_set_add(ctx->need_barriers[is_compute], res);
-   if (res->bind_count[!is_compute] && other_layout && (layout != other_layout || res->layout != other_layout))
-      _mesa_set_add(ctx->need_barriers[!is_compute], res);
+   if (!is_compute && res->fb_binds && !(ctx->feedback_loops & res->fb_binds)) {
+      /* always double check feedback loops */
+      _mesa_set_add(ctx->need_barriers[0], res);
+   } else {
+      if (res->bind_count[is_compute] && layout && res->layout != layout)
+         _mesa_set_add(ctx->need_barriers[is_compute], res);
+      if (res->bind_count[!is_compute] && other_layout && (layout != other_layout || res->layout != other_layout))
+         _mesa_set_add(ctx->need_barriers[!is_compute], res);
+   }
 }
 
 static void