From 72b43c0595d41c233d039c32f63120e0c3c27f59 Mon Sep 17 00:00:00 2001 From: Benjamin Cheng Date: Mon, 8 Dec 2025 14:58:40 -0500 Subject: [PATCH] radv/video: Always end ref pic modification list The app-provided arrays should always end with IDC_END, but when overriding we need to end the list with IDC_END as well. Fixes: 2e21eec921f ("radv/video: Fix num_ref_idx_l{0,1} related overrides") Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/14436 Reviewed-by: David Rosca Part-of: --- src/amd/vulkan/radv_video_enc.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/amd/vulkan/radv_video_enc.c b/src/amd/vulkan/radv_video_enc.c index ee761f61b02..d02bdd66636 100644 --- a/src/amd/vulkan/radv_video_enc.c +++ b/src/amd/vulkan/radv_video_enc.c @@ -1131,8 +1131,9 @@ radv_enc_slice_header(struct radv_cmd_buffer *cmd_buffer, const VkVideoEncodeInf radv_enc_code_fixed_bits(cmd_buffer, ref_lists->flags.ref_pic_list_modification_flag_l0, 1); if (ref_lists->flags.ref_pic_list_modification_flag_l0) { + const StdVideoEncodeH264RefListModEntry *entry = NULL; for (unsigned op = 0; op < MIN2(ref_lists->refList0ModOpCount, num_active_l0_refs_minus1 + 1); op++) { - const StdVideoEncodeH264RefListModEntry *entry = &ref_lists->pRefList0ModOperations[op]; + entry = &ref_lists->pRefList0ModOperations[op]; radv_enc_code_ue(cmd_buffer, entry->modification_of_pic_nums_idc); if (entry->modification_of_pic_nums_idc == @@ -1142,13 +1143,17 @@ radv_enc_slice_header(struct radv_cmd_buffer *cmd_buffer, const VkVideoEncodeInf else if (entry->modification_of_pic_nums_idc == STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_LONG_TERM) radv_enc_code_ue(cmd_buffer, entry->long_term_pic_num); } + + if (entry && entry->modification_of_pic_nums_idc != STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_END) + radv_enc_code_ue(cmd_buffer, STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_END); } if (pic->primary_pic_type == STD_VIDEO_H264_PICTURE_TYPE_B) { radv_enc_code_fixed_bits(cmd_buffer, ref_lists->flags.ref_pic_list_modification_flag_l1, 1); if (ref_lists->flags.ref_pic_list_modification_flag_l1) { + const StdVideoEncodeH264RefListModEntry *entry = NULL; for (unsigned op = 0; op < MIN2(ref_lists->refList1ModOpCount, /* num_active_l1_refs_minus1 + */ 1); op++) { - const StdVideoEncodeH264RefListModEntry *entry = &ref_lists->pRefList1ModOperations[op]; + entry = &ref_lists->pRefList1ModOperations[op]; radv_enc_code_ue(cmd_buffer, entry->modification_of_pic_nums_idc); if (entry->modification_of_pic_nums_idc == @@ -1158,6 +1163,9 @@ radv_enc_slice_header(struct radv_cmd_buffer *cmd_buffer, const VkVideoEncodeInf else if (entry->modification_of_pic_nums_idc == STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_LONG_TERM) radv_enc_code_ue(cmd_buffer, entry->long_term_pic_num); } + + if (entry && entry->modification_of_pic_nums_idc != STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_END) + radv_enc_code_ue(cmd_buffer, STD_VIDEO_H264_MODIFICATION_OF_PIC_NUMS_IDC_END); } } }