From 435139d196f8c6ac9acb0852aa36eae368f35e30 Mon Sep 17 00:00:00 2001 From: Daniel Almeida Date: Sun, 4 Dec 2022 09:25:45 -0300 Subject: [PATCH] r600: uvd: implement the get_decoder_fence vfunc Implement the get_decoder_fence vfunc by waiting on the fence previously passed in picture->fence in the end_frame vfunc. Signed-off-by: Daniel Almeida Reviewed-by: Leo Liu Reviewed-by: Boyuan Zhang Part-of: --- src/gallium/drivers/r600/radeon_uvd.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/r600/radeon_uvd.c b/src/gallium/drivers/r600/radeon_uvd.c index e4971c3d5c0..35471e51d6a 100644 --- a/src/gallium/drivers/r600/radeon_uvd.c +++ b/src/gallium/drivers/r600/radeon_uvd.c @@ -100,9 +100,9 @@ struct ruvd_decoder { }; /* flush IB to the hardware */ -static int flush(struct ruvd_decoder *dec, unsigned flags) -{ - return dec->ws->cs_flush(&dec->cs, flags, NULL); +static int flush(struct ruvd_decoder *dec, unsigned flags, + struct pipe_fence_handle **fence) { + return dec->ws->cs_flush(&dec->cs, flags, fence); } /* add a new set register command to the IB */ @@ -807,7 +807,7 @@ static void ruvd_destroy(struct pipe_video_codec *decoder) dec->msg->stream_handle = dec->stream_handle; send_msg_buf(dec); - flush(dec, 0); + flush(dec, 0, NULL); dec->ws->cs_destroy(&dec->cs); @@ -1017,7 +1017,7 @@ static void ruvd_end_frame(struct pipe_video_codec *decoder, FB_BUFFER_OFFSET + dec->fb_size, RADEON_USAGE_READ, RADEON_DOMAIN_GTT); set_reg(dec, dec->reg.cntl, 1); - flush(dec, PIPE_FLUSH_ASYNC); + flush(dec, PIPE_FLUSH_ASYNC, picture->fence); next_buffer(dec); } @@ -1028,6 +1028,14 @@ static void ruvd_flush(struct pipe_video_codec *decoder) { } +static int ruvd_get_decoder_fence(struct pipe_video_codec *decoder, + struct pipe_fence_handle *fence, + uint64_t timeout) { + + struct ruvd_decoder *dec = (struct ruvd_decoder *)decoder; + return dec->ws->fence_wait(dec->ws, fence, timeout); +} + /** * create and UVD decoder */ @@ -1084,6 +1092,7 @@ struct pipe_video_codec *ruvd_create_decoder(struct pipe_context *context, dec->base.decode_bitstream = ruvd_decode_bitstream; dec->base.end_frame = ruvd_end_frame; dec->base.flush = ruvd_flush; + dec->base.get_decoder_fence = ruvd_get_decoder_fence; dec->stream_type = profile2stream_type(dec, info.family); dec->set_dtb = set_dtb; @@ -1142,7 +1151,7 @@ struct pipe_video_codec *ruvd_create_decoder(struct pipe_context *context, dec->msg->body.create.height_in_samples = dec->base.height; dec->msg->body.create.dpb_size = dpb_size; send_msg_buf(dec); - r = flush(dec, 0); + r = flush(dec, 0, NULL); if (r) goto error;