Mesa (staging/22.1): ac/nir/ngg: add a barrier before prim id export

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jul 27 23:25:25 UTC 2022


Module: Mesa
Branch: staging/22.1
Commit: 1b4e99e9298c4462798f75a1f6cf838d0c3bff94
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=1b4e99e9298c4462798f75a1f6cf838d0c3bff94

Author: Qiang Yu <yuq825 at gmail.com>
Date:   Tue Jun 28 16:18:21 2022 +0800

ac/nir/ngg: add a barrier before prim id export

When culling enabled, it will use LDS space, which overlap with
the prim id export.

Fixes: e97f0463a8f ("ac/nir: Implement NGG deferred attribute culling in NIR.")
Reviewed-by: Timur Kristóf <timur.kristof at gmail.com>
Signed-off-by: Qiang Yu <yuq825 at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17593>
(cherry picked from commit eeaf0b1888810042d335f609695bceaa2368b42f)

 Conflicts:
	src/amd/common/ac_nir_lower_ngg.c

---

 .pick_status.json                 |  2 +-
 src/amd/common/ac_nir_lower_ngg.c | 15 ++++++++++++++-
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index f1c06373618..acc1d2e4f59 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -4873,7 +4873,7 @@
         "description": "ac/nir/ngg: add a barrier before prim id export",
         "nominated": true,
         "nomination_type": 1,
-        "resolution": 0,
+        "resolution": 1,
         "main_sha": null,
         "because_sha": "e97f0463a8f55d5d407178f74b0cdb916a42aef8"
     },
diff --git a/src/amd/common/ac_nir_lower_ngg.c b/src/amd/common/ac_nir_lower_ngg.c
index 4430c626309..4e921ec5a70 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 can_cull;
    unsigned wave_size;
    unsigned max_num_waves;
    unsigned num_vertices_per_primitives;
@@ -374,6 +375,17 @@ emit_ngg_nogs_prim_exp_arg(nir_builder *b, lower_ngg_nogs_state *st)
 static void
 emit_ngg_nogs_prim_export(nir_builder *b, lower_ngg_nogs_state *st, nir_ssa_def *arg)
 {
+   bool need_prim_id_store_shared =
+      st->export_prim_id && b->shader->info.stage == MESA_SHADER_VERTEX;
+
+   /* Add barrier if LDS is already used by culling and we need LDS for prim id here. */
+   if (st->can_cull && need_prim_id_store_shared) {
+      nir_scoped_barrier(b, .execution_scope = NIR_SCOPE_WORKGROUP,
+                            .memory_scope = NIR_SCOPE_WORKGROUP,
+                            .memory_semantics = NIR_MEMORY_ACQ_REL,
+                            .memory_modes = nir_var_mem_shared);
+   }
+
    nir_ssa_def *gs_thread = st->gs_accepted_var
                             ? nir_load_var(b, st->gs_accepted_var)
                             : nir_has_input_primitive_amd(b);
@@ -383,7 +395,7 @@ emit_ngg_nogs_prim_export(nir_builder *b, lower_ngg_nogs_state *st, nir_ssa_def
       if (!arg)
          arg = emit_ngg_nogs_prim_exp_arg(b, st);
 
-      if (st->export_prim_id && b->shader->info.stage == MESA_SHADER_VERTEX) {
+      if (need_prim_id_store_shared) {
          nir_ssa_def *prim_valid = nir_ieq_imm(b, nir_ushr_imm(b, arg, 31), 0);
          nir_if *if_prim_valid = nir_push_if(b, prim_valid);
          {
@@ -1322,6 +1334,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,
+      .can_cull = can_cull,
       .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,



More information about the mesa-commit mailing list