From 43df0bd565d532d3f11024c8f3ab8f628b9a485e Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Thu, 21 Oct 2021 15:23:20 +0200 Subject: [PATCH] render/timeline: add wlr_render_timeline_transfer --- include/wlr/render/timeline.h | 7 +++++++ render/timeline.c | 14 ++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/include/wlr/render/timeline.h b/include/wlr/render/timeline.h index dc799c8d7..3e4b6bc3f 100644 --- a/include/wlr/render/timeline.h +++ b/include/wlr/render/timeline.h @@ -39,6 +39,13 @@ struct wlr_render_timeline *wlr_render_timeline_import(int drm_fd, * Destroy a synchronization timeline. */ void wlr_render_timeline_destroy(struct wlr_render_timeline *timeline); +/** + * Transfer a point from a timeline to another. + * + * Both timelines must have been created with the same DRM FD. + */ +bool wlr_render_timeline_transfer(struct wlr_render_timeline *dst, + uint64_t dst_point, struct wlr_render_timeline *src, uint64_t src_point); /** * Export a timeline point as a sync_file FD. * diff --git a/render/timeline.c b/render/timeline.c index df98b5325..4cae1f749 100644 --- a/render/timeline.c +++ b/render/timeline.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -48,6 +49,19 @@ void wlr_render_timeline_destroy(struct wlr_render_timeline *timeline) { free(timeline); } +bool wlr_render_timeline_transfer(struct wlr_render_timeline *dst, + uint64_t dst_point, struct wlr_render_timeline *src, uint64_t src_point) { + assert(dst->drm_fd == src->drm_fd); + + if (drmSyncobjTransfer(dst->drm_fd, dst->handle, dst_point, + src->handle, src_point, 0) != 0) { + wlr_log_errno(WLR_ERROR, "drmSyncobjTransfer failed"); + return false; + } + + return true; +} + int wlr_render_timeline_export_sync_file(struct wlr_render_timeline *timeline, uint64_t src_point) { int sync_file_fd = -1;