kk: Support subgroup rotate ops

Rotate is native, clustered rotate is lowered to shuffle since MSL's rotate
does not support clustering.

Reviewed-by: Aitor Camacho <aitor@lunarg.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41186>
This commit is contained in:
squidbus 2026-04-24 01:26:58 -07:00 committed by Marge Bot
parent 2cd9dd1fd7
commit a6352a504f
3 changed files with 12 additions and 0 deletions

View file

@ -20,6 +20,7 @@ needs_bool_widening(nir_intrinsic_instr *intrin)
case nir_intrinsic_quad_swap_horizontal:
case nir_intrinsic_quad_swap_vertical:
case nir_intrinsic_quad_swap_diagonal:
case nir_intrinsic_rotate:
case nir_intrinsic_shuffle:
case nir_intrinsic_shuffle_down:
case nir_intrinsic_shuffle_up:
@ -66,6 +67,8 @@ msl_nir_lower_subgroups(nir_shader *nir)
.lower_relative_shuffle = true,
/* Metal reduce operations do not support certain types or cluster size */
.lower_reduce = true,
/* Metal rotate operations do not support cluster size */
.lower_rotate_clustered_to_shuffle = true,
};
NIR_PASS(_, nir, nir_lower_subgroups, &subgroups_options);
NIR_PASS(_, nir, nir_shader_intrinsics_pass, lower_bool_ops,

View file

@ -183,6 +183,7 @@ update_instr_type(struct hash_table *types, nir_instr *instr, ti_type type)
case nir_intrinsic_quad_swap_horizontal:
case nir_intrinsic_quad_swap_vertical:
case nir_intrinsic_quad_swap_diagonal:
case nir_intrinsic_rotate:
case nir_intrinsic_shuffle:
case nir_intrinsic_shuffle_down:
case nir_intrinsic_shuffle_up:
@ -462,6 +463,7 @@ infer_types_from_intrinsic(struct hash_table *types, nir_intrinsic_instr *instr)
break;
case nir_intrinsic_read_invocation:
case nir_intrinsic_quad_broadcast:
case nir_intrinsic_rotate:
case nir_intrinsic_shuffle:
case nir_intrinsic_shuffle_down:
case nir_intrinsic_shuffle_up:

View file

@ -1471,6 +1471,13 @@ intrinsic_to_msl(struct nir_to_msl_ctx *ctx, nir_intrinsic_instr *instr)
src_to_msl(ctx, &instr->src[1]);
P(ctx, ");");
break;
case nir_intrinsic_rotate:
P(ctx, "simd_shuffle_rotate_down(");
src_to_msl(ctx, &instr->src[0]);
P(ctx, ", ");
src_to_msl(ctx, &instr->src[1]);
P(ctx, ");\n");
break;
case nir_intrinsic_shuffle:
P(ctx, "simd_shuffle(");
src_to_msl(ctx, &instr->src[0]);