From 843bdd226268880b26629f9605e0217a0b379f48 Mon Sep 17 00:00:00 2001 From: Boyuan Zhang Date: Thu, 19 Jan 2023 23:22:20 -0500 Subject: [PATCH] radeonsi/vcn: check fence before destroying dpb 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 Reviewed-by: Leo Liu Reviewed-by: Sajeesh Sidharthan Part-of: --- src/gallium/drivers/radeonsi/radeon_vcn_dec.c | 2 ++ src/gallium/drivers/radeonsi/radeon_vcn_dec.h | 1 + 2 files changed, 3 insertions(+) diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c index 33dfc9b..7e52a1e 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c @@ -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); } diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_dec.h b/src/gallium/drivers/radeonsi/radeon_vcn_dec.h index 41b55f8..b9d2f0d 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_dec.h +++ b/src/gallium/drivers/radeonsi/radeon_vcn_dec.h @@ -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, -- 2.7.4