diff --git a/include/wlr/render/drm_syncobj.h b/include/wlr/render/drm_syncobj.h index be3dce2d..232c13a0 100644 --- a/include/wlr/render/drm_syncobj.h +++ b/include/wlr/render/drm_syncobj.h @@ -62,6 +62,13 @@ struct wlr_drm_syncobj_timeline *wlr_drm_syncobj_timeline_ref(struct wlr_drm_syn * Unreference a synchronization timeline. */ void wlr_drm_syncobj_timeline_unref(struct wlr_drm_syncobj_timeline *timeline); +/** + * Transfer a point from a timeline to another. + * + * Both timelines must have been created with the same DRM FD. + */ +bool wlr_drm_syncobj_timeline_transfer(struct wlr_drm_syncobj_timeline *dst, + uint64_t dst_point, struct wlr_drm_syncobj_timeline *src, uint64_t src_point); /** * Check if a timeline point has been signalled or has materialized. * diff --git a/render/drm_syncobj.c b/render/drm_syncobj.c index af3e79fc..a612e20f 100644 --- a/render/drm_syncobj.c +++ b/render/drm_syncobj.c @@ -67,6 +67,19 @@ void wlr_drm_syncobj_timeline_unref(struct wlr_drm_syncobj_timeline *timeline) { free(timeline); } +bool wlr_drm_syncobj_timeline_transfer(struct wlr_drm_syncobj_timeline *dst, + uint64_t dst_point, struct wlr_drm_syncobj_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_drm_syncobj_timeline_export_sync_file(struct wlr_drm_syncobj_timeline *timeline, uint64_t src_point) { int sync_file_fd = -1;