pan,nir: Add cube face intrinsics

Reviewed-by: Christoph Pillmayer <christoph.pillmayer@arm.com>
Reviewed-by: Lorenzo Rossi <lorenzo.rossi@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41036>
This commit is contained in:
Faith Ekstrand 2026-04-13 06:10:37 -04:00 committed by Marge Bot
parent c99f97efd3
commit 337aaa0ab9
3 changed files with 46 additions and 0 deletions

View file

@ -769,6 +769,9 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state)
case nir_intrinsic_load_global_cvt_pan:
case nir_intrinsic_lea_attr_pan:
case nir_intrinsic_lea_buf_pan:
case nir_intrinsic_cubeface_pan:
case nir_intrinsic_cube_ssel_pan:
case nir_intrinsic_cube_tsel_pan:
case nir_intrinsic_atomic_counter_read:
case nir_intrinsic_atomic_counter_read_deref:
case nir_intrinsic_is_sparse_texels_resident:

View file

@ -1733,6 +1733,18 @@ store("raw_output_pan", [], [IO_SEMANTICS, BASE])
store("combined_output_pan", [1, 1, 1, 4], [IO_SEMANTICS, COMPONENT, SRC_TYPE, DEST_TYPE])
load("raw_output_pan", [1], [IO_SEMANTICS], [CAN_ELIMINATE, CAN_REORDER])
# Returns a vec2 which is the result of CUBEFACE1/2
# src = { x, y, z }
intrinsic("cubeface_pan", [1, 1, 1], dest_comp=2, bit_sizes=[32],
flags=[CAN_ELIMINATE, CAN_REORDER])
# src = { z, x, face }
intrinsic("cube_ssel_pan", [1, 1, 1], dest_comp=1, bit_sizes=[32],
flags=[CAN_ELIMINATE, CAN_REORDER])
# src = { y, z, face }
intrinsic("cube_tsel_pan", [1, 1, 1], dest_comp=1, bit_sizes=[32],
flags=[CAN_ELIMINATE, CAN_REORDER])
# Loads the sampler paramaters <min_lod, max_lod, lod_bias>
# src[] = { sampler_index }
load("sampler_lod_parameters", [1], flags=[CAN_ELIMINATE, CAN_REORDER])

View file

@ -2198,6 +2198,37 @@ bi_emit_intrinsic(bi_builder *b, nir_intrinsic_instr *instr)
b->shader->info.has_ld_gclk_instr = true;
break;
case nir_intrinsic_cubeface_pan: {
bi_index x = bi_src_index(&instr->src[0]);
bi_index y = bi_src_index(&instr->src[1]);
bi_index z = bi_src_index(&instr->src[2]);
bi_index max_xyz = bi_temp(b->shader);
bi_index inf_face = bi_temp(b->shader);
/* Use a pseudo op on Bifrost due to tuple restrictions */
if (b->shader->arch <= 8) {
bi_cubeface_to(b, max_xyz, inf_face, x, y, z);
} else {
bi_cubeface1_to(b, max_xyz, x, y, z);
bi_cubeface2_v9_to(b, inf_face, x, y, z);
}
bi_collect_v2i32_to(b, dst, max_xyz, inf_face);
break;
}
case nir_intrinsic_cube_ssel_pan:
bi_cube_ssel_to(b, dst, bi_src_index(&instr->src[0]),
bi_src_index(&instr->src[1]),
bi_src_index(&instr->src[2]));
break;
case nir_intrinsic_cube_tsel_pan:
bi_cube_tsel_to(b, dst, bi_src_index(&instr->src[0]),
bi_src_index(&instr->src[1]),
bi_src_index(&instr->src[2]));
break;
case nir_intrinsic_ddx:
case nir_intrinsic_ddx_fine:
bi_emit_derivative(b, dst, instr, 1, false);