Mesa (main): intel/compiler: Lower Task/Mesh local_invocation_{id,index}

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Dec 4 01:33:16 UTC 2021


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

Author: Caio Oliveira <caio.oliveira at intel.com>
Date:   Fri Oct 29 12:48:54 2021 -0700

intel/compiler: Lower Task/Mesh local_invocation_{id,index}

The Invocation index is provided by the payload, so we can skip the
usual math done to get to it.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13661>

---

 src/intel/compiler/brw_mesh.cpp                  | 16 ++++++++++++++++
 src/intel/compiler/brw_nir_lower_cs_intrinsics.c |  8 ++++++++
 2 files changed, 24 insertions(+)

diff --git a/src/intel/compiler/brw_mesh.cpp b/src/intel/compiler/brw_mesh.cpp
index bec636dceee..1de458b01c4 100644
--- a/src/intel/compiler/brw_mesh.cpp
+++ b/src/intel/compiler/brw_mesh.cpp
@@ -255,7 +255,23 @@ fs_visitor::nir_emit_task_mesh_intrinsic(const fs_builder &bld,
 {
    assert(stage == MESA_SHADER_MESH || stage == MESA_SHADER_TASK);
 
+   fs_reg dest;
+   if (nir_intrinsic_infos[instr->intrinsic].has_dest)
+      dest = get_nir_dest(instr->dest);
+
    switch (instr->intrinsic) {
+   case nir_intrinsic_load_local_invocation_index:
+   case nir_intrinsic_load_local_invocation_id:
+      /* Local_ID.X is given by the HW in the shader payload. */
+      dest = retype(dest, BRW_REGISTER_TYPE_UD);
+      bld.MOV(dest, retype(brw_vec8_grf(1, 0), BRW_REGISTER_TYPE_UW));
+      /* Task/Mesh only use one dimension. */
+      if (instr->intrinsic == nir_intrinsic_load_local_invocation_id) {
+         bld.MOV(offset(dest, bld, 1), brw_imm_uw(0));
+         bld.MOV(offset(dest, bld, 2), brw_imm_uw(0));
+      }
+      break;
+
    default:
       nir_emit_cs_intrinsic(bld, instr);
       break;
diff --git a/src/intel/compiler/brw_nir_lower_cs_intrinsics.c b/src/intel/compiler/brw_nir_lower_cs_intrinsics.c
index 1ab3316d31e..962c97759e5 100644
--- a/src/intel/compiler/brw_nir_lower_cs_intrinsics.c
+++ b/src/intel/compiler/brw_nir_lower_cs_intrinsics.c
@@ -68,6 +68,14 @@ lower_cs_intrinsics_convert_block(struct lower_intrinsics_state *state,
 
       case nir_intrinsic_load_local_invocation_index:
       case nir_intrinsic_load_local_invocation_id: {
+         if (nir->info.stage == MESA_SHADER_TASK ||
+             nir->info.stage == MESA_SHADER_MESH) {
+            /* Will be lowered by nir_emit_task_mesh_intrinsic() using
+             * information from the payload.
+             */
+            continue;
+         }
+
          /* First time we are using those, so let's calculate them. */
          if (!local_index) {
             assert(!local_id);



More information about the mesa-commit mailing list