mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-26 10:40:11 +01:00
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:
parent
bcefeef1d1
commit
85ff421d8a
3 changed files with 34 additions and 1 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue