xref: /aosp_15_r20/external/mesa3d/src/virtio/vulkan/vn_queue.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2019 Google LLC
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  *
5*61046927SAndroid Build Coastguard Worker  * based in part on anv and radv which are:
6*61046927SAndroid Build Coastguard Worker  * Copyright © 2015 Intel Corporation
7*61046927SAndroid Build Coastguard Worker  * Copyright © 2016 Red Hat.
8*61046927SAndroid Build Coastguard Worker  * Copyright © 2016 Bas Nieuwenhuizen
9*61046927SAndroid Build Coastguard Worker  */
10*61046927SAndroid Build Coastguard Worker 
11*61046927SAndroid Build Coastguard Worker #ifndef VN_QUEUE_H
12*61046927SAndroid Build Coastguard Worker #define VN_QUEUE_H
13*61046927SAndroid Build Coastguard Worker 
14*61046927SAndroid Build Coastguard Worker #include "vn_common.h"
15*61046927SAndroid Build Coastguard Worker 
16*61046927SAndroid Build Coastguard Worker struct vn_queue {
17*61046927SAndroid Build Coastguard Worker    struct vn_queue_base base;
18*61046927SAndroid Build Coastguard Worker 
19*61046927SAndroid Build Coastguard Worker    /* only used if renderer supports multiple timelines */
20*61046927SAndroid Build Coastguard Worker    uint32_t ring_idx;
21*61046927SAndroid Build Coastguard Worker 
22*61046927SAndroid Build Coastguard Worker    /* wait fence used for vn_QueueWaitIdle */
23*61046927SAndroid Build Coastguard Worker    VkFence wait_fence;
24*61046927SAndroid Build Coastguard Worker 
25*61046927SAndroid Build Coastguard Worker    /* semaphore for gluing vkQueueSubmit feedback commands to
26*61046927SAndroid Build Coastguard Worker     * vkQueueBindSparse
27*61046927SAndroid Build Coastguard Worker     */
28*61046927SAndroid Build Coastguard Worker    VkSemaphore sparse_semaphore;
29*61046927SAndroid Build Coastguard Worker    uint64_t sparse_semaphore_counter;
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker    /* for vn_queue_submission storage */
32*61046927SAndroid Build Coastguard Worker    struct vn_cached_storage storage;
33*61046927SAndroid Build Coastguard Worker };
34*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(vn_queue, base.base.base, VkQueue, VK_OBJECT_TYPE_QUEUE)
35*61046927SAndroid Build Coastguard Worker 
36*61046927SAndroid Build Coastguard Worker enum vn_sync_type {
37*61046927SAndroid Build Coastguard Worker    /* no payload */
38*61046927SAndroid Build Coastguard Worker    VN_SYNC_TYPE_INVALID,
39*61046927SAndroid Build Coastguard Worker 
40*61046927SAndroid Build Coastguard Worker    /* device object */
41*61046927SAndroid Build Coastguard Worker    VN_SYNC_TYPE_DEVICE_ONLY,
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker    /* payload is an imported sync file */
44*61046927SAndroid Build Coastguard Worker    VN_SYNC_TYPE_IMPORTED_SYNC_FD,
45*61046927SAndroid Build Coastguard Worker };
46*61046927SAndroid Build Coastguard Worker 
47*61046927SAndroid Build Coastguard Worker struct vn_sync_payload {
48*61046927SAndroid Build Coastguard Worker    enum vn_sync_type type;
49*61046927SAndroid Build Coastguard Worker 
50*61046927SAndroid Build Coastguard Worker    /* If type is VN_SYNC_TYPE_IMPORTED_SYNC_FD, fd is a sync file. */
51*61046927SAndroid Build Coastguard Worker    int fd;
52*61046927SAndroid Build Coastguard Worker };
53*61046927SAndroid Build Coastguard Worker 
54*61046927SAndroid Build Coastguard Worker /* For external fences and external semaphores submitted to be signaled. The
55*61046927SAndroid Build Coastguard Worker  * Vulkan spec guarantees those external syncs are on permanent payload.
56*61046927SAndroid Build Coastguard Worker  */
57*61046927SAndroid Build Coastguard Worker struct vn_sync_payload_external {
58*61046927SAndroid Build Coastguard Worker    /* ring_idx of the last queue submission */
59*61046927SAndroid Build Coastguard Worker    uint32_t ring_idx;
60*61046927SAndroid Build Coastguard Worker    /* valid when NO_ASYNC_QUEUE_SUBMIT perf option is not used */
61*61046927SAndroid Build Coastguard Worker    bool ring_seqno_valid;
62*61046927SAndroid Build Coastguard Worker    /* ring seqno of the last queue submission */
63*61046927SAndroid Build Coastguard Worker    uint32_t ring_seqno;
64*61046927SAndroid Build Coastguard Worker };
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker struct vn_feedback_slot;
67*61046927SAndroid Build Coastguard Worker 
68*61046927SAndroid Build Coastguard Worker struct vn_fence {
69*61046927SAndroid Build Coastguard Worker    struct vn_object_base base;
70*61046927SAndroid Build Coastguard Worker 
71*61046927SAndroid Build Coastguard Worker    struct vn_sync_payload *payload;
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker    struct vn_sync_payload permanent;
74*61046927SAndroid Build Coastguard Worker    struct vn_sync_payload temporary;
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker    struct {
77*61046927SAndroid Build Coastguard Worker       /* non-NULL if VN_PERF_NO_FENCE_FEEDBACK is disabled */
78*61046927SAndroid Build Coastguard Worker       struct vn_feedback_slot *slot;
79*61046927SAndroid Build Coastguard Worker       VkCommandBuffer *commands;
80*61046927SAndroid Build Coastguard Worker    } feedback;
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker    bool is_external;
83*61046927SAndroid Build Coastguard Worker    struct vn_sync_payload_external external_payload;
84*61046927SAndroid Build Coastguard Worker };
85*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(vn_fence,
86*61046927SAndroid Build Coastguard Worker                                base.base,
87*61046927SAndroid Build Coastguard Worker                                VkFence,
88*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_FENCE)
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker struct vn_semaphore {
91*61046927SAndroid Build Coastguard Worker    struct vn_object_base base;
92*61046927SAndroid Build Coastguard Worker 
93*61046927SAndroid Build Coastguard Worker    VkSemaphoreType type;
94*61046927SAndroid Build Coastguard Worker 
95*61046927SAndroid Build Coastguard Worker    struct vn_sync_payload *payload;
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker    struct vn_sync_payload permanent;
98*61046927SAndroid Build Coastguard Worker    struct vn_sync_payload temporary;
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker    struct {
101*61046927SAndroid Build Coastguard Worker       /* non-NULL if VN_PERF_NO_SEMAPHORE_FEEDBACK is disabled */
102*61046927SAndroid Build Coastguard Worker       struct vn_feedback_slot *slot;
103*61046927SAndroid Build Coastguard Worker 
104*61046927SAndroid Build Coastguard Worker       /* Lists of allocated vn_semaphore_feedback_cmd
105*61046927SAndroid Build Coastguard Worker        *
106*61046927SAndroid Build Coastguard Worker        * On submission prepare, sfb cmd is cache allocated from the free list
107*61046927SAndroid Build Coastguard Worker        * and is moved to the pending list after initialization.
108*61046927SAndroid Build Coastguard Worker        *
109*61046927SAndroid Build Coastguard Worker        * On submission cleanup, sfb cmds of the owner semaphores are checked
110*61046927SAndroid Build Coastguard Worker        * and cached to the free list if they have been "signaled", which is
111*61046927SAndroid Build Coastguard Worker        * proxyed via the src slot value having been reached.
112*61046927SAndroid Build Coastguard Worker        */
113*61046927SAndroid Build Coastguard Worker       struct list_head pending_cmds;
114*61046927SAndroid Build Coastguard Worker       struct list_head free_cmds;
115*61046927SAndroid Build Coastguard Worker       uint32_t free_cmd_count;
116*61046927SAndroid Build Coastguard Worker 
117*61046927SAndroid Build Coastguard Worker       /* Lock for accessing free/pending sfb cmds */
118*61046927SAndroid Build Coastguard Worker       simple_mtx_t cmd_mtx;
119*61046927SAndroid Build Coastguard Worker 
120*61046927SAndroid Build Coastguard Worker       /* Cached counter value to track if an async sem wait call is needed */
121*61046927SAndroid Build Coastguard Worker       uint64_t signaled_counter;
122*61046927SAndroid Build Coastguard Worker 
123*61046927SAndroid Build Coastguard Worker       /* Lock for checking if an async sem wait call is needed based on
124*61046927SAndroid Build Coastguard Worker        * the current counter value and signaled_counter to ensure async
125*61046927SAndroid Build Coastguard Worker        * wait order across threads.
126*61046927SAndroid Build Coastguard Worker        */
127*61046927SAndroid Build Coastguard Worker       simple_mtx_t async_wait_mtx;
128*61046927SAndroid Build Coastguard Worker    } feedback;
129*61046927SAndroid Build Coastguard Worker 
130*61046927SAndroid Build Coastguard Worker    bool is_external;
131*61046927SAndroid Build Coastguard Worker    struct vn_sync_payload_external external_payload;
132*61046927SAndroid Build Coastguard Worker };
133*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(vn_semaphore,
134*61046927SAndroid Build Coastguard Worker                                base.base,
135*61046927SAndroid Build Coastguard Worker                                VkSemaphore,
136*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_SEMAPHORE)
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker struct vn_event {
139*61046927SAndroid Build Coastguard Worker    struct vn_object_base base;
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker    /* non-NULL if below are satisfied:
142*61046927SAndroid Build Coastguard Worker     * - event is created without VK_EVENT_CREATE_DEVICE_ONLY_BIT
143*61046927SAndroid Build Coastguard Worker     * - VN_PERF_NO_EVENT_FEEDBACK is disabled
144*61046927SAndroid Build Coastguard Worker     */
145*61046927SAndroid Build Coastguard Worker    struct vn_feedback_slot *feedback_slot;
146*61046927SAndroid Build Coastguard Worker };
147*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(vn_event,
148*61046927SAndroid Build Coastguard Worker                                base.base,
149*61046927SAndroid Build Coastguard Worker                                VkEvent,
150*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_EVENT)
151*61046927SAndroid Build Coastguard Worker 
152*61046927SAndroid Build Coastguard Worker void
153*61046927SAndroid Build Coastguard Worker vn_fence_signal_wsi(struct vn_device *dev, struct vn_fence *fence);
154*61046927SAndroid Build Coastguard Worker 
155*61046927SAndroid Build Coastguard Worker void
156*61046927SAndroid Build Coastguard Worker vn_semaphore_signal_wsi(struct vn_device *dev, struct vn_semaphore *sem);
157*61046927SAndroid Build Coastguard Worker 
158*61046927SAndroid Build Coastguard Worker #endif /* VN_QUEUE_H */
159