Skip to contentSkip to conversation

libdrm: add drm syncobj create/destroy/import/export

PATCH In review Dave Airlie 3 participants 7 messages Jun 17, 2017 – Sep 9, 2017

Subsystems (2)
lore
Share & tools
lore

Dave Airlie

author maintainer
#0 lore raw

PATCH 1/1 libdrm: add drm syncobj create/destroy/import/export

From: Dave Airlie <[email protected]>

These ioctls are now in drm next so add the first set of libdrm APIs.

---
 include/drm/drm.h | 26 ++++++++++++++++++
 xf86drm.c         | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 xf86drm.h         |  8 ++++++
 3 files changed, 115 insertions(+)
include/drm/drm.h +26 -0
index 1e7a4bc..bf3674a 100644
@@ -642,6 +642,7 @@ struct drm_gem_open {
 #define DRM_CAP_ADDFB2_MODIFIERS	0x10
 #define DRM_CAP_PAGE_FLIP_TARGET	0x11
 #define DRM_CAP_CRTC_IN_VBLANK_EVENT	0x12
+#define DRM_CAP_SYNCOBJ		0x13
 
 /** DRM_IOCTL_GET_CAP ioctl argument type */
 struct drm_get_cap {
@@ -691,6 +692,26 @@ struct drm_prime_handle {
 	__s32 fd;
 };
 
+struct drm_syncobj_create {
+	__u32 handle;
+	__u32 flags;
+};
+
+struct drm_syncobj_destroy {
+	__u32 handle;
+	__u32 pad;
+};
+
+#define DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE (1 << 0)
+#define DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE (1 << 0)
+struct drm_syncobj_handle {
+	__u32 handle;
+	__u32 flags;
+
+	__s32 fd;
+	__u32 pad;
+};
+
 #if defined(__cplusplus)
 }
 #endif
@@ -809,6 +830,11 @@ extern "C" {
 #define DRM_IOCTL_MODE_CREATEPROPBLOB	DRM_IOWR(0xBD, struct drm_mode_create_blob)
 #define DRM_IOCTL_MODE_DESTROYPROPBLOB	DRM_IOWR(0xBE, struct drm_mode_destroy_blob)
 
+#define DRM_IOCTL_SYNCOBJ_CREATE	DRM_IOWR(0xBF, struct drm_syncobj_create)
+#define DRM_IOCTL_SYNCOBJ_DESTROY	DRM_IOWR(0xC0, struct drm_syncobj_destroy)
+#define DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD	DRM_IOWR(0xC1, struct drm_syncobj_handle)
+#define DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE	DRM_IOWR(0xC2, struct drm_syncobj_handle)
+
 /**
  * Device specific ioctls should only be in their respective headers
  * The device specific ioctl range is from 0x40 to 0x9f.
xf86drm.c +81 -0

84 lines not on this page · raw message

xf86drm.h +8 -0
index 74f54f1..2855a3e 100644
@@ -853,6 +853,14 @@ extern int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_device
 
 extern int drmDevicesEqual(drmDevicePtr a, drmDevicePtr b);
 
+extern int drmSyncobjCreate(int fd, uint32_t flags, uint32_t *handle);
+extern int drmSyncobjDestroy(int fd, uint32_t handle);
+extern int drmSyncobjHandleToFD(int fd, uint32_t handle, int *obj_fd);
+extern int drmSyncobjFDToHandle(int fd, int obj_fd, uint32_t *handle);
+
+extern int drmSyncobjImportSyncFile(int fd, uint32_t handle, int sync_file_fd);
+extern int drmSyncobjExportSyncFile(int fd, uint32_t handle, int *sync_file_fd);
+
 #if defined(__cplusplus)
 }
 #endif
Signature · 6 lines
2.9.4

_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
author maintainer
#1 lore raw

ping?

Dave.

Quoted 173 lines · Dave Airlie

From: Dave Airlie <[email protected]>

These ioctls are now in drm next so add the first set of libdrm APIs.

---
 include/drm/drm.h | 26 ++++++++++++++++++
 xf86drm.c         | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 xf86drm.h         |  8 ++++++
 3 files changed, 115 insertions(+)
include/drm/drm.h +26 -0
index 1e7a4bc..bf3674a 100644
@@ -642,6 +642,7 @@ struct drm_gem_open {
 #define DRM_CAP_ADDFB2_MODIFIERS       0x10
 #define DRM_CAP_PAGE_FLIP_TARGET       0x11
 #define DRM_CAP_CRTC_IN_VBLANK_EVENT   0x12
+#define DRM_CAP_SYNCOBJ                0x13
 
 /** DRM_IOCTL_GET_CAP ioctl argument type */
 struct drm_get_cap {
@@ -691,6 +692,26 @@ struct drm_prime_handle {
        __s32 fd;
 };
 
+struct drm_syncobj_create {
+       __u32 handle;
+       __u32 flags;
+};
+
+struct drm_syncobj_destroy {
+       __u32 handle;
+       __u32 pad;
+};
+
+#define DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE (1 << 0)
+#define DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE (1 << 0)
+struct drm_syncobj_handle {
+       __u32 handle;
+       __u32 flags;
+
+       __s32 fd;
+       __u32 pad;
+};
+
 #if defined(__cplusplus)
 }
 #endif
@@ -809,6 +830,11 @@ extern "C" {
 #define DRM_IOCTL_MODE_CREATEPROPBLOB  DRM_IOWR(0xBD, struct drm_mode_create_blob)
 #define DRM_IOCTL_MODE_DESTROYPROPBLOB DRM_IOWR(0xBE, struct drm_mode_destroy_blob)
 
+#define DRM_IOCTL_SYNCOBJ_CREATE       DRM_IOWR(0xBF, struct drm_syncobj_create)
+#define DRM_IOCTL_SYNCOBJ_DESTROY      DRM_IOWR(0xC0, struct drm_syncobj_destroy)
+#define DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD DRM_IOWR(0xC1, struct drm_syncobj_handle)
+#define DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE DRM_IOWR(0xC2, struct drm_syncobj_handle)
+
 /**
  * Device specific ioctls should only be in their respective headers
  * The device specific ioctl range is from 0x40 to 0x9f.
xf86drm.c +81 -0
index 728ac78..2ac3f26 100644
@@ -4146,3 +4146,84 @@ char *drmGetDeviceNameFromFd2(int fd)
     return strdup(node);
 #endif
 }
+
+int drmSyncobjCreate(int fd, uint32_t flags, uint32_t *handle)
+{
+    struct drm_syncobj_create args;
+    int ret;
+
+    memclear(args);
+    args.flags = flags;
+    args.handle = 0;
+    ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_CREATE, &args);
+    if (ret)
+       return ret;
+    *handle = args.handle;
+    return 0;
+}
+
+int drmSyncobjDestroy(int fd, uint32_t handle)
+{
+    struct drm_syncobj_destroy args;
+
+    memclear(args);
+    args.handle = handle;
+    return drmIoctl(fd, DRM_IOCTL_SYNCOBJ_DESTROY, &args);
+}
+
+int drmSyncobjHandleToFD(int fd, uint32_t handle, int *obj_fd)
+{
+    struct drm_syncobj_handle args;
+    int ret;
+
+    memclear(args);
+    args.fd = -1;
+    args.handle = handle;
+    ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD, &args);
+    if (ret)
+       return ret;
+    *obj_fd = args.fd;
+    return 0;
+}
+
+int drmSyncobjFDToHandle(int fd, int obj_fd, uint32_t *handle)
+{
+    struct drm_syncobj_handle args;
+    int ret;
+
+    memclear(args);
+    args.fd = obj_fd;
+    args.handle = 0;
+    ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, &args);
+    if (ret)
+       return ret;
+    *handle = args.handle;
+    return 0;
+}
+
+int drmSyncobjImportSyncFile(int fd, uint32_t handle, int sync_file_fd)
+{
+    struct drm_syncobj_handle args;
+
+    memclear(args);
+    args.fd = sync_file_fd;
+    args.handle = handle;
+    args.flags = DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE;
+    return drmIoctl(fd, DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, &args);
+}
+
+int drmSyncobjExportSyncFile(int fd, uint32_t handle, int *sync_file_fd)
+{
+    struct drm_syncobj_handle args;
+    int ret;
+
+    memclear(args);
+    args.fd = -1;
+    args.handle = handle;
+    args.flags = DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE;
+    ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD, &args);
+    if (ret)
+       return ret;
+    *sync_file_fd = args.fd;
+    return 0;
+}
xf86drm.h +8 -1
index 74f54f1..2855a3e 100644
@@ -853,6 +853,14 @@ extern int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_device
 
 extern int drmDevicesEqual(drmDevicePtr a, drmDevicePtr b);
 
+extern int drmSyncobjCreate(int fd, uint32_t flags, uint32_t *handle);
+extern int drmSyncobjDestroy(int fd, uint32_t handle);
+extern int drmSyncobjHandleToFD(int fd, uint32_t handle, int *obj_fd);
+extern int drmSyncobjFDToHandle(int fd, int obj_fd, uint32_t *handle);
+
+extern int drmSyncobjImportSyncFile(int fd, uint32_t handle, int sync_file_fd);
+extern int drmSyncobjExportSyncFile(int fd, uint32_t handle, int *sync_file_fd);
+
 #if defined(__cplusplus)
 }
 #endif
--

2.9.4

Quoted 4 lines

_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel

_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reviewed-by on v1 1/1
#2 lore raw
In reply to Dave Airlie
Quoted 5 lines · Dave Airlie

From: Dave Airlie <[email protected]>

These ioctls are now in drm next so add the first set of libdrm APIs.

It took me a bit of digging to understand the functional difference between drmSyncobjHandleToFD() and drmSyncobjExportSyncFile(), but the wrappers for these ioctls seem fine.

_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel

#3 lore raw
In reply to Dave Airlie

What's the difference between HandleToFD and ExportSyncFile?

Thanks,
Marek

Quoted 173 lines · Dave Airlie

From: Dave Airlie <[email protected]>

These ioctls are now in drm next so add the first set of libdrm APIs.

---
 include/drm/drm.h | 26 ++++++++++++++++++
 xf86drm.c         | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 xf86drm.h         |  8 ++++++
 3 files changed, 115 insertions(+)
include/drm/drm.h +26 -0
index 1e7a4bc..bf3674a 100644
@@ -642,6 +642,7 @@ struct drm_gem_open {
 #define DRM_CAP_ADDFB2_MODIFIERS       0x10
 #define DRM_CAP_PAGE_FLIP_TARGET       0x11
 #define DRM_CAP_CRTC_IN_VBLANK_EVENT   0x12
+#define DRM_CAP_SYNCOBJ                0x13
 
 /** DRM_IOCTL_GET_CAP ioctl argument type */
 struct drm_get_cap {
@@ -691,6 +692,26 @@ struct drm_prime_handle {
        __s32 fd;
 };
 
+struct drm_syncobj_create {
+       __u32 handle;
+       __u32 flags;
+};
+
+struct drm_syncobj_destroy {
+       __u32 handle;
+       __u32 pad;
+};
+
+#define DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE (1 << 0)
+#define DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE (1 << 0)
+struct drm_syncobj_handle {
+       __u32 handle;
+       __u32 flags;
+
+       __s32 fd;
+       __u32 pad;
+};
+
 #if defined(__cplusplus)
 }
 #endif
@@ -809,6 +830,11 @@ extern "C" {
 #define DRM_IOCTL_MODE_CREATEPROPBLOB  DRM_IOWR(0xBD, struct drm_mode_create_blob)
 #define DRM_IOCTL_MODE_DESTROYPROPBLOB DRM_IOWR(0xBE, struct drm_mode_destroy_blob)
 
+#define DRM_IOCTL_SYNCOBJ_CREATE       DRM_IOWR(0xBF, struct drm_syncobj_create)
+#define DRM_IOCTL_SYNCOBJ_DESTROY      DRM_IOWR(0xC0, struct drm_syncobj_destroy)
+#define DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD DRM_IOWR(0xC1, struct drm_syncobj_handle)
+#define DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE DRM_IOWR(0xC2, struct drm_syncobj_handle)
+
 /**
  * Device specific ioctls should only be in their respective headers
  * The device specific ioctl range is from 0x40 to 0x9f.
xf86drm.c +81 -0
index 728ac78..2ac3f26 100644
@@ -4146,3 +4146,84 @@ char *drmGetDeviceNameFromFd2(int fd)
     return strdup(node);
 #endif
 }
+
+int drmSyncobjCreate(int fd, uint32_t flags, uint32_t *handle)
+{
+    struct drm_syncobj_create args;
+    int ret;
+
+    memclear(args);
+    args.flags = flags;
+    args.handle = 0;
+    ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_CREATE, &args);
+    if (ret)
+       return ret;
+    *handle = args.handle;
+    return 0;
+}
+
+int drmSyncobjDestroy(int fd, uint32_t handle)
+{
+    struct drm_syncobj_destroy args;
+
+    memclear(args);
+    args.handle = handle;
+    return drmIoctl(fd, DRM_IOCTL_SYNCOBJ_DESTROY, &args);
+}
+
+int drmSyncobjHandleToFD(int fd, uint32_t handle, int *obj_fd)
+{
+    struct drm_syncobj_handle args;
+    int ret;
+
+    memclear(args);
+    args.fd = -1;
+    args.handle = handle;
+    ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD, &args);
+    if (ret)
+       return ret;
+    *obj_fd = args.fd;
+    return 0;
+}
+
+int drmSyncobjFDToHandle(int fd, int obj_fd, uint32_t *handle)
+{
+    struct drm_syncobj_handle args;
+    int ret;
+
+    memclear(args);
+    args.fd = obj_fd;
+    args.handle = 0;
+    ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, &args);
+    if (ret)
+       return ret;
+    *handle = args.handle;
+    return 0;
+}
+
+int drmSyncobjImportSyncFile(int fd, uint32_t handle, int sync_file_fd)
+{
+    struct drm_syncobj_handle args;
+
+    memclear(args);
+    args.fd = sync_file_fd;
+    args.handle = handle;
+    args.flags = DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE;
+    return drmIoctl(fd, DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, &args);
+}
+
+int drmSyncobjExportSyncFile(int fd, uint32_t handle, int *sync_file_fd)
+{
+    struct drm_syncobj_handle args;
+    int ret;
+
+    memclear(args);
+    args.fd = -1;
+    args.handle = handle;
+    args.flags = DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE;
+    ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD, &args);
+    if (ret)
+       return ret;
+    *sync_file_fd = args.fd;
+    return 0;
+}
xf86drm.h +8 -1
index 74f54f1..2855a3e 100644
@@ -853,6 +853,14 @@ extern int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_device
 
 extern int drmDevicesEqual(drmDevicePtr a, drmDevicePtr b);
 
+extern int drmSyncobjCreate(int fd, uint32_t flags, uint32_t *handle);
+extern int drmSyncobjDestroy(int fd, uint32_t handle);
+extern int drmSyncobjHandleToFD(int fd, uint32_t handle, int *obj_fd);
+extern int drmSyncobjFDToHandle(int fd, int obj_fd, uint32_t *handle);
+
+extern int drmSyncobjImportSyncFile(int fd, uint32_t handle, int sync_file_fd);
+extern int drmSyncobjExportSyncFile(int fd, uint32_t handle, int *sync_file_fd);
+
 #if defined(__cplusplus)
 }
 #endif
--

2.9.4

Quoted 4 lines

_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel

_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel

author maintainer
#4 lore raw

On 9 Sep. 2017 2:30 am, "Marek Olšák" <[email protected]> wrote:

What's the difference between HandleToFD and ExportSyncFile?

One just gives you an FD for sharing the syncobj itself, the other exports the syncobj state into a sync file and you get to do sync file stuff with it.

A) is for process sharing
B) for interop with sync files

Dave.

Thanks,
Marek

Quoted 8 lines · Dave Airlie

From: Dave Airlie <[email protected]>

These ioctls are now in drm next so add the first set of libdrm APIs.

---
 include/drm/drm.h | 26 ++++++++++++++++++
 xf86drm.c         | 81 ++++++++++++++++++++++++++++++

+++++++++++++++++++++++++

Quoted 43 lines
 xf86drm.h         |  8 ++++++
 3 files changed, 115 insertions(+)
include/drm/drm.h +21 -0
index 1e7a4bc..bf3674a 100644
@@ -642,6 +642,7 @@ struct drm_gem_open {
 #define DRM_CAP_ADDFB2_MODIFIERS       0x10
 #define DRM_CAP_PAGE_FLIP_TARGET       0x11
 #define DRM_CAP_CRTC_IN_VBLANK_EVENT   0x12
+#define DRM_CAP_SYNCOBJ                0x13
 
 /** DRM_IOCTL_GET_CAP ioctl argument type */
 struct drm_get_cap {
@@ -691,6 +692,26 @@ struct drm_prime_handle {
        __s32 fd;
 };
 
+struct drm_syncobj_create {
+       __u32 handle;
+       __u32 flags;
+};
+
+struct drm_syncobj_destroy {
+       __u32 handle;
+       __u32 pad;
+};
+
+#define DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE (1 << 0)
+#define DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE (1 << 0)
+struct drm_syncobj_handle {
+       __u32 handle;
+       __u32 flags;
+
+       __s32 fd;
+       __u32 pad;
+};
+
 #if defined(__cplusplus)
 }
 #endif

include/drm/drm.h extern "C" { · line 830

Quoted 1 line
include/drm/drm.h +0 -0
@@ -809,6 +830,11 @@ extern "C" {
 #define DRM_IOCTL_MODE_CREATEPROPBLOB  DRM_IOWR(0xBD, struct

drm_mode_create_blob)

include/drm/drm.h extern "C" { · line 831

Quoted 1 line
include/drm/drm.h +0 -0
 #define DRM_IOCTL_MODE_DESTROYPROPBLOB DRM_IOWR(0xBE, struct

drm_mode_destroy_blob)

include/drm/drm.h extern "C" { · line 832

Quoted 2 lines
include/drm/drm.h +1 -0
+#define DRM_IOCTL_SYNCOBJ_CREATE       DRM_IOWR(0xBF, struct

drm_syncobj_create)

include/drm/drm.h extern "C" { · line 833

Quoted 1 line
include/drm/drm.h +1 -0
+#define DRM_IOCTL_SYNCOBJ_DESTROY      DRM_IOWR(0xC0, struct

drm_syncobj_destroy)

include/drm/drm.h extern "C" { · line 834

Quoted 1 line
include/drm/drm.h +1 -0
+#define DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD DRM_IOWR(0xC1, struct

drm_syncobj_handle)

include/drm/drm.h extern "C" { · line 835

Quoted 1 line
include/drm/drm.h +1 -0
+#define DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE DRM_IOWR(0xC2, struct

drm_syncobj_handle)

xf86drm.h extern int drmGetDevices2(uint32_t flags,

Quoted 98 lines
include/drm/drm.h +1 -0
+
 /**
  * Device specific ioctls should only be in their respective headers
  * The device specific ioctl range is from 0x40 to 0x9f.
xf86drm.c +81 -0
index 728ac78..2ac3f26 100644
@@ -4146,3 +4146,84 @@ char *drmGetDeviceNameFromFd2(int fd)
     return strdup(node);
 #endif
 }
+
+int drmSyncobjCreate(int fd, uint32_t flags, uint32_t *handle)
+{
+    struct drm_syncobj_create args;
+    int ret;
+
+    memclear(args);
+    args.flags = flags;
+    args.handle = 0;
+    ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_CREATE, &args);
+    if (ret)
+       return ret;
+    *handle = args.handle;
+    return 0;
+}
+
+int drmSyncobjDestroy(int fd, uint32_t handle)
+{
+    struct drm_syncobj_destroy args;
+
+    memclear(args);
+    args.handle = handle;
+    return drmIoctl(fd, DRM_IOCTL_SYNCOBJ_DESTROY, &args);
+}
+
+int drmSyncobjHandleToFD(int fd, uint32_t handle, int *obj_fd)
+{
+    struct drm_syncobj_handle args;
+    int ret;
+
+    memclear(args);
+    args.fd = -1;
+    args.handle = handle;
+    ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD, &args);
+    if (ret)
+       return ret;
+    *obj_fd = args.fd;
+    return 0;
+}
+
+int drmSyncobjFDToHandle(int fd, int obj_fd, uint32_t *handle)
+{
+    struct drm_syncobj_handle args;
+    int ret;
+
+    memclear(args);
+    args.fd = obj_fd;
+    args.handle = 0;
+    ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, &args);
+    if (ret)
+       return ret;
+    *handle = args.handle;
+    return 0;
+}
+
+int drmSyncobjImportSyncFile(int fd, uint32_t handle, int sync_file_fd)
+{
+    struct drm_syncobj_handle args;
+
+    memclear(args);
+    args.fd = sync_file_fd;
+    args.handle = handle;
+    args.flags = DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE;
+    return drmIoctl(fd, DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, &args);
+}
+
+int drmSyncobjExportSyncFile(int fd, uint32_t handle, int *sync_file_fd)
+{
+    struct drm_syncobj_handle args;
+    int ret;
+
+    memclear(args);
+    args.fd = -1;
+    args.handle = handle;
+    args.flags = DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE;
+    ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD, &args);
+    if (ret)
+       return ret;
+    *sync_file_fd = args.fd;
+    return 0;
+}
xf86drm.h +0 -0
index 74f54f1..2855a3e 100644
@@ -853,6 +853,14 @@ extern int drmGetDevices2(uint32_t flags,

drmDevicePtr devices[], int max_device

xf86drm.h extern int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_device

Quoted 9 lines
xf86drm.h +6 -0
 extern int drmDevicesEqual(drmDevicePtr a, drmDevicePtr b);
 
+extern int drmSyncobjCreate(int fd, uint32_t flags, uint32_t *handle);
+extern int drmSyncobjDestroy(int fd, uint32_t handle);
+extern int drmSyncobjHandleToFD(int fd, uint32_t handle, int *obj_fd);
+extern int drmSyncobjFDToHandle(int fd, int obj_fd, uint32_t *handle);
+
+extern int drmSyncobjImportSyncFile(int fd, uint32_t handle, int

sync_file_fd);

xf86drm.h extern int drmGetDevices2(uint32_t flags, · line 861

Quoted 1 line
xf86drm.h +1 -0
+extern int drmSyncobjExportSyncFile(int fd, uint32_t handle, int

*sync_file_fd);

Quoted 11 lines
xf86drm.h +1 -1
+
 #if defined(__cplusplus)
 }
 #endif
--

2.9.4

_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel

_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel

#5 lore raw
Quoted 7 lines · Dave Airlie

On 9 Sep. 2017 2:30 am, "Marek Olšák" <[email protected]> wrote:

What's the difference between HandleToFD and ExportSyncFile?

Quoted 6 lines

One just gives you an FD for sharing the syncobj itself, the other exports the syncobj state into a sync file and you get to do sync file stuff with it.

A) is for process sharing
B) for interop with sync files

i'm still confused, but If I understand it correctly, we have 4 kinds fences now:
- amdgpu per-ring sequence numbers
- syncobj
- HandleToFD for sharing a syncobj (this is not an Android fence)
- ExportSyncFile, which is an Android fence

Is that right?

Thanks,
Marek
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel

author maintainer
#6 lore raw

On 9 Sep. 2017 10:17 am, "Marek Olšák" <[email protected]> wrote:

Quoted 7 lines · Dave Airlie

On 9 Sep. 2017 2:30 am, "Marek Olšák" <[email protected]> wrote:

What's the difference between HandleToFD and ExportSyncFile?

Quoted 6 lines

One just gives you an FD for sharing the syncobj itself, the other exports the syncobj state into a sync file and you get to do sync file stuff with it.

A) is for process sharing
B) for interop with sync files

i'm still confused, but If I understand it correctly, we have 4 kinds fences now:
- amdgpu per-ring sequence numbers
- syncobj
- HandleToFD for sharing a syncobj (this is not an Android fence)
- ExportSyncFile, which is an Android fence

Yes, syncobj is pretty much Vulkan fence and semaphores semantics, sync file are android fence semantics.

Syncobj FD is just for sharing and getting back the same under lying object whereas sync file has a lot of other semantics that are undesirable when you just want to share between APIs and processes.

Dave.

Is that right?

Thanks,
Marek

_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel