radeonsi/video: Change si_vid_resize_buffer to take si_resource

Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37884>
This commit is contained in:
David Rosca 2025-10-15 10:29:27 +02:00 committed by Marge Bot
parent 663eada9b2
commit a25db1c53c
7 changed files with 27 additions and 25 deletions

View file

@ -1039,7 +1039,7 @@ static void ruvd_decode_bitstream(struct pipe_video_codec *decoder,
return;
}
si_vid_destroy_buffer(&old_buf);
} else if (!si_vid_resize_buffer(dec->base.context, buf, total_bs_size, NULL)) {
} else if (!si_vid_resize_buffer(dec->base.context, &buf->res, total_bs_size, NULL)) {
RVID_ERR("Can't resize bitstream buffer!");
return;
}

View file

@ -1082,7 +1082,7 @@ static void radeon_uvd_enc_begin_frame(struct pipe_video_codec *encoder,
RVID_ERR("Can't create DPB buffer.\n");
return;
}
} else if (!si_vid_resize_buffer(enc->base.context, &enc->dpb, dpb_size, NULL)) {
} else if (!si_vid_resize_buffer(enc->base.context, &enc->dpb.res, dpb_size, NULL)) {
RVID_ERR("Can't resize DPB buffer.\n");
return;
}

View file

@ -905,7 +905,7 @@ static void rvce_begin_frame(struct pipe_video_codec *encoder, struct pipe_video
RVID_ERR("Can't create DPB buffer.\n");
return;
}
} else if (!si_vid_resize_buffer(enc->base.context, &enc->dpb, dpb_size, NULL)) {
} else if (!si_vid_resize_buffer(enc->base.context, &enc->dpb.res, dpb_size, NULL)) {
RVID_ERR("Can't resize DPB buffer.\n");
return;
}

View file

@ -1639,7 +1639,7 @@ static struct pb_buffer_lean *rvcn_dec_message_decode(struct radeon_decoder *dec
align(dec->base.height, dec->db_alignment) * 3 / 2);
dec->dpb_size = calc_dpb_size(dec);
r = si_vid_resize_buffer(dec->base.context, &dec->dpb, dec->dpb_size, &buf_offset_info);
r = si_vid_resize_buffer(dec->base.context, &dec->dpb.res, dec->dpb_size, &buf_offset_info);
if (!r) {
RADEON_DEC_ERR("Can't resize dpb.\n");
return NULL;
@ -2516,7 +2516,7 @@ static void radeon_dec_decode_bitstream(struct pipe_video_codec *decoder,
return;
}
si_vid_destroy_buffer(&old_buf);
} else if (!si_vid_resize_buffer(dec->base.context, buf, total_bs_size, NULL)) {
} else if (!si_vid_resize_buffer(dec->base.context, &buf->res, total_bs_size, NULL)) {
RADEON_DEC_ERR("Can't resize bitstream buffer!");
return;
}

View file

