From a9df891bc679809ba2d3e9f49ffb60fc2bcf112a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Fri, 6 Feb 2026 12:40:32 -0500 Subject: [PATCH] nir: allow get_ssbo_size to return a 64-bit result to match get_ubo_size, and to support HW where SSBOs can have a 64-bit size. Reviewed-by: Rhys Perry Part-of: --- src/amd/common/nir/ac_nir_lower_resinfo.c | 2 +- src/compiler/nir/nir_intrinsics.py | 2 +- src/compiler/nir/nir_lower_explicit_io.c | 2 +- src/compiler/nir/nir_lower_robust_access.c | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/amd/common/nir/ac_nir_lower_resinfo.c b/src/amd/common/nir/ac_nir_lower_resinfo.c index c56e25c7bb5..3315d3001c9 100644 --- a/src/amd/common/nir/ac_nir_lower_resinfo.c +++ b/src/amd/common/nir/ac_nir_lower_resinfo.c @@ -246,7 +246,7 @@ static bool lower_resinfo(nir_builder *b, nir_instr *instr, void *data) nir_def *desc = nir_ssbo_descriptor_amd(b, intr->src[0].ssa, .access = nir_intrinsic_access(intr)); - result = nir_channel(b, desc, 2); + result = nir_u2uN(b, nir_channel(b, desc, 2), nir_instr_def(instr)->bit_size); } else if (instr->type == nir_instr_type_intrinsic) { nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr); const struct glsl_type *type; diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index 0029d25d0d2..7d82bdb257c 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -450,7 +450,7 @@ intrinsic("deref_implicit_array_length", src_comp=[-1], dest_comp=1, # Ask the driver for the size of a given SSBO. It takes the buffer index # as source. -intrinsic("get_ssbo_size", src_comp=[-1], dest_comp=1, bit_sizes=[32], +intrinsic("get_ssbo_size", src_comp=[-1], dest_comp=1, indices=[ACCESS], flags=[CAN_ELIMINATE, CAN_REORDER]) intrinsic("get_ubo_size", src_comp=[-1], dest_comp=1, indices=[ACCESS], flags=[CAN_ELIMINATE, CAN_REORDER]) diff --git a/src/compiler/nir/nir_lower_explicit_io.c b/src/compiler/nir/nir_lower_explicit_io.c index 61d1c471d54..642ae6c16ac 100644 --- a/src/compiler/nir/nir_lower_explicit_io.c +++ b/src/compiler/nir/nir_lower_explicit_io.c @@ -1690,7 +1690,7 @@ lower_explicit_io_array_length(nir_builder *b, nir_intrinsic_instr *intrin, offset = addr_to_offset(b, addr, addr_format); nir_def *index = addr_to_index(b, addr, addr_format); unsigned access = nir_intrinsic_access(intrin); - size = nir_get_ssbo_size(b, index, .access = access); + size = nir_get_ssbo_size(b, 32, index, .access = access); break; } diff --git a/src/compiler/nir/nir_lower_robust_access.c b/src/compiler/nir/nir_lower_robust_access.c index fa58516046d..b47dfd26dca 100644 --- a/src/compiler/nir/nir_lower_robust_access.c +++ b/src/compiler/nir/nir_lower_robust_access.c @@ -68,7 +68,7 @@ lower_buffer_load(nir_builder *b, nir_intrinsic_instr *instr) if (instr->intrinsic == nir_intrinsic_load_ubo) { size = nir_get_ubo_size(b, 32, index); } else { - size = nir_get_ssbo_size(b, index); + size = nir_get_ssbo_size(b, 32, index); } rewrite_offset(b, instr, type_sz, 1, size); @@ -79,13 +79,13 @@ lower_buffer_store(nir_builder *b, nir_intrinsic_instr *instr) { uint32_t type_sz = nir_src_bit_size(instr->src[0]) / 8; rewrite_offset(b, instr, type_sz, 2, - nir_get_ssbo_size(b, instr->src[1].ssa)); + nir_get_ssbo_size(b, 32, instr->src[1].ssa)); } static void lower_buffer_atomic(nir_builder *b, nir_intrinsic_instr *instr) { - rewrite_offset(b, instr, 4, 1, nir_get_ssbo_size(b, instr->src[0].ssa)); + rewrite_offset(b, instr, 4, 1, nir_get_ssbo_size(b, 32, instr->src[0].ssa)); } static void