xref: /aosp_15_r20/external/virglrenderer/src/venus/vkr_queue.c (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 #include "vkr_queue.h"
7*bbecb9d1SAndroid Build Coastguard Worker 
8*bbecb9d1SAndroid Build Coastguard Worker #include "venus-protocol/vn_protocol_renderer_queue.h"
9*bbecb9d1SAndroid Build Coastguard Worker 
10*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_context.h"
11*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_physical_device.h"
12*bbecb9d1SAndroid Build Coastguard Worker #include "vkr_queue_gen.h"
13*bbecb9d1SAndroid Build Coastguard Worker 
14*bbecb9d1SAndroid Build Coastguard Worker struct vkr_queue_sync *
vkr_device_alloc_queue_sync(struct vkr_device * dev,uint32_t fence_flags,uint32_t ring_idx,uint64_t fence_id)15*bbecb9d1SAndroid Build Coastguard Worker vkr_device_alloc_queue_sync(struct vkr_device *dev,
16*bbecb9d1SAndroid Build Coastguard Worker                             uint32_t fence_flags,
17*bbecb9d1SAndroid Build Coastguard Worker                             uint32_t ring_idx,
18*bbecb9d1SAndroid Build Coastguard Worker                             uint64_t fence_id)
19*bbecb9d1SAndroid Build Coastguard Worker {
20*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &dev->proc_table;
21*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_queue_sync *sync;
22*bbecb9d1SAndroid Build Coastguard Worker 
23*bbecb9d1SAndroid Build Coastguard Worker    if (vkr_renderer_flags & VKR_RENDERER_ASYNC_FENCE_CB)
24*bbecb9d1SAndroid Build Coastguard Worker       mtx_lock(&dev->free_sync_mutex);
25*bbecb9d1SAndroid Build Coastguard Worker 
26*bbecb9d1SAndroid Build Coastguard Worker    if (LIST_IS_EMPTY(&dev->free_syncs)) {
27*bbecb9d1SAndroid Build Coastguard Worker       if (vkr_renderer_flags & VKR_RENDERER_ASYNC_FENCE_CB)
28*bbecb9d1SAndroid Build Coastguard Worker          mtx_unlock(&dev->free_sync_mutex);
29*bbecb9d1SAndroid Build Coastguard Worker 
30*bbecb9d1SAndroid Build Coastguard Worker       sync = malloc(sizeof(*sync));
31*bbecb9d1SAndroid Build Coastguard Worker       if (!sync)
32*bbecb9d1SAndroid Build Coastguard Worker          return NULL;
33*bbecb9d1SAndroid Build Coastguard Worker 
34*bbecb9d1SAndroid Build Coastguard Worker       const VkExportFenceCreateInfo export_info = {
35*bbecb9d1SAndroid Build Coastguard Worker          .sType = VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO,
36*bbecb9d1SAndroid Build Coastguard Worker          .handleTypes = VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT,
37*bbecb9d1SAndroid Build Coastguard Worker       };
38*bbecb9d1SAndroid Build Coastguard Worker       const struct VkFenceCreateInfo create_info = {
39*bbecb9d1SAndroid Build Coastguard Worker          .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
40*bbecb9d1SAndroid Build Coastguard Worker          .pNext = dev->physical_device->KHR_external_fence_fd ? &export_info : NULL,
41*bbecb9d1SAndroid Build Coastguard Worker       };
42*bbecb9d1SAndroid Build Coastguard Worker       VkResult result =
43*bbecb9d1SAndroid Build Coastguard Worker          vk->CreateFence(dev->base.handle.device, &create_info, NULL, &sync->fence);
44*bbecb9d1SAndroid Build Coastguard Worker       if (result != VK_SUCCESS) {
45*bbecb9d1SAndroid Build Coastguard Worker          free(sync);
46*bbecb9d1SAndroid Build Coastguard Worker          return NULL;
47*bbecb9d1SAndroid Build Coastguard Worker       }
48*bbecb9d1SAndroid Build Coastguard Worker    } else {
49*bbecb9d1SAndroid Build Coastguard Worker       sync = LIST_ENTRY(struct vkr_queue_sync, dev->free_syncs.next, head);
50*bbecb9d1SAndroid Build Coastguard Worker       list_del(&sync->head);
51*bbecb9d1SAndroid Build Coastguard Worker 
52*bbecb9d1SAndroid Build Coastguard Worker       if (vkr_renderer_flags & VKR_RENDERER_ASYNC_FENCE_CB)
53*bbecb9d1SAndroid Build Coastguard Worker          mtx_unlock(&dev->free_sync_mutex);
54*bbecb9d1SAndroid Build Coastguard Worker 
55*bbecb9d1SAndroid Build Coastguard Worker       vk->ResetFences(dev->base.handle.device, 1, &sync->fence);
56*bbecb9d1SAndroid Build Coastguard Worker    }
57*bbecb9d1SAndroid Build Coastguard Worker 
58*bbecb9d1SAndroid Build Coastguard Worker    sync->device_lost = false;
59*bbecb9d1SAndroid Build Coastguard Worker    sync->flags = fence_flags;
60*bbecb9d1SAndroid Build Coastguard Worker    sync->ring_idx = ring_idx;
61*bbecb9d1SAndroid Build Coastguard Worker    sync->fence_id = fence_id;
62*bbecb9d1SAndroid Build Coastguard Worker 
63*bbecb9d1SAndroid Build Coastguard Worker    return sync;
64*bbecb9d1SAndroid Build Coastguard Worker }
65*bbecb9d1SAndroid Build Coastguard Worker 
66*bbecb9d1SAndroid Build Coastguard Worker void
vkr_device_free_queue_sync(struct vkr_device * dev,struct vkr_queue_sync * sync)67*bbecb9d1SAndroid Build Coastguard Worker vkr_device_free_queue_sync(struct vkr_device *dev, struct vkr_queue_sync *sync)
68*bbecb9d1SAndroid Build Coastguard Worker {
69*bbecb9d1SAndroid Build Coastguard Worker    if (vkr_renderer_flags & VKR_RENDERER_ASYNC_FENCE_CB) {
70*bbecb9d1SAndroid Build Coastguard Worker       mtx_lock(&dev->free_sync_mutex);
71*bbecb9d1SAndroid Build Coastguard Worker       list_addtail(&sync->head, &dev->free_syncs);
72*bbecb9d1SAndroid Build Coastguard Worker       mtx_unlock(&dev->free_sync_mutex);
73*bbecb9d1SAndroid Build Coastguard Worker    } else {
74*bbecb9d1SAndroid Build Coastguard Worker       list_addtail(&sync->head, &dev->free_syncs);
75*bbecb9d1SAndroid Build Coastguard Worker    }
76*bbecb9d1SAndroid Build Coastguard Worker }
77*bbecb9d1SAndroid Build Coastguard Worker 
78*bbecb9d1SAndroid Build Coastguard Worker void
vkr_queue_get_signaled_syncs(struct vkr_queue * queue,struct list_head * retired_syncs,bool * queue_empty)79*bbecb9d1SAndroid Build Coastguard Worker vkr_queue_get_signaled_syncs(struct vkr_queue *queue,
80*bbecb9d1SAndroid Build Coastguard Worker                              struct list_head *retired_syncs,
81*bbecb9d1SAndroid Build Coastguard Worker                              bool *queue_empty)
82*bbecb9d1SAndroid Build Coastguard Worker {
83*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_device *dev = queue->device;
84*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &dev->proc_table;
85*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_queue_sync *sync, *tmp;
86*bbecb9d1SAndroid Build Coastguard Worker 
87*bbecb9d1SAndroid Build Coastguard Worker    assert(!(vkr_renderer_flags & VKR_RENDERER_ASYNC_FENCE_CB));
88*bbecb9d1SAndroid Build Coastguard Worker 
89*bbecb9d1SAndroid Build Coastguard Worker    list_inithead(retired_syncs);
90*bbecb9d1SAndroid Build Coastguard Worker 
91*bbecb9d1SAndroid Build Coastguard Worker    if (vkr_renderer_flags & VKR_RENDERER_THREAD_SYNC) {
92*bbecb9d1SAndroid Build Coastguard Worker       mtx_lock(&queue->mutex);
93*bbecb9d1SAndroid Build Coastguard Worker 
94*bbecb9d1SAndroid Build Coastguard Worker       LIST_FOR_EACH_ENTRY_SAFE (sync, tmp, &queue->signaled_syncs, head) {
95*bbecb9d1SAndroid Build Coastguard Worker          if (sync->head.next == &queue->signaled_syncs ||
96*bbecb9d1SAndroid Build Coastguard Worker              !(sync->flags & VIRGL_RENDERER_FENCE_FLAG_MERGEABLE))
97*bbecb9d1SAndroid Build Coastguard Worker             list_addtail(&sync->head, retired_syncs);
98*bbecb9d1SAndroid Build Coastguard Worker          else
99*bbecb9d1SAndroid Build Coastguard Worker             vkr_device_free_queue_sync(dev, sync);
100*bbecb9d1SAndroid Build Coastguard Worker       }
101*bbecb9d1SAndroid Build Coastguard Worker       list_inithead(&queue->signaled_syncs);
102*bbecb9d1SAndroid Build Coastguard Worker 
103*bbecb9d1SAndroid Build Coastguard Worker       *queue_empty = LIST_IS_EMPTY(&queue->pending_syncs);
104*bbecb9d1SAndroid Build Coastguard Worker 
105*bbecb9d1SAndroid Build Coastguard Worker       mtx_unlock(&queue->mutex);
106*bbecb9d1SAndroid Build Coastguard Worker    } else {
107*bbecb9d1SAndroid Build Coastguard Worker       LIST_FOR_EACH_ENTRY_SAFE (sync, tmp, &queue->pending_syncs, head) {
108*bbecb9d1SAndroid Build Coastguard Worker          if (!sync->device_lost) {
109*bbecb9d1SAndroid Build Coastguard Worker             VkResult result = vk->GetFenceStatus(dev->base.handle.device, sync->fence);
110*bbecb9d1SAndroid Build Coastguard Worker             if (result == VK_NOT_READY)
111*bbecb9d1SAndroid Build Coastguard Worker                break;
112*bbecb9d1SAndroid Build Coastguard Worker          }
113*bbecb9d1SAndroid Build Coastguard Worker 
114*bbecb9d1SAndroid Build Coastguard Worker          bool is_last_sync = sync->head.next == &queue->pending_syncs;
115*bbecb9d1SAndroid Build Coastguard Worker 
116*bbecb9d1SAndroid Build Coastguard Worker          list_del(&sync->head);
117*bbecb9d1SAndroid Build Coastguard Worker          if (is_last_sync || !(sync->flags & VIRGL_RENDERER_FENCE_FLAG_MERGEABLE))
118*bbecb9d1SAndroid Build Coastguard Worker             list_addtail(&sync->head, retired_syncs);
119*bbecb9d1SAndroid Build Coastguard Worker          else
120*bbecb9d1SAndroid Build Coastguard Worker             vkr_device_free_queue_sync(dev, sync);
121*bbecb9d1SAndroid Build Coastguard Worker       }
122*bbecb9d1SAndroid Build Coastguard Worker 
123*bbecb9d1SAndroid Build Coastguard Worker       *queue_empty = LIST_IS_EMPTY(&queue->pending_syncs);
124*bbecb9d1SAndroid Build Coastguard Worker    }
125*bbecb9d1SAndroid Build Coastguard Worker }
126*bbecb9d1SAndroid Build Coastguard Worker 
127*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_queue_sync_retire(struct vkr_context * ctx,struct vkr_device * dev,struct vkr_queue_sync * sync)128*bbecb9d1SAndroid Build Coastguard Worker vkr_queue_sync_retire(struct vkr_context *ctx,
129*bbecb9d1SAndroid Build Coastguard Worker                       struct vkr_device *dev,
130*bbecb9d1SAndroid Build Coastguard Worker                       struct vkr_queue_sync *sync)
131*bbecb9d1SAndroid Build Coastguard Worker {
132*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &dev->proc_table;
133*bbecb9d1SAndroid Build Coastguard Worker 
134*bbecb9d1SAndroid Build Coastguard Worker    if (vkr_renderer_flags & VKR_RENDERER_ASYNC_FENCE_CB) {
135*bbecb9d1SAndroid Build Coastguard Worker       ctx->base.fence_retire(&ctx->base, sync->ring_idx, sync->fence_id);
136*bbecb9d1SAndroid Build Coastguard Worker       vkr_device_free_queue_sync(dev, sync);
137*bbecb9d1SAndroid Build Coastguard Worker    } else {
138*bbecb9d1SAndroid Build Coastguard Worker       vk->DestroyFence(dev->base.handle.device, sync->fence, NULL);
139*bbecb9d1SAndroid Build Coastguard Worker       sync->fence = VK_NULL_HANDLE;
140*bbecb9d1SAndroid Build Coastguard Worker 
141*bbecb9d1SAndroid Build Coastguard Worker       /* move to the ctx to be retired and freed at the next retire_fences */
142*bbecb9d1SAndroid Build Coastguard Worker       list_addtail(&sync->head, &ctx->signaled_syncs);
143*bbecb9d1SAndroid Build Coastguard Worker    }
144*bbecb9d1SAndroid Build Coastguard Worker }
145*bbecb9d1SAndroid Build Coastguard Worker 
146*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_queue_retire_all_syncs(struct vkr_context * ctx,struct vkr_queue * queue)147*bbecb9d1SAndroid Build Coastguard Worker vkr_queue_retire_all_syncs(struct vkr_context *ctx, struct vkr_queue *queue)
148*bbecb9d1SAndroid Build Coastguard Worker {
149*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_queue_sync *sync, *tmp;
150*bbecb9d1SAndroid Build Coastguard Worker 
151*bbecb9d1SAndroid Build Coastguard Worker    if (vkr_renderer_flags & VKR_RENDERER_THREAD_SYNC) {
152*bbecb9d1SAndroid Build Coastguard Worker       mtx_lock(&queue->mutex);
153*bbecb9d1SAndroid Build Coastguard Worker       queue->join = true;
154*bbecb9d1SAndroid Build Coastguard Worker       mtx_unlock(&queue->mutex);
155*bbecb9d1SAndroid Build Coastguard Worker 
156*bbecb9d1SAndroid Build Coastguard Worker       cnd_signal(&queue->cond);
157*bbecb9d1SAndroid Build Coastguard Worker       thrd_join(queue->thread, NULL);
158*bbecb9d1SAndroid Build Coastguard Worker 
159*bbecb9d1SAndroid Build Coastguard Worker       LIST_FOR_EACH_ENTRY_SAFE (sync, tmp, &queue->signaled_syncs, head)
160*bbecb9d1SAndroid Build Coastguard Worker          vkr_queue_sync_retire(ctx, queue->device, sync);
161*bbecb9d1SAndroid Build Coastguard Worker    } else {
162*bbecb9d1SAndroid Build Coastguard Worker       assert(LIST_IS_EMPTY(&queue->signaled_syncs));
163*bbecb9d1SAndroid Build Coastguard Worker    }
164*bbecb9d1SAndroid Build Coastguard Worker 
165*bbecb9d1SAndroid Build Coastguard Worker    LIST_FOR_EACH_ENTRY_SAFE (sync, tmp, &queue->pending_syncs, head)
166*bbecb9d1SAndroid Build Coastguard Worker       vkr_queue_sync_retire(ctx, queue->device, sync);
167*bbecb9d1SAndroid Build Coastguard Worker }
168*bbecb9d1SAndroid Build Coastguard Worker 
169*bbecb9d1SAndroid Build Coastguard Worker void
vkr_queue_destroy(struct vkr_context * ctx,struct vkr_queue * queue)170*bbecb9d1SAndroid Build Coastguard Worker vkr_queue_destroy(struct vkr_context *ctx, struct vkr_queue *queue)
171*bbecb9d1SAndroid Build Coastguard Worker {
172*bbecb9d1SAndroid Build Coastguard Worker    /* vkDeviceWaitIdle has been called */
173*bbecb9d1SAndroid Build Coastguard Worker    vkr_queue_retire_all_syncs(ctx, queue);
174*bbecb9d1SAndroid Build Coastguard Worker 
175*bbecb9d1SAndroid Build Coastguard Worker    mtx_destroy(&queue->mutex);
176*bbecb9d1SAndroid Build Coastguard Worker    cnd_destroy(&queue->cond);
177*bbecb9d1SAndroid Build Coastguard Worker 
178*bbecb9d1SAndroid Build Coastguard Worker    list_del(&queue->busy_head);
179*bbecb9d1SAndroid Build Coastguard Worker    list_del(&queue->base.track_head);
180*bbecb9d1SAndroid Build Coastguard Worker 
181*bbecb9d1SAndroid Build Coastguard Worker    if (queue->ring_idx > 0)
182*bbecb9d1SAndroid Build Coastguard Worker       ctx->sync_queues[queue->ring_idx] = NULL;
183*bbecb9d1SAndroid Build Coastguard Worker 
184*bbecb9d1SAndroid Build Coastguard Worker    if (queue->base.id)
185*bbecb9d1SAndroid Build Coastguard Worker       vkr_context_remove_object(ctx, &queue->base);
186*bbecb9d1SAndroid Build Coastguard Worker    else
187*bbecb9d1SAndroid Build Coastguard Worker       free(queue);
188*bbecb9d1SAndroid Build Coastguard Worker }
189*bbecb9d1SAndroid Build Coastguard Worker 
190*bbecb9d1SAndroid Build Coastguard Worker static int
vkr_queue_thread(void * arg)191*bbecb9d1SAndroid Build Coastguard Worker vkr_queue_thread(void *arg)
192*bbecb9d1SAndroid Build Coastguard Worker {
193*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_queue *queue = arg;
194*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_context *ctx = queue->context;
195*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_device *dev = queue->device;
196*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &dev->proc_table;
197*bbecb9d1SAndroid Build Coastguard Worker    const uint64_t ns_per_sec = 1000000000llu;
198*bbecb9d1SAndroid Build Coastguard Worker    char thread_name[16];
199*bbecb9d1SAndroid Build Coastguard Worker 
200*bbecb9d1SAndroid Build Coastguard Worker    snprintf(thread_name, ARRAY_SIZE(thread_name), "vkr-queue-%d", ctx->base.ctx_id);
201*bbecb9d1SAndroid Build Coastguard Worker    u_thread_setname(thread_name);
202*bbecb9d1SAndroid Build Coastguard Worker 
203*bbecb9d1SAndroid Build Coastguard Worker    mtx_lock(&queue->mutex);
204*bbecb9d1SAndroid Build Coastguard Worker    while (true) {
205*bbecb9d1SAndroid Build Coastguard Worker       while (LIST_IS_EMPTY(&queue->pending_syncs) && !queue->join)
206*bbecb9d1SAndroid Build Coastguard Worker          cnd_wait(&queue->cond, &queue->mutex);
207*bbecb9d1SAndroid Build Coastguard Worker 
208*bbecb9d1SAndroid Build Coastguard Worker       if (queue->join)
209*bbecb9d1SAndroid Build Coastguard Worker          break;
210*bbecb9d1SAndroid Build Coastguard Worker 
211*bbecb9d1SAndroid Build Coastguard Worker       struct vkr_queue_sync *sync =
212*bbecb9d1SAndroid Build Coastguard Worker          LIST_ENTRY(struct vkr_queue_sync, queue->pending_syncs.next, head);
213*bbecb9d1SAndroid Build Coastguard Worker 
214*bbecb9d1SAndroid Build Coastguard Worker       mtx_unlock(&queue->mutex);
215*bbecb9d1SAndroid Build Coastguard Worker 
216*bbecb9d1SAndroid Build Coastguard Worker       VkResult result;
217*bbecb9d1SAndroid Build Coastguard Worker       if (sync->device_lost) {
218*bbecb9d1SAndroid Build Coastguard Worker          result = VK_ERROR_DEVICE_LOST;
219*bbecb9d1SAndroid Build Coastguard Worker       } else {
220*bbecb9d1SAndroid Build Coastguard Worker          result = vk->WaitForFences(dev->base.handle.device, 1, &sync->fence, true,
221*bbecb9d1SAndroid Build Coastguard Worker                                     ns_per_sec * 3);
222*bbecb9d1SAndroid Build Coastguard Worker       }
223*bbecb9d1SAndroid Build Coastguard Worker 
224*bbecb9d1SAndroid Build Coastguard Worker       mtx_lock(&queue->mutex);
225*bbecb9d1SAndroid Build Coastguard Worker 
226*bbecb9d1SAndroid Build Coastguard Worker       if (result == VK_TIMEOUT)
227*bbecb9d1SAndroid Build Coastguard Worker          continue;
228*bbecb9d1SAndroid Build Coastguard Worker 
229*bbecb9d1SAndroid Build Coastguard Worker       list_del(&sync->head);
230*bbecb9d1SAndroid Build Coastguard Worker 
231*bbecb9d1SAndroid Build Coastguard Worker       if (vkr_renderer_flags & VKR_RENDERER_ASYNC_FENCE_CB) {
232*bbecb9d1SAndroid Build Coastguard Worker          ctx->base.fence_retire(&ctx->base, sync->ring_idx, sync->fence_id);
233*bbecb9d1SAndroid Build Coastguard Worker          vkr_device_free_queue_sync(queue->device, sync);
234*bbecb9d1SAndroid Build Coastguard Worker       } else {
235*bbecb9d1SAndroid Build Coastguard Worker          list_addtail(&sync->head, &queue->signaled_syncs);
236*bbecb9d1SAndroid Build Coastguard Worker          write_eventfd(queue->eventfd, 1);
237*bbecb9d1SAndroid Build Coastguard Worker       }
238*bbecb9d1SAndroid Build Coastguard Worker    }
239*bbecb9d1SAndroid Build Coastguard Worker    mtx_unlock(&queue->mutex);
240*bbecb9d1SAndroid Build Coastguard Worker 
241*bbecb9d1SAndroid Build Coastguard Worker    return 0;
242*bbecb9d1SAndroid Build Coastguard Worker }
243*bbecb9d1SAndroid Build Coastguard Worker 
244*bbecb9d1SAndroid Build Coastguard Worker struct vkr_queue *
vkr_queue_create(struct vkr_context * ctx,struct vkr_device * dev,VkDeviceQueueCreateFlags flags,uint32_t family,uint32_t index,VkQueue handle)245*bbecb9d1SAndroid Build Coastguard Worker vkr_queue_create(struct vkr_context *ctx,
246*bbecb9d1SAndroid Build Coastguard Worker                  struct vkr_device *dev,
247*bbecb9d1SAndroid Build Coastguard Worker                  VkDeviceQueueCreateFlags flags,
248*bbecb9d1SAndroid Build Coastguard Worker                  uint32_t family,
249*bbecb9d1SAndroid Build Coastguard Worker                  uint32_t index,
250*bbecb9d1SAndroid Build Coastguard Worker                  VkQueue handle)
251*bbecb9d1SAndroid Build Coastguard Worker {
252*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_queue *queue;
253*bbecb9d1SAndroid Build Coastguard Worker    int ret;
254*bbecb9d1SAndroid Build Coastguard Worker 
255*bbecb9d1SAndroid Build Coastguard Worker    /* id is set to 0 until vkr_queue_assign_object_id */
256*bbecb9d1SAndroid Build Coastguard Worker    queue = vkr_object_alloc(sizeof(*queue), VK_OBJECT_TYPE_QUEUE, 0);
257*bbecb9d1SAndroid Build Coastguard Worker    if (!queue)
258*bbecb9d1SAndroid Build Coastguard Worker       return NULL;
259*bbecb9d1SAndroid Build Coastguard Worker 
260*bbecb9d1SAndroid Build Coastguard Worker    queue->base.handle.queue = handle;
261*bbecb9d1SAndroid Build Coastguard Worker 
262*bbecb9d1SAndroid Build Coastguard Worker    queue->context = ctx;
263*bbecb9d1SAndroid Build Coastguard Worker    queue->device = dev;
264*bbecb9d1SAndroid Build Coastguard Worker    queue->flags = flags;
265*bbecb9d1SAndroid Build Coastguard Worker    queue->family = family;
266*bbecb9d1SAndroid Build Coastguard Worker    queue->index = index;
267*bbecb9d1SAndroid Build Coastguard Worker 
268*bbecb9d1SAndroid Build Coastguard Worker    list_inithead(&queue->pending_syncs);
269*bbecb9d1SAndroid Build Coastguard Worker    list_inithead(&queue->signaled_syncs);
270*bbecb9d1SAndroid Build Coastguard Worker 
271*bbecb9d1SAndroid Build Coastguard Worker    ret = mtx_init(&queue->mutex, mtx_plain);
272*bbecb9d1SAndroid Build Coastguard Worker    if (ret != thrd_success) {
273*bbecb9d1SAndroid Build Coastguard Worker       free(queue);
274*bbecb9d1SAndroid Build Coastguard Worker       return NULL;
275*bbecb9d1SAndroid Build Coastguard Worker    }
276*bbecb9d1SAndroid Build Coastguard Worker    ret = cnd_init(&queue->cond);
277*bbecb9d1SAndroid Build Coastguard Worker    if (ret != thrd_success) {
278*bbecb9d1SAndroid Build Coastguard Worker       mtx_destroy(&queue->mutex);
279*bbecb9d1SAndroid Build Coastguard Worker       free(queue);
280*bbecb9d1SAndroid Build Coastguard Worker       return NULL;
281*bbecb9d1SAndroid Build Coastguard Worker    }
282*bbecb9d1SAndroid Build Coastguard Worker 
283*bbecb9d1SAndroid Build Coastguard Worker    if (vkr_renderer_flags & VKR_RENDERER_THREAD_SYNC) {
284*bbecb9d1SAndroid Build Coastguard Worker       ret = thrd_create(&queue->thread, vkr_queue_thread, queue);
285*bbecb9d1SAndroid Build Coastguard Worker       if (ret != thrd_success) {
286*bbecb9d1SAndroid Build Coastguard Worker          mtx_destroy(&queue->mutex);
287*bbecb9d1SAndroid Build Coastguard Worker          cnd_destroy(&queue->cond);
288*bbecb9d1SAndroid Build Coastguard Worker          free(queue);
289*bbecb9d1SAndroid Build Coastguard Worker          return NULL;
290*bbecb9d1SAndroid Build Coastguard Worker       }
291*bbecb9d1SAndroid Build Coastguard Worker       queue->eventfd = ctx->fence_eventfd;
292*bbecb9d1SAndroid Build Coastguard Worker    }
293*bbecb9d1SAndroid Build Coastguard Worker 
294*bbecb9d1SAndroid Build Coastguard Worker    list_inithead(&queue->busy_head);
295*bbecb9d1SAndroid Build Coastguard Worker    list_inithead(&queue->base.track_head);
296*bbecb9d1SAndroid Build Coastguard Worker 
297*bbecb9d1SAndroid Build Coastguard Worker    return queue;
298*bbecb9d1SAndroid Build Coastguard Worker }
299*bbecb9d1SAndroid Build Coastguard Worker 
300*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_queue_assign_object_id(struct vkr_context * ctx,struct vkr_queue * queue,vkr_object_id id)301*bbecb9d1SAndroid Build Coastguard Worker vkr_queue_assign_object_id(struct vkr_context *ctx,
302*bbecb9d1SAndroid Build Coastguard Worker                            struct vkr_queue *queue,
303*bbecb9d1SAndroid Build Coastguard Worker                            vkr_object_id id)
304*bbecb9d1SAndroid Build Coastguard Worker {
305*bbecb9d1SAndroid Build Coastguard Worker    if (queue->base.id) {
306*bbecb9d1SAndroid Build Coastguard Worker       if (queue->base.id != id)
307*bbecb9d1SAndroid Build Coastguard Worker          vkr_cs_decoder_set_fatal(&ctx->decoder);
308*bbecb9d1SAndroid Build Coastguard Worker       return;
309*bbecb9d1SAndroid Build Coastguard Worker    }
310*bbecb9d1SAndroid Build Coastguard Worker    if (!vkr_context_validate_object_id(ctx, id))
311*bbecb9d1SAndroid Build Coastguard Worker       return;
312*bbecb9d1SAndroid Build Coastguard Worker 
313*bbecb9d1SAndroid Build Coastguard Worker    queue->base.id = id;
314*bbecb9d1SAndroid Build Coastguard Worker 
315*bbecb9d1SAndroid Build Coastguard Worker    vkr_context_add_object(ctx, &queue->base);
316*bbecb9d1SAndroid Build Coastguard Worker }
317*bbecb9d1SAndroid Build Coastguard Worker 
318*bbecb9d1SAndroid Build Coastguard Worker static struct vkr_queue *
vkr_device_lookup_queue(struct vkr_device * dev,VkDeviceQueueCreateFlags flags,uint32_t family,uint32_t index)319*bbecb9d1SAndroid Build Coastguard Worker vkr_device_lookup_queue(struct vkr_device *dev,
320*bbecb9d1SAndroid Build Coastguard Worker                         VkDeviceQueueCreateFlags flags,
321*bbecb9d1SAndroid Build Coastguard Worker                         uint32_t family,
322*bbecb9d1SAndroid Build Coastguard Worker                         uint32_t index)
323*bbecb9d1SAndroid Build Coastguard Worker {
324*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_queue *queue;
325*bbecb9d1SAndroid Build Coastguard Worker 
326*bbecb9d1SAndroid Build Coastguard Worker    LIST_FOR_EACH_ENTRY (queue, &dev->queues, base.track_head) {
327*bbecb9d1SAndroid Build Coastguard Worker       if (queue->flags == flags && queue->family == family && queue->index == index)
328*bbecb9d1SAndroid Build Coastguard Worker          return queue;
329*bbecb9d1SAndroid Build Coastguard Worker    }
330*bbecb9d1SAndroid Build Coastguard Worker 
331*bbecb9d1SAndroid Build Coastguard Worker    return NULL;
332*bbecb9d1SAndroid Build Coastguard Worker }
333*bbecb9d1SAndroid Build Coastguard Worker 
334*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkGetDeviceQueue(struct vn_dispatch_context * dispatch,struct vn_command_vkGetDeviceQueue * args)335*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkGetDeviceQueue(struct vn_dispatch_context *dispatch,
336*bbecb9d1SAndroid Build Coastguard Worker                               struct vn_command_vkGetDeviceQueue *args)
337*bbecb9d1SAndroid Build Coastguard Worker {
338*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_context *ctx = dispatch->data;
339*bbecb9d1SAndroid Build Coastguard Worker 
340*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_device *dev = vkr_device_from_handle(args->device);
341*bbecb9d1SAndroid Build Coastguard Worker 
342*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_queue *queue = vkr_device_lookup_queue(
343*bbecb9d1SAndroid Build Coastguard Worker       dev, 0 /* flags */, args->queueFamilyIndex, args->queueIndex);
344*bbecb9d1SAndroid Build Coastguard Worker    if (!queue) {
345*bbecb9d1SAndroid Build Coastguard Worker       vkr_cs_decoder_set_fatal(&ctx->decoder);
346*bbecb9d1SAndroid Build Coastguard Worker       return;
347*bbecb9d1SAndroid Build Coastguard Worker    }
348*bbecb9d1SAndroid Build Coastguard Worker 
349*bbecb9d1SAndroid Build Coastguard Worker    const vkr_object_id id =
350*bbecb9d1SAndroid Build Coastguard Worker       vkr_cs_handle_load_id((const void **)args->pQueue, VK_OBJECT_TYPE_QUEUE);
351*bbecb9d1SAndroid Build Coastguard Worker    vkr_queue_assign_object_id(ctx, queue, id);
352*bbecb9d1SAndroid Build Coastguard Worker }
353*bbecb9d1SAndroid Build Coastguard Worker 
354*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkGetDeviceQueue2(struct vn_dispatch_context * dispatch,struct vn_command_vkGetDeviceQueue2 * args)355*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkGetDeviceQueue2(struct vn_dispatch_context *dispatch,
356*bbecb9d1SAndroid Build Coastguard Worker                                struct vn_command_vkGetDeviceQueue2 *args)
357*bbecb9d1SAndroid Build Coastguard Worker {
358*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_context *ctx = dispatch->data;
359*bbecb9d1SAndroid Build Coastguard Worker 
360*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_device *dev = vkr_device_from_handle(args->device);
361*bbecb9d1SAndroid Build Coastguard Worker 
362*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_queue *queue = vkr_device_lookup_queue(dev, args->pQueueInfo->flags,
363*bbecb9d1SAndroid Build Coastguard Worker                                                      args->pQueueInfo->queueFamilyIndex,
364*bbecb9d1SAndroid Build Coastguard Worker                                                      args->pQueueInfo->queueIndex);
365*bbecb9d1SAndroid Build Coastguard Worker    if (!queue) {
366*bbecb9d1SAndroid Build Coastguard Worker       vkr_cs_decoder_set_fatal(&ctx->decoder);
367*bbecb9d1SAndroid Build Coastguard Worker       return;
368*bbecb9d1SAndroid Build Coastguard Worker    }
369*bbecb9d1SAndroid Build Coastguard Worker 
370*bbecb9d1SAndroid Build Coastguard Worker    const VkDeviceQueueTimelineInfoMESA *timeline_info = vkr_find_struct(
371*bbecb9d1SAndroid Build Coastguard Worker       args->pQueueInfo->pNext, VK_STRUCTURE_TYPE_DEVICE_QUEUE_TIMELINE_INFO_MESA);
372*bbecb9d1SAndroid Build Coastguard Worker    if (timeline_info) {
373*bbecb9d1SAndroid Build Coastguard Worker       if (timeline_info->ringIdx == 0 ||
374*bbecb9d1SAndroid Build Coastguard Worker           timeline_info->ringIdx >= ARRAY_SIZE(ctx->sync_queues)) {
375*bbecb9d1SAndroid Build Coastguard Worker          vkr_log("invalid ring_idx %d", timeline_info->ringIdx);
376*bbecb9d1SAndroid Build Coastguard Worker          vkr_cs_decoder_set_fatal(&ctx->decoder);
377*bbecb9d1SAndroid Build Coastguard Worker          return;
378*bbecb9d1SAndroid Build Coastguard Worker       }
379*bbecb9d1SAndroid Build Coastguard Worker 
380*bbecb9d1SAndroid Build Coastguard Worker       if (ctx->sync_queues[timeline_info->ringIdx]) {
381*bbecb9d1SAndroid Build Coastguard Worker          vkr_log("sync_queue %d already bound", timeline_info->ringIdx);
382*bbecb9d1SAndroid Build Coastguard Worker          vkr_cs_decoder_set_fatal(&ctx->decoder);
383*bbecb9d1SAndroid Build Coastguard Worker          return;
384*bbecb9d1SAndroid Build Coastguard Worker       }
385*bbecb9d1SAndroid Build Coastguard Worker 
386*bbecb9d1SAndroid Build Coastguard Worker       queue->ring_idx = timeline_info->ringIdx;
387*bbecb9d1SAndroid Build Coastguard Worker       ctx->sync_queues[timeline_info->ringIdx] = queue;
388*bbecb9d1SAndroid Build Coastguard Worker    }
389*bbecb9d1SAndroid Build Coastguard Worker 
390*bbecb9d1SAndroid Build Coastguard Worker    const vkr_object_id id =
391*bbecb9d1SAndroid Build Coastguard Worker       vkr_cs_handle_load_id((const void **)args->pQueue, VK_OBJECT_TYPE_QUEUE);
392*bbecb9d1SAndroid Build Coastguard Worker    vkr_queue_assign_object_id(ctx, queue, id);
393*bbecb9d1SAndroid Build Coastguard Worker }
394*bbecb9d1SAndroid Build Coastguard Worker 
395*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkQueueSubmit(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkQueueSubmit * args)396*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkQueueSubmit(UNUSED struct vn_dispatch_context *dispatch,
397*bbecb9d1SAndroid Build Coastguard Worker                            struct vn_command_vkQueueSubmit *args)
398*bbecb9d1SAndroid Build Coastguard Worker {
399*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_queue *queue = vkr_queue_from_handle(args->queue);
400*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &queue->device->proc_table;
401*bbecb9d1SAndroid Build Coastguard Worker 
402*bbecb9d1SAndroid Build Coastguard Worker    vn_replace_vkQueueSubmit_args_handle(args);
403*bbecb9d1SAndroid Build Coastguard Worker    args->ret =
404*bbecb9d1SAndroid Build Coastguard Worker       vk->QueueSubmit(args->queue, args->submitCount, args->pSubmits, args->fence);
405*bbecb9d1SAndroid Build Coastguard Worker }
406*bbecb9d1SAndroid Build Coastguard Worker 
407*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkQueueBindSparse(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkQueueBindSparse * args)408*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkQueueBindSparse(UNUSED struct vn_dispatch_context *dispatch,
409*bbecb9d1SAndroid Build Coastguard Worker                                struct vn_command_vkQueueBindSparse *args)
410*bbecb9d1SAndroid Build Coastguard Worker {
411*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_queue *queue = vkr_queue_from_handle(args->queue);
412*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &queue->device->proc_table;
413*bbecb9d1SAndroid Build Coastguard Worker 
414*bbecb9d1SAndroid Build Coastguard Worker    vn_replace_vkQueueBindSparse_args_handle(args);
415*bbecb9d1SAndroid Build Coastguard Worker    args->ret =
416*bbecb9d1SAndroid Build Coastguard Worker       vk->QueueBindSparse(args->queue, args->bindInfoCount, args->pBindInfo, args->fence);
417*bbecb9d1SAndroid Build Coastguard Worker }
418*bbecb9d1SAndroid Build Coastguard Worker 
419*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkQueueWaitIdle(struct vn_dispatch_context * dispatch,UNUSED struct vn_command_vkQueueWaitIdle * args)420*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkQueueWaitIdle(struct vn_dispatch_context *dispatch,
421*bbecb9d1SAndroid Build Coastguard Worker                              UNUSED struct vn_command_vkQueueWaitIdle *args)
422*bbecb9d1SAndroid Build Coastguard Worker {
423*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_context *ctx = dispatch->data;
424*bbecb9d1SAndroid Build Coastguard Worker    /* no blocking call */
425*bbecb9d1SAndroid Build Coastguard Worker    vkr_cs_decoder_set_fatal(&ctx->decoder);
426*bbecb9d1SAndroid Build Coastguard Worker }
427*bbecb9d1SAndroid Build Coastguard Worker 
428*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkQueueSubmit2(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkQueueSubmit2 * args)429*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkQueueSubmit2(UNUSED struct vn_dispatch_context *dispatch,
430*bbecb9d1SAndroid Build Coastguard Worker                             struct vn_command_vkQueueSubmit2 *args)
431*bbecb9d1SAndroid Build Coastguard Worker {
432*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_queue *queue = vkr_queue_from_handle(args->queue);
433*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &queue->device->proc_table;
434*bbecb9d1SAndroid Build Coastguard Worker 
435*bbecb9d1SAndroid Build Coastguard Worker    vn_replace_vkQueueSubmit2_args_handle(args);
436*bbecb9d1SAndroid Build Coastguard Worker    args->ret =
437*bbecb9d1SAndroid Build Coastguard Worker       vk->QueueSubmit2(args->queue, args->submitCount, args->pSubmits, args->fence);
438*bbecb9d1SAndroid Build Coastguard Worker }
439*bbecb9d1SAndroid Build Coastguard Worker 
440*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkCreateFence(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateFence * args)441*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkCreateFence(struct vn_dispatch_context *dispatch,
442*bbecb9d1SAndroid Build Coastguard Worker                            struct vn_command_vkCreateFence *args)
443*bbecb9d1SAndroid Build Coastguard Worker {
444*bbecb9d1SAndroid Build Coastguard Worker    vkr_fence_create_and_add(dispatch->data, args);
445*bbecb9d1SAndroid Build Coastguard Worker }
446*bbecb9d1SAndroid Build Coastguard Worker 
447*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkDestroyFence(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroyFence * args)448*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkDestroyFence(struct vn_dispatch_context *dispatch,
449*bbecb9d1SAndroid Build Coastguard Worker                             struct vn_command_vkDestroyFence *args)
450*bbecb9d1SAndroid Build Coastguard Worker {
451*bbecb9d1SAndroid Build Coastguard Worker    vkr_fence_destroy_and_remove(dispatch->data, args);
452*bbecb9d1SAndroid Build Coastguard Worker }
453*bbecb9d1SAndroid Build Coastguard Worker 
454*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkResetFences(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkResetFences * args)455*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkResetFences(UNUSED struct vn_dispatch_context *dispatch,
456*bbecb9d1SAndroid Build Coastguard Worker                            struct vn_command_vkResetFences *args)
457*bbecb9d1SAndroid Build Coastguard Worker {
458*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_device *dev = vkr_device_from_handle(args->device);
459*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &dev->proc_table;
460*bbecb9d1SAndroid Build Coastguard Worker 
461*bbecb9d1SAndroid Build Coastguard Worker    vn_replace_vkResetFences_args_handle(args);
462*bbecb9d1SAndroid Build Coastguard Worker    args->ret = vk->ResetFences(args->device, args->fenceCount, args->pFences);
463*bbecb9d1SAndroid Build Coastguard Worker }
464*bbecb9d1SAndroid Build Coastguard Worker 
465*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkGetFenceStatus(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetFenceStatus * args)466*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkGetFenceStatus(UNUSED struct vn_dispatch_context *dispatch,
467*bbecb9d1SAndroid Build Coastguard Worker                               struct vn_command_vkGetFenceStatus *args)
468*bbecb9d1SAndroid Build Coastguard Worker {
469*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_device *dev = vkr_device_from_handle(args->device);
470*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &dev->proc_table;
471*bbecb9d1SAndroid Build Coastguard Worker 
472*bbecb9d1SAndroid Build Coastguard Worker    vn_replace_vkGetFenceStatus_args_handle(args);
473*bbecb9d1SAndroid Build Coastguard Worker    args->ret = vk->GetFenceStatus(args->device, args->fence);
474*bbecb9d1SAndroid Build Coastguard Worker }
475*bbecb9d1SAndroid Build Coastguard Worker 
476*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkWaitForFences(struct vn_dispatch_context * dispatch,struct vn_command_vkWaitForFences * args)477*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkWaitForFences(struct vn_dispatch_context *dispatch,
478*bbecb9d1SAndroid Build Coastguard Worker                              struct vn_command_vkWaitForFences *args)
479*bbecb9d1SAndroid Build Coastguard Worker {
480*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_context *ctx = dispatch->data;
481*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_device *dev = vkr_device_from_handle(args->device);
482*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &dev->proc_table;
483*bbecb9d1SAndroid Build Coastguard Worker 
484*bbecb9d1SAndroid Build Coastguard Worker    vn_replace_vkWaitForFences_args_handle(args);
485*bbecb9d1SAndroid Build Coastguard Worker    args->ret = vk->WaitForFences(args->device, args->fenceCount, args->pFences,
486*bbecb9d1SAndroid Build Coastguard Worker                                  args->waitAll, args->timeout);
487*bbecb9d1SAndroid Build Coastguard Worker 
488*bbecb9d1SAndroid Build Coastguard Worker    if (args->ret == VK_ERROR_DEVICE_LOST)
489*bbecb9d1SAndroid Build Coastguard Worker       vkr_cs_decoder_set_fatal(&ctx->decoder);
490*bbecb9d1SAndroid Build Coastguard Worker }
491*bbecb9d1SAndroid Build Coastguard Worker 
492*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkResetFenceResource100000MESA(struct vn_dispatch_context * dispatch,struct vn_command_vkResetFenceResource100000MESA * args)493*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkResetFenceResource100000MESA(
494*bbecb9d1SAndroid Build Coastguard Worker    struct vn_dispatch_context *dispatch,
495*bbecb9d1SAndroid Build Coastguard Worker    struct vn_command_vkResetFenceResource100000MESA *args)
496*bbecb9d1SAndroid Build Coastguard Worker {
497*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_context *ctx = dispatch->data;
498*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_device *dev = vkr_device_from_handle(args->device);
499*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &dev->proc_table;
500*bbecb9d1SAndroid Build Coastguard Worker    int fd = -1;
501*bbecb9d1SAndroid Build Coastguard Worker 
502*bbecb9d1SAndroid Build Coastguard Worker    vn_replace_vkResetFenceResource100000MESA_args_handle(args);
503*bbecb9d1SAndroid Build Coastguard Worker 
504*bbecb9d1SAndroid Build Coastguard Worker    const VkFenceGetFdInfoKHR info = {
505*bbecb9d1SAndroid Build Coastguard Worker       .sType = VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR,
506*bbecb9d1SAndroid Build Coastguard Worker       .fence = args->fence,
507*bbecb9d1SAndroid Build Coastguard Worker       .handleType = VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT,
508*bbecb9d1SAndroid Build Coastguard Worker    };
509*bbecb9d1SAndroid Build Coastguard Worker    VkResult result = vk->GetFenceFdKHR(args->device, &info, &fd);
510*bbecb9d1SAndroid Build Coastguard Worker    if (result != VK_SUCCESS) {
511*bbecb9d1SAndroid Build Coastguard Worker       vkr_cs_decoder_set_fatal(&ctx->decoder);
512*bbecb9d1SAndroid Build Coastguard Worker       return;
513*bbecb9d1SAndroid Build Coastguard Worker    }
514*bbecb9d1SAndroid Build Coastguard Worker 
515*bbecb9d1SAndroid Build Coastguard Worker    if (fd >= 0)
516*bbecb9d1SAndroid Build Coastguard Worker       close(fd);
517*bbecb9d1SAndroid Build Coastguard Worker }
518*bbecb9d1SAndroid Build Coastguard Worker 
519*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkCreateSemaphore(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateSemaphore * args)520*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkCreateSemaphore(struct vn_dispatch_context *dispatch,
521*bbecb9d1SAndroid Build Coastguard Worker                                struct vn_command_vkCreateSemaphore *args)
522*bbecb9d1SAndroid Build Coastguard Worker {
523*bbecb9d1SAndroid Build Coastguard Worker    vkr_semaphore_create_and_add(dispatch->data, args);
524*bbecb9d1SAndroid Build Coastguard Worker }
525*bbecb9d1SAndroid Build Coastguard Worker 
526*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkDestroySemaphore(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroySemaphore * args)527*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkDestroySemaphore(struct vn_dispatch_context *dispatch,
528*bbecb9d1SAndroid Build Coastguard Worker                                 struct vn_command_vkDestroySemaphore *args)
529*bbecb9d1SAndroid Build Coastguard Worker {
530*bbecb9d1SAndroid Build Coastguard Worker    vkr_semaphore_destroy_and_remove(dispatch->data, args);
531*bbecb9d1SAndroid Build Coastguard Worker }
532*bbecb9d1SAndroid Build Coastguard Worker 
533*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkGetSemaphoreCounterValue(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetSemaphoreCounterValue * args)534*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkGetSemaphoreCounterValue(UNUSED struct vn_dispatch_context *dispatch,
535*bbecb9d1SAndroid Build Coastguard Worker                                         struct vn_command_vkGetSemaphoreCounterValue *args)
536*bbecb9d1SAndroid Build Coastguard Worker {
537*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_device *dev = vkr_device_from_handle(args->device);
538*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &dev->proc_table;
539*bbecb9d1SAndroid Build Coastguard Worker 
540*bbecb9d1SAndroid Build Coastguard Worker    vn_replace_vkGetSemaphoreCounterValue_args_handle(args);
541*bbecb9d1SAndroid Build Coastguard Worker    args->ret = vk->GetSemaphoreCounterValue(args->device, args->semaphore, args->pValue);
542*bbecb9d1SAndroid Build Coastguard Worker }
543*bbecb9d1SAndroid Build Coastguard Worker 
544*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkWaitSemaphores(struct vn_dispatch_context * dispatch,struct vn_command_vkWaitSemaphores * args)545*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkWaitSemaphores(struct vn_dispatch_context *dispatch,
546*bbecb9d1SAndroid Build Coastguard Worker                               struct vn_command_vkWaitSemaphores *args)
547*bbecb9d1SAndroid Build Coastguard Worker {
548*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_context *ctx = dispatch->data;
549*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_device *dev = vkr_device_from_handle(args->device);
550*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &dev->proc_table;
551*bbecb9d1SAndroid Build Coastguard Worker 
552*bbecb9d1SAndroid Build Coastguard Worker    vn_replace_vkWaitSemaphores_args_handle(args);
553*bbecb9d1SAndroid Build Coastguard Worker    args->ret = vk->WaitSemaphores(args->device, args->pWaitInfo, args->timeout);
554*bbecb9d1SAndroid Build Coastguard Worker 
555*bbecb9d1SAndroid Build Coastguard Worker    if (args->ret == VK_ERROR_DEVICE_LOST)
556*bbecb9d1SAndroid Build Coastguard Worker       vkr_cs_decoder_set_fatal(&ctx->decoder);
557*bbecb9d1SAndroid Build Coastguard Worker }
558*bbecb9d1SAndroid Build Coastguard Worker 
559*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkSignalSemaphore(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkSignalSemaphore * args)560*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkSignalSemaphore(UNUSED struct vn_dispatch_context *dispatch,
561*bbecb9d1SAndroid Build Coastguard Worker                                struct vn_command_vkSignalSemaphore *args)
562*bbecb9d1SAndroid Build Coastguard Worker {
563*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_device *dev = vkr_device_from_handle(args->device);
564*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &dev->proc_table;
565*bbecb9d1SAndroid Build Coastguard Worker 
566*bbecb9d1SAndroid Build Coastguard Worker    vn_replace_vkSignalSemaphore_args_handle(args);
567*bbecb9d1SAndroid Build Coastguard Worker    args->ret = vk->SignalSemaphore(args->device, args->pSignalInfo);
568*bbecb9d1SAndroid Build Coastguard Worker }
569*bbecb9d1SAndroid Build Coastguard Worker 
570*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkWaitSemaphoreResource100000MESA(struct vn_dispatch_context * dispatch,struct vn_command_vkWaitSemaphoreResource100000MESA * args)571*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkWaitSemaphoreResource100000MESA(
572*bbecb9d1SAndroid Build Coastguard Worker    struct vn_dispatch_context *dispatch,
573*bbecb9d1SAndroid Build Coastguard Worker    struct vn_command_vkWaitSemaphoreResource100000MESA *args)
574*bbecb9d1SAndroid Build Coastguard Worker {
575*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_context *ctx = dispatch->data;
576*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_device *dev = vkr_device_from_handle(args->device);
577*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &dev->proc_table;
578*bbecb9d1SAndroid Build Coastguard Worker    int fd = -1;
579*bbecb9d1SAndroid Build Coastguard Worker 
580*bbecb9d1SAndroid Build Coastguard Worker    vn_replace_vkWaitSemaphoreResource100000MESA_args_handle(args);
581*bbecb9d1SAndroid Build Coastguard Worker 
582*bbecb9d1SAndroid Build Coastguard Worker    const VkSemaphoreGetFdInfoKHR info = {
583*bbecb9d1SAndroid Build Coastguard Worker       .sType = VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR,
584*bbecb9d1SAndroid Build Coastguard Worker       .semaphore = args->semaphore,
585*bbecb9d1SAndroid Build Coastguard Worker       .handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT,
586*bbecb9d1SAndroid Build Coastguard Worker    };
587*bbecb9d1SAndroid Build Coastguard Worker    VkResult result = vk->GetSemaphoreFdKHR(args->device, &info, &fd);
588*bbecb9d1SAndroid Build Coastguard Worker    if (result != VK_SUCCESS) {
589*bbecb9d1SAndroid Build Coastguard Worker       vkr_cs_decoder_set_fatal(&ctx->decoder);
590*bbecb9d1SAndroid Build Coastguard Worker       return;
591*bbecb9d1SAndroid Build Coastguard Worker    }
592*bbecb9d1SAndroid Build Coastguard Worker 
593*bbecb9d1SAndroid Build Coastguard Worker    if (fd >= 0)
594*bbecb9d1SAndroid Build Coastguard Worker       close(fd);
595*bbecb9d1SAndroid Build Coastguard Worker }
596*bbecb9d1SAndroid Build Coastguard Worker 
597*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkImportSemaphoreResource100000MESA(struct vn_dispatch_context * dispatch,struct vn_command_vkImportSemaphoreResource100000MESA * args)598*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkImportSemaphoreResource100000MESA(
599*bbecb9d1SAndroid Build Coastguard Worker    struct vn_dispatch_context *dispatch,
600*bbecb9d1SAndroid Build Coastguard Worker    struct vn_command_vkImportSemaphoreResource100000MESA *args)
601*bbecb9d1SAndroid Build Coastguard Worker {
602*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_context *ctx = dispatch->data;
603*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_device *dev = vkr_device_from_handle(args->device);
604*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &dev->proc_table;
605*bbecb9d1SAndroid Build Coastguard Worker 
606*bbecb9d1SAndroid Build Coastguard Worker    vn_replace_vkImportSemaphoreResource100000MESA_args_handle(args);
607*bbecb9d1SAndroid Build Coastguard Worker 
608*bbecb9d1SAndroid Build Coastguard Worker    const VkImportSemaphoreResourceInfo100000MESA *res_info =
609*bbecb9d1SAndroid Build Coastguard Worker       args->pImportSemaphoreResourceInfo;
610*bbecb9d1SAndroid Build Coastguard Worker 
611*bbecb9d1SAndroid Build Coastguard Worker    /* resourceId 0 is for importing a signaled payload to sync_fd fence */
612*bbecb9d1SAndroid Build Coastguard Worker    assert(!res_info->resourceId);
613*bbecb9d1SAndroid Build Coastguard Worker 
614*bbecb9d1SAndroid Build Coastguard Worker    const VkImportSemaphoreFdInfoKHR import_info = {
615*bbecb9d1SAndroid Build Coastguard Worker       .sType = VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR,
616*bbecb9d1SAndroid Build Coastguard Worker       .semaphore = res_info->semaphore,
617*bbecb9d1SAndroid Build Coastguard Worker       .flags = VK_SEMAPHORE_IMPORT_TEMPORARY_BIT,
618*bbecb9d1SAndroid Build Coastguard Worker       .handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT,
619*bbecb9d1SAndroid Build Coastguard Worker       .fd = -1,
620*bbecb9d1SAndroid Build Coastguard Worker    };
621*bbecb9d1SAndroid Build Coastguard Worker    if (vk->ImportSemaphoreFdKHR(args->device, &import_info) != VK_SUCCESS)
622*bbecb9d1SAndroid Build Coastguard Worker       vkr_cs_decoder_set_fatal(&ctx->decoder);
623*bbecb9d1SAndroid Build Coastguard Worker }
624*bbecb9d1SAndroid Build Coastguard Worker 
625*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkCreateEvent(struct vn_dispatch_context * dispatch,struct vn_command_vkCreateEvent * args)626*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkCreateEvent(struct vn_dispatch_context *dispatch,
627*bbecb9d1SAndroid Build Coastguard Worker                            struct vn_command_vkCreateEvent *args)
628*bbecb9d1SAndroid Build Coastguard Worker {
629*bbecb9d1SAndroid Build Coastguard Worker    vkr_event_create_and_add(dispatch->data, args);
630*bbecb9d1SAndroid Build Coastguard Worker }
631*bbecb9d1SAndroid Build Coastguard Worker 
632*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkDestroyEvent(struct vn_dispatch_context * dispatch,struct vn_command_vkDestroyEvent * args)633*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkDestroyEvent(struct vn_dispatch_context *dispatch,
634*bbecb9d1SAndroid Build Coastguard Worker                             struct vn_command_vkDestroyEvent *args)
635*bbecb9d1SAndroid Build Coastguard Worker {
636*bbecb9d1SAndroid Build Coastguard Worker    vkr_event_destroy_and_remove(dispatch->data, args);
637*bbecb9d1SAndroid Build Coastguard Worker }
638*bbecb9d1SAndroid Build Coastguard Worker 
639*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkGetEventStatus(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkGetEventStatus * args)640*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkGetEventStatus(UNUSED struct vn_dispatch_context *dispatch,
641*bbecb9d1SAndroid Build Coastguard Worker                               struct vn_command_vkGetEventStatus *args)
642*bbecb9d1SAndroid Build Coastguard Worker {
643*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_device *dev = vkr_device_from_handle(args->device);
644*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &dev->proc_table;
645*bbecb9d1SAndroid Build Coastguard Worker 
646*bbecb9d1SAndroid Build Coastguard Worker    vn_replace_vkGetEventStatus_args_handle(args);
647*bbecb9d1SAndroid Build Coastguard Worker    args->ret = vk->GetEventStatus(args->device, args->event);
648*bbecb9d1SAndroid Build Coastguard Worker }
649*bbecb9d1SAndroid Build Coastguard Worker 
650*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkSetEvent(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkSetEvent * args)651*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkSetEvent(UNUSED struct vn_dispatch_context *dispatch,
652*bbecb9d1SAndroid Build Coastguard Worker                         struct vn_command_vkSetEvent *args)
653*bbecb9d1SAndroid Build Coastguard Worker {
654*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_device *dev = vkr_device_from_handle(args->device);
655*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &dev->proc_table;
656*bbecb9d1SAndroid Build Coastguard Worker 
657*bbecb9d1SAndroid Build Coastguard Worker    vn_replace_vkSetEvent_args_handle(args);
658*bbecb9d1SAndroid Build Coastguard Worker    args->ret = vk->SetEvent(args->device, args->event);
659*bbecb9d1SAndroid Build Coastguard Worker }
660*bbecb9d1SAndroid Build Coastguard Worker 
661*bbecb9d1SAndroid Build Coastguard Worker static void
vkr_dispatch_vkResetEvent(UNUSED struct vn_dispatch_context * dispatch,struct vn_command_vkResetEvent * args)662*bbecb9d1SAndroid Build Coastguard Worker vkr_dispatch_vkResetEvent(UNUSED struct vn_dispatch_context *dispatch,
663*bbecb9d1SAndroid Build Coastguard Worker                           struct vn_command_vkResetEvent *args)
664*bbecb9d1SAndroid Build Coastguard Worker {
665*bbecb9d1SAndroid Build Coastguard Worker    struct vkr_device *dev = vkr_device_from_handle(args->device);
666*bbecb9d1SAndroid Build Coastguard Worker    struct vn_device_proc_table *vk = &dev->proc_table;
667*bbecb9d1SAndroid Build Coastguard Worker 
668*bbecb9d1SAndroid Build Coastguard Worker    vn_replace_vkResetEvent_args_handle(args);
669*bbecb9d1SAndroid Build Coastguard Worker    args->ret = vk->ResetEvent(args->device, args->event);
670*bbecb9d1SAndroid Build Coastguard Worker }
671*bbecb9d1SAndroid Build Coastguard Worker 
672*bbecb9d1SAndroid Build Coastguard Worker void
vkr_context_init_queue_dispatch(struct vkr_context * ctx)673*bbecb9d1SAndroid Build Coastguard Worker vkr_context_init_queue_dispatch(struct vkr_context *ctx)
674*bbecb9d1SAndroid Build Coastguard Worker {
675*bbecb9d1SAndroid Build Coastguard Worker    struct vn_dispatch_context *dispatch = &ctx->dispatch;
676*bbecb9d1SAndroid Build Coastguard Worker 
677*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkGetDeviceQueue = vkr_dispatch_vkGetDeviceQueue;
678*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkGetDeviceQueue2 = vkr_dispatch_vkGetDeviceQueue2;
679*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkQueueSubmit = vkr_dispatch_vkQueueSubmit;
680*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkQueueBindSparse = vkr_dispatch_vkQueueBindSparse;
681*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkQueueWaitIdle = vkr_dispatch_vkQueueWaitIdle;
682*bbecb9d1SAndroid Build Coastguard Worker 
683*bbecb9d1SAndroid Build Coastguard Worker    /* VK_KHR_synchronization2 */
684*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkQueueSubmit2 = vkr_dispatch_vkQueueSubmit2;
685*bbecb9d1SAndroid Build Coastguard Worker }
686*bbecb9d1SAndroid Build Coastguard Worker 
687*bbecb9d1SAndroid Build Coastguard Worker void
vkr_context_init_fence_dispatch(struct vkr_context * ctx)688*bbecb9d1SAndroid Build Coastguard Worker vkr_context_init_fence_dispatch(struct vkr_context *ctx)
689*bbecb9d1SAndroid Build Coastguard Worker {
690*bbecb9d1SAndroid Build Coastguard Worker    struct vn_dispatch_context *dispatch = &ctx->dispatch;
691*bbecb9d1SAndroid Build Coastguard Worker 
692*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkCreateFence = vkr_dispatch_vkCreateFence;
693*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkDestroyFence = vkr_dispatch_vkDestroyFence;
694*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkResetFences = vkr_dispatch_vkResetFences;
695*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkGetFenceStatus = vkr_dispatch_vkGetFenceStatus;
696*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkWaitForFences = vkr_dispatch_vkWaitForFences;
697*bbecb9d1SAndroid Build Coastguard Worker 
698*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkResetFenceResource100000MESA =
699*bbecb9d1SAndroid Build Coastguard Worker       vkr_dispatch_vkResetFenceResource100000MESA;
700*bbecb9d1SAndroid Build Coastguard Worker }
701*bbecb9d1SAndroid Build Coastguard Worker 
702*bbecb9d1SAndroid Build Coastguard Worker void
vkr_context_init_semaphore_dispatch(struct vkr_context * ctx)703*bbecb9d1SAndroid Build Coastguard Worker vkr_context_init_semaphore_dispatch(struct vkr_context *ctx)
704*bbecb9d1SAndroid Build Coastguard Worker {
705*bbecb9d1SAndroid Build Coastguard Worker    struct vn_dispatch_context *dispatch = &ctx->dispatch;
706*bbecb9d1SAndroid Build Coastguard Worker 
707*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkCreateSemaphore = vkr_dispatch_vkCreateSemaphore;
708*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkDestroySemaphore = vkr_dispatch_vkDestroySemaphore;
709*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkGetSemaphoreCounterValue =
710*bbecb9d1SAndroid Build Coastguard Worker       vkr_dispatch_vkGetSemaphoreCounterValue;
711*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkWaitSemaphores = vkr_dispatch_vkWaitSemaphores;
712*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkSignalSemaphore = vkr_dispatch_vkSignalSemaphore;
713*bbecb9d1SAndroid Build Coastguard Worker 
714*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkWaitSemaphoreResource100000MESA =
715*bbecb9d1SAndroid Build Coastguard Worker       vkr_dispatch_vkWaitSemaphoreResource100000MESA;
716*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkImportSemaphoreResource100000MESA =
717*bbecb9d1SAndroid Build Coastguard Worker       vkr_dispatch_vkImportSemaphoreResource100000MESA;
718*bbecb9d1SAndroid Build Coastguard Worker }
719*bbecb9d1SAndroid Build Coastguard Worker 
720*bbecb9d1SAndroid Build Coastguard Worker void
vkr_context_init_event_dispatch(struct vkr_context * ctx)721*bbecb9d1SAndroid Build Coastguard Worker vkr_context_init_event_dispatch(struct vkr_context *ctx)
722*bbecb9d1SAndroid Build Coastguard Worker {
723*bbecb9d1SAndroid Build Coastguard Worker    struct vn_dispatch_context *dispatch = &ctx->dispatch;
724*bbecb9d1SAndroid Build Coastguard Worker 
725*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkCreateEvent = vkr_dispatch_vkCreateEvent;
726*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkDestroyEvent = vkr_dispatch_vkDestroyEvent;
727*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkGetEventStatus = vkr_dispatch_vkGetEventStatus;
728*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkSetEvent = vkr_dispatch_vkSetEvent;
729*bbecb9d1SAndroid Build Coastguard Worker    dispatch->dispatch_vkResetEvent = vkr_dispatch_vkResetEvent;
730*bbecb9d1SAndroid Build Coastguard Worker }
731