@ -1581,12 +1581,12 @@ static void radeon_enc_begin_frame(struct pipe_video_codec *encoder,
if (dpb_slots > enc->dpb_slots) {
setup_dpb(enc, dpb_slots);
if (!si_vid_resize_buffer(enc->base.context, enc->dpb, enc->dpb_size, NULL)) {
if (!si_vid_resize_buffer(enc->base.context, &enc->dpb->res, enc->dpb_size, NULL)) {
RADEON_ENC_ERR("Can't resize DPB buffer.\n");
goto error;
}
if (sscreen->info.vcn_ip_version >= VCN_5_0_0 && enc->metadata_size &&
!si_vid_resize_buffer(enc->base.context, enc->meta, enc->metadata_size, NULL)) {
!si_vid_resize_buffer(enc->base.context, &enc->meta->res, enc->metadata_size, NULL)) {
RADEON_ENC_ERR("Can't resize meta buffer.\n");
goto error;
}

View file

@ -63,25 +63,27 @@ void si_vid_destroy_buffer(struct rvid_buffer *buffer)
/* reallocate a buffer, preserving its content */
bool si_vid_resize_buffer(struct pipe_context *context,
struct rvid_buffer *new_buf, unsigned new_size,
struct si_resource **buf, unsigned new_size,
struct rvid_buf_offset_info *buf_ofst_info)
{
struct si_context *sctx = (struct si_context *)context;
struct si_screen *sscreen = (struct si_screen *)context->screen;
struct radeon_winsys *ws = sscreen->ws;
unsigned bytes = MIN2(new_buf->res->buf->size, new_size);
struct rvid_buffer old_buf = *new_buf;
struct si_resource *new_buf = *buf;
unsigned bytes = MIN2(new_buf->buf->size, new_size);
struct si_resource *old_buf = new_buf;
void *src = NULL, *dst = NULL;
if (!si_vid_create_buffer(context->screen, new_buf, new_size, new_buf->usage))
new_buf = si_resource(pipe_buffer_create(context->screen, old_buf->b.b.bind, old_buf->b.b.usage, new_size));
if (!new_buf)
goto error;
if (old_buf.usage == PIPE_USAGE_STAGING) {
src = ws->buffer_map(ws, old_buf.res->buf, NULL, PIPE_MAP_READ | RADEON_MAP_TEMPORARY);
if (old_buf->b.b.usage == PIPE_USAGE_STAGING) {
src = ws->buffer_map(ws, old_buf->buf, NULL, PIPE_MAP_READ | RADEON_MAP_TEMPORARY);
if (!src)
goto error;
dst = ws->buffer_map(ws, new_buf->res->buf, NULL, PIPE_MAP_WRITE | RADEON_MAP_TEMPORARY);
dst = ws->buffer_map(ws, new_buf->buf, NULL, PIPE_MAP_WRITE | RADEON_MAP_TEMPORARY);
if (!dst)
goto error;
@ -100,33 +102,33 @@ bool si_vid_resize_buffer(struct pipe_context *context,
memset(dst, 0, new_size);
}
}
ws->buffer_unmap(ws, new_buf->res->buf);
ws->buffer_unmap(ws, old_buf.res->buf);
ws->buffer_unmap(ws, new_buf->buf);
ws->buffer_unmap(ws, old_buf->buf);
} else {
si_barrier_before_simple_buffer_op(sctx, 0, &new_buf->res->b.b, &old_buf.res->b.b);
si_barrier_before_simple_buffer_op(sctx, 0, &new_buf->b.b, &old_buf->b.b);
if (buf_ofst_info) {
uint64_t dst_offset = 0, src_offset = 0;
for (int i = 0; i < buf_ofst_info->num_units; i++) {
si_copy_buffer(sctx, &new_buf->res->b.b, &old_buf.res->b.b,
si_copy_buffer(sctx, &new_buf->b.b, &old_buf->b.b,
dst_offset, src_offset, buf_ofst_info->old_offset);
dst_offset += buf_ofst_info->new_offset;
src_offset += buf_ofst_info->old_offset;
}
} else {
bytes = MIN2(new_buf->res->b.b.width0, old_buf.res->b.b.width0);
si_copy_buffer(sctx, &new_buf->res->b.b, &old_buf.res->b.b, 0, 0, bytes);
bytes = MIN2(new_buf->b.b.width0, old_buf->b.b.width0);
si_copy_buffer(sctx, &new_buf->b.b, &old_buf->b.b, 0, 0, bytes);
}
context->flush(context, NULL, 0);
}
si_vid_destroy_buffer(&old_buf);
si_resource_reference(&old_buf, NULL);
*buf = new_buf;
return true;
error:
if (src)
ws->buffer_unmap(ws, old_buf.res->buf);
si_vid_destroy_buffer(new_buf);
*new_buf = old_buf;
ws->buffer_unmap(ws, old_buf->buf);
si_resource_reference(&new_buf, NULL);
return false;
}

View file

@ -51,7 +51,7 @@ void si_vid_destroy_buffer(struct rvid_buffer *buffer);
/* reallocate a buffer, preserving its content */
bool si_vid_resize_buffer(struct pipe_context *context,
struct rvid_buffer *new_buf, unsigned new_size,
struct si_resource **buf, unsigned new_size,
struct rvid_buf_offset_info *buf_ofst_info);
/* clear the buffer with zeros */