From c99f97efd37eb93e6632d2273059275d9a425986 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 13 Apr 2026 04:45:39 -0400 Subject: [PATCH] panfrost: Add and use a new pan_nir_res_handle() helper Reviewed-by: Christoph Pillmayer Reviewed-by: Lorenzo Rossi Part-of: --- .../drivers/panfrost/pan_nir_lower_res_indices.c | 13 ++++++------- src/panfrost/compiler/pan_nir.h | 12 ++++++++++++ .../vulkan/panvk_vX_nir_lower_descriptors.c | 5 ++--- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_nir_lower_res_indices.c b/src/gallium/drivers/panfrost/pan_nir_lower_res_indices.c index 4c767941902..2f4274a12a5 100644 --- a/src/gallium/drivers/panfrost/pan_nir_lower_res_indices.c +++ b/src/gallium/drivers/panfrost/pan_nir_lower_res_indices.c @@ -7,6 +7,7 @@ #include "genxml/gen_macros.h" #include "pan_context.h" #include "pan_shader.h" +#include "pan_nir.h" static bool lower_tex(nir_builder *b, nir_tex_instr *tex) @@ -17,8 +18,7 @@ lower_tex(nir_builder *b, nir_tex_instr *tex) nir_def *sampler_offset = nir_steal_tex_src(tex, nir_tex_src_sampler_offset); if (tex_offset != NULL) { - tex_offset = - nir_ior_imm(b, tex_offset, pan_res_handle(PAN_TABLE_TEXTURE, 0)); + tex_offset = pan_nir_res_handle(b, PAN_TABLE_TEXTURE, 0, tex_offset); nir_tex_instr_add_src(tex, nir_tex_src_texture_offset, tex_offset); } else { tex->texture_index = @@ -32,7 +32,7 @@ lower_tex(nir_builder *b, nir_tex_instr *tex) tex->sampler_index = pan_res_handle(PAN_TABLE_SAMPLER, 0); } else if (sampler_offset != NULL) { sampler_offset = - nir_ior_imm(b, sampler_offset, pan_res_handle(PAN_TABLE_SAMPLER, 0)); + pan_nir_res_handle(b, PAN_TABLE_SAMPLER, 0, sampler_offset); nir_tex_instr_add_src(tex, nir_tex_src_sampler_offset, sampler_offset); } else { tex->sampler_index = @@ -49,7 +49,7 @@ lower_image_intrin(nir_builder *b, nir_intrinsic_instr *intrin) nir_src *tex_handle = &intrin->src[0]; nir_def *new_handle = - nir_ior_imm(b, tex_handle->ssa, pan_res_handle(PAN_TABLE_IMAGE, 0)); + pan_nir_res_handle(b, PAN_TABLE_IMAGE, 0, tex_handle->ssa); nir_src_rewrite(tex_handle, new_handle); return true; @@ -80,7 +80,7 @@ lower_load_ubo_intrin(nir_builder *b, nir_intrinsic_instr *intrin) b->cursor = nir_before_instr(&intrin->instr); nir_def *new_offset = - nir_ior_imm(b, intrin->src[0].ssa, pan_res_handle(PAN_TABLE_UBO, 0)); + pan_nir_res_handle(b, PAN_TABLE_UBO, 0, intrin->src[0].ssa); nir_src_rewrite(&intrin->src[0], new_offset); @@ -94,8 +94,7 @@ lower_ssbo_intrin(nir_builder *b, nir_intrinsic_instr *intrin) bool is_store = intrin->intrinsic == nir_intrinsic_store_ssbo; nir_src *handle = &intrin->src[is_store ? 1 : 0]; - nir_def *new_handle = nir_ior_imm(b, handle->ssa, - pan_res_handle(PAN_TABLE_SSBO, 0)); + nir_def *new_handle = pan_nir_res_handle(b, PAN_TABLE_SSBO, 0, handle->ssa); nir_src_rewrite(handle, new_handle); diff --git a/src/panfrost/compiler/pan_nir.h b/src/panfrost/compiler/pan_nir.h index 1cf2cff291f..deb8cbbba3c 100644 --- a/src/panfrost/compiler/pan_nir.h +++ b/src/panfrost/compiler/pan_nir.h @@ -45,6 +45,18 @@ pan_nir_tile_default_coverage(nir_builder *b) return nir_iand_imm(b, nir_load_cumulative_coverage_pan(b), 0x1f); } +static inline nir_def * +pan_nir_res_handle(nir_builder *b, uint32_t table, + uint32_t index, nir_def *offset) +{ + if (offset) { + return nir_ior_imm(b, nir_iadd_imm(b, offset, index), + pan_res_handle(table, 0)); + } else { + return nir_imm_int(b, pan_res_handle(table, index)); + } +} + bool pan_nir_lower_bool_to_bitsize(nir_shader *shader); bool pan_nir_lower_vertex_id(nir_shader *shader); diff --git a/src/panfrost/vulkan/panvk_vX_nir_lower_descriptors.c b/src/panfrost/vulkan/panvk_vX_nir_lower_descriptors.c index 5888e67a164..4648d7e43e4 100644 --- a/src/panfrost/vulkan/panvk_vX_nir_lower_descriptors.c +++ b/src/panfrost/vulkan/panvk_vX_nir_lower_descriptors.c @@ -18,8 +18,7 @@ #include "vk_pipeline_layout.h" #include "util/bitset.h" -#include "nir.h" -#include "nir_builder.h" +#include "pan_nir.h" #if PAN_ARCH >= 9 #define VALHALL_RESOURCE_TABLE_IDX 62 @@ -548,7 +547,7 @@ load_resource_deref_desc(nir_builder *b, nir_deref_instr *deref, /* note that user sets start from index 1 */ return nir_load_ubo( b, num_components, bit_size, - nir_imm_int(b, pan_res_handle(VALHALL_RESOURCE_TABLE_IDX, set + 1)), + pan_nir_res_handle(b, VALHALL_RESOURCE_TABLE_IDX, set + 1, NULL), set_offset, .range = ~0u, .align_mul = PANVK_DESCRIPTOR_SIZE, .align_offset = desc_offset); #endif