From 337aaa0ab91f88d9c7ceac1f60e255e26f85552b Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 13 Apr 2026 06:10:37 -0400 Subject: [PATCH] pan,nir: Add cube face intrinsics Reviewed-by: Christoph Pillmayer Reviewed-by: Lorenzo Rossi Part-of: --- src/compiler/nir/nir_divergence_analysis.c | 3 ++ src/compiler/nir/nir_intrinsics.py | 12 +++++++ .../compiler/bifrost/bifrost_compile.c | 31 +++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/src/compiler/nir/nir_divergence_analysis.c b/src/compiler/nir/nir_divergence_analysis.c index f11b4d62f0d..bcdf65ee792 100644 --- a/src/compiler/nir/nir_divergence_analysis.c +++ b/src/compiler/nir/nir_divergence_analysis.c @@ -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: diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index 47a33c7aae7..2aab55ef8f5 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -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 # src[] = { sampler_index } load("sampler_lod_parameters", [1], flags=[CAN_ELIMINATE, CAN_REORDER]) diff --git a/src/panfrost/compiler/bifrost/bifrost_compile.c b/src/panfrost/compiler/bifrost/bifrost_compile.c index e1d36c974f9..1e917d90c9f 100644 --- a/src/panfrost/compiler/bifrost/bifrost_compile.c +++ b/src/panfrost/compiler/bifrost/bifrost_compile.c @@ -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);