radeonsi/vcn: check fence before destroying dpb
authorBoyuan Zhang <boyuan.zhang@amd.com>
Fri, 20 Jan 2023 04:22:20 +0000 (23:22 -0500)
committerMarge Bot <emma+marge@anholt.net>
Mon, 23 Jan 2023 17:46:54 +0000 (17:46 +0000)
Add a fence_wait before destroying dpb buffer in dpg_unref_list to make sure
previous decode job has been done. (for DPB_DYNAMIC_TIER_2)

Signed-off-by: Boyuan Zhang <boyuan.zhang@amd.com>
Reviewed-by: Leo Liu <leo.liu@amd.com>
Reviewed-by: Sajeesh Sidharthan <sajeesh.sidharthan@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20805>

src/gallium/drivers/radeonsi/radeon_vcn_dec.c
src/gallium/drivers/radeonsi/radeon_vcn_dec.h

index 33dfc9b..7e52a1e 100644 (file)
@@ -1871,6 +1871,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_unref_list, list) {
+      dec->ws->fence_wait(dec->ws, dec->prev_fence, PIPE_DEFAULT_DECODER_FEEDBACK_TIMEOUT_NS);
       list_del(&d->list);
       si_vid_destroy_buffer(&d->dpb);
       FREE(d);
@@ -2906,6 +2907,7 @@ static void radeon_dec_end_frame(struct pipe_video_codec *decoder, struct pipe_v
 
    dec->send_cmd(dec, target, picture);
    flush(dec, PIPE_FLUSH_ASYNC, picture->fence);
+   dec->prev_fence = *picture->fence;
    next_buffer(dec);
 }
 
index 41b55f8..b9d2f0d 100644 (file)
@@ -114,6 +114,7 @@ struct radeon_decoder {
    struct radeon_winsys_ctx **jctx;
    unsigned cb_idx;
    unsigned njctx;
+   struct pipe_fence_handle *prev_fence;
 };
 
 void send_cmd_dec(struct radeon_decoder *dec, struct pipe_video_buffer *target,