From b65efda50880d4bf03d06b7d2496ac7d9d314e7d Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 8 Jun 2023 13:03:48 -0400 Subject: [PATCH] zink: specialize invalidate_descriptor_state hook for compact mode the constant flag check here has perf implications at high fps, so avoid it when possible Part-of: --- src/gallium/drivers/zink/zink_context.c | 5 ++++- src/gallium/drivers/zink/zink_descriptors.c | 10 +++++++++- src/gallium/drivers/zink/zink_descriptors.h | 2 ++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index ad62a61942e..e45eb85bc10 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -5247,7 +5247,10 @@ zink_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) if (!ctx->batch.state) goto fail; - ctx->invalidate_descriptor_state = zink_context_invalidate_descriptor_state; + if (screen->compact_descriptors) + ctx->invalidate_descriptor_state = zink_context_invalidate_descriptor_state_compact; + else + ctx->invalidate_descriptor_state = zink_context_invalidate_descriptor_state; if (!is_copy_only && !is_compute_only) { pipe_buffer_write_nooverlap(&ctx->base, ctx->dummy_vertex_buffer, 0, sizeof(data), data); pipe_buffer_write_nooverlap(&ctx->base, ctx->dummy_xfb_buffer, 0, sizeof(data), data); diff --git a/src/gallium/drivers/zink/zink_descriptors.c b/src/gallium/drivers/zink/zink_descriptors.c index 12da7df99de..fa459133756 100644 --- a/src/gallium/drivers/zink/zink_descriptors.c +++ b/src/gallium/drivers/zink/zink_descriptors.c @@ -1447,11 +1447,19 @@ zink_descriptors_update(struct zink_context *ctx, bool is_compute) /* called from gallium descriptor change hooks, e.g., set_sampler_views */ void zink_context_invalidate_descriptor_state(struct zink_context *ctx, gl_shader_stage shader, enum zink_descriptor_type type, unsigned start, unsigned count) +{ + if (type == ZINK_DESCRIPTOR_TYPE_UBO && !start) + ctx->dd.push_state_changed[shader == MESA_SHADER_COMPUTE] = true; + else + ctx->dd.state_changed[shader == MESA_SHADER_COMPUTE] |= BITFIELD_BIT(type); +} +void +zink_context_invalidate_descriptor_state_compact(struct zink_context *ctx, gl_shader_stage shader, enum zink_descriptor_type type, unsigned start, unsigned count) { if (type == ZINK_DESCRIPTOR_TYPE_UBO && !start) ctx->dd.push_state_changed[shader == MESA_SHADER_COMPUTE] = true; else { - if (zink_screen(ctx->base.screen)->compact_descriptors && type > ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW) + if (type > ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW) type -= ZINK_DESCRIPTOR_COMPACT; ctx->dd.state_changed[shader == MESA_SHADER_COMPUTE] |= BITFIELD_BIT(type); } diff --git a/src/gallium/drivers/zink/zink_descriptors.h b/src/gallium/drivers/zink/zink_descriptors.h index e61d24c75d8..8280a05f194 100644 --- a/src/gallium/drivers/zink/zink_descriptors.h +++ b/src/gallium/drivers/zink/zink_descriptors.h @@ -173,6 +173,8 @@ zink_descriptors_update(struct zink_context *ctx, bool is_compute); void zink_context_invalidate_descriptor_state(struct zink_context *ctx, gl_shader_stage shader, enum zink_descriptor_type type, unsigned, unsigned); +void +zink_context_invalidate_descriptor_state_compact(struct zink_context *ctx, gl_shader_stage shader, enum zink_descriptor_type type, unsigned, unsigned); void zink_batch_descriptor_deinit(struct zink_screen *screen, struct zink_batch_state *bs);