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;