From 73528dd3b702317449a9c7ebae1eb44ce504d294 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 10 Mar 2023 07:40:59 -0500 Subject: [PATCH] zink: don't use/update tc rp info while blitting this is illegal Part-of: --- src/gallium/drivers/zink/zink_context.c | 12 ++++++++---- src/gallium/drivers/zink/zink_render_pass.c | 5 +++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 8119afd20cc..50086764773 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -2536,6 +2536,7 @@ begin_rendering(struct zink_context *ctx) bool changed_layout = false; bool changed_size = false; bool zsbuf_used = zink_is_zsbuf_used(ctx); + bool use_tc_info = !ctx->blitting && ctx->tc && zink_screen(ctx->base.screen)->driver_workarounds.track_renderpasses; if (ctx->rp_changed || ctx->rp_layout_changed || ctx->rp_loadop_changed) { /* init imageviews, base loadOp, formats */ for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) { @@ -2545,7 +2546,7 @@ begin_rendering(struct zink_context *ctx) ctx->dynamic_fb.attachments[i].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; else ctx->dynamic_fb.attachments[i].loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; - if (ctx->tc && zink_screen(ctx->base.screen)->driver_workarounds.track_renderpasses) { + if (use_tc_info) { if (ctx->dynamic_fb.tc_info.cbuf_invalidate & BITFIELD_BIT(i)) ctx->dynamic_fb.attachments[i].storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; else @@ -2582,7 +2583,7 @@ begin_rendering(struct zink_context *ctx) else ctx->dynamic_fb.attachments[PIPE_MAX_COLOR_BUFS].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - if (ctx->tc && zink_screen(ctx->base.screen)->driver_workarounds.track_renderpasses) { + if (use_tc_info) { if (ctx->dynamic_fb.tc_info.zsbuf_invalidate) ctx->dynamic_fb.attachments[PIPE_MAX_COLOR_BUFS].storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; else @@ -2742,8 +2743,11 @@ zink_batch_rp(struct zink_context *ctx) ctx->base.clear(&ctx->base, ctx->void_clears, NULL, &color, 0, 0); ctx->void_clears = 0; } - update_tc_info(ctx, ctx->rp_tc_info_updated); - ctx->rp_tc_info_updated = false; + if (!ctx->blitting) { + if (ctx->rp_tc_info_updated) + update_tc_info(ctx, true); + ctx->rp_tc_info_updated = false; + } bool maybe_has_query_ends = !ctx->tc || !zink_screen(ctx->base.screen)->driver_workarounds.track_renderpasses || ctx->dynamic_fb.tc_info.has_query_ends; ctx->queries_in_rp = maybe_has_query_ends; /* if possible, out-of-renderpass resume any queries that were stopped when previous rp ended */ diff --git a/src/gallium/drivers/zink/zink_render_pass.c b/src/gallium/drivers/zink/zink_render_pass.c index 80bae85cee5..7a460f2c7fc 100644 --- a/src/gallium/drivers/zink/zink_render_pass.c +++ b/src/gallium/drivers/zink/zink_render_pass.c @@ -454,10 +454,11 @@ get_render_pass(struct zink_context *ctx) struct zink_render_pass_state state = {0}; uint32_t clears = 0; bool have_zsbuf = fb->zsbuf && zink_is_zsbuf_used(ctx); + bool use_tc_info = !ctx->blitting && ctx->tc && zink_screen(ctx->base.screen)->driver_workarounds.track_renderpasses; state.samples = fb->samples > 0; for (int i = 0; i < fb->nr_cbufs; i++) { - if (ctx->tc && screen->driver_workarounds.track_renderpasses) + if (use_tc_info) zink_tc_init_color_attachment(ctx, &ctx->dynamic_fb.tc_info, i, &state.rts[i]); else zink_init_color_attachment(ctx, i, &state.rts[i]); @@ -482,7 +483,7 @@ get_render_pass(struct zink_context *ctx) assert(!state.num_cresolves || state.num_cbufs == state.num_cresolves); if (have_zsbuf) { - if (ctx->tc && screen->driver_workarounds.track_renderpasses) + if (use_tc_info) zink_tc_init_zs_attachment(ctx, &ctx->dynamic_fb.tc_info, &state.rts[fb->nr_cbufs]); else zink_init_zs_attachment(ctx, &state.rts[fb->nr_cbufs]);