return;
dec->send_cmd(dec, target, picture);
- flush(dec, PIPE_FLUSH_ASYNC, &dec->prev_fence);
+ flush(dec, PIPE_FLUSH_ASYNC, picture->fence);
if (picture->fence)
- *picture->fence = dec->prev_fence;
+ dec->ws->fence_reference(&dec->prev_fence, *picture->fence);
next_buffer(dec);
}
uint64_t timeout) {
struct radeon_decoder *dec = (struct radeon_decoder *)decoder;
- /* Only last fence is valid */
- if (fence != dec->prev_fence)
- return true;
+
return dec->ws->fence_wait(dec->ws, fence, timeout);
}
+static void radeon_dec_destroy_fence(struct pipe_video_codec *decoder,
+ struct pipe_fence_handle *fence)
+{
+ struct radeon_decoder *dec = (struct radeon_decoder *)decoder;
+
+ dec->ws->fence_reference(&fence, NULL);
+}
+
/**
* update render list when target buffer got updated, use the existing
* index and update the new buffer to associate with it.
dec->base.end_frame = radeon_dec_end_frame;
dec->base.flush = radeon_dec_flush;
dec->base.get_decoder_fence = radeon_dec_get_decoder_fence;
+ dec->base.destroy_fence = radeon_dec_destroy_fence;
dec->base.update_decoder_target = radeon_dec_update_render_list;
dec->stream_type = stream_type;
FREE(fb);
}
+static void radeon_enc_destroy_fence(struct pipe_video_codec *encoder,
+ struct pipe_fence_handle *fence)
+{
+ struct radeon_encoder *enc = (struct radeon_encoder *)encoder;
+
+ enc->ws->fence_reference(&fence, NULL);
+}
+
struct pipe_video_codec *radeon_create_encoder(struct pipe_context *context,
const struct pipe_video_codec *templ,
struct radeon_winsys *ws,
enc->base.end_frame = radeon_enc_end_frame;
enc->base.flush = radeon_enc_flush;
enc->base.get_feedback = radeon_enc_get_feedback;
+ enc->base.destroy_fence = radeon_enc_destroy_fence;
enc->get_buffer = get_buffer;
enc->bits_in_shifter = 0;
enc->screen = context->screen;