From 171bdd2ec66221368599eb3e8cbf4b9164e626f7 Mon Sep 17 00:00:00 2001 From: Caio Oliveira Date: Fri, 29 Oct 2021 12:48:54 -0700 Subject: [PATCH] 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 Part-of: --- 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);