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