blob: 581d8814554ae6316d1c7dd6b6235936c709ea21 [file] [log] [blame]
/*
* Copyright 2022 Google LLC
* SPDX-License-Identifier: MIT
*/
#ifndef DRM_FENCE_H_
#define DRM_FENCE_H_
#include <stdbool.h>
#include <stdint.h>
#include "c11/threads.h"
#include "util/list.h"
/*
* Helpers to deal with managing dma-fence fd's. This should something that
* can be re-used by any virtgpu native context implementation.
*/
struct drm_fence;
struct virgl_context;
/**
* Represents a single timeline of fence-fd's. Fences on a timeline are
* signaled in FIFO order.
*/
struct drm_timeline {
struct virgl_context *vctx;
const char *name;
int eventfd;
int ring_idx;
virgl_context_fence_retire fence_retire;
int last_fence_fd;
struct list_head pending_fences;
mtx_t fence_mutex;
cnd_t fence_cond;
thrd_t sync_thread;
bool stop_sync_thread;
};
void drm_timeline_init(struct drm_timeline *timeline, struct virgl_context *vctx,
const char *name, int eventfd, int ring_idx,
virgl_context_fence_retire fence_retire);
void drm_timeline_fini(struct drm_timeline *timeline);
int drm_timeline_submit_fence(struct drm_timeline *timeline, uint32_t flags,
uint64_t fence_id);
void drm_timeline_set_last_fence_fd(struct drm_timeline *timeline, int fd);
#endif /* DRM_FENCE_H_ */