- assert(type == PIPE_FD_TYPE_NATIVE_SYNC);
- *pfence = fence_create(fd_context(pctx), NULL, 0, os_dupfd_cloexec(fd));
+ struct fd_context *ctx = fd_context(pctx);
+
+ switch (type) {
+ case PIPE_FD_TYPE_NATIVE_SYNC:
+ *pfence = fence_create(fd_context(pctx), NULL, 0, os_dupfd_cloexec(fd), 0);
+ break;
+ case PIPE_FD_TYPE_SYNCOBJ: {
+ int ret;
+ uint32_t syncobj;
+
+ assert(ctx->screen->has_syncobj);
+ ret = drmSyncobjFDToHandle(fd_device_fd(ctx->screen->dev), fd, &syncobj);
+ if (!ret)
+ close(fd);
+
+ *pfence = fence_create(fd_context(pctx), NULL, 0, -1, syncobj);
+ break;
+ }
+ default:
+ unreachable("Unhandled fence type");
+ }