1*bbecb9d1SAndroid Build Coastguard Worker /* 2*bbecb9d1SAndroid Build Coastguard Worker * Copyright 2020 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 VKR_QUEUE_H 7*bbecb9d1SAndroid Build Coastguard Worker #define VKR_QUEUE_H 8*bbecb9d1SAndroid Build Coastguard Worker 9*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_common.h" 10*bbecb9d1SAndroid Build Coastguard Worker 11*bbecb9d1SAndroid Build Coastguard Worker struct vkr_queue_sync { 12*bbecb9d1SAndroid Build Coastguard Worker VkFence fence; 13*bbecb9d1SAndroid Build Coastguard Worker bool device_lost; 14*bbecb9d1SAndroid Build Coastguard Worker 15*bbecb9d1SAndroid Build Coastguard Worker uint32_t flags; 16*bbecb9d1SAndroid Build Coastguard Worker uint32_t ring_idx; 17*bbecb9d1SAndroid Build Coastguard Worker uint64_t fence_id; 18*bbecb9d1SAndroid Build Coastguard Worker 19*bbecb9d1SAndroid Build Coastguard Worker struct list_head head; 20*bbecb9d1SAndroid Build Coastguard Worker }; 21*bbecb9d1SAndroid Build Coastguard Worker 22*bbecb9d1SAndroid Build Coastguard Worker struct vkr_queue { 23*bbecb9d1SAndroid Build Coastguard Worker struct vkr_object base; 24*bbecb9d1SAndroid Build Coastguard Worker 25*bbecb9d1SAndroid Build Coastguard Worker struct vkr_context *context; 26*bbecb9d1SAndroid Build Coastguard Worker struct vkr_device *device; 27*bbecb9d1SAndroid Build Coastguard Worker 28*bbecb9d1SAndroid Build Coastguard Worker VkDeviceQueueCreateFlags flags; 29*bbecb9d1SAndroid Build Coastguard Worker uint32_t family; 30*bbecb9d1SAndroid Build Coastguard Worker uint32_t index; 31*bbecb9d1SAndroid Build Coastguard Worker 32*bbecb9d1SAndroid Build Coastguard Worker /* only used when client driver uses multiple timelines */ 33*bbecb9d1SAndroid Build Coastguard Worker uint32_t ring_idx; 34*bbecb9d1SAndroid Build Coastguard Worker 35*bbecb9d1SAndroid Build Coastguard Worker /* Submitted fences are added to pending_syncs first. How submitted fences 36*bbecb9d1SAndroid Build Coastguard Worker * are retired depends on VKR_RENDERER_THREAD_SYNC and 37*bbecb9d1SAndroid Build Coastguard Worker * VKR_RENDERER_ASYNC_FENCE_CB. 38*bbecb9d1SAndroid Build Coastguard Worker * 39*bbecb9d1SAndroid Build Coastguard Worker * When VKR_RENDERER_THREAD_SYNC is not set, the main thread calls 40*bbecb9d1SAndroid Build Coastguard Worker * vkGetFenceStatus and retires signaled fences in pending_syncs in order. 41*bbecb9d1SAndroid Build Coastguard Worker * 42*bbecb9d1SAndroid Build Coastguard Worker * When VKR_RENDERER_THREAD_SYNC is set but VKR_RENDERER_ASYNC_FENCE_CB is 43*bbecb9d1SAndroid Build Coastguard Worker * not set, the sync thread calls vkWaitForFences and moves signaled fences 44*bbecb9d1SAndroid Build Coastguard Worker * from pending_syncs to signaled_syncs in order. The main thread simply 45*bbecb9d1SAndroid Build Coastguard Worker * retires all fences in signaled_syncs. 46*bbecb9d1SAndroid Build Coastguard Worker * 47*bbecb9d1SAndroid Build Coastguard Worker * When VKR_RENDERER_THREAD_SYNC and VKR_RENDERER_ASYNC_FENCE_CB are both 48*bbecb9d1SAndroid Build Coastguard Worker * set, the sync thread calls vkWaitForFences and retires signaled fences 49*bbecb9d1SAndroid Build Coastguard Worker * in pending_syncs in order. 50*bbecb9d1SAndroid Build Coastguard Worker */ 51*bbecb9d1SAndroid Build Coastguard Worker int eventfd; 52*bbecb9d1SAndroid Build Coastguard Worker thrd_t thread; 53*bbecb9d1SAndroid Build Coastguard Worker mtx_t mutex; 54*bbecb9d1SAndroid Build Coastguard Worker cnd_t cond; 55*bbecb9d1SAndroid Build Coastguard Worker bool join; 56*bbecb9d1SAndroid Build Coastguard Worker struct list_head pending_syncs; 57*bbecb9d1SAndroid Build Coastguard Worker struct list_head signaled_syncs; 58*bbecb9d1SAndroid Build Coastguard Worker 59*bbecb9d1SAndroid Build Coastguard Worker struct list_head busy_head; 60*bbecb9d1SAndroid Build Coastguard Worker }; 61*bbecb9d1SAndroid Build Coastguard Worker VKR_DEFINE_OBJECT_CAST(queue, VK_OBJECT_TYPE_QUEUE, VkQueue) 62*bbecb9d1SAndroid Build Coastguard Worker 63*bbecb9d1SAndroid Build Coastguard Worker struct vkr_fence { 64*bbecb9d1SAndroid Build Coastguard Worker struct vkr_object base; 65*bbecb9d1SAndroid Build Coastguard Worker }; 66*bbecb9d1SAndroid Build Coastguard Worker VKR_DEFINE_OBJECT_CAST(fence, VK_OBJECT_TYPE_FENCE, VkFence) 67*bbecb9d1SAndroid Build Coastguard Worker 68*bbecb9d1SAndroid Build Coastguard Worker struct vkr_semaphore { 69*bbecb9d1SAndroid Build Coastguard Worker struct vkr_object base; 70*bbecb9d1SAndroid Build Coastguard Worker }; 71*bbecb9d1SAndroid Build Coastguard Worker VKR_DEFINE_OBJECT_CAST(semaphore, VK_OBJECT_TYPE_SEMAPHORE, VkSemaphore) 72*bbecb9d1SAndroid Build Coastguard Worker 73*bbecb9d1SAndroid Build Coastguard Worker struct vkr_event { 74*bbecb9d1SAndroid Build Coastguard Worker struct vkr_object base; 75*bbecb9d1SAndroid Build Coastguard Worker }; 76*bbecb9d1SAndroid Build Coastguard Worker VKR_DEFINE_OBJECT_CAST(event, VK_OBJECT_TYPE_EVENT, VkEvent) 77*bbecb9d1SAndroid Build Coastguard Worker 78*bbecb9d1SAndroid Build Coastguard Worker void 79*bbecb9d1SAndroid Build Coastguard Worker vkr_context_init_queue_dispatch(struct vkr_context *ctx); 80*bbecb9d1SAndroid Build Coastguard Worker 81*bbecb9d1SAndroid Build Coastguard Worker void 82*bbecb9d1SAndroid Build Coastguard Worker vkr_context_init_fence_dispatch(struct vkr_context *ctx); 83*bbecb9d1SAndroid Build Coastguard Worker 84*bbecb9d1SAndroid Build Coastguard Worker void 85*bbecb9d1SAndroid Build Coastguard Worker vkr_context_init_semaphore_dispatch(struct vkr_context *ctx); 86*bbecb9d1SAndroid Build Coastguard Worker 87*bbecb9d1SAndroid Build Coastguard Worker void 88*bbecb9d1SAndroid Build Coastguard Worker vkr_context_init_event_dispatch(struct vkr_context *ctx); 89*bbecb9d1SAndroid Build Coastguard Worker 90*bbecb9d1SAndroid Build Coastguard Worker struct vkr_queue_sync * 91*bbecb9d1SAndroid Build Coastguard Worker vkr_device_alloc_queue_sync(struct vkr_device *dev, 92*bbecb9d1SAndroid Build Coastguard Worker uint32_t fence_flags, 93*bbecb9d1SAndroid Build Coastguard Worker uint32_t ring_idx, 94*bbecb9d1SAndroid Build Coastguard Worker uint64_t fence_id); 95*bbecb9d1SAndroid Build Coastguard Worker 96*bbecb9d1SAndroid Build Coastguard Worker void 97*bbecb9d1SAndroid Build Coastguard Worker vkr_device_free_queue_sync(struct vkr_device *dev, struct vkr_queue_sync *sync); 98*bbecb9d1SAndroid Build Coastguard Worker 99*bbecb9d1SAndroid Build Coastguard Worker void 100*bbecb9d1SAndroid Build Coastguard Worker vkr_queue_get_signaled_syncs(struct vkr_queue *queue, 101*bbecb9d1SAndroid Build Coastguard Worker struct list_head *retired_syncs, 102*bbecb9d1SAndroid Build Coastguard Worker bool *queue_empty); 103*bbecb9d1SAndroid Build Coastguard Worker 104*bbecb9d1SAndroid Build Coastguard Worker struct vkr_queue * 105*bbecb9d1SAndroid Build Coastguard Worker vkr_queue_create(struct vkr_context *ctx, 106*bbecb9d1SAndroid Build Coastguard Worker struct vkr_device *dev, 107*bbecb9d1SAndroid Build Coastguard Worker VkDeviceQueueCreateFlags flags, 108*bbecb9d1SAndroid Build Coastguard Worker uint32_t family, 109*bbecb9d1SAndroid Build Coastguard Worker uint32_t index, 110*bbecb9d1SAndroid Build Coastguard Worker VkQueue handle); 111*bbecb9d1SAndroid Build Coastguard Worker 112*bbecb9d1SAndroid Build Coastguard Worker void 113*bbecb9d1SAndroid Build Coastguard Worker vkr_queue_destroy(struct vkr_context *ctx, struct vkr_queue *queue); 114*bbecb9d1SAndroid Build Coastguard Worker 115*bbecb9d1SAndroid Build Coastguard Worker #endif /* VKR_QUEUE_H */ 116