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:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user