From 58b199f7ed4c653f25788df47ed49932e4234380 Mon Sep 17 00:00:00 2001 From: Job Noorman Date: Thu, 17 Oct 2024 21:44:39 +0200 Subject: [PATCH] nir/lower_subgroups: add build_cluster_mask helper This functionality will become more complex in the next commit so separate it into a helper function. Signed-off-by: Job Noorman Reviewed-by: Alyssa Rosenzweig Reviewed-by: Faith Ekstrand Part-of: --- src/compiler/nir/nir_lower_subgroups.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/compiler/nir/nir_lower_subgroups.c b/src/compiler/nir/nir_lower_subgroups.c index b35e2851bdc..263191d8675 100644 --- a/src/compiler/nir/nir_lower_subgroups.c +++ b/src/compiler/nir/nir_lower_subgroups.c @@ -803,6 +803,16 @@ build_scan_reduce(nir_builder *b, nir_intrinsic_op op, nir_op red_op, } } +static nir_def * +build_cluster_mask(nir_builder *b, unsigned cluster_size) +{ + nir_def *idx = nir_load_subgroup_invocation(b); + nir_def *cluster = nir_iand_imm(b, idx, ~(uint64_t)(cluster_size - 1)); + + nir_def *cluster_mask = nir_imm_int(b, BITFIELD_MASK(cluster_size)); + return nir_ishl(b, cluster_mask, cluster); +} + static nir_def * lower_scan_reduce(nir_builder *b, nir_intrinsic_instr *intrin, unsigned subgroup_size) @@ -830,12 +840,7 @@ lower_scan_reduce(nir_builder *b, nir_intrinsic_instr *intrin, { /* Mask according to the cluster size */ if (cluster_size < subgroup_size) { - nir_def *idx = nir_load_subgroup_invocation(b); - nir_def *cluster = nir_iand_imm(b, idx, ~(uint64_t)(cluster_size - 1)); - - nir_def *cluster_mask = nir_imm_int(b, BITFIELD_MASK(cluster_size)); - cluster_mask = nir_ishl(b, cluster_mask, cluster); - + nir_def *cluster_mask = build_cluster_mask(b, cluster_size); mask = nir_iand(b, mask, cluster_mask); }