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

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

zink: use EXT_color_write_enable to mask out primgen+rasterizer_discard output

by disabling color and depth write, the side effects of force-disabling discard 
can
be mitigated

fixes:
KHR-GL46.tessellation_shader.single.isolines_tessellation
KHR-GL46.tessellation_shader.tessellation_control_to_tessellation_evaluation.data_pass_through
KHR-GL46.tessellation_shader.tessellation_invariance.invariance_rule3
KHR-GL46.tessellation_shader.tessellation_shader_point_mode.points_verification
KHR-GL46.tessellation_shader.tessellation_shader_quads_tessellation.degenerate_case
KHR-GL46.tessellation_shader.tessellation_shader_quads_tessellation.inner_tessellation_level_rounding
KHR-GL46.tessellation_shader.tessellation_shader_tessellation.gl_InvocationID_PatchVerticesIn_PrimitiveID
KHR-GL46.tessellation_shader.vertex.vertex_spacing

Acked-by: Dave Airlie <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15392>

---

 src/gallium/drivers/zink/zink_context.c | 12 +++++++++++-
 src/gallium/drivers/zink/zink_program.c |  5 +++--
 src/gallium/drivers/zink/zink_program.h |  2 +-
 src/gallium/drivers/zink/zink_query.c   |  6 ++++--
 src/gallium/drivers/zink/zink_state.c   |  3 +++
 5 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_context.c 
b/src/gallium/drivers/zink/zink_context.c
index 65c226b0e72..08ea0fbe0b1 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -2574,13 +2574,23 @@ zink_set_color_write_enables(struct zink_context *ctx)
    const VkBool32 enables[PIPE_MAX_COLOR_BUFS] = {1, 1, 1, 1, 1, 1, 1, 1};
    const VkBool32 disables[PIPE_MAX_COLOR_BUFS] = {0};
    const unsigned max_att = MIN2(PIPE_MAX_COLOR_BUFS, 
zink_screen(ctx->base.screen)->info.props.limits.maxColorAttachments);
+   bool disable_color_writes = ctx->rast_state && 
ctx->rast_state->base.rasterizer_discard && ctx->primitives_generated_active;
+   if (ctx->disable_color_writes == disable_color_writes)
+      return;
+   ctx->disable_color_writes = disable_color_writes;
    if (zink_screen(ctx->base.screen)->driver_workarounds.color_write_missing) {
       /* use dummy color buffers instead of the more sane option */
       zink_end_render_pass(ctx);
       update_framebuffer_state(ctx, ctx->fb_state.width, ctx->fb_state.height);
    } else {
-      VKCTX(CmdSetColorWriteEnableEXT)(ctx->batch.state->cmdbuf, max_att, 
enables);
+      VKCTX(CmdSetColorWriteEnableEXT)(ctx->batch.state->cmdbuf, max_att, 
disable_color_writes ? disables : enables);
+   }
+   if (!zink_screen(ctx->base.screen)->info.have_EXT_extended_dynamic_state) {
+      /* TODO: maybe pipeline variants for this */
+      return;
    }
+   if (ctx->dsa_state)
+      VKCTX(CmdSetDepthWriteEnableEXT)(ctx->batch.state->cmdbuf, 
disable_color_writes ? VK_FALSE : ctx->dsa_state->hw_state.depth_write);
 }
 
 static void
diff --git a/src/gallium/drivers/zink/zink_program.c 
b/src/gallium/drivers/zink/zink_program.c
index 83dfb9f42f3..78c810a145f 100644
--- a/src/gallium/drivers/zink/zink_program.c
+++ b/src/gallium/drivers/zink/zink_program.c
@@ -1131,15 +1131,16 @@ zink_program_init(struct zink_context *ctx)
    ctx->base.delete_compute_state = zink_delete_shader_state;
 }
 
-void
+bool
 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;
+      return false;
    if (!zink_screen(ctx->base.screen)->info.have_EXT_extended_dynamic_state2)
       ctx->gfx_pipeline_state.dirty |= true;
    ctx->rasterizer_discard_changed = true;
+   return true;
 }
diff --git a/src/gallium/drivers/zink/zink_program.h 
b/src/gallium/drivers/zink/zink_program.h
index 3eb295c0780..20b99c0e691 100644
--- a/src/gallium/drivers/zink/zink_program.h
+++ b/src/gallium/drivers/zink/zink_program.h
@@ -379,7 +379,7 @@ zink_set_fs_point_coord_key(struct zink_context *ctx)
    }
 }
 
-void
+bool
 zink_set_rasterizer_discard(struct zink_context *ctx, bool disable);
 
 #ifdef __cplusplus
diff --git a/src/gallium/drivers/zink/zink_query.c 
b/src/gallium/drivers/zink/zink_query.c
index 7351d0ca4d5..664b7fbd0fa 100644
--- a/src/gallium/drivers/zink/zink_query.c
+++ b/src/gallium/drivers/zink/zink_query.c
@@ -706,7 +706,8 @@ begin_query(struct zink_context *ctx, struct zink_batch 
*batch, struct zink_quer
    _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);
+      if (zink_set_rasterizer_discard(ctx, true))
+         zink_set_color_write_enables(ctx);
    }
 }
 
@@ -777,7 +778,8 @@ end_query(struct zink_context *ctx, struct zink_batch 
*batch, struct zink_query
    update_query_id(ctx, q);
    if (q->type == PIPE_QUERY_PRIMITIVES_GENERATED) {
       ctx->primitives_generated_active = false;
-      zink_set_rasterizer_discard(ctx, false);
+      if (zink_set_rasterizer_discard(ctx, false))
+         zink_set_color_write_enables(ctx);
    }
 }
 
diff --git a/src/gallium/drivers/zink/zink_state.c 
b/src/gallium/drivers/zink/zink_state.c
index 1cd00edea7a..9af4d2c8297 100644
--- a/src/gallium/drivers/zink/zink_state.c
+++ b/src/gallium/drivers/zink/zink_state.c
@@ -681,6 +681,7 @@ zink_bind_rasterizer_state(struct pipe_context *pctx, void 
*cso)
    bool pv_last = ctx->rast_state ? ctx->rast_state->hw_state.pv_last : false;
    bool force_persample_interp = ctx->rast_state ? 
ctx->rast_state->hw_state.force_persample_interp : false;
    bool clip_halfz = ctx->rast_state ? ctx->rast_state->hw_state.clip_halfz : 
false;
+   bool rasterizer_discard = ctx->rast_state ? 
ctx->rast_state->base.rasterizer_discard : false;
    ctx->rast_state = cso;
 
    if (ctx->rast_state) {
@@ -710,6 +711,8 @@ zink_bind_rasterizer_state(struct pipe_context *pctx, void 
*cso)
       }
       if (!ctx->primitives_generated_active)
          zink_set_rasterizer_discard(ctx, false);
+      else if (rasterizer_discard != ctx->rast_state->base.rasterizer_discard)
+         zink_set_color_write_enables(ctx);
 
       if (ctx->rast_state->base.point_quad_rasterization != 
point_quad_rasterization)
          zink_set_fs_point_coord_key(ctx);

Reply via email to