radeon/vcn: Updating render_pic_list for correction
authorRuijing Dong <ruijing.dong@amd.com>
Mon, 24 Jan 2022 18:00:32 +0000 (13:00 -0500)
committerMarge Bot <emma+marge@anholt.net>
Wed, 26 Jan 2022 15:28:55 +0000 (15:28 +0000)
In order to keep track of reference frame buffer address changing,
using past_ref to compare with render_pic_list, once the one in
past_ref is valid and if render_pic_list has that entry, it will
need to update it to the latest one in ref[i].

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/5868

Signed-off-by: Ruijing Dong <ruijing.dong@amd.com>
Reviewed-by: Leo Liu <leo.liu@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14646>

src/gallium/drivers/radeon/radeon_vcn_dec.c [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index 0c06566..1a5015f
@@ -69,6 +69,7 @@ static rvcn_dec_message_avc_t get_h264_msg(struct radeon_decoder *dec,
                                            struct pipe_h264_picture_desc *pic)
 {
    rvcn_dec_message_avc_t result;
+   struct h264_private *private;
    unsigned i, j, k;
 
    memset(&result, 0, sizeof(result));
@@ -165,6 +166,25 @@ static rvcn_dec_message_avc_t get_h264_msg(struct radeon_decoder *dec,
       goto end;
    }
 
+   private = pic->private;
+   for (i = 0; i < ARRAY_SIZE(private->past_ref); i++) {
+      for (k = 0; private->past_ref[i] && (k < ARRAY_SIZE(pic->ref)); k++)
+         if (pic->ref[k] && (private->past_ref[i] == pic->ref[k]))
+            break;
+
+      for (j = 0; private->past_ref[i]
+                     && (k == ARRAY_SIZE(pic->ref))
+                     && (j < ARRAY_SIZE(dec->render_pic_list)); j++) {
+         if (dec->render_pic_list[j]
+                  && (dec->render_pic_list[j] == private->past_ref[i])) {
+            dec->render_pic_list[j] = pic->ref[i];
+            vl_video_buffer_set_associated_data(pic->ref[i], &dec->base,
+                   (void *)(uintptr_t)j, &radeon_dec_destroy_associated_data);
+            break;
+         }
+      }
+   }
+
    for (i = 0; i < ARRAY_SIZE(dec->render_pic_list); i++) {
       for (j = 0; (pic->ref[j] != NULL) && (j < ARRAY_SIZE(dec->render_pic_list)); j++) {
          if (dec->render_pic_list[i] == pic->ref[j])
@@ -1453,7 +1473,7 @@ static unsigned rvcn_dec_dynamic_dpb_t2_message(struct radeon_decoder *dec, rvcn
 
    list_for_each_entry_safe(struct rvcn_dec_dynamic_dpb_t2, d, &dec->dpb_ref_list, list) {
       for (i = 0; i < dec->ref_codec.ref_size; ++i) {
-         if ((dec->ref_codec.ref_list[i] != 0x7f) && (d->index == (dec->ref_codec.ref_list[i] & 0x7f))) {
+         if (((dec->ref_codec.ref_list[i] & 0x7f) != 0x7f) && (d->index == (dec->ref_codec.ref_list[i] & 0x7f))) {
             if (!dummy)
                dummy = d;