bool lower_shuffle:1;
bool lower_shuffle_to_32bit:1;
bool lower_quad:1;
+ bool lower_quad_broadcast_dynamic:1;
} nir_lower_subgroups_options;
bool nir_lower_subgroups(nir_shader *shader,
case nir_intrinsic_quad_swap_horizontal:
case nir_intrinsic_quad_swap_vertical:
case nir_intrinsic_quad_swap_diagonal:
- if (options->lower_quad)
+ if (options->lower_quad ||
+ (options->lower_quad_broadcast_dynamic &&
+ intrin->intrinsic == nir_intrinsic_quad_broadcast &&
+ !nir_src_is_const(intrin->src[1])))
return lower_shuffle(b, intrin, options->lower_to_scalar, false);
else if (options->lower_to_scalar && intrin->num_components > 1)
return lower_subgroup_op_to_scalar(b, intrin, false);
.lower_to_scalar = true,
.lower_vote_trivial = !is_scalar,
.lower_shuffle = true,
+ .lower_quad_broadcast_dynamic = true,
};
OPT(nir_lower_subgroups, &subgroups_options);