From d8bb8af4f5528d998848d308b0eee2c526ff800b Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 17 Mar 2023 09:47:10 -0400 Subject: [PATCH] zink: track zsbuf info even when rp optimizing is disabled this should allow zsbuf elimination in some cases Part-of: --- src/gallium/drivers/zink/zink_clear.c | 9 +++++++-- src/gallium/drivers/zink/zink_context.c | 26 ++++++++++++++++++++++++++ src/gallium/drivers/zink/zink_context.h | 2 ++ src/gallium/drivers/zink/zink_program.c | 2 ++ src/gallium/drivers/zink/zink_state.c | 2 ++ 5 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/zink/zink_clear.c b/src/gallium/drivers/zink/zink_clear.c index 19c9a33..2fa554c 100644 --- a/src/gallium/drivers/zink/zink_clear.c +++ b/src/gallium/drivers/zink/zink_clear.c @@ -298,10 +298,15 @@ zink_clear(struct pipe_context *pctx, if (buffers & PIPE_CLEAR_STENCIL) clear->zs.stencil = stencil; clear->zs.bits |= (buffers & PIPE_CLEAR_DEPTHSTENCIL); - if (zink_fb_clear_first_needs_explicit(fb_clear)) + if (zink_fb_clear_first_needs_explicit(fb_clear)) { ctx->rp_clears_enabled &= ~PIPE_CLEAR_DEPTHSTENCIL; - else + if (!zink_screen(ctx->base.screen)->driver_workarounds.track_renderpasses) + ctx->dynamic_fb.tc_info.zsbuf_clear_partial = true; + } else { ctx->rp_clears_enabled |= (buffers & PIPE_CLEAR_DEPTHSTENCIL); + if (!zink_screen(ctx->base.screen)->driver_workarounds.track_renderpasses) + ctx->dynamic_fb.tc_info.zsbuf_clear = true; + } } assert(!ctx->batch.in_rp); ctx->rp_changed |= ctx->rp_clears_enabled != rp_clears_enabled; diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 9ee64ce..83bfdee 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -67,6 +67,20 @@ update_tc_info(struct zink_context *ctx) const struct tc_renderpass_info *info = threaded_context_get_renderpass_info(ctx->tc); ctx->rp_changed |= ctx->dynamic_fb.tc_info.data != info->data; ctx->dynamic_fb.tc_info.data = info->data; + } else { + struct tc_renderpass_info info = ctx->dynamic_fb.tc_info; + bool zsbuf_used = zink_is_zsbuf_used(ctx); + bool zsbuf_write = zink_is_zsbuf_write(ctx); + ctx->dynamic_fb.tc_info.data32[0] = 0; + if (ctx->clears_enabled & PIPE_CLEAR_DEPTHSTENCIL) + ctx->dynamic_fb.tc_info.zsbuf_clear_partial = true; + if (ctx->rp_clears_enabled & PIPE_CLEAR_DEPTHSTENCIL) + ctx->dynamic_fb.tc_info.zsbuf_clear = true; + if (ctx->dynamic_fb.tc_info.zsbuf_clear != info.zsbuf_clear) + ctx->rp_loadop_changed = true; + if (zink_is_zsbuf_write(ctx) != zsbuf_write) + ctx->rp_layout_changed = true; + ctx->rp_changed |= zink_is_zsbuf_used(ctx) != zsbuf_used; } } @@ -5284,6 +5298,18 @@ zink_tc_parse_fs(void *state, struct tc_renderpass_info *info) info->cbuf_fbfetch |= zs->nir->info.fs.uses_fbfetch_output ? BITFIELD_BIT(0) : 0; } +void +zink_parse_tc_info(struct zink_context *ctx) +{ + struct tc_renderpass_info *info = &ctx->dynamic_fb.tc_info; + /* reset cso info first */ + info->data16[2] = 0; + if (ctx->gfx_stages[MESA_SHADER_FRAGMENT]) + zink_tc_parse_fs(ctx->gfx_stages[MESA_SHADER_FRAGMENT], info); + if (ctx->dsa_state) + zink_tc_parse_dsa(ctx->dsa_state, info); +} + struct pipe_context * zink_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) { diff --git a/src/gallium/drivers/zink/zink_context.h b/src/gallium/drivers/zink/zink_context.h index d9c48bf..80cfabd 100644 --- a/src/gallium/drivers/zink/zink_context.h +++ b/src/gallium/drivers/zink/zink_context.h @@ -167,6 +167,8 @@ void zink_rebind_all_images(struct zink_context *ctx); void +zink_parse_tc_info(struct zink_context *ctx); +void zink_flush_memory_barrier(struct zink_context *ctx, bool is_compute); void zink_init_draw_functions(struct zink_context *ctx, struct zink_screen *screen); diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index f5b48f9..b2bee7f 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -1767,6 +1767,8 @@ zink_bind_fs_state(struct pipe_context *pctx, if (shadow_mask != ctx->gfx_stages[MESA_SHADER_FRAGMENT]->fs.legacy_shadow_mask && !zink_screen(pctx->screen)->driver_workarounds.needs_zs_shader_swizzle) zink_update_shadow_samplerviews(ctx, shadow_mask | ctx->gfx_stages[MESA_SHADER_FRAGMENT]->fs.legacy_shadow_mask); + if (!zink_screen(ctx->base.screen)->driver_workarounds.track_renderpasses && !ctx->blitting) + zink_parse_tc_info(ctx); } zink_update_fbfetch(ctx); } diff --git a/src/gallium/drivers/zink/zink_state.c b/src/gallium/drivers/zink/zink_state.c index c445c5d..4f472a5 100644 --- a/src/gallium/drivers/zink/zink_state.c +++ b/src/gallium/drivers/zink/zink_state.c @@ -522,6 +522,8 @@ zink_bind_depth_stencil_alpha_state(struct pipe_context *pctx, void *cso) state->dirty |= !zink_screen(pctx->screen)->info.have_EXT_extended_dynamic_state; ctx->dsa_state_changed = true; } + if (!zink_screen(ctx->base.screen)->driver_workarounds.track_renderpasses && !ctx->blitting) + zink_parse_tc_info(ctx); } bool zs_write = ctx->dsa_state ? ctx->dsa_state->hw_state.depth_write || ctx->dsa_state->hw_state.stencil_test : false; if (prev_zswrite != zs_write) { -- 2.7.4