diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index a80b3a9e291..302a5601cbb 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -601,6 +601,7 @@ radv_shader_compile_to_nir(struct radv_device *device, .lower_quad_broadcast_dynamic = 1, .lower_quad_broadcast_dynamic_to_const = gfx7minus, .lower_shuffle_to_swizzle_amd = 1, + .lower_elect = radv_use_llvm_for_stage(device, stage), }); nir_lower_load_const_to_scalar(nir); diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 2765ad0dae3..e44dc62dbe6 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -4440,6 +4440,7 @@ typedef struct nir_lower_subgroups_options { bool lower_quad:1; bool lower_quad_broadcast_dynamic:1; bool lower_quad_broadcast_dynamic_to_const:1; + bool lower_elect:1; } nir_lower_subgroups_options; bool nir_lower_subgroups(nir_shader *shader, diff --git a/src/compiler/nir/nir_lower_subgroups.c b/src/compiler/nir/nir_lower_subgroups.c index b76e3538e72..ecd3d03a192 100644 --- a/src/compiler/nir/nir_lower_subgroups.c +++ b/src/compiler/nir/nir_lower_subgroups.c @@ -550,6 +550,9 @@ lower_subgroups_instr(nir_builder *b, nir_instr *instr, void *_options) } case nir_intrinsic_elect: { + if (!options->lower_elect) + return NULL; + nir_intrinsic_instr *first = nir_intrinsic_instr_create(b->shader, nir_intrinsic_first_invocation); diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp index 9141b149581..b2561213890 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_nir.cpp @@ -3114,6 +3114,7 @@ Converter::run() struct nir_lower_subgroups_options subgroup_options = { .subgroup_size = 32, .ballot_bit_size = 32, + .lower_elect = true, }; /* prepare for IO lowering */ diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c index 9556186dbc0..472243cfc44 100644 --- a/src/gallium/drivers/radeonsi/si_shader_nir.c +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c @@ -663,6 +663,7 @@ static void si_lower_nir(struct si_screen *sscreen, struct nir_shader *nir) .lower_subgroup_masks = true, .lower_vote_trivial = false, .lower_vote_eq_to_ballot = true, + .lower_elect = true, }; NIR_PASS_V(nir, nir_lower_subgroups, &subgroups_options); diff --git a/src/intel/compiler/brw_nir.c b/src/intel/compiler/brw_nir.c index 2b9194b1292..245003c8dbb 100644 --- a/src/intel/compiler/brw_nir.c +++ b/src/intel/compiler/brw_nir.c @@ -752,6 +752,7 @@ brw_preprocess_nir(const struct brw_compiler *compiler, nir_shader *nir, .lower_vote_trivial = !is_scalar, .lower_shuffle = true, .lower_quad_broadcast_dynamic = true, + .lower_elect = true, }; OPT(nir_lower_subgroups, &subgroups_options);