radeonsi: uvd: implement the get_decoder_fence vfunc

Implement the get_decoder_fence vfunc by waiting on the fence
previously passed in the end_frame vfunc.

Signed-off-by: Daniel Almeida <daniel.almeida@collabora.com>
Reviewed-by: Leo Liu <leo.liu@amd.com>
Reviewed-by: Boyuan Zhang <Boyuan.Zhang@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20133>
This commit is contained in:
Daniel Almeida
2022-12-04 09:27:33 -03:00
committed by Marge Bot
parent 435139d196
commit 01a5de1b95

View File

@@ -94,9 +94,16 @@ struct ruvd_decoder {
};
/* flush IB to the hardware */
static int flush(struct ruvd_decoder *dec, unsigned flags)
static int flush(struct ruvd_decoder *dec, unsigned flags, struct pipe_fence_handle **fence)
{
return dec->ws->cs_flush(&dec->cs, flags, NULL);
return dec->ws->cs_flush(&dec->cs, flags, fence);
}
static int ruvd_dec_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);
}
/* add a new set register command to the IB */
@@ -981,7 +988,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);
@@ -1198,7 +1205,7 @@ static void ruvd_end_frame(struct pipe_video_codec *decoder, struct pipe_video_b
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);
}
@@ -1262,6 +1269,7 @@ struct pipe_video_codec *si_common_uvd_create_decoder(struct pipe_context *conte
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_dec_get_decoder_fence;
dec->stream_type = profile2stream_type(dec, sctx->family);
dec->set_dtb = set_dtb;
@@ -1347,7 +1355,7 @@ struct pipe_video_codec *si_common_uvd_create_decoder(struct pipe_context *conte
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;