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

Author: Tapani Pälli <[email protected]>
Date:   Thu Feb  9 17:29:28 2023 +0200

anv: implement emission of 3DSTATE_HS for Wa_1306463417

We need to emit 3DSTATE_HS for each primitive with tessellation.

Signed-off-by: Tapani Pälli <[email protected]>
Reviewed-by: Lionel Landwerlin <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21308>

---

 src/intel/vulkan/genX_cmd_buffer.c | 51 ++++++++++++++++++++++++++++++++------
 1 file changed, 44 insertions(+), 7 deletions(-)

diff --git a/src/intel/vulkan/genX_cmd_buffer.c 
b/src/intel/vulkan/genX_cmd_buffer.c
index 40fdb8b03d8..27c3f6c00f4 100644
--- a/src/intel/vulkan/genX_cmd_buffer.c
+++ b/src/intel/vulkan/genX_cmd_buffer.c
@@ -3265,6 +3265,19 @@ cmd_buffer_emit_streamout(struct anv_cmd_buffer 
*cmd_buffer)
    anv_batch_emit_merge(&cmd_buffer->batch, dwords, 
pipeline->gfx8.streamout_state);
 }
 
+ALWAYS_INLINE static void
+genX(emit_hs)(struct anv_cmd_buffer *cmd_buffer)
+{
+   struct anv_graphics_pipeline *pipeline = cmd_buffer->state.gfx.pipeline;
+   if (!anv_pipeline_has_stage(pipeline, MESA_SHADER_TESS_EVAL))
+      return;
+
+   uint32_t *dw =
+      anv_batch_emitn(&cmd_buffer->batch, GENX(3DSTATE_HS_length),
+                         GENX(3DSTATE_HS));
+   memcpy(dw, &pipeline->gfx8.hs, sizeof(pipeline->gfx8.hs));
+}
+
 ALWAYS_INLINE static void
 genX(cmd_buffer_flush_gfx_state)(struct anv_cmd_buffer *cmd_buffer)
 {
@@ -3378,6 +3391,11 @@ genX(cmd_buffer_flush_gfx_state)(struct anv_cmd_buffer 
*cmd_buffer)
       cmd_buffer->state.push_descriptors_dirty &= ~push_descriptor_dirty;
    }
 
+   /* Wa_1306463417 - Send HS state for every primitive on gfx11. */
+   if (cmd_buffer->state.gfx.dirty & ANV_CMD_DIRTY_PIPELINE || GFX_VER == 11) {
+      genX(emit_hs)(cmd_buffer);
+   }
+
    if (!cmd_buffer->state.gfx.dirty && !descriptors_dirty &&
        !any_dynamic_state_dirty &&
        !cmd_buffer->state.push_constants_dirty)
@@ -3522,13 +3540,6 @@ genX(cmd_buffer_flush_gfx_state)(struct anv_cmd_buffer 
*cmd_buffer)
       }
    }
 
-   if (cmd_buffer->state.gfx.dirty & ANV_CMD_DIRTY_PIPELINE) {
-      uint32_t *dw =
-         anv_batch_emitn(&cmd_buffer->batch, GENX(3DSTATE_HS_length),
-                         GENX(3DSTATE_HS));
-      memcpy(dw, &pipeline->gfx8.hs, sizeof(pipeline->gfx8.hs));
-   }
-
    if (any_dynamic_state_dirty || cmd_buffer->state.gfx.dirty)
       genX(cmd_buffer_flush_dynamic_state)(cmd_buffer);
 }
@@ -4189,6 +4200,13 @@ void genX(CmdDrawMultiEXT)(
    }
 #else
    vk_foreach_multi_draw(draw, i, pVertexInfo, drawCount, stride) {
+
+      /* Wa_1306463417 - Send HS state for every primitive, first
+       * one was handled by cmd_buffer_flush_gfx_state.
+       */
+      if (i && GFX_VER == 11)
+         genX(emit_hs)(cmd_buffer);
+
       anv_batch_emit(&cmd_buffer->batch, GENX(3DPRIMITIVE_EXTENDED), prim) {
          prim.PredicateEnable          = 
cmd_buffer->state.conditional_render_enabled;
          prim.VertexAccessType         = SEQUENTIAL;
@@ -4389,6 +4407,13 @@ void genX(CmdDrawMultiIndexedEXT)(
    }
 #else
    vk_foreach_multi_draw_indexed(draw, i, pIndexInfo, drawCount, stride) {
+
+      /* Wa_1306463417 - Send HS state for every primitive, first
+       * one was handled by cmd_buffer_flush_gfx_state.
+       */
+      if (i && GFX_VER == 11)
+         genX(emit_hs)(cmd_buffer);
+
       anv_batch_emit(&cmd_buffer->batch, GENX(3DPRIMITIVE_EXTENDED), prim) {
          prim.PredicateEnable          = 
cmd_buffer->state.conditional_render_enabled;
          prim.VertexAccessType         = RANDOM;
@@ -4633,6 +4658,12 @@ emit_indirect_draws(struct anv_cmd_buffer *cmd_buffer,
 
       load_indirect_parameters(cmd_buffer, draw, indexed, i);
 
+      /* Wa_1306463417 - Send HS state for every primitive HS, first
+       * one was handled by cmd_buffer_flush_gfx_state.
+       */
+      if (i && GFX_VER == 11)
+         genX(emit_hs)(cmd_buffer);
+
       anv_batch_emit(&cmd_buffer->batch,
 #if GFX_VER < 11
                      GENX(3DPRIMITIVE),
@@ -4861,6 +4892,12 @@ emit_indirect_count_draws(struct anv_cmd_buffer 
*cmd_buffer,
 
       load_indirect_parameters(cmd_buffer, draw, indexed, i);
 
+      /* Wa_1306463417 - Send HS state for every primitive HS, first
+       * one was handled by cmd_buffer_flush_gfx_state.
+       */
+      if (i && GFX_VER == 11)
+         genX(emit_hs)(cmd_buffer);
+
       anv_batch_emit(&cmd_buffer->batch,
 #if GFX_VER < 11
                      GENX(3DPRIMITIVE),

Reply via email to