From 12d12eb2785882a2e180ebea8c97afe347c9f4b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michel=20D=C3=A4nzer?= Date: Thu, 27 Jun 2024 18:02:33 +0200 Subject: [PATCH] drm-timeline: Add meta_drm_timeline_create_syncobj Creates a kernel syncobj and returns a file descriptor representing it. v2: * Call drmSyncobjDestroy also after drmSyncobjHandleToFD returns 0, or we leak the original syncobj reference. (Sebastian Wick) * Add errno based error messages. Part-of: --- src/common/meta-drm-timeline.c | 31 +++++++++++++++++++++++++++++++ src/common/meta-drm-timeline.h | 3 +++ 2 files changed, 34 insertions(+) diff --git a/src/common/meta-drm-timeline.c b/src/common/meta-drm-timeline.c index c5ec1a2de..9d10318fa 100644 --- a/src/common/meta-drm-timeline.c +++ b/src/common/meta-drm-timeline.c @@ -141,6 +141,37 @@ initable_iface_init (GInitableIface *initable_iface) initable_iface->init = meta_drm_timeline_initable_init; } +int +meta_drm_timeline_create_syncobj (int drm_fd, + GError **error) +{ + uint32_t syncobj_handle; + int syncobj_fd; + + if (drmSyncobjCreate (drm_fd, 0, &syncobj_handle)) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "drmSyncobjCreate failed: %s", + g_strerror (errno)); + return -1; + } + + if (drmSyncobjHandleToFD (drm_fd, syncobj_handle, &syncobj_fd) < 0) + { + syncobj_fd = -1; + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "drmSyncobjHandleToFD failed: %s", + g_strerror (errno)); + } + + drmSyncobjDestroy (drm_fd, syncobj_handle); + return syncobj_fd; +} + MetaDrmTimeline * meta_drm_timeline_import_syncobj (int fd, int drm_syncobj, diff --git a/src/common/meta-drm-timeline.h b/src/common/meta-drm-timeline.h index 9ad6a6301..11166b450 100644 --- a/src/common/meta-drm-timeline.h +++ b/src/common/meta-drm-timeline.h @@ -30,6 +30,9 @@ G_DECLARE_FINAL_TYPE (MetaDrmTimeline, meta_drm_timeline, typedef struct _MetaDrmTimeline MetaDrmTimeline; +int meta_drm_timeline_create_syncobj (int fd, + GError **error); + MetaDrmTimeline * meta_drm_timeline_import_syncobj (int fd, int drm_syncobj, GError **error);