Mesa (main): ac/nir/ngg: count the number of generated primitives for VS and TES

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jun 9 08:50:09 UTC 2022


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

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Fri May 27 13:51:12 2022 +0200

ac/nir/ngg: count the number of generated primitives for VS and TES

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Timur Kristóf <timur.kristof at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15639>

---

 src/amd/common/ac_nir.h           |  1 +
 src/amd/common/ac_nir_lower_ngg.c | 21 +++++++++++++++++++++
 src/amd/vulkan/radv_shader.c      |  3 ++-
 3 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/src/amd/common/ac_nir.h b/src/amd/common/ac_nir.h
index f5c59acbcf9..a532db6e289 100644
--- a/src/amd/common/ac_nir.h
+++ b/src/amd/common/ac_nir.h
@@ -125,6 +125,7 @@ ac_nir_lower_ngg_nogs(nir_shader *shader,
                       bool export_prim_id,
                       bool provoking_vtx_last,
                       bool use_edgeflags,
+                      bool has_prim_query,
                       uint32_t instance_rate_inputs);
 
 void
diff --git a/src/amd/common/ac_nir_lower_ngg.c b/src/amd/common/ac_nir_lower_ngg.c
index 0631964fb06..69caffe203d 100644
--- a/src/amd/common/ac_nir_lower_ngg.c
+++ b/src/amd/common/ac_nir_lower_ngg.c
@@ -53,6 +53,7 @@ typedef struct
    bool export_prim_id;
    bool early_prim_export;
    bool use_edgeflags;
+   bool has_prim_query;
    unsigned wave_size;
    unsigned max_num_waves;
    unsigned num_vertices_per_primitives;
@@ -445,6 +446,24 @@ emit_ngg_nogs_prim_export(nir_builder *b, lower_ngg_nogs_state *st, nir_ssa_def
          nir_pop_if(b, if_prim_valid);
       }
 
+      if (st->has_prim_query) {
+         nir_if *if_shader_query = nir_push_if(b, nir_load_shader_query_enabled_amd(b));
+         {
+            /* Number of active GS threads. Each has 1 output primitive. */
+            nir_ssa_def *num_gs_threads = nir_bit_count(b, nir_ballot(b, 1, st->wave_size, nir_imm_bool(b, true)));
+            /* Activate only 1 lane and add the number of primitives to GDS. */
+            nir_if *if_elected = nir_push_if(b, nir_elect(b, 1));
+            {
+               /* Use a different GDS offset than NGG GS to ensure that pipeline statistics
+                * queries won't return the number of primitives generated by VS/TES.
+                */
+               nir_gds_atomic_add_amd(b, 32, num_gs_threads, nir_imm_int(b, 4), nir_imm_int(b, 0x100));
+            }
+            nir_pop_if(b, if_elected);
+         }
+         nir_pop_if(b, if_shader_query);
+      }
+
       nir_export_primitive_amd(b, arg);
    }
    nir_pop_if(b, if_gs_thread);
@@ -1350,6 +1369,7 @@ ac_nir_lower_ngg_nogs(nir_shader *shader,
                       bool export_prim_id,
                       bool provoking_vtx_last,
                       bool use_edgeflags,
+                      bool has_prim_query,
                       uint32_t instance_rate_inputs)
 {
    nir_function_impl *impl = nir_shader_get_entrypoint(shader);
@@ -1367,6 +1387,7 @@ ac_nir_lower_ngg_nogs(nir_shader *shader,
       .export_prim_id = export_prim_id,
       .early_prim_export = early_prim_export,
       .use_edgeflags = use_edgeflags,
+      .has_prim_query = has_prim_query,
       .num_vertices_per_primitives = num_vertices_per_primitives,
       .provoking_vtx_idx = provoking_vtx_last ? (num_vertices_per_primitives - 1) : 0,
       .position_value_var = position_value_var,
diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c
index 4dc180f8616..178ca2bf3e3 100644
--- a/src/amd/vulkan/radv_shader.c
+++ b/src/amd/vulkan/radv_shader.c
@@ -1235,7 +1235,8 @@ void radv_lower_ngg(struct radv_device *device, struct radv_pipeline_stage *ngg_
       NIR_PASS_V(nir, ac_nir_lower_ngg_nogs, max_vtx_in, num_vertices_per_prim,
                  info->workgroup_size, info->wave_size, info->has_ngg_culling,
                  info->has_ngg_early_prim_export, info->is_ngg_passthrough, export_prim_id,
-                 pl_key->vs.provoking_vtx_last, false, pl_key->vs.instance_rate_inputs);
+                 pl_key->vs.provoking_vtx_last, false, pl_key->primitives_generated_query,
+                 pl_key->vs.instance_rate_inputs);
    } else if (nir->info.stage == MESA_SHADER_GEOMETRY) {
       assert(info->is_ngg);
       NIR_PASS_V(nir, ac_nir_lower_ngg_gs, info->wave_size, info->workgroup_size,



More information about the mesa-commit mailing list