Mesa (main): nir, spirv: Don't mark NV_mesh_shader primitive indices as per-primitive.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Nov 16 08:20:39 UTC 2021


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

Author: Timur Kristóf <timur.kristof at gmail.com>
Date:   Thu Oct 21 11:24:20 2021 +0200

nir, spirv: Don't mark NV_mesh_shader primitive indices as per-primitive.

They are not per-primitive in NV_mesh_shader, but a flat array.

Signed-off-by: Timur Kristóf <timur.kristof at gmail.com>
Reviewed-by: Caio Oliveira <caio.oliveira at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13466>

---

 src/compiler/nir/nir_gather_info.c | 14 +++++++++++---
 src/compiler/nir/nir_lower_io.c    | 23 ++++++++++++++++++++++-
 src/compiler/spirv/vtn_variables.c | 13 -------------
 3 files changed, 33 insertions(+), 17 deletions(-)

diff --git a/src/compiler/nir/nir_gather_info.c b/src/compiler/nir/nir_gather_info.c
index d1544ee24fe..30df0631008 100644
--- a/src/compiler/nir/nir_gather_info.c
+++ b/src/compiler/nir/nir_gather_info.c
@@ -170,7 +170,10 @@ mark_whole_variable(nir_shader *shader, nir_variable *var,
 {
    const struct glsl_type *type = var->type;
 
-   if (nir_is_arrayed_io(var, shader->info.stage)) {
+   if (nir_is_arrayed_io(var, shader->info.stage) ||
+       /* For NV_mesh_shader. */
+       (shader->info.stage == MESA_SHADER_MESH &&
+        var->data.location == VARYING_SLOT_PRIMITIVE_INDICES)) {
       assert(glsl_type_is_array(type));
       type = glsl_get_array_element(type);
    }
@@ -194,7 +197,8 @@ mark_whole_variable(nir_shader *shader, nir_variable *var,
 }
 
 static unsigned
-get_io_offset(nir_deref_instr *deref, nir_variable *var, bool is_arrayed)
+get_io_offset(nir_deref_instr *deref, nir_variable *var, bool is_arrayed,
+              bool skip_non_arrayed)
 {
    if (var->data.compact) {
       assert(deref->deref_type == nir_deref_type_array);
@@ -210,6 +214,9 @@ get_io_offset(nir_deref_instr *deref, nir_variable *var, bool is_arrayed)
          if (is_arrayed && nir_deref_instr_parent(d)->deref_type == nir_deref_type_var)
             break;
 
+         if (!is_arrayed && skip_non_arrayed)
+            break;
+
          if (!nir_src_is_const(d->arr.index))
             return -1;
 
@@ -240,6 +247,7 @@ try_mask_partial_io(nir_shader *shader, nir_variable *var,
 {
    const struct glsl_type *type = var->type;
    bool is_arrayed = nir_is_arrayed_io(var, shader->info.stage);
+   bool skip_non_arrayed = shader->info.stage == MESA_SHADER_MESH;
 
    if (is_arrayed) {
       assert(glsl_type_is_array(type));
@@ -250,7 +258,7 @@ try_mask_partial_io(nir_shader *shader, nir_variable *var,
    if (var->data.per_view)
       return false;
 
-   unsigned offset = get_io_offset(deref, var, is_arrayed);
+   unsigned offset = get_io_offset(deref, var, is_arrayed, skip_non_arrayed);
    if (offset == -1)
       return false;
 
diff --git a/src/compiler/nir/nir_lower_io.c b/src/compiler/nir/nir_lower_io.c
index 4d459c7d60b..13032579db8 100644
--- a/src/compiler/nir/nir_lower_io.c
+++ b/src/compiler/nir/nir_lower_io.c
@@ -152,6 +152,12 @@ nir_is_arrayed_io(const nir_variable *var, gl_shader_stage stage)
    if (var->data.patch || !glsl_type_is_array(var->type))
       return false;
 
+   if (stage == MESA_SHADER_MESH) {
+      /* NV_mesh_shader: this is flat array for the whole workgroup. */
+      if (var->data.location == VARYING_SLOT_PRIMITIVE_INDICES)
+         return false;
+   }
+
    if (var->data.mode == nir_var_shader_in)
       return stage == MESA_SHADER_GEOMETRY ||
              stage == MESA_SHADER_TESS_CTRL ||
@@ -438,6 +444,13 @@ emit_store(struct lower_io_state *state, nir_ssa_def *data,
       var->data.precision == GLSL_PRECISION_MEDIUM ||
       var->data.precision == GLSL_PRECISION_LOW;
    semantics.per_view = var->data.per_view;
+
+   /* NV_mesh_shader: prevent assigning several slots to primitive indices. */
+   if (b->shader->info.stage == MESA_SHADER_MESH &&
+       var->data.location == VARYING_SLOT_PRIMITIVE_INDICES &&
+       !nir_is_arrayed_io(var, b->shader->info.stage))
+      semantics.num_slots = 1;
+
    nir_intrinsic_set_io_semantics(store, semantics);
 
    nir_builder_instr_insert(b, &store->instr);
@@ -2684,6 +2697,15 @@ add_const_offset_to_base_block(nir_block *block, nir_builder *b,
 
       if (((modes & nir_var_shader_in) && is_input(intrin)) ||
           ((modes & nir_var_shader_out) && is_output(intrin))) {
+         nir_io_semantics sem = nir_intrinsic_io_semantics(intrin);
+
+         /* NV_mesh_shader: ignore MS primitive indices. */
+         if (b->shader->info.stage == MESA_SHADER_MESH &&
+             sem.location == VARYING_SLOT_PRIMITIVE_INDICES &&
+             !(b->shader->info.per_primitive_outputs &
+               BITFIELD64_BIT(VARYING_SLOT_PRIMITIVE_INDICES)))
+            continue;
+
          nir_src *offset = nir_get_io_offset_src(intrin);
 
          /* TODO: Better handling of per-view variables here */
@@ -2693,7 +2715,6 @@ add_const_offset_to_base_block(nir_block *block, nir_builder *b,
 
             nir_intrinsic_set_base(intrin, nir_intrinsic_base(intrin) + off);
 
-            nir_io_semantics sem = nir_intrinsic_io_semantics(intrin);
             sem.location += off;
             /* non-indirect indexing should reduce num_slots */
             sem.num_slots = is_dual_slot(intrin) ? 2 : 1;
diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c
index 8657d5b81b2..894b74bc060 100644
--- a/src/compiler/spirv/vtn_variables.c
+++ b/src/compiler/spirv/vtn_variables.c
@@ -1329,19 +1329,6 @@ gather_var_kind_cb(struct vtn_builder *b, struct vtn_value *val, int member,
    case SpvDecorationPerPrimitiveNV:
       vtn_var->var->data.per_primitive = true;
       break;
-   case SpvDecorationBuiltIn:
-      if (b->shader->info.stage == MESA_SHADER_MESH) {
-         SpvBuiltIn builtin = dec->operands[0];
-         switch (builtin) {
-         case SpvBuiltInPrimitiveIndicesNV:
-            vtn_var->var->data.per_primitive = true;
-            break;
-         default:
-            /* Nothing to do. */
-            break;
-         }
-      }
-      break;
    default:
       /* Nothing to do. */
       break;



More information about the mesa-commit mailing list