diff --git a/src/gallium/drivers/radeonsi/radeon_uvd.c b/src/gallium/drivers/radeonsi/radeon_uvd.c index 641676092d3..d7951c39915 100644 --- a/src/gallium/drivers/radeonsi/radeon_uvd.c +++ b/src/gallium/drivers/radeonsi/radeon_uvd.c @@ -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; } diff --git a/src/gallium/drivers/radeonsi/radeon_uvd_enc.c b/src/gallium/drivers/radeonsi/radeon_uvd_enc.c index 2cfb539cc80..1a6972e3494 100644 --- a/src/gallium/drivers/radeonsi/radeon_uvd_enc.c +++ b/src/gallium/drivers/radeonsi/radeon_uvd_enc.c @@ -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; } diff --git a/src/gallium/drivers/radeonsi/radeon_vce.c b/src/gallium/drivers/radeonsi/radeon_vce.c index 9d6f2189f0a..2cdc6e16b47 100644 --- a/src/gallium/drivers/radeonsi/radeon_vce.c +++ b/src/gallium/drivers/radeonsi/radeon_vce.c @@ -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; } diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c index 7b3b7eb90c9..9762236fa84 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c @@ -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; } diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc.c b/src/gallium/drivers/radeonsi/radeon_vcn_enc.c index 8b10a2a4d6e..98848d821ba 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc.c @@ -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; } diff --git a/src/gallium/drivers/radeonsi/radeon_video.c b/src/gallium/drivers/radeonsi/radeon_video.c index fe402b99a9a..17abd82fce9 100644 --- a/src/gallium/drivers/radeonsi/radeon_video.c +++ b/src/gallium/drivers/radeonsi/radeon_video.c @@ -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; } diff --git a/src/gallium/drivers/radeonsi/radeon_video.h b/src/gallium/drivers/radeonsi/radeon_video.h index f470e3644b6..efa5922ae1f 100644 --- a/src/gallium/drivers/radeonsi/radeon_video.h +++ b/src/gallium/drivers/radeonsi/radeon_video.h @@ -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 */