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

Author: Samuel Pitoiset <[email protected]>
Date:   Mon Mar 27 12:28:11 2023 +0200

radv: add DI_PT_RECTLIST to si_conv_prim_to_gs_out()

Signed-off-by: Samuel Pitoiset <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22105>

---

 src/amd/vulkan/radv_cmd_buffer.c | 9 +++++----
 src/amd/vulkan/radv_pipeline.c   | 7 +++----
 src/amd/vulkan/radv_private.h    | 6 ++++--
 3 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index bfff91495e0..671e110eae2 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -2157,7 +2157,7 @@ radv_emit_provoking_vertex_mode(struct radv_cmd_buffer 
*cmd_buffer)
 
    if (d->vk.rs.provoking_vertex == VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT) {
       if (stage == MESA_SHADER_VERTEX) {
-         provoking_vtx = si_conv_prim_to_gs_out(d->vk.ia.primitive_topology);
+         provoking_vtx = si_conv_prim_to_gs_out(d->vk.ia.primitive_topology, 
pipeline->is_ngg);
       } else {
          assert(stage == MESA_SHADER_GEOMETRY);
          struct radv_shader *gs = pipeline->base.shaders[stage];
@@ -2194,7 +2194,7 @@ radv_emit_primitive_topology(struct radv_cmd_buffer 
*cmd_buffer)
 
    base_reg = pipeline->base.user_data_0[stage];
    radeon_set_sh_reg(cmd_buffer->cs, base_reg + loc->sgpr_idx * 4,
-                     si_conv_prim_to_gs_out(d->vk.ia.primitive_topology) + 1);
+                     si_conv_prim_to_gs_out(d->vk.ia.primitive_topology, 
pipeline->is_ngg) + 1);
 }
 
 static void
@@ -3505,7 +3505,7 @@ radv_emit_guardband_state(struct radv_cmd_buffer 
*cmd_buffer)
       /* Ignore dynamic primitive topology for TES/GS/MS stages. */
       rast_prim = pipeline->rast_prim;
    } else {
-      rast_prim = si_conv_prim_to_gs_out(d->vk.ia.primitive_topology);
+      rast_prim = si_conv_prim_to_gs_out(d->vk.ia.primitive_topology, 
pipeline->is_ngg);
    }
 
    si_write_guardband(cmd_buffer->cs, d->vk.vp.viewport_count, 
d->vk.vp.viewports, rast_prim,
@@ -8622,7 +8622,8 @@ radv_get_ngg_culling_settings(struct radv_cmd_buffer 
*cmd_buffer, bool vp_y_inve
     * because we don't know the primitive topology at compile time, so we 
should
     * disable it dynamically for points or lines.
     */
-   const unsigned num_vertices_per_prim = 
si_conv_prim_to_gs_out(d->vk.ia.primitive_topology) + 1;
+   const unsigned num_vertices_per_prim =
+      si_conv_prim_to_gs_out(d->vk.ia.primitive_topology, true) + 1;
    if (num_vertices_per_prim != 3)
       return radv_nggc_none;
 
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index d42188e6cab..ccd3497eef4 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -4772,7 +4772,7 @@ radv_pipeline_init_vgt_gs_out(struct 
radv_graphics_pipeline *pipeline,
       gs_out =
          
si_conv_gl_prim_to_gs_out(pipeline->base.shaders[MESA_SHADER_MESH]->info.ms.output_prim);
    } else {
-      gs_out = 
si_conv_prim_to_gs_out(si_translate_prim(state->ia->primitive_topology));
+      gs_out = 
si_conv_prim_to_gs_out(si_translate_prim(state->ia->primitive_topology), false);
    }
 
    return gs_out;
@@ -4802,9 +4802,8 @@ radv_pipeline_init_extra(struct radv_graphics_pipeline 
*pipeline,
       struct radv_dynamic_state *dynamic = &pipeline->dynamic_state;
       dynamic->vk.ia.primitive_topology = V_008958_DI_PT_RECTLIST;
 
-      *vgt_gs_out_prim_type = V_028A6C_TRISTRIP;
-      if (radv_pipeline_has_ngg(pipeline))
-         *vgt_gs_out_prim_type = V_028A6C_RECTLIST;
+      *vgt_gs_out_prim_type =
+         si_conv_prim_to_gs_out(dynamic->vk.ia.primitive_topology, 
radv_pipeline_has_ngg(pipeline));
 
       pipeline->rast_prim = *vgt_gs_out_prim_type;
    }
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 70923da4a6d..bc8651837c3 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -3202,7 +3202,7 @@ void radv_prepare_dgc(struct radv_cmd_buffer *cmd_buffer,
                       const VkGeneratedCommandsInfoNV *pGeneratedCommandsInfo);
 
 static inline uint32_t
-si_conv_prim_to_gs_out(uint32_t topology)
+si_conv_prim_to_gs_out(uint32_t topology, bool is_ngg)
 {
    switch (topology) {
    case V_008958_DI_PT_POINTLIST:
@@ -3219,6 +3219,8 @@ si_conv_prim_to_gs_out(uint32_t topology)
    case V_008958_DI_PT_TRILIST_ADJ:
    case V_008958_DI_PT_TRISTRIP_ADJ:
       return V_028A6C_TRISTRIP;
+   case V_008958_DI_PT_RECTLIST:
+      return is_ngg ? V_028A6C_RECTLIST : V_028A6C_TRISTRIP;
    default:
       assert(0);
       return 0;
@@ -3319,7 +3321,7 @@ radv_get_num_vertices_per_prim(const struct 
radv_pipeline_key *pipeline_key)
       return 3;
    } else {
       /* Need to add 1, because: V_028A6C_POINTLIST=0, V_028A6C_LINESTRIP=1, 
V_028A6C_TRISTRIP=2, etc. */
-      return si_conv_prim_to_gs_out(pipeline_key->vs.topology) + 1;
+      return si_conv_prim_to_gs_out(pipeline_key->vs.topology, false) + 1;
    }
 }
 

Reply via email to