xref: /aosp_15_r20/external/virglrenderer/src/venus/vkr_queue.h (revision bbecb9d118dfdb95f99bd754f8fa9be01f189df3)
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