From 0df4eed1e24c054acb52d862153fa1166feadbd8 Mon Sep 17 00:00:00 2001 From: David Rosca Date: Wed, 29 Jan 2025 12:53:35 +0100 Subject: [PATCH] radeonsi/vcn: Support VPE with decode processing Reviewed-by: Ruijing Dong Part-of: --- src/gallium/drivers/radeonsi/radeon_vcn_dec.c | 31 +++++++++++++++++++ src/gallium/drivers/radeonsi/radeon_vcn_dec.h | 1 + 2 files changed, 32 insertions(+) diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c index 64d15c5e409..8682402a694 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c @@ -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; diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_dec.h b/src/gallium/drivers/radeonsi/radeon_vcn_dec.h index 78eb09f0b75..092dbb455fe 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_dec.h +++ b/src/gallium/drivers/radeonsi/radeon_vcn_dec.h @@ -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,