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

Author: Samuel Pitoiset <[email protected]>
Date:   Fri Sep 24 14:52:58 2021 +0200

radv: store the topology instead of the output primitive type in the key

To match the pipeline key.

Signed-off-by: Samuel Pitoiset <[email protected]>
Reviewed-by: Timur Kristóf <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13032>

---

 src/amd/vulkan/radv_nir_to_llvm.c |  6 ++++--
 src/amd/vulkan/radv_pipeline.c    | 26 +-------------------------
 src/amd/vulkan/radv_private.h     | 24 ++++++++++++++++++++++++
 src/amd/vulkan/radv_shader.c      |  2 +-
 src/amd/vulkan/radv_shader.h      |  4 ++--
 5 files changed, 32 insertions(+), 30 deletions(-)

diff --git a/src/amd/vulkan/radv_nir_to_llvm.c 
b/src/amd/vulkan/radv_nir_to_llvm.c
index 70da516697c..5804c24a9ae 100644
--- a/src/amd/vulkan/radv_nir_to_llvm.c
+++ b/src/amd/vulkan/radv_nir_to_llvm.c
@@ -1617,8 +1617,10 @@ handle_ngg_outputs_post_2(struct radv_shader_context 
*ctx)
       LLVMValueRef provoking_vtx_in_prim = LLVMConstInt(ctx->ac.i32, 0, false);
 
       /* For provoking vertex last mode, use num_vtx_in_prim - 1. */
-      if (ctx->args->options->key.vs.provoking_vtx_last)
-         provoking_vtx_in_prim = LLVMConstInt(ctx->ac.i32, 
ctx->args->options->key.vs.outprim, false);
+      if (ctx->args->options->key.vs.provoking_vtx_last) {
+         uint8_t outprim = 
si_conv_prim_to_gs_out(ctx->args->options->key.vs.topology);
+         provoking_vtx_in_prim = LLVMConstInt(ctx->ac.i32, outprim, false);
+      }
 
       /* provoking_vtx_index = vtxindex[provoking_vtx_in_prim]; */
       LLVMValueRef indices = ac_build_gather_values(&ctx->ac, vtxindex, 3);
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index 5425b9e375b..857848425b8 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -1237,30 +1237,6 @@ si_conv_gl_prim_to_gs_out(unsigned gl_prim)
    }
 }
 
-static uint32_t
-si_conv_prim_to_gs_out(enum VkPrimitiveTopology topology)
-{
-   switch (topology) {
-   case VK_PRIMITIVE_TOPOLOGY_POINT_LIST:
-   case VK_PRIMITIVE_TOPOLOGY_PATCH_LIST:
-      return V_028A6C_POINTLIST;
-   case VK_PRIMITIVE_TOPOLOGY_LINE_LIST:
-   case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP:
-   case VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY:
-   case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY:
-      return V_028A6C_LINESTRIP;
-   case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
-   case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:
-   case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN:
-   case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY:
-   case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY:
-      return V_028A6C_TRISTRIP;
-   default:
-      assert(0);
-      return 0;
-   }
-}
-
 static uint64_t
 radv_dynamic_state_mask(VkDynamicState state)
 {
@@ -2771,8 +2747,8 @@ radv_fill_shader_keys(struct radv_device *device, struct 
radv_shader_variant_key
    }
    for (unsigned i = 0; i < MAX_VBS; ++i)
       keys[MESA_SHADER_VERTEX].vs.vertex_binding_align[i] = 
key->vertex_binding_align[i];
-   keys[MESA_SHADER_VERTEX].vs.outprim = si_conv_prim_to_gs_out(key->topology);
    keys[MESA_SHADER_VERTEX].vs.provoking_vtx_last = key->provoking_vtx_last;
+   keys[MESA_SHADER_VERTEX].vs.topology = key->topology;
 
    if (nir[MESA_SHADER_TESS_CTRL]) {
       keys[MESA_SHADER_VERTEX].vs_common_out.as_ls = true;
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index ab4ba1ed5c3..0c2cba6fbc1 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -2716,6 +2716,30 @@ si_conv_gl_prim_to_vertices(unsigned gl_prim)
    }
 }
 
+static inline uint32_t
+si_conv_prim_to_gs_out(enum VkPrimitiveTopology topology)
+{
+   switch (topology) {
+   case VK_PRIMITIVE_TOPOLOGY_POINT_LIST:
+   case VK_PRIMITIVE_TOPOLOGY_PATCH_LIST:
+      return V_028A6C_POINTLIST;
+   case VK_PRIMITIVE_TOPOLOGY_LINE_LIST:
+   case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP:
+   case VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY:
+   case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY:
+      return V_028A6C_LINESTRIP;
+   case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
+   case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:
+   case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN:
+   case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY:
+   case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY:
+      return V_028A6C_TRISTRIP;
+   default:
+      assert(0);
+      return 0;
+   }
+}
+
 struct radv_extra_render_pass_begin_info {
    bool disable_dcc;
 };
diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c
index c0594c39c29..be3ff8ef15a 100644
--- a/src/amd/vulkan/radv_shader.c
+++ b/src/amd/vulkan/radv_shader.c
@@ -949,7 +949,7 @@ void radv_lower_ngg(struct radv_device *device, struct 
nir_shader *nir,
 
    } else if (nir->info.stage == MESA_SHADER_VERTEX) {
       /* Need to add 1, because: V_028A6C_POINTLIST=0, V_028A6C_LINESTRIP=1, 
V_028A6C_TRISTRIP=2, etc. */
-      num_vertices_per_prim = key->vs.outprim + 1;
+      num_vertices_per_prim = si_conv_prim_to_gs_out(pl_key->topology) + 1;
 
       /* Manually mark the instance ID used, so the shader can repack it. */
       if (key->vs.instance_rate_inputs)
diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h
index 1afecc48135..b1ba250b1e5 100644
--- a/src/amd/vulkan/radv_shader.h
+++ b/src/amd/vulkan/radv_shader.h
@@ -76,8 +76,8 @@ struct radv_vs_variant_key {
    /* For some formats the channels have to be shuffled. */
    uint32_t post_shuffle;
 
-   /* Output primitive type. */
-   uint8_t outprim;
+   /* Topology. */
+   uint8_t topology;
 
    /* Provoking vertex mode. */
    bool provoking_vtx_last;

Reply via email to