pvr, pco: add support for buffer size intrinsic

Signed-off-by: Simon Perretta <simon.perretta@imgtec.com>
Acked-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36412>
This commit is contained in:
Simon Perretta 2025-01-24 14:45:34 +00:00 committed by Marge Bot
parent bcefeef1d1
commit 85ff421d8a
3 changed files with 34 additions and 1 deletions

View file

@ -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;

View file

@ -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 {

View file

@ -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));