Module: Mesa
Branch: main
Commit: 0a80f94de06b2be90f5accad7edaec7f9e1c91f1
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=0a80f94de06b2be90f5accad7edaec7f9e1c91f1

Author: Mike Blumenkrantz <[email protected]>
Date:   Mon Mar  7 15:32:40 2022 -0500

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 <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15392>

---

 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)

Reply via email to