xref: /aosp_15_r20/external/mesa3d/src/vulkan/runtime/vk_sync.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2021 Intel Corporation
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker #ifndef VK_SYNC_H
24*61046927SAndroid Build Coastguard Worker #define VK_SYNC_H
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
27*61046927SAndroid Build Coastguard Worker #include <vulkan/vulkan_core.h>
28*61046927SAndroid Build Coastguard Worker 
29*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
32*61046927SAndroid Build Coastguard Worker extern "C" {
33*61046927SAndroid Build Coastguard Worker #endif
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker struct vk_device;
36*61046927SAndroid Build Coastguard Worker struct vk_sync;
37*61046927SAndroid Build Coastguard Worker 
38*61046927SAndroid Build Coastguard Worker enum vk_sync_features {
39*61046927SAndroid Build Coastguard Worker    /** Set if a sync type supports the binary mode of operation
40*61046927SAndroid Build Coastguard Worker     *
41*61046927SAndroid Build Coastguard Worker     * In binary mode, a vk_sync has two modes: signaled and unsignaled.  If
42*61046927SAndroid Build Coastguard Worker     * it supports CPU_RESET, it can be changed from signaled to unsignaled on
43*61046927SAndroid Build Coastguard Worker     * the CPU via vk_sync_reset().  If it supports CPU_SIGNAL, it can be
44*61046927SAndroid Build Coastguard Worker     * changed from unsignaled to signaled on the CPU via vk_sync_signal().
45*61046927SAndroid Build Coastguard Worker     *
46*61046927SAndroid Build Coastguard Worker     * Binary vk_sync types may also support WAIT_PENDING in which they have a
47*61046927SAndroid Build Coastguard Worker     * third hidden pending state.  Once such a vk_sync has been submitted to
48*61046927SAndroid Build Coastguard Worker     * the kernel driver for signaling, it is in the pending state and remains
49*61046927SAndroid Build Coastguard Worker     * there until the work is complete at which point it enters the signaled
50*61046927SAndroid Build Coastguard Worker     * state.  This pending state is visible across processes for shared
51*61046927SAndroid Build Coastguard Worker     * vk_sync types.  This is used to by the threaded submit mode to ensure
52*61046927SAndroid Build Coastguard Worker     * that everything gets submitted to the kernel driver in-order.
53*61046927SAndroid Build Coastguard Worker     *
54*61046927SAndroid Build Coastguard Worker     * A vk_sync operates in binary mode if VK_SYNC_IS_TIMELINE is not set
55*61046927SAndroid Build Coastguard Worker     * in vk_sync::flags.
56*61046927SAndroid Build Coastguard Worker     */
57*61046927SAndroid Build Coastguard Worker    VK_SYNC_FEATURE_BINARY              = (1 << 0),
58*61046927SAndroid Build Coastguard Worker 
59*61046927SAndroid Build Coastguard Worker    /** Set if a sync type supports the timeline mode of operation
60*61046927SAndroid Build Coastguard Worker     *
61*61046927SAndroid Build Coastguard Worker     * In timeline mode, a vk_sync has a monotonically increasing 64-bit value
62*61046927SAndroid Build Coastguard Worker     * which represents most recently signaled time point.  Waits are relative
63*61046927SAndroid Build Coastguard Worker     * to time points.  Instead of waiting for the vk_sync to enter a signaled
64*61046927SAndroid Build Coastguard Worker     * state, you wait for its 64-bit value to be at least some wait value.
65*61046927SAndroid Build Coastguard Worker     *
66*61046927SAndroid Build Coastguard Worker     * Timeline vk_sync types can also support WAIT_PENDING.  In this case, the
67*61046927SAndroid Build Coastguard Worker     * wait is not for a pending state, as such, but rather for someone to have
68*61046927SAndroid Build Coastguard Worker     * submitted a kernel request which will signal a time point with at least
69*61046927SAndroid Build Coastguard Worker     * that value.  Logically, you can think of this as having two timelines,
70*61046927SAndroid Build Coastguard Worker     * the real timeline and a pending timeline which runs slightly ahead of
71*61046927SAndroid Build Coastguard Worker     * the real one.  As with binary vk_sync types, this is used by threaded
72*61046927SAndroid Build Coastguard Worker     * submit to re-order things so that the kernel requests happen in a valid
73*61046927SAndroid Build Coastguard Worker     * linear order.
74*61046927SAndroid Build Coastguard Worker     *
75*61046927SAndroid Build Coastguard Worker     * A vk_sync operates in timeline mode if VK_SYNC_IS_TIMELINE is set in
76*61046927SAndroid Build Coastguard Worker     * vk_sync::flags.
77*61046927SAndroid Build Coastguard Worker     */
78*61046927SAndroid Build Coastguard Worker    VK_SYNC_FEATURE_TIMELINE            = (1 << 1),
79*61046927SAndroid Build Coastguard Worker 
80*61046927SAndroid Build Coastguard Worker    /** Set if this sync supports GPU waits */
81*61046927SAndroid Build Coastguard Worker    VK_SYNC_FEATURE_GPU_WAIT            = (1 << 2),
82*61046927SAndroid Build Coastguard Worker 
83*61046927SAndroid Build Coastguard Worker    /** Set if a sync type supports multiple GPU waits on one signal state
84*61046927SAndroid Build Coastguard Worker     *
85*61046927SAndroid Build Coastguard Worker     * The Vulkan spec for VkSemaphore requires GPU wait and signal operations
86*61046927SAndroid Build Coastguard Worker     * to have a one-to-one relationship.  This formally described by saying
87*61046927SAndroid Build Coastguard Worker     * that the VkSemaphore gets implicitly reset on wait.  However, it is
88*61046927SAndroid Build Coastguard Worker     * often useful to have well-defined multi-wait.  If binary vk_sync
89*61046927SAndroid Build Coastguard Worker     * supports multi-wait then any number of kernel requests can be submitted
90*61046927SAndroid Build Coastguard Worker     * which wait on one signal operation.  This also implies that you can
91*61046927SAndroid Build Coastguard Worker     * signal twice back-to-back (there are 0 waits on the first signal).
92*61046927SAndroid Build Coastguard Worker     *
93*61046927SAndroid Build Coastguard Worker     * This feature only applies to binary vk_sync objects.
94*61046927SAndroid Build Coastguard Worker     */
95*61046927SAndroid Build Coastguard Worker    VK_SYNC_FEATURE_GPU_MULTI_WAIT      = (1 << 3),
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker    /** Set if a sync type supports vk_sync_wait() and vk_sync_wait_many() */
98*61046927SAndroid Build Coastguard Worker    VK_SYNC_FEATURE_CPU_WAIT            = (1 << 4),
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker    /** Set if a sync type supports vk_sync_reset()
101*61046927SAndroid Build Coastguard Worker     *
102*61046927SAndroid Build Coastguard Worker     * This feature only applies to binary vk_sync objects.
103*61046927SAndroid Build Coastguard Worker     */
104*61046927SAndroid Build Coastguard Worker    VK_SYNC_FEATURE_CPU_RESET           = (1 << 5),
105*61046927SAndroid Build Coastguard Worker 
106*61046927SAndroid Build Coastguard Worker    /** Set if a sync type supports vk_sync_signal() */
107*61046927SAndroid Build Coastguard Worker    VK_SYNC_FEATURE_CPU_SIGNAL          = (1 << 6),
108*61046927SAndroid Build Coastguard Worker 
109*61046927SAndroid Build Coastguard Worker    /** Set if sync_type::wait_many supports the VK_SYNC_WAIT_ANY bit
110*61046927SAndroid Build Coastguard Worker     *
111*61046927SAndroid Build Coastguard Worker     * vk_sync_wait_many() will support the bit regardless.  If the sync type
112*61046927SAndroid Build Coastguard Worker     * doesn't support it natively, it will be emulated.
113*61046927SAndroid Build Coastguard Worker     */
114*61046927SAndroid Build Coastguard Worker    VK_SYNC_FEATURE_WAIT_ANY            = (1 << 7),
115*61046927SAndroid Build Coastguard Worker 
116*61046927SAndroid Build Coastguard Worker    /** Set if a sync type supports the VK_SYNC_WAIT_PENDING bit
117*61046927SAndroid Build Coastguard Worker     *
118*61046927SAndroid Build Coastguard Worker     * See VK_SYNC_FEATURE_BINARY and VK_SYNC_FEATURE_TIMELINE for descriptions
119*61046927SAndroid Build Coastguard Worker     * of what this does in each case.
120*61046927SAndroid Build Coastguard Worker     */
121*61046927SAndroid Build Coastguard Worker    VK_SYNC_FEATURE_WAIT_PENDING        = (1 << 8),
122*61046927SAndroid Build Coastguard Worker 
123*61046927SAndroid Build Coastguard Worker    /** Set if a sync type natively supports wait-before-signal
124*61046927SAndroid Build Coastguard Worker     *
125*61046927SAndroid Build Coastguard Worker     * If this is set then the underlying OS primitive supports submitting
126*61046927SAndroid Build Coastguard Worker     * kernel requests which wait on the vk_sync before submitting a kernel
127*61046927SAndroid Build Coastguard Worker     * request which would cause that wait to unblock.
128*61046927SAndroid Build Coastguard Worker     */
129*61046927SAndroid Build Coastguard Worker    VK_SYNC_FEATURE_WAIT_BEFORE_SIGNAL  = (1 << 9),
130*61046927SAndroid Build Coastguard Worker };
131*61046927SAndroid Build Coastguard Worker 
132*61046927SAndroid Build Coastguard Worker struct vk_sync_wait;
133*61046927SAndroid Build Coastguard Worker 
134*61046927SAndroid Build Coastguard Worker enum vk_sync_wait_flags {
135*61046927SAndroid Build Coastguard Worker    /** Placeholder for 0 to make vk_sync_wait() calls more clear */
136*61046927SAndroid Build Coastguard Worker    VK_SYNC_WAIT_COMPLETE   = 0,
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker    /** If set, only wait for the vk_sync operation to be pending
139*61046927SAndroid Build Coastguard Worker     *
140*61046927SAndroid Build Coastguard Worker     * See VK_SYNC_FEATURE_BINARY and VK_SYNC_FEATURE_TIMELINE for descriptions
141*61046927SAndroid Build Coastguard Worker     * of what this does in each case.
142*61046927SAndroid Build Coastguard Worker     */
143*61046927SAndroid Build Coastguard Worker    VK_SYNC_WAIT_PENDING    = (1 << 0),
144*61046927SAndroid Build Coastguard Worker 
145*61046927SAndroid Build Coastguard Worker    /** If set, wait for any of of the vk_sync operations to complete
146*61046927SAndroid Build Coastguard Worker     *
147*61046927SAndroid Build Coastguard Worker     * This is as opposed to waiting for all of them.  There is no guarantee
148*61046927SAndroid Build Coastguard Worker     * that vk_sync_wait_many() will return immediately after the first
149*61046927SAndroid Build Coastguard Worker     * operation completes but it will make a best effort to return as soon as
150*61046927SAndroid Build Coastguard Worker     * possible.
151*61046927SAndroid Build Coastguard Worker     */
152*61046927SAndroid Build Coastguard Worker    VK_SYNC_WAIT_ANY        = (1 << 1),
153*61046927SAndroid Build Coastguard Worker };
154*61046927SAndroid Build Coastguard Worker 
155*61046927SAndroid Build Coastguard Worker struct vk_sync_type {
156*61046927SAndroid Build Coastguard Worker    /** Size of this sync type */
157*61046927SAndroid Build Coastguard Worker    size_t size;
158*61046927SAndroid Build Coastguard Worker 
159*61046927SAndroid Build Coastguard Worker    /** Features supported by this sync type */
160*61046927SAndroid Build Coastguard Worker    enum vk_sync_features features;
161*61046927SAndroid Build Coastguard Worker 
162*61046927SAndroid Build Coastguard Worker    /** Initialize a vk_sync
163*61046927SAndroid Build Coastguard Worker     *
164*61046927SAndroid Build Coastguard Worker     * The base vk_sync will already be initialized and the sync type set
165*61046927SAndroid Build Coastguard Worker     * before this function is called.  If any OS primitives need to be
166*61046927SAndroid Build Coastguard Worker     * allocated, that should be done here.
167*61046927SAndroid Build Coastguard Worker     */
168*61046927SAndroid Build Coastguard Worker    VkResult (*init)(struct vk_device *device,
169*61046927SAndroid Build Coastguard Worker                     struct vk_sync *sync,
170*61046927SAndroid Build Coastguard Worker                     uint64_t initial_value);
171*61046927SAndroid Build Coastguard Worker 
172*61046927SAndroid Build Coastguard Worker    /** Finish a vk_sync
173*61046927SAndroid Build Coastguard Worker     *
174*61046927SAndroid Build Coastguard Worker     * This should free any internal data stored in this vk_sync.
175*61046927SAndroid Build Coastguard Worker     */
176*61046927SAndroid Build Coastguard Worker    void (*finish)(struct vk_device *device,
177*61046927SAndroid Build Coastguard Worker                   struct vk_sync *sync);
178*61046927SAndroid Build Coastguard Worker 
179*61046927SAndroid Build Coastguard Worker    /** Signal a vk_sync
180*61046927SAndroid Build Coastguard Worker     *
181*61046927SAndroid Build Coastguard Worker     * For non-timeline sync types, value == 0.
182*61046927SAndroid Build Coastguard Worker     */
183*61046927SAndroid Build Coastguard Worker    VkResult (*signal)(struct vk_device *device,
184*61046927SAndroid Build Coastguard Worker                       struct vk_sync *sync,
185*61046927SAndroid Build Coastguard Worker                       uint64_t value);
186*61046927SAndroid Build Coastguard Worker 
187*61046927SAndroid Build Coastguard Worker    /** Get the timeline value for a vk_sync */
188*61046927SAndroid Build Coastguard Worker    VkResult (*get_value)(struct vk_device *device,
189*61046927SAndroid Build Coastguard Worker                          struct vk_sync *sync,
190*61046927SAndroid Build Coastguard Worker                          uint64_t *value);
191*61046927SAndroid Build Coastguard Worker 
192*61046927SAndroid Build Coastguard Worker    /** Reset a non-timeline vk_sync */
193*61046927SAndroid Build Coastguard Worker    VkResult (*reset)(struct vk_device *device,
194*61046927SAndroid Build Coastguard Worker                      struct vk_sync *sync);
195*61046927SAndroid Build Coastguard Worker 
196*61046927SAndroid Build Coastguard Worker    /** Moves the guts of one binary vk_sync to another
197*61046927SAndroid Build Coastguard Worker     *
198*61046927SAndroid Build Coastguard Worker     * This moves the current binary vk_sync event from src to dst and resets
199*61046927SAndroid Build Coastguard Worker     * src.  If dst contained an event, it is discarded.
200*61046927SAndroid Build Coastguard Worker     *
201*61046927SAndroid Build Coastguard Worker     * This is required for all binary vk_sync types that can be used for a
202*61046927SAndroid Build Coastguard Worker     * semaphore wait in conjunction with real timeline semaphores.
203*61046927SAndroid Build Coastguard Worker     */
204*61046927SAndroid Build Coastguard Worker    VkResult (*move)(struct vk_device *device,
205*61046927SAndroid Build Coastguard Worker                     struct vk_sync *dst,
206*61046927SAndroid Build Coastguard Worker                     struct vk_sync *src);
207*61046927SAndroid Build Coastguard Worker 
208*61046927SAndroid Build Coastguard Worker    /** Wait on a vk_sync
209*61046927SAndroid Build Coastguard Worker     *
210*61046927SAndroid Build Coastguard Worker     * For a timeline vk_sync, wait_value is the timeline value to wait for.
211*61046927SAndroid Build Coastguard Worker     * This function should not return VK_SUCCESS until get_value on that
212*61046927SAndroid Build Coastguard Worker     * vk_sync would return a value >= wait_value.  A wait_value of zero is
213*61046927SAndroid Build Coastguard Worker     * allowed in which case the wait is a no-op.  For a non-timeline vk_sync,
214*61046927SAndroid Build Coastguard Worker     * wait_value should be ignored.
215*61046927SAndroid Build Coastguard Worker     *
216*61046927SAndroid Build Coastguard Worker     * This function is optional.  If the sync type needs to support CPU waits,
217*61046927SAndroid Build Coastguard Worker     * at least one of wait or wait_many must be provided.  If one is missing,
218*61046927SAndroid Build Coastguard Worker     * it will be implemented in terms of the other.
219*61046927SAndroid Build Coastguard Worker     */
220*61046927SAndroid Build Coastguard Worker    VkResult (*wait)(struct vk_device *device,
221*61046927SAndroid Build Coastguard Worker                     struct vk_sync *sync,
222*61046927SAndroid Build Coastguard Worker                     uint64_t wait_value,
223*61046927SAndroid Build Coastguard Worker                     enum vk_sync_wait_flags wait_flags,
224*61046927SAndroid Build Coastguard Worker                     uint64_t abs_timeout_ns);
225*61046927SAndroid Build Coastguard Worker 
226*61046927SAndroid Build Coastguard Worker    /** Wait for multiple vk_sync events
227*61046927SAndroid Build Coastguard Worker     *
228*61046927SAndroid Build Coastguard Worker     * If VK_SYNC_WAIT_ANY is set, it will return after at least one of the
229*61046927SAndroid Build Coastguard Worker     * wait events is complete instead of waiting for all of them.
230*61046927SAndroid Build Coastguard Worker     *
231*61046927SAndroid Build Coastguard Worker     * See wait for more details.
232*61046927SAndroid Build Coastguard Worker     */
233*61046927SAndroid Build Coastguard Worker    VkResult (*wait_many)(struct vk_device *device,
234*61046927SAndroid Build Coastguard Worker                          uint32_t wait_count,
235*61046927SAndroid Build Coastguard Worker                          const struct vk_sync_wait *waits,
236*61046927SAndroid Build Coastguard Worker                          enum vk_sync_wait_flags wait_flags,
237*61046927SAndroid Build Coastguard Worker                          uint64_t abs_timeout_ns);
238*61046927SAndroid Build Coastguard Worker 
239*61046927SAndroid Build Coastguard Worker    /** Permanently imports the given FD into this vk_sync
240*61046927SAndroid Build Coastguard Worker     *
241*61046927SAndroid Build Coastguard Worker     * This replaces the guts of the given vk_sync with whatever is in the FD.
242*61046927SAndroid Build Coastguard Worker     * In a sense, this vk_sync now aliases whatever vk_sync the FD was
243*61046927SAndroid Build Coastguard Worker     * exported from.
244*61046927SAndroid Build Coastguard Worker     */
245*61046927SAndroid Build Coastguard Worker    VkResult (*import_opaque_fd)(struct vk_device *device,
246*61046927SAndroid Build Coastguard Worker                                 struct vk_sync *sync,
247*61046927SAndroid Build Coastguard Worker                                 int fd);
248*61046927SAndroid Build Coastguard Worker 
249*61046927SAndroid Build Coastguard Worker    /** Export the guts of this vk_sync to an FD */
250*61046927SAndroid Build Coastguard Worker    VkResult (*export_opaque_fd)(struct vk_device *device,
251*61046927SAndroid Build Coastguard Worker                                 struct vk_sync *sync,
252*61046927SAndroid Build Coastguard Worker                                 int *fd);
253*61046927SAndroid Build Coastguard Worker 
254*61046927SAndroid Build Coastguard Worker    /** Imports a sync file into this binary vk_sync
255*61046927SAndroid Build Coastguard Worker     *
256*61046927SAndroid Build Coastguard Worker     * If this completes successfully, the vk_sync will now signal whenever
257*61046927SAndroid Build Coastguard Worker     * the sync file signals.
258*61046927SAndroid Build Coastguard Worker     *
259*61046927SAndroid Build Coastguard Worker     * If sync_file == -1, the vk_sync should be signaled immediately.  If
260*61046927SAndroid Build Coastguard Worker     * the vk_sync_type implements signal, sync_file will never be -1.
261*61046927SAndroid Build Coastguard Worker     */
262*61046927SAndroid Build Coastguard Worker    VkResult (*import_sync_file)(struct vk_device *device,
263*61046927SAndroid Build Coastguard Worker                                 struct vk_sync *sync,
264*61046927SAndroid Build Coastguard Worker                                 int sync_file);
265*61046927SAndroid Build Coastguard Worker 
266*61046927SAndroid Build Coastguard Worker    /** Exports the current binary vk_sync state as a sync file.
267*61046927SAndroid Build Coastguard Worker     *
268*61046927SAndroid Build Coastguard Worker     * The resulting sync file will contain the current event stored in this
269*61046927SAndroid Build Coastguard Worker     * binary vk_sync must be turned into a sync file.  If the vk_sync is later
270*61046927SAndroid Build Coastguard Worker     * modified to contain a new event, the sync file is unaffected.
271*61046927SAndroid Build Coastguard Worker     */
272*61046927SAndroid Build Coastguard Worker    VkResult (*export_sync_file)(struct vk_device *device,
273*61046927SAndroid Build Coastguard Worker                                 struct vk_sync *sync,
274*61046927SAndroid Build Coastguard Worker                                 int *sync_file);
275*61046927SAndroid Build Coastguard Worker 
276*61046927SAndroid Build Coastguard Worker    /** Permanently imports the given handle or name into this vk_sync
277*61046927SAndroid Build Coastguard Worker     *
278*61046927SAndroid Build Coastguard Worker     * This replaces the guts of the given vk_sync with whatever is in the object.
279*61046927SAndroid Build Coastguard Worker     * In a sense, this vk_sync now aliases whatever vk_sync the handle was
280*61046927SAndroid Build Coastguard Worker     * exported from.
281*61046927SAndroid Build Coastguard Worker     */
282*61046927SAndroid Build Coastguard Worker    VkResult (*import_win32_handle)(struct vk_device *device,
283*61046927SAndroid Build Coastguard Worker                                    struct vk_sync *sync,
284*61046927SAndroid Build Coastguard Worker                                    void *handle,
285*61046927SAndroid Build Coastguard Worker                                    const wchar_t *name);
286*61046927SAndroid Build Coastguard Worker 
287*61046927SAndroid Build Coastguard Worker    /** Export the guts of this vk_sync to a handle and/or name */
288*61046927SAndroid Build Coastguard Worker    VkResult (*export_win32_handle)(struct vk_device *device,
289*61046927SAndroid Build Coastguard Worker                                    struct vk_sync *sync,
290*61046927SAndroid Build Coastguard Worker                                    void **handle);
291*61046927SAndroid Build Coastguard Worker 
292*61046927SAndroid Build Coastguard Worker    /** Vulkan puts these as creation params instead of export params */
293*61046927SAndroid Build Coastguard Worker    VkResult (*set_win32_export_params)(struct vk_device *device,
294*61046927SAndroid Build Coastguard Worker                                        struct vk_sync *sync,
295*61046927SAndroid Build Coastguard Worker                                        const void *security_attributes,
296*61046927SAndroid Build Coastguard Worker                                        uint32_t access,
297*61046927SAndroid Build Coastguard Worker                                        const wchar_t *name);
298*61046927SAndroid Build Coastguard Worker };
299*61046927SAndroid Build Coastguard Worker 
300*61046927SAndroid Build Coastguard Worker enum vk_sync_flags {
301*61046927SAndroid Build Coastguard Worker    /** Set if the vk_sync is a timeline */
302*61046927SAndroid Build Coastguard Worker    VK_SYNC_IS_TIMELINE  = (1 << 0),
303*61046927SAndroid Build Coastguard Worker 
304*61046927SAndroid Build Coastguard Worker    /** Set if the vk_sync can have its payload shared */
305*61046927SAndroid Build Coastguard Worker    VK_SYNC_IS_SHAREABLE = (1 << 1),
306*61046927SAndroid Build Coastguard Worker 
307*61046927SAndroid Build Coastguard Worker    /** Set if the vk_sync has a shared payload */
308*61046927SAndroid Build Coastguard Worker    VK_SYNC_IS_SHARED    = (1 << 2),
309*61046927SAndroid Build Coastguard Worker };
310*61046927SAndroid Build Coastguard Worker 
311*61046927SAndroid Build Coastguard Worker struct vk_sync {
312*61046927SAndroid Build Coastguard Worker    const struct vk_sync_type *type;
313*61046927SAndroid Build Coastguard Worker    enum vk_sync_flags flags;
314*61046927SAndroid Build Coastguard Worker };
315*61046927SAndroid Build Coastguard Worker 
316*61046927SAndroid Build Coastguard Worker /* See VkSemaphoreSubmitInfo */
317*61046927SAndroid Build Coastguard Worker struct vk_sync_wait {
318*61046927SAndroid Build Coastguard Worker    struct vk_sync *sync;
319*61046927SAndroid Build Coastguard Worker    VkPipelineStageFlags2 stage_mask;
320*61046927SAndroid Build Coastguard Worker    uint64_t wait_value;
321*61046927SAndroid Build Coastguard Worker };
322*61046927SAndroid Build Coastguard Worker 
323*61046927SAndroid Build Coastguard Worker /* See VkSemaphoreSubmitInfo */
324*61046927SAndroid Build Coastguard Worker struct vk_sync_signal {
325*61046927SAndroid Build Coastguard Worker    struct vk_sync *sync;
326*61046927SAndroid Build Coastguard Worker    VkPipelineStageFlags2 stage_mask;
327*61046927SAndroid Build Coastguard Worker    uint64_t signal_value;
328*61046927SAndroid Build Coastguard Worker };
329*61046927SAndroid Build Coastguard Worker 
330*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK vk_sync_init(struct vk_device *device,
331*61046927SAndroid Build Coastguard Worker                                  struct vk_sync *sync,
332*61046927SAndroid Build Coastguard Worker                                  const struct vk_sync_type *type,
333*61046927SAndroid Build Coastguard Worker                                  enum vk_sync_flags flags,
334*61046927SAndroid Build Coastguard Worker                                  uint64_t initial_value);
335*61046927SAndroid Build Coastguard Worker 
336*61046927SAndroid Build Coastguard Worker void vk_sync_finish(struct vk_device *device,
337*61046927SAndroid Build Coastguard Worker                     struct vk_sync *sync);
338*61046927SAndroid Build Coastguard Worker 
339*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK vk_sync_create(struct vk_device *device,
340*61046927SAndroid Build Coastguard Worker                                    const struct vk_sync_type *type,
341*61046927SAndroid Build Coastguard Worker                                    enum vk_sync_flags flags,
342*61046927SAndroid Build Coastguard Worker                                    uint64_t initial_value,
343*61046927SAndroid Build Coastguard Worker                                    struct vk_sync **sync_out);
344*61046927SAndroid Build Coastguard Worker 
345*61046927SAndroid Build Coastguard Worker void vk_sync_destroy(struct vk_device *device,
346*61046927SAndroid Build Coastguard Worker                      struct vk_sync *sync);
347*61046927SAndroid Build Coastguard Worker 
348*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK vk_sync_signal(struct vk_device *device,
349*61046927SAndroid Build Coastguard Worker                                    struct vk_sync *sync,
350*61046927SAndroid Build Coastguard Worker                                    uint64_t value);
351*61046927SAndroid Build Coastguard Worker 
352*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK vk_sync_get_value(struct vk_device *device,
353*61046927SAndroid Build Coastguard Worker                                       struct vk_sync *sync,
354*61046927SAndroid Build Coastguard Worker                                       uint64_t *value);
355*61046927SAndroid Build Coastguard Worker 
356*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK vk_sync_reset(struct vk_device *device,
357*61046927SAndroid Build Coastguard Worker                                   struct vk_sync *sync);
358*61046927SAndroid Build Coastguard Worker 
359*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK vk_sync_wait(struct vk_device *device,
360*61046927SAndroid Build Coastguard Worker                                  struct vk_sync *sync,
361*61046927SAndroid Build Coastguard Worker                                  uint64_t wait_value,
362*61046927SAndroid Build Coastguard Worker                                  enum vk_sync_wait_flags wait_flags,
363*61046927SAndroid Build Coastguard Worker                                  uint64_t abs_timeout_ns);
364*61046927SAndroid Build Coastguard Worker 
365*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK vk_sync_wait_many(struct vk_device *device,
366*61046927SAndroid Build Coastguard Worker                                       uint32_t wait_count,
367*61046927SAndroid Build Coastguard Worker                                       const struct vk_sync_wait *waits,
368*61046927SAndroid Build Coastguard Worker                                       enum vk_sync_wait_flags wait_flags,
369*61046927SAndroid Build Coastguard Worker                                       uint64_t abs_timeout_ns);
370*61046927SAndroid Build Coastguard Worker 
371*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK vk_sync_import_opaque_fd(struct vk_device *device,
372*61046927SAndroid Build Coastguard Worker                                              struct vk_sync *sync,
373*61046927SAndroid Build Coastguard Worker                                              int fd);
374*61046927SAndroid Build Coastguard Worker 
375*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK vk_sync_export_opaque_fd(struct vk_device *device,
376*61046927SAndroid Build Coastguard Worker                                              struct vk_sync *sync,
377*61046927SAndroid Build Coastguard Worker                                              int *fd);
378*61046927SAndroid Build Coastguard Worker 
379*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK vk_sync_import_sync_file(struct vk_device *device,
380*61046927SAndroid Build Coastguard Worker                                              struct vk_sync *sync,
381*61046927SAndroid Build Coastguard Worker                                              int sync_file);
382*61046927SAndroid Build Coastguard Worker 
383*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK vk_sync_export_sync_file(struct vk_device *device,
384*61046927SAndroid Build Coastguard Worker                                              struct vk_sync *sync,
385*61046927SAndroid Build Coastguard Worker                                              int *sync_file);
386*61046927SAndroid Build Coastguard Worker 
387*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK vk_sync_import_win32_handle(struct vk_device *device,
388*61046927SAndroid Build Coastguard Worker                                                 struct vk_sync *sync,
389*61046927SAndroid Build Coastguard Worker                                                 void *handle,
390*61046927SAndroid Build Coastguard Worker                                                 const wchar_t *name);
391*61046927SAndroid Build Coastguard Worker 
392*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK vk_sync_export_win32_handle(struct vk_device *device,
393*61046927SAndroid Build Coastguard Worker                                                 struct vk_sync *sync,
394*61046927SAndroid Build Coastguard Worker                                                 void **handle);
395*61046927SAndroid Build Coastguard Worker 
396*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK vk_sync_set_win32_export_params(struct vk_device *device,
397*61046927SAndroid Build Coastguard Worker                                                     struct vk_sync *sync,
398*61046927SAndroid Build Coastguard Worker                                                     const void *security_attributes,
399*61046927SAndroid Build Coastguard Worker                                                     uint32_t access,
400*61046927SAndroid Build Coastguard Worker                                                     const wchar_t *name);
401*61046927SAndroid Build Coastguard Worker 
402*61046927SAndroid Build Coastguard Worker VkResult MUST_CHECK vk_sync_move(struct vk_device *device,
403*61046927SAndroid Build Coastguard Worker                                  struct vk_sync *dst,
404*61046927SAndroid Build Coastguard Worker                                  struct vk_sync *src);
405*61046927SAndroid Build Coastguard Worker 
406*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
407*61046927SAndroid Build Coastguard Worker }
408*61046927SAndroid Build Coastguard Worker #endif
409*61046927SAndroid Build Coastguard Worker 
410*61046927SAndroid Build Coastguard Worker #endif /* VK_SYNC_H */
411