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