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 <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:25:45 -03:00
committed by Marge Bot
parent 8187b35fa1
commit 435139d196

View File

@@ -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;