radeonsi/vcn: set current pic index correctly

video corruption observed while running decode test for av1
content in chromeos.

solution is when target buffer is found in render pic list and when
target codec is null, set curr_pic_indx as index to the
pic in render pic list.

Cc: mesa-stable
Signed-off-by: Sajeesh Sidharthan <sajeesh.sidharthan@amd.com>
Reviewed-by: Boyuan Zhang <Boyuan.Zhang@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20000>
(cherry picked from commit 8b99e96dc8)
This commit is contained in:
Sajeesh Sidharthan 2022-11-24 13:59:46 -08:00 committed by Dylan Baker
parent c837ae5027
commit f73fc14feb
2 changed files with 28 additions and 31 deletions

View file

@ -175,7 +175,7 @@
"description": "radeonsi/vcn: set current pic index correctly",
"nominated": true,
"nomination_type": 0,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": null
},

View file

@ -63,6 +63,30 @@ static void radeon_dec_destroy_associated_data(void *data)
/* NOOP, since we only use an intptr */
}
static void get_current_pic_index(struct radeon_decoder *dec,
struct pipe_video_buffer *target,
unsigned char *curr_pic_idx)
{
for (int i = 0; i < ARRAY_SIZE(dec->render_pic_list); ++i) {
if (dec->render_pic_list[i] && dec->render_pic_list[i] == target) {
if (target->codec != NULL)
*curr_pic_idx = (uintptr_t)vl_video_buffer_get_associated_data(target, &dec->base);
else {
*curr_pic_idx = i;
vl_video_buffer_set_associated_data(target, &dec->base, (void *)(uintptr_t)i,
&radeon_dec_destroy_associated_data);
}
break;
} else if (!dec->render_pic_list[i]) {
dec->render_pic_list[i] = target;
*curr_pic_idx = i;
vl_video_buffer_set_associated_data(target, &dec->base, (void *)(uintptr_t)i,
&radeon_dec_destroy_associated_data);
break;
}
}
}
static rvcn_dec_message_avc_t get_h264_msg(struct radeon_decoder *dec,
struct pipe_video_buffer *target,
struct pipe_h264_picture_desc *pic)
@ -637,24 +661,7 @@ static rvcn_dec_message_vp9_t get_vp9_msg(struct radeon_decoder *dec,
}
}
for (i = 0; i < ARRAY_SIZE(dec->render_pic_list); ++i) {
if (dec->render_pic_list[i] && dec->render_pic_list[i] == target) {
if (target->codec != NULL) {
result.curr_pic_idx =(uintptr_t)vl_video_buffer_get_associated_data(target, &dec->base);
} else {
result.curr_pic_idx = i;
vl_video_buffer_set_associated_data(target, &dec->base, (void *)(uintptr_t)i,
&radeon_dec_destroy_associated_data);
}
break;
} else if (!dec->render_pic_list[i]) {
dec->render_pic_list[i] = target;
result.curr_pic_idx = i;
vl_video_buffer_set_associated_data(target, &dec->base, (void *)(uintptr_t)i,
&radeon_dec_destroy_associated_data);
break;
}
}
get_current_pic_index(dec, target, &result.curr_pic_idx);
for (i = 0; i < 8; i++) {
result.ref_frame_map[i] =
@ -880,18 +887,8 @@ static rvcn_dec_message_av1_t get_av1_msg(struct radeon_decoder *dec,
result.is_annexb = 0;
result.frame_type = pic->picture_parameter.pic_info_fields.frame_type;
result.primary_ref_frame = pic->picture_parameter.primary_ref_frame;
for (i = 0; i < ARRAY_SIZE(dec->render_pic_list); ++i) {
if (dec->render_pic_list[i] && dec->render_pic_list[i] == target) {
result.curr_pic_idx = (uintptr_t)vl_video_buffer_get_associated_data(target, &dec->base);
break;
} else if (!dec->render_pic_list[i]) {
dec->render_pic_list[i] = target;
result.curr_pic_idx = dec->ref_idx;
vl_video_buffer_set_associated_data(target, &dec->base, (void *)(uintptr_t)dec->ref_idx++,
&radeon_dec_destroy_associated_data);
break;
}
}
get_current_pic_index(dec, target, &result.curr_pic_idx);
result.sb_size = pic->picture_parameter.seq_info_fields.use_128x128_superblock;
result.interp_filter = pic->picture_parameter.interp_filter;