*/
tbm_fd tbm_sync_fence_merge(const char *name, tbm_fd fence1, tbm_fd fence2);
+/**
+ * @brief Get signaled of fence
+ * @param[in] fence fence object
+ * @return 0 on active, 1 on signaled, -1 on error
+ */
+int tbm_sync_fence_is_signaled(tbm_fd fence);
+
#ifdef __cplusplus
}
#endif
return data.fence;
}
+
+int
+tbm_sync_fence_is_signaled(tbm_fd fence)
+{
+ struct sync_file_info info;
+ int signaled;
+ int ret;
+
+ memset(&info, 0, sizeof(info));
+ ret = ioctl(fence, SYNC_IOC_FILE_INFO, &info);
+ if (ret < 0 && errno == ENOTTY) {
+ struct sync_fence_info_data *legacy_info;
+
+ legacy_info = calloc(1, sizeof *legacy_info);
+ if (!legacy_info)
+ return -1;
+
+ legacy_info->len = sizeof *legacy_info;
+ ret = ioctl(fence, SYNC_IOC_LEGACY_FENCE_INFO, legacy_info);
+ if ((ret < 0) || (legacy_info->status < 0)) {
+ free(legacy_info);
+ _log_errno();
+ return -1;
+ }
+
+ signaled = legacy_info->status;
+ free(legacy_info);
+
+ return signaled;
+ } else if ((ret < 0) || (info.status < 0)) {
+ _log_errno();
+ return -1;
+ }
+
+ return info.status;
+}
/* LCOV_EXCL_STOP */