From 85ff421d8a4e2bc8b9371a0c66079856d127cfce Mon Sep 17 00:00:00 2001 From: Simon Perretta Date: Fri, 24 Jan 2025 14:45:34 +0000 Subject: [PATCH] pvr, pco: add support for buffer size intrinsic Signed-off-by: Simon Perretta Acked-by: Erik Faye-Lund Part-of: --- src/imagination/pco/pco_trans_nir.c | 27 +++++++++++++++++++++ src/imagination/vulkan/pvr_common.h | 4 ++- src/imagination/vulkan/pvr_descriptor_set.c | 4 +++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/imagination/pco/pco_trans_nir.c b/src/imagination/pco/pco_trans_nir.c index 4590ba9d702..cab4f7d5e3b 100644 --- a/src/imagination/pco/pco_trans_nir.c +++ b/src/imagination/pco/pco_trans_nir.c @@ -534,6 +534,28 @@ static pco_instr *trans_load_buffer(trans_ctx *tctx, addr); } +static pco_instr * +trans_get_buffer_size(trans_ctx *tctx, nir_intrinsic_instr *intr, pco_ref dest) +{ + const pco_common_data *common = &tctx->shader->data.common; + + ASSERTED unsigned chans = pco_ref_get_chans(dest); + ASSERTED unsigned bits = pco_ref_get_bits(dest); + + assert(chans == 1); + assert(bits == 32); + + uint32_t packed_desc = nir_src_comp_as_uint(intr->src[0], 0); + unsigned elem = nir_src_comp_as_uint(intr->src[0], 1); + unsigned sh_index = + fetch_resource_base_reg_packed(common, packed_desc, elem, NULL); + + pco_ref size_reg = pco_ref_hwreg(sh_index, PCO_REG_CLASS_SHARED); + size_reg = pco_ref_offset(size_reg, 2); + + return pco_mov(&tctx->b, dest, size_reg); +} + static pco_instr *trans_store_buffer(trans_ctx *tctx, nir_intrinsic_instr *intr, pco_ref data_src, @@ -934,6 +956,11 @@ static pco_instr *trans_intr(trans_ctx *tctx, nir_intrinsic_instr *intr) instr = trans_load_buffer(tctx, intr, dest, src[1]); break; + case nir_intrinsic_get_ubo_size: + case nir_intrinsic_get_ssbo_size: + instr = trans_get_buffer_size(tctx, intr, dest); + break; + case nir_intrinsic_store_ssbo: instr = trans_store_buffer(tctx, intr, src[0], src[2]); break; diff --git a/src/imagination/vulkan/pvr_common.h b/src/imagination/vulkan/pvr_common.h index 1210a8d90db..10b1c38e2a2 100644 --- a/src/imagination/vulkan/pvr_common.h +++ b/src/imagination/vulkan/pvr_common.h @@ -193,8 +193,10 @@ enum pvr_query_type { struct pvr_buffer_descriptor { uint64_t addr; + uint32_t size; + uint32_t rsvd; } PACKED; -static_assert(sizeof(struct pvr_buffer_descriptor) == 2 * sizeof(uint32_t), +static_assert(sizeof(struct pvr_buffer_descriptor) == 4 * sizeof(uint32_t), "pvr_buffer_descriptor size is invalid."); struct pvr_sampler_descriptor { diff --git a/src/imagination/vulkan/pvr_descriptor_set.c b/src/imagination/vulkan/pvr_descriptor_set.c index 9c5b8ad0eaa..6ec587a4bb9 100644 --- a/src/imagination/vulkan/pvr_descriptor_set.c +++ b/src/imagination/vulkan/pvr_descriptor_set.c @@ -477,8 +477,12 @@ write_buffer(const struct pvr_descriptor_set *set, const pvr_dev_addr_t buffer_addr = PVR_DEV_ADDR_OFFSET(buffer->dev_addr, buffer_info->offset); + UNUSED uint32_t range = + vk_buffer_range(&buffer->vk, buffer_info->offset, buffer_info->range); + const struct pvr_buffer_descriptor buffer_desc = { .addr = buffer_addr.addr, + .size = range, }; memcpy(desc_mapping, &buffer_desc, sizeof(buffer_desc));