xref: /aosp_15_r20/external/virglrenderer/src/drm/drm_fence.h (revision bbecb9d118dfdb95f99bd754f8fa9be01f189df3)
1*bbecb9d1SAndroid Build Coastguard Worker /*
2*bbecb9d1SAndroid Build Coastguard Worker  * Copyright 2022 Google LLC
3*bbecb9d1SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*bbecb9d1SAndroid Build Coastguard Worker  */
5*bbecb9d1SAndroid Build Coastguard Worker 
6*bbecb9d1SAndroid Build Coastguard Worker #ifndef DRM_FENCE_H_
7*bbecb9d1SAndroid Build Coastguard Worker #define DRM_FENCE_H_
8*bbecb9d1SAndroid Build Coastguard Worker 
9*bbecb9d1SAndroid Build Coastguard Worker #include <stdbool.h>
10*bbecb9d1SAndroid Build Coastguard Worker #include <stdint.h>
11*bbecb9d1SAndroid Build Coastguard Worker 
12*bbecb9d1SAndroid Build Coastguard Worker #include "c11/threads.h"
13*bbecb9d1SAndroid Build Coastguard Worker #include "util/list.h"
14*bbecb9d1SAndroid Build Coastguard Worker 
15*bbecb9d1SAndroid Build Coastguard Worker /*
16*bbecb9d1SAndroid Build Coastguard Worker  * Helpers to deal with managing dma-fence fd's.  This should something that
17*bbecb9d1SAndroid Build Coastguard Worker  * can be re-used by any virtgpu native context implementation.
18*bbecb9d1SAndroid Build Coastguard Worker  */
19*bbecb9d1SAndroid Build Coastguard Worker 
20*bbecb9d1SAndroid Build Coastguard Worker struct drm_fence;
21*bbecb9d1SAndroid Build Coastguard Worker struct virgl_context;
22*bbecb9d1SAndroid Build Coastguard Worker 
23*bbecb9d1SAndroid Build Coastguard Worker /**
24*bbecb9d1SAndroid Build Coastguard Worker  * Represents a single timeline of fence-fd's.  Fences on a timeline are
25*bbecb9d1SAndroid Build Coastguard Worker  * signaled in FIFO order.
26*bbecb9d1SAndroid Build Coastguard Worker  */
27*bbecb9d1SAndroid Build Coastguard Worker struct drm_timeline {
28*bbecb9d1SAndroid Build Coastguard Worker    struct virgl_context *vctx;
29*bbecb9d1SAndroid Build Coastguard Worker    const char *name;
30*bbecb9d1SAndroid Build Coastguard Worker    int eventfd;
31*bbecb9d1SAndroid Build Coastguard Worker    int ring_idx;
32*bbecb9d1SAndroid Build Coastguard Worker 
33*bbecb9d1SAndroid Build Coastguard Worker    int last_fence_fd;
34*bbecb9d1SAndroid Build Coastguard Worker    struct list_head pending_fences;
35*bbecb9d1SAndroid Build Coastguard Worker 
36*bbecb9d1SAndroid Build Coastguard Worker    mtx_t fence_mutex;
37*bbecb9d1SAndroid Build Coastguard Worker    cnd_t fence_cond;
38*bbecb9d1SAndroid Build Coastguard Worker    thrd_t sync_thread;
39*bbecb9d1SAndroid Build Coastguard Worker    bool stop_sync_thread;
40*bbecb9d1SAndroid Build Coastguard Worker };
41*bbecb9d1SAndroid Build Coastguard Worker 
42*bbecb9d1SAndroid Build Coastguard Worker void drm_timeline_init(struct drm_timeline *timeline, struct virgl_context *vctx,
43*bbecb9d1SAndroid Build Coastguard Worker                        const char *name, int eventfd, int ring_idx);
44*bbecb9d1SAndroid Build Coastguard Worker 
45*bbecb9d1SAndroid Build Coastguard Worker void drm_timeline_fini(struct drm_timeline *timeline);
46*bbecb9d1SAndroid Build Coastguard Worker 
47*bbecb9d1SAndroid Build Coastguard Worker int drm_timeline_submit_fence(struct drm_timeline *timeline, uint32_t flags,
48*bbecb9d1SAndroid Build Coastguard Worker                               uint64_t fence_id);
49*bbecb9d1SAndroid Build Coastguard Worker 
50*bbecb9d1SAndroid Build Coastguard Worker void drm_timeline_set_last_fence_fd(struct drm_timeline *timeline, int fd);
51*bbecb9d1SAndroid Build Coastguard Worker 
52*bbecb9d1SAndroid Build Coastguard Worker #endif /* DRM_FENCE_H_ */
53