mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2024-11-27 12:14:10 +08:00
radeonsi: vcn: 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:
parent
01a5de1b95
commit
5e1bd07ac5
@ -2360,11 +2360,11 @@ static void rvcn_dec_sq_tail(struct radeon_decoder *dec)
|
|||||||
rvcn_sq_tail(&dec->cs, &dec->sq);
|
rvcn_sq_tail(&dec->cs, &dec->sq);
|
||||||
}
|
}
|
||||||
/* flush IB to the hardware */
|
/* flush IB to the hardware */
|
||||||
static int flush(struct radeon_decoder *dec, unsigned flags)
|
static int flush(struct radeon_decoder *dec, unsigned flags,
|
||||||
{
|
struct pipe_fence_handle **fence) {
|
||||||
rvcn_dec_sq_tail(dec);
|
rvcn_dec_sq_tail(dec);
|
||||||
|
|
||||||
return dec->ws->cs_flush(&dec->cs, flags, NULL);
|
return dec->ws->cs_flush(&dec->cs, flags, fence);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* add a new set register command to the IB */
|
/* add a new set register command to the IB */
|
||||||
@ -2736,7 +2736,7 @@ static void radeon_dec_destroy(struct pipe_video_codec *decoder)
|
|||||||
map_msg_fb_it_probs_buf(dec);
|
map_msg_fb_it_probs_buf(dec);
|
||||||
rvcn_dec_message_destroy(dec);
|
rvcn_dec_message_destroy(dec);
|
||||||
send_msg_buf(dec);
|
send_msg_buf(dec);
|
||||||
flush(dec, 0);
|
flush(dec, 0, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
dec->ws->cs_destroy(&dec->cs);
|
dec->ws->cs_destroy(&dec->cs);
|
||||||
@ -2905,7 +2905,7 @@ static void radeon_dec_end_frame(struct pipe_video_codec *decoder, struct pipe_v
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
dec->send_cmd(dec, target, picture);
|
dec->send_cmd(dec, target, picture);
|
||||||
flush(dec, PIPE_FLUSH_ASYNC);
|
flush(dec, PIPE_FLUSH_ASYNC, picture->fence);
|
||||||
next_buffer(dec);
|
next_buffer(dec);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2923,7 +2923,7 @@ static void radeon_dec_jpeg_end_frame(struct pipe_video_codec *decoder, struct p
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
dec->send_cmd(dec, target, picture);
|
dec->send_cmd(dec, target, picture);
|
||||||
dec->ws->cs_flush(&dec->jcs[dec->cb_idx], PIPE_FLUSH_ASYNC, NULL);
|
dec->ws->cs_flush(&dec->jcs[dec->cb_idx], PIPE_FLUSH_ASYNC, picture->fence);
|
||||||
next_buffer(dec);
|
next_buffer(dec);
|
||||||
dec->cb_idx = (dec->cb_idx+1) % dec->njctx;
|
dec->cb_idx = (dec->cb_idx+1) % dec->njctx;
|
||||||
}
|
}
|
||||||
@ -2935,6 +2935,14 @@ static void radeon_dec_flush(struct pipe_video_codec *decoder)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int radeon_dec_get_decoder_fence(struct pipe_video_codec *decoder,
|
||||||
|
struct pipe_fence_handle *fence,
|
||||||
|
uint64_t timeout) {
|
||||||
|
|
||||||
|
struct radeon_decoder *dec = (struct radeon_decoder *)decoder;
|
||||||
|
return dec->ws->fence_wait(dec->ws, fence, timeout);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* create and HW decoder
|
* create and HW decoder
|
||||||
*/
|
*/
|
||||||
@ -3001,6 +3009,7 @@ struct pipe_video_codec *radeon_create_decoder(struct pipe_context *context,
|
|||||||
dec->base.decode_bitstream = radeon_dec_decode_bitstream;
|
dec->base.decode_bitstream = radeon_dec_decode_bitstream;
|
||||||
dec->base.end_frame = radeon_dec_end_frame;
|
dec->base.end_frame = radeon_dec_end_frame;
|
||||||
dec->base.flush = radeon_dec_flush;
|
dec->base.flush = radeon_dec_flush;
|
||||||
|
dec->base.get_decoder_fence = radeon_dec_get_decoder_fence;
|
||||||
|
|
||||||
dec->stream_type = stream_type;
|
dec->stream_type = stream_type;
|
||||||
dec->stream_handle = si_vid_alloc_stream_handle();
|
dec->stream_handle = si_vid_alloc_stream_handle();
|
||||||
@ -3175,7 +3184,7 @@ struct pipe_video_codec *radeon_create_decoder(struct pipe_context *context,
|
|||||||
map_msg_fb_it_probs_buf(dec);
|
map_msg_fb_it_probs_buf(dec);
|
||||||
rvcn_dec_message_create(dec);
|
rvcn_dec_message_create(dec);
|
||||||
send_msg_buf(dec);
|
send_msg_buf(dec);
|
||||||
r = flush(dec, 0);
|
r = flush(dec, 0, NULL);
|
||||||
if (r)
|
if (r)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user