From f638ba4669f9d37fb3afb0ecaaabeb3cd87c6951 Mon Sep 17 00:00:00 2001 From: David Rosca Date: Mon, 14 Aug 2023 20:31:58 +0200 Subject: [PATCH] radeonsi/vcn: Fix leaking fences in decode Unref fence used in destroy. Don't store the fence reference in picture->fence, instead keep it in the driver. Because only the last fence will now be valid, check the fence pointer in get_decoder_fence. Reviewed-by: Leo Liu Part-of: --- src/gallium/drivers/radeonsi/radeon_vcn_dec.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c index 8974db14eed..b7b5ffda5e9 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_dec.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_dec.c @@ -2740,8 +2740,10 @@ static void radeon_dec_destroy(struct pipe_video_codec *decoder) send_msg_buf(dec); flush(dec, 0, &dec->destroy_fence); dec->ws->fence_wait(dec->ws, dec->destroy_fence, PIPE_DEFAULT_DECODER_FEEDBACK_TIMEOUT_NS); + dec->ws->fence_reference(&dec->destroy_fence, NULL); } + dec->ws->fence_reference(&dec->prev_fence, NULL); dec->ws->cs_destroy(&dec->cs); if (dec->stream_type == RDECODE_CODEC_JPEG) { @@ -2919,9 +2921,9 @@ static void radeon_dec_end_frame(struct pipe_video_codec *decoder, struct pipe_v return; dec->send_cmd(dec, target, picture); - flush(dec, PIPE_FLUSH_ASYNC, picture->fence); + flush(dec, PIPE_FLUSH_ASYNC, &dec->prev_fence); if (picture->fence) - dec->prev_fence = *picture->fence; + *picture->fence = dec->prev_fence; next_buffer(dec); } @@ -2965,6 +2967,9 @@ static int radeon_dec_get_decoder_fence(struct pipe_video_codec *decoder, uint64_t timeout) { struct radeon_decoder *dec = (struct radeon_decoder *)decoder; + /* Only last fence is valid */ + if (fence != dec->prev_fence) + return true; return dec->ws->fence_wait(dec->ws, fence, timeout); }