radeonsi/vcn: Support VPE with decode processing

Reviewed-by: Ruijing Dong <ruijing.dong@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36755>
This commit is contained in:
David Rosca
2025-01-29 12:53:35 +01:00
committed by Marge Bot
parent 10ac8567de
commit 0df4eed1e2
2 changed files with 32 additions and 0 deletions
@@ -2392,6 +2392,8 @@ static void radeon_dec_destroy(struct pipe_video_codec *decoder)
dec->ws->cs_destroy(&dec->cs);
if (dec->ectx)
dec->ectx->destroy(dec->ectx);
if (dec->vpe)
dec->vpe->destroy(dec->vpe);
if (dec->stream_type == RDECODE_CODEC_JPEG) {
for (i = 0; i < dec->njctx; i++) {
@@ -2588,6 +2590,34 @@ static void send_ref_buffers(struct radeon_decoder *dec)
dec->decode_buffer->valid_buf_flag |= RDECODE_CMDBUF_FLAGS_REF_BUFFER;
}
static int radeon_dec_process_frame(struct pipe_video_codec *decoder,
struct pipe_video_buffer *source,
const struct pipe_vpp_desc *vpp)
{
struct radeon_decoder *dec = (struct radeon_decoder *)decoder;
struct si_screen *sscreen = (struct si_screen *)dec->screen;
if (!dec->vpe && sscreen->info.ip[AMD_IP_VPE].num_queues) {
struct pipe_video_codec templat = {
.profile = PIPE_VIDEO_PROFILE_UNKNOWN,
.entrypoint = PIPE_VIDEO_ENTRYPOINT_PROCESSING,
};
dec->vpe = si_uvd_create_decoder(dec->base.context, &templat);
}
if (!dec->vpe)
return 1;
struct pipe_picture_desc pic = {
.out_fence = vpp->base.out_fence,
};
dec->vpe->begin_frame(dec->vpe, vpp->dst, &pic);
int ret = dec->vpe->process_frame(dec->vpe, source, vpp);
if (ret != 0)
return ret;
return dec->vpe->end_frame(dec->vpe, vpp->dst, &pic);
}
/**
* send cmd for vcn dec
*/
@@ -2864,6 +2894,7 @@ struct pipe_video_codec *radeon_create_decoder(struct pipe_context *context,
dec->base.begin_frame = radeon_dec_begin_frame;
dec->base.decode_macroblock = radeon_dec_decode_macroblock;
dec->base.decode_bitstream = radeon_dec_decode_bitstream;
dec->base.process_frame = radeon_dec_process_frame;
dec->base.end_frame = radeon_dec_end_frame;
dec->base.flush = radeon_dec_flush;
dec->base.fence_wait = radeon_dec_fence_wait;
@@ -152,6 +152,7 @@ struct radeon_decoder {
bool error;
struct pipe_context *ectx;
struct pipe_video_codec *vpe;
};
bool send_cmd_dec(struct radeon_decoder *dec, struct pipe_video_buffer *target,