zink: disable fbfetch when flushing clears
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Thu, 13 Oct 2022 20:35:22 +0000 (16:35 -0400)
committerMarge Bot <emma+marge@anholt.net>
Fri, 14 Oct 2022 01:16:30 +0000 (01:16 +0000)
this ensures there's no weird perf happening, avoids using renderpass
instead of dynamic rendering, and avoids hitting an assert from broken
framebuffer construction

cc: mesa-stable

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

src/gallium/drivers/zink/zink_context.c

index b24f5fe..ef0325f 100644 (file)
@@ -3597,9 +3597,18 @@ zink_flush(struct pipe_context *pctx,
    VkSemaphore export_sem = VK_NULL_HANDLE;
 
    /* triggering clears will force has_work */
-   if (!deferred && ctx->clears_enabled)
+   if (!deferred && ctx->clears_enabled) {
+      /* if fbfetch outputs are active, disable them when flushing clears */
+      unsigned fbfetch_outputs = ctx->fbfetch_outputs;
+      if (fbfetch_outputs) {
+         ctx->fbfetch_outputs = 0;
+         ctx->rp_changed = true;
+      }
       /* start rp to do all the clears */
       zink_batch_rp(ctx);
+      ctx->fbfetch_outputs = fbfetch_outputs;
+      ctx->rp_changed |= fbfetch_outputs > 0;
+   }
 
    if (ctx->needs_present && (flags & PIPE_FLUSH_END_OF_FRAME)) {
       if (ctx->needs_present->obj->image)