From 82add9f2e992be166c60551cfc5baaea0fd0d3a3 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 28 Mar 2023 09:47:45 -0400 Subject: [PATCH] zink: avoid recursion during msrtss blits from flushing clears if an attachment other than the msrtss blit attachment has clears pending, unbinding the other attachment will trigger a clear flush, which will then recurse into the msrtss blit that's being triggered instead, save/restore these clears around the msrtss blit since they can be executed during the normal renderpass Part-of: --- src/gallium/drivers/zink/zink_render_pass.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/gallium/drivers/zink/zink_render_pass.c b/src/gallium/drivers/zink/zink_render_pass.c index 7a503ec..60b9736 100644 --- a/src/gallium/drivers/zink/zink_render_pass.c +++ b/src/gallium/drivers/zink/zink_render_pass.c @@ -797,10 +797,19 @@ zink_begin_render_pass(struct zink_context *ctx) ctx->blitting = false; zink_blit_barriers(ctx, zink_resource(src), zink_resource(dst_view->texture), true); ctx->blitting = true; + unsigned clear_mask = i == PIPE_MAX_COLOR_BUFS ? + (BITFIELD_MASK(PIPE_MAX_COLOR_BUFS) << 2) : + (PIPE_CLEAR_DEPTHSTENCIL | ((BITFIELD_MASK(PIPE_MAX_COLOR_BUFS) & ~BITFIELD_BIT(i)) << 2)); + unsigned clears_enabled = ctx->clears_enabled & clear_mask; + unsigned rp_clears_enabled = ctx->rp_clears_enabled & clear_mask; + ctx->clears_enabled &= ~clear_mask; + ctx->rp_clears_enabled &= ~clear_mask; util_blitter_blit_generic(ctx->blitter, dst_view, &dstbox, src_view, &dstbox, ctx->fb_state.width, ctx->fb_state.height, PIPE_MASK_RGBAZS, PIPE_TEX_FILTER_NEAREST, NULL, false, false, 0); + ctx->clears_enabled = clears_enabled; + ctx->rp_clears_enabled = rp_clears_enabled; ctx->blitting = false; if (blitting) { zink_blit_barriers(ctx, NULL, zink_resource(dst_view->texture), true); -- 2.7.4