From 0a80f94de06b2be90f5accad7edaec7f9e1c91f1 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 7 Mar 2022 15:32:40 -0500 Subject: [PATCH] zink: force disable rasterization discard if primgen query is active this query requires rasterization to pass the clipping invocations stage, which means discard is impossible Acked-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_context.h | 1 + src/gallium/drivers/zink/zink_program.c | 13 +++++++++++++ src/gallium/drivers/zink/zink_program.h | 3 +++ src/gallium/drivers/zink/zink_query.c | 9 +++++++++ src/gallium/drivers/zink/zink_state.c | 9 +++------ 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/zink/zink_context.h b/src/gallium/drivers/zink/zink_context.h index cb925f1f5d0..fd47db21599 100644 --- a/src/gallium/drivers/zink/zink_context.h +++ b/src/gallium/drivers/zink/zink_context.h @@ -290,6 +290,7 @@ struct zink_context { struct list_head suspended_queries; struct list_head primitives_generated_queries; struct zink_query *vertices_query; + bool primitives_generated_active; bool queries_disabled, render_condition_active; struct { struct zink_query *query; diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index 6dd9f8de676..83dfb9f42f3 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -1130,3 +1130,16 @@ zink_program_init(struct zink_context *ctx) ctx->base.bind_compute_state = zink_bind_cs_state; ctx->base.delete_compute_state = zink_delete_shader_state; } + +void +zink_set_rasterizer_discard(struct zink_context *ctx, bool disable) +{ + bool value = disable ? false : (ctx->rast_state ? ctx->rast_state->base.rasterizer_discard : false); + bool changed = ctx->gfx_pipeline_state.dyn_state2.rasterizer_discard != value; + ctx->gfx_pipeline_state.dyn_state2.rasterizer_discard = value; + if (!changed) + return; + if (!zink_screen(ctx->base.screen)->info.have_EXT_extended_dynamic_state2) + ctx->gfx_pipeline_state.dirty |= true; + ctx->rasterizer_discard_changed = true; +} diff --git a/src/gallium/drivers/zink/zink_program.h b/src/gallium/drivers/zink/zink_program.h index 87c4c73f6d4..3eb295c0780 100644 --- a/src/gallium/drivers/zink/zink_program.h +++ b/src/gallium/drivers/zink/zink_program.h @@ -379,6 +379,9 @@ zink_set_fs_point_coord_key(struct zink_context *ctx) } } +void +zink_set_rasterizer_discard(struct zink_context *ctx, bool disable); + #ifdef __cplusplus } #endif diff --git a/src/gallium/drivers/zink/zink_query.c b/src/gallium/drivers/zink/zink_query.c index 1e0ea47f6b2..7351d0ca4d5 100644 --- a/src/gallium/drivers/zink/zink_query.c +++ b/src/gallium/drivers/zink/zink_query.c @@ -2,6 +2,7 @@ #include "zink_context.h" #include "zink_fence.h" +#include "zink_program.h" #include "zink_resource.h" #include "zink_screen.h" @@ -703,6 +704,10 @@ begin_query(struct zink_context *ctx, struct zink_batch *batch, struct zink_quer list_addtail(&q->stats_list, &ctx->primitives_generated_queries); zink_batch_usage_set(&q->batch_id, batch->state); _mesa_set_add(batch->state->active_queries, q); + if (q->type == PIPE_QUERY_PRIMITIVES_GENERATED) { + ctx->primitives_generated_active = true; + zink_set_rasterizer_discard(ctx, true); + } } static bool @@ -770,6 +775,10 @@ end_query(struct zink_context *ctx, struct zink_batch *batch, struct zink_query list_delinit(&q->stats_list); update_query_id(ctx, q); + if (q->type == PIPE_QUERY_PRIMITIVES_GENERATED) { + ctx->primitives_generated_active = false; + zink_set_rasterizer_discard(ctx, false); + } } static bool diff --git a/src/gallium/drivers/zink/zink_state.c b/src/gallium/drivers/zink/zink_state.c index 29801bb09a8..1cd00edea7a 100644 --- a/src/gallium/drivers/zink/zink_state.c +++ b/src/gallium/drivers/zink/zink_state.c @@ -708,12 +708,9 @@ zink_bind_rasterizer_state(struct pipe_context *pctx, void *cso) ctx->gfx_pipeline_state.dyn_state1.front_face = ctx->rast_state->front_face; ctx->gfx_pipeline_state.dirty |= !zink_screen(pctx->screen)->info.have_EXT_extended_dynamic_state; } - if (ctx->gfx_pipeline_state.dyn_state2.rasterizer_discard != ctx->rast_state->base.rasterizer_discard) { - ctx->gfx_pipeline_state.dyn_state2.rasterizer_discard = ctx->rast_state->base.rasterizer_discard; - ctx->gfx_pipeline_state.dirty |= !zink_screen(pctx->screen)->info.have_EXT_extended_dynamic_state2; - if (zink_screen(pctx->screen)->info.have_EXT_extended_dynamic_state2) - ctx->rasterizer_discard_changed = true; - } + if (!ctx->primitives_generated_active) + zink_set_rasterizer_discard(ctx, false); + if (ctx->rast_state->base.point_quad_rasterization != point_quad_rasterization) zink_set_fs_point_coord_key(ctx); if (ctx->rast_state->base.scissor != scissor)