From 87fa1fdcb245b41190e54d97a377b3c0fc71ed50 Mon Sep 17 00:00:00 2001 From: "David (Ming Qiang) Wu" Date: Tue, 23 Apr 2024 16:21:06 -0400 Subject: [PATCH] radeonsi/vcn: set accurate size for dec header and index_codec Each codec has its own size in the dec message, for example: AVC has sizeof(rvcn_dec_message_avc_t) and AV1 has sizeof(rvcn_dec_message_av1_t) This patch will set the correct size for index_codec section and set the total_size properly for the dec message header. Signed-off-by: David (Ming Qiang) Wu Reviewed-by: Leo Liu Reviewed-by: Boyuan Zhang Part-of: --- src/gallium/drivers/radeonsi/radeon_vcn_dec.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c index f7a4f2c3777..189f3de8074 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c @@ -2002,7 +2002,7 @@ static struct pb_buffer_lean *rvcn_dec_message_decode(struct radeon_decoder *dec header->num_buffers = 1; index_codec->offset = offset_codec; - index_codec->size = sizeof(rvcn_dec_message_avc_t); + index_codec->size = 0; index_codec->filled = 0; ++header->num_buffers; @@ -2252,6 +2252,7 @@ static struct pb_buffer_lean *rvcn_dec_message_decode(struct radeon_decoder *dec rvcn_dec_message_avc_t avc = get_h264_msg(dec, target, (struct pipe_h264_picture_desc *)picture); memcpy(codec, (void *)&avc, sizeof(rvcn_dec_message_avc_t)); index_codec->message_id = RDECODE_MESSAGE_AVC; + index_codec->size = sizeof(rvcn_dec_message_avc_t); break; } case PIPE_VIDEO_FORMAT_HEVC: { @@ -2260,6 +2261,7 @@ static struct pb_buffer_lean *rvcn_dec_message_decode(struct radeon_decoder *dec memcpy(codec, (void *)&hevc, sizeof(rvcn_dec_message_hevc_t)); index_codec->message_id = RDECODE_MESSAGE_HEVC; + index_codec->size = sizeof(rvcn_dec_message_hevc_t); break; } case PIPE_VIDEO_FORMAT_VC1: { @@ -2272,6 +2274,7 @@ static struct pb_buffer_lean *rvcn_dec_message_decode(struct radeon_decoder *dec decode->height_in_samples = align(decode->height_in_samples, 16) / 16; } index_codec->message_id = RDECODE_MESSAGE_VC1; + index_codec->size = sizeof(rvcn_dec_message_vc1_t); break; } case PIPE_VIDEO_FORMAT_MPEG12: { @@ -2280,6 +2283,7 @@ static struct pb_buffer_lean *rvcn_dec_message_decode(struct radeon_decoder *dec memcpy(codec, (void *)&mpeg2, sizeof(rvcn_dec_message_mpeg2_vld_t)); index_codec->message_id = RDECODE_MESSAGE_MPEG2_VLD; + index_codec->size = sizeof(rvcn_dec_message_mpeg2_vld_t); break; } case PIPE_VIDEO_FORMAT_MPEG4: { @@ -2288,6 +2292,7 @@ static struct pb_buffer_lean *rvcn_dec_message_decode(struct radeon_decoder *dec memcpy(codec, (void *)&mpeg4, sizeof(rvcn_dec_message_mpeg4_asp_vld_t)); index_codec->message_id = RDECODE_MESSAGE_MPEG4_ASP_VLD; + index_codec->size = sizeof(rvcn_dec_message_mpeg4_asp_vld_t); break; } case PIPE_VIDEO_FORMAT_VP9: { @@ -2296,6 +2301,7 @@ static struct pb_buffer_lean *rvcn_dec_message_decode(struct radeon_decoder *dec memcpy(codec, (void *)&vp9, sizeof(rvcn_dec_message_vp9_t)); index_codec->message_id = RDECODE_MESSAGE_VP9; + index_codec->size = sizeof(rvcn_dec_message_vp9_t); break; } case PIPE_VIDEO_FORMAT_AV1: { @@ -2304,6 +2310,7 @@ static struct pb_buffer_lean *rvcn_dec_message_decode(struct radeon_decoder *dec memcpy(codec, (void *)&av1, sizeof(rvcn_dec_message_av1_t)); index_codec->message_id = RDECODE_MESSAGE_AV1; + index_codec->size = sizeof(rvcn_dec_message_av1_t); if (dec->ctx.res == NULL) { unsigned frame_ctxt_size = dec->av1_version == RDECODE_AV1_VER_0 @@ -2363,6 +2370,8 @@ static struct pb_buffer_lean *rvcn_dec_message_decode(struct radeon_decoder *dec return NULL; } + header->total_size += index_codec->size; + if (dec->ctx.res) decode->hw_ctxt_size = dec->ctx.res->buf->size;