blob: 2c88bddecbacffba693f56c3afda8d93a926541f [file] [edit]
/*
* Copyright 2026 Google LLC
* SPDX-License-Identifier: MIT
*/
#ifndef VN_SYNC_H
#define VN_SYNC_H
#include "vn_common.h"
#include "vn_feedback.h"
enum vn_sync_type {
/* no payload */
VN_SYNC_TYPE_INVALID,
/* device object */
VN_SYNC_TYPE_DEVICE_ONLY,
/* renderer sync object */
VN_SYNC_TYPE_SYNC,
/* renderer sync objects
* - cpu sync x 1
* - gpu sync x vn_device::queue_count
*/
VN_SYNC_TYPE_TIMELINE_SYNC,
/* payload is an imported sync file */
VN_SYNC_TYPE_IMPORTED_SYNC_FD,
};
struct vn_sync_payload {
enum vn_sync_type type;
union {
/* If type is VN_SYNC_TYPE_SYNC, sync is non-NULL. */
struct vn_renderer_sync *sync;
/* If type is VN_SYNC_TYPE_TIMELINE_SYNC, syncs are non-NULL. */
struct vn_renderer_sync **syncs;
/* If type is VN_SYNC_TYPE_IMPORTED_SYNC_FD, fd is a sync file. */
int fd;
};
};
struct vn_fence {
struct vn_object_base base;
struct vn_sync_payload *payload;
struct vn_sync_payload permanent;
struct vn_sync_payload temporary;
};
VK_DEFINE_NONDISP_HANDLE_CASTS(vn_fence,
base.vk,
VkFence,
VK_OBJECT_TYPE_FENCE)
struct vn_semaphore {
struct vn_object_base base;
VkSemaphoreType type;
bool sync_fd_export;
struct vn_sync_payload *payload;
struct vn_sync_payload permanent;
struct vn_sync_payload temporary;
struct vn_sync_feedback feedback;
};
VK_DEFINE_NONDISP_HANDLE_CASTS(vn_semaphore,
base.vk,
VkSemaphore,
VK_OBJECT_TYPE_SEMAPHORE)
struct vn_event {
struct vn_object_base base;
/* non-NULL if below are satisfied:
* - event is created without VK_EVENT_CREATE_DEVICE_ONLY_BIT
* - VN_PERF_NO_EVENT_FEEDBACK is disabled
*/
struct vn_feedback_slot *feedback_slot;
};
VK_DEFINE_NONDISP_HANDLE_CASTS(vn_event,
base.vk,
VkEvent,
VK_OBJECT_TYPE_EVENT)
static inline bool
vn_semaphore_is_timeline(VkSemaphore sem_handle)
{
struct vn_semaphore *sem = vn_semaphore_from_handle(sem_handle);
return sem->type == VK_SEMAPHORE_TYPE_TIMELINE;
}
static inline bool
vn_semaphore_is_sync_fd(VkSemaphore sem_handle)
{
struct vn_semaphore *sem = vn_semaphore_from_handle(sem_handle);
return sem->payload->type == VN_SYNC_TYPE_IMPORTED_SYNC_FD ||
(sem->payload->type == VN_SYNC_TYPE_SYNC && sem->sync_fd_export);
}
bool
vn_semaphore_wait_sync_fd(VkDevice dev_handle, VkSemaphore sem_handle);
#endif /* VN_SYNC_H */