• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *
3  * Copyright (c) 2015-2022 The Khronos Group Inc.
4  * Copyright (c) 2015-2022 Valve Corporation
5  * Copyright (c) 2015-2022 LunarG, Inc.
6  * Copyright (C) 2015 Google Inc.
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *     http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  * Author: Courtney Goeltzenleuchter <courtney@lunarg.com>
21  * Author: Jon Ashburn <jon@lunarg.com>
22  * Author: Tony Barbour <tony@LunarG.com>
23  * Author: Chia-I Wu <olv@lunarg.com>
24  * Author: Charles Giessen <charles@lunarg.com>
25  */
26 
27 #include <stdlib.h>
28 #include <string.h>
29 
30 #include "allocation.h"
31 #include "debug_utils.h"
32 #include "gpa_helper.h"
33 #include "loader.h"
34 #include "log.h"
35 #include "vk_loader_extensions.h"
36 #include "vk_loader_platform.h"
37 #include "wsi.h"
38 
39 // Trampoline entrypoints are in this file for core Vulkan commands
40 
41 /* vkGetInstanceProcAddr: Get global level or instance level entrypoint addressess.
42  * @param instance
43  * @param pName
44  * @return
45  *    If pName is a global level entrypoint:
46  *        If instance == NULL || instance is invalid || (instance is valid && instance.minor_version <= 2):
47  *            return global level functions
48  *        Else:
49  *            return NULL
50  *    Else:
51  *        If instance is valid:
52  *            return a trampoline entry point for all dispatchable Vulkan functions both core and extensions.
53  *        Else:
54  *            return NULL
55  *
56  * Note:
57  * Vulkan header updated 1.2.193 changed the behavior of vkGetInstanceProcAddr for global entrypoints. They used to always be
58  * returned regardless of the value of the instance paramtere. The spec was amended in this version to only allow querying global
59  * level entrypoints with a NULL instance. However, as to not break old applications, the new behavior is only applied if the
60  * instance passed in is both valid and minor version is greater than 1.2, which was when this change in behavior occurred. Only
61  * instances with a newer version will get the new behavior.
62  */
vkGetInstanceProcAddr(VkInstance instance,const char * pName)63 LOADER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *pName) {
64     // Always should be able to get vkGetInstanceProcAddr if queried, regardless of the value of instance
65     if (!strcmp(pName, "vkGetInstanceProcAddr")) return (PFN_vkVoidFunction)vkGetInstanceProcAddr;
66 
67     // Get entrypoint addresses that are global (no dispatchable object)
68     void *addr = globalGetProcAddr(pName);
69     if (addr != VK_NULL_HANDLE) {
70         // Always can get a global entrypoint from vkGetInstanceProcAddr with a NULL instance handle
71         if (instance == VK_NULL_HANDLE) {
72             return addr;
73         } else {
74             // New behavior only returns a global entrypoint if the instance handle is NULL.
75             // Old behavior is to return a global entrypoint regardless of the value of the instance handle.
76             // Use new behavior if: The instance is valid and the minor version of the instance is greater than 1.2, which
77             // was when the new behavior was added. (eg, it is enforced in the next minor version of vulkan, which will be 1.3)
78 
79             // First check if instance is valid - loader_get_instance() returns NULL if it isn't.
80             struct loader_instance *ptr_instance = loader_get_instance(instance);
81             if (ptr_instance != NULL &&
82                 loader_check_version_meets_required(loader_combine_version(1, 3, 0), ptr_instance->app_api_version)) {
83                 // New behavior
84                 return NULL;
85             } else {
86                 // Old behavior
87                 return addr;
88             }
89         }
90     } else {
91         // All other functions require a valid instance handle to get
92         if (instance == VK_NULL_HANDLE) {
93             return NULL;
94         }
95         struct loader_instance *ptr_instance = loader_get_instance(instance);
96         // If we've gotten here and the pointer is NULL, it's invalid
97         if (ptr_instance == NULL) {
98             loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
99                        "vkGetInstanceProcAddr: Invalid instance [VUID-vkGetInstanceProcAddr-instance-parameter]");
100             abort(); /* Intentionally fail so user can correct issue. */
101         }
102         // Return trampoline code for non-global entrypoints including any extensions.
103         // Device extensions are returned if a layer or ICD supports the extension.
104         // Instance extensions are returned if the extension is enabled and the
105         // loader or someone else supports the extension
106         return trampoline_get_proc_addr(ptr_instance, pName);
107     }
108 }
109 
110 // Get a device level or global level entry point address.
111 // @param device
112 // @param pName
113 // @return
114 //    If device is valid, returns a device relative entry point for device level
115 //    entry points both core and extensions.
116 //    Device relative means call down the device chain.
vkGetDeviceProcAddr(VkDevice device,const char * pName)117 LOADER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char *pName) {
118     void *addr;
119 
120     // For entrypoints that loader must handle (ie non-dispatchable or create object)
121     // make sure the loader entrypoint is returned
122     addr = loader_non_passthrough_gdpa(pName);
123     if (addr) {
124         return addr;
125     }
126 
127     // Although CreateDevice is on device chain it's dispatchable object isn't
128     // a VkDevice or child of VkDevice so return NULL.
129     if (!strcmp(pName, "CreateDevice")) return NULL;
130 
131     // Return the dispatch table entrypoint for the fastest case
132     const VkLayerDispatchTable *disp_table = *(VkLayerDispatchTable **)device;
133     if (disp_table == NULL) return NULL;
134 
135     addr = loader_lookup_device_dispatch_table(disp_table, pName);
136     if (addr) return addr;
137 
138     if (disp_table->GetDeviceProcAddr == NULL) return NULL;
139     return disp_table->GetDeviceProcAddr(device, pName);
140 }
141 
vkEnumerateInstanceExtensionProperties(const char * pLayerName,uint32_t * pPropertyCount,VkExtensionProperties * pProperties)142 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName,
143                                                                                     uint32_t *pPropertyCount,
144                                                                                     VkExtensionProperties *pProperties) {
145     LOADER_PLATFORM_THREAD_ONCE(&once_init, loader_initialize);
146 
147     // We know we need to call at least the terminator
148     VkResult res = VK_SUCCESS;
149     VkEnumerateInstanceExtensionPropertiesChain chain_tail = {
150         .header =
151             {
152                 .type = VK_CHAIN_TYPE_ENUMERATE_INSTANCE_EXTENSION_PROPERTIES,
153                 .version = VK_CURRENT_CHAIN_VERSION,
154                 .size = sizeof(chain_tail),
155             },
156         .pfnNextLayer = &terminator_EnumerateInstanceExtensionProperties,
157         .pNextLink = NULL,
158     };
159     VkEnumerateInstanceExtensionPropertiesChain *chain_head = &chain_tail;
160 
161     // Get the implicit layers
162     struct loader_layer_list layers;
163     memset(&layers, 0, sizeof(layers));
164     loader_scan_for_implicit_layers(NULL, &layers);
165 
166     // We'll need to save the dl handles so we can close them later
167     loader_platform_dl_handle *libs =
168         loader_calloc(NULL, sizeof(loader_platform_dl_handle) * layers.count, VK_SYSTEM_ALLOCATION_SCOPE_COMMAND);
169     if (libs == NULL && layers.count > 0) {
170         return VK_ERROR_OUT_OF_HOST_MEMORY;
171     }
172     size_t lib_count = 0;
173 
174     // Prepend layers onto the chain if they implement this entry point
175     for (uint32_t i = 0; i < layers.count; ++i) {
176         if (!loader_implicit_layer_is_enabled(NULL, layers.list + i) ||
177             layers.list[i].pre_instance_functions.enumerate_instance_extension_properties[0] == '\0') {
178             continue;
179         }
180 
181         loader_platform_dl_handle layer_lib = loader_platform_open_library(layers.list[i].lib_name);
182         if (layer_lib == NULL) {
183             loader_log(NULL, VULKAN_LOADER_WARN_BIT | VULKAN_LOADER_LAYER_BIT, 0,
184                        "%s: Unable to load implicit layer library \"%s\"", __FUNCTION__, layers.list[i].lib_name);
185             continue;
186         }
187 
188         libs[lib_count++] = layer_lib;
189         void *pfn = loader_platform_get_proc_address(layer_lib,
190                                                      layers.list[i].pre_instance_functions.enumerate_instance_extension_properties);
191         if (pfn == NULL) {
192             loader_log(NULL, VULKAN_LOADER_WARN_BIT | VULKAN_LOADER_LAYER_BIT, 0,
193                        "%s: Unable to resolve symbol \"%s\" in implicit layer library \"%s\"", __FUNCTION__,
194                        layers.list[i].pre_instance_functions.enumerate_instance_extension_properties, layers.list[i].lib_name);
195             continue;
196         }
197 
198         VkEnumerateInstanceExtensionPropertiesChain *chain_link =
199             loader_alloc(NULL, sizeof(VkEnumerateInstanceExtensionPropertiesChain), VK_SYSTEM_ALLOCATION_SCOPE_COMMAND);
200         if (chain_link == NULL) {
201             res = VK_ERROR_OUT_OF_HOST_MEMORY;
202             break;
203         }
204         memset(chain_link, 0, sizeof(VkEnumerateInstanceLayerPropertiesChain));
205         chain_link->header.type = VK_CHAIN_TYPE_ENUMERATE_INSTANCE_EXTENSION_PROPERTIES;
206         chain_link->header.version = VK_CURRENT_CHAIN_VERSION;
207         chain_link->header.size = sizeof(*chain_link);
208         chain_link->pfnNextLayer = pfn;
209         chain_link->pNextLink = chain_head;
210 
211         chain_head = chain_link;
212     }
213 
214     // Call down the chain
215     if (res == VK_SUCCESS) {
216         res = chain_head->pfnNextLayer(chain_head->pNextLink, pLayerName, pPropertyCount, pProperties);
217     }
218 
219     // Free up the layers
220     loader_delete_layer_list_and_properties(NULL, &layers);
221 
222     // Tear down the chain
223     while (chain_head != &chain_tail) {
224         VkEnumerateInstanceExtensionPropertiesChain *holder = chain_head;
225         chain_head = (VkEnumerateInstanceExtensionPropertiesChain *)chain_head->pNextLink;
226         loader_free(NULL, holder);
227     }
228 
229     // Close the dl handles
230     for (size_t i = 0; i < lib_count; ++i) {
231         loader_platform_close_library(libs[i]);
232     }
233     loader_free(NULL, libs);
234 
235     return res;
236 }
237 
vkEnumerateInstanceLayerProperties(uint32_t * pPropertyCount,VkLayerProperties * pProperties)238 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pPropertyCount,
239                                                                                 VkLayerProperties *pProperties) {
240     LOADER_PLATFORM_THREAD_ONCE(&once_init, loader_initialize);
241 
242     // We know we need to call at least the terminator
243     VkResult res = VK_SUCCESS;
244     VkEnumerateInstanceLayerPropertiesChain chain_tail = {
245         .header =
246             {
247                 .type = VK_CHAIN_TYPE_ENUMERATE_INSTANCE_LAYER_PROPERTIES,
248                 .version = VK_CURRENT_CHAIN_VERSION,
249                 .size = sizeof(chain_tail),
250             },
251         .pfnNextLayer = &terminator_EnumerateInstanceLayerProperties,
252         .pNextLink = NULL,
253     };
254     VkEnumerateInstanceLayerPropertiesChain *chain_head = &chain_tail;
255 
256     // Get the implicit layers
257     struct loader_layer_list layers;
258     memset(&layers, 0, sizeof(layers));
259     loader_scan_for_implicit_layers(NULL, &layers);
260 
261     // We'll need to save the dl handles so we can close them later
262     loader_platform_dl_handle *libs =
263         loader_calloc(NULL, sizeof(loader_platform_dl_handle) * layers.count, VK_SYSTEM_ALLOCATION_SCOPE_COMMAND);
264     if (libs == NULL && layers.count > 0) {
265         return VK_ERROR_OUT_OF_HOST_MEMORY;
266     }
267     size_t lib_count = 0;
268 
269     // Prepend layers onto the chain if they implement this entry point
270     for (uint32_t i = 0; i < layers.count; ++i) {
271         if (!loader_implicit_layer_is_enabled(NULL, layers.list + i) ||
272             layers.list[i].pre_instance_functions.enumerate_instance_layer_properties[0] == '\0') {
273             continue;
274         }
275 
276         loader_platform_dl_handle layer_lib = loader_platform_open_library(layers.list[i].lib_name);
277         if (layer_lib == NULL) {
278             loader_log(NULL, VULKAN_LOADER_WARN_BIT, 0, "%s: Unable to load implicit layer library \"%s\"", __FUNCTION__,
279                        layers.list[i].lib_name);
280             continue;
281         }
282 
283         libs[lib_count++] = layer_lib;
284         void *pfn =
285             loader_platform_get_proc_address(layer_lib, layers.list[i].pre_instance_functions.enumerate_instance_layer_properties);
286         if (pfn == NULL) {
287             loader_log(NULL, VULKAN_LOADER_WARN_BIT, 0, "%s: Unable to resolve symbol \"%s\" in implicit layer library \"%s\"",
288                        __FUNCTION__, layers.list[i].pre_instance_functions.enumerate_instance_layer_properties,
289                        layers.list[i].lib_name);
290             continue;
291         }
292 
293         VkEnumerateInstanceLayerPropertiesChain *chain_link =
294             loader_alloc(NULL, sizeof(VkEnumerateInstanceLayerPropertiesChain), VK_SYSTEM_ALLOCATION_SCOPE_COMMAND);
295         if (chain_link == NULL) {
296             res = VK_ERROR_OUT_OF_HOST_MEMORY;
297             break;
298         }
299         memset(chain_link, 0, sizeof(VkEnumerateInstanceLayerPropertiesChain));
300         chain_link->header.type = VK_CHAIN_TYPE_ENUMERATE_INSTANCE_LAYER_PROPERTIES;
301         chain_link->header.version = VK_CURRENT_CHAIN_VERSION;
302         chain_link->header.size = sizeof(*chain_link);
303         chain_link->pfnNextLayer = pfn;
304         chain_link->pNextLink = chain_head;
305 
306         chain_head = chain_link;
307     }
308 
309     // Call down the chain
310     if (res == VK_SUCCESS) {
311         res = chain_head->pfnNextLayer(chain_head->pNextLink, pPropertyCount, pProperties);
312     }
313 
314     // Free up the layers
315     loader_delete_layer_list_and_properties(NULL, &layers);
316 
317     // Tear down the chain
318     while (chain_head != &chain_tail) {
319         VkEnumerateInstanceLayerPropertiesChain *holder = chain_head;
320         chain_head = (VkEnumerateInstanceLayerPropertiesChain *)chain_head->pNextLink;
321         loader_free(NULL, holder);
322     }
323 
324     // Close the dl handles
325     for (size_t i = 0; i < lib_count; ++i) {
326         loader_platform_close_library(libs[i]);
327     }
328     loader_free(NULL, libs);
329 
330     return res;
331 }
332 
vkEnumerateInstanceVersion(uint32_t * pApiVersion)333 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceVersion(uint32_t *pApiVersion) {
334     LOADER_PLATFORM_THREAD_ONCE(&once_init, loader_initialize);
335 
336     if (NULL == pApiVersion) {
337         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
338                    "vkEnumerateInstanceVersion: \'pApiVersion\' must not be NULL "
339                    "(VUID-vkEnumerateInstanceVersion-pApiVersion-parameter");
340         // NOTE: This seems silly, but it's the only allowable failure
341         return VK_ERROR_OUT_OF_HOST_MEMORY;
342     }
343 
344     // We know we need to call at least the terminator
345     VkResult res = VK_SUCCESS;
346     VkEnumerateInstanceVersionChain chain_tail = {
347         .header =
348             {
349                 .type = VK_CHAIN_TYPE_ENUMERATE_INSTANCE_VERSION,
350                 .version = VK_CURRENT_CHAIN_VERSION,
351                 .size = sizeof(chain_tail),
352             },
353         .pfnNextLayer = &terminator_EnumerateInstanceVersion,
354         .pNextLink = NULL,
355     };
356     VkEnumerateInstanceVersionChain *chain_head = &chain_tail;
357 
358     // Get the implicit layers
359     struct loader_layer_list layers;
360     memset(&layers, 0, sizeof(layers));
361     loader_scan_for_implicit_layers(NULL, &layers);
362 
363     // We'll need to save the dl handles so we can close them later
364     loader_platform_dl_handle *libs =
365         loader_calloc(NULL, sizeof(loader_platform_dl_handle) * layers.count, VK_SYSTEM_ALLOCATION_SCOPE_COMMAND);
366     if (libs == NULL && layers.count > 0) {
367         return VK_ERROR_OUT_OF_HOST_MEMORY;
368     }
369     size_t lib_count = 0;
370 
371     // Prepend layers onto the chain if they implement this entry point
372     for (uint32_t i = 0; i < layers.count; ++i) {
373         if (!loader_implicit_layer_is_enabled(NULL, layers.list + i) ||
374             layers.list[i].pre_instance_functions.enumerate_instance_version[0] == '\0') {
375             continue;
376         }
377 
378         loader_platform_dl_handle layer_lib = loader_platform_open_library(layers.list[i].lib_name);
379         if (layer_lib == NULL) {
380             loader_log(NULL, VULKAN_LOADER_WARN_BIT, 0, "%s: Unable to load implicit layer library \"%s\"", __FUNCTION__,
381                        layers.list[i].lib_name);
382             continue;
383         }
384 
385         libs[lib_count++] = layer_lib;
386         void *pfn = loader_platform_get_proc_address(layer_lib, layers.list[i].pre_instance_functions.enumerate_instance_version);
387         if (pfn == NULL) {
388             loader_log(NULL, VULKAN_LOADER_WARN_BIT, 0, "%s: Unable to resolve symbol \"%s\" in implicit layer library \"%s\"",
389                        __FUNCTION__, layers.list[i].pre_instance_functions.enumerate_instance_version, layers.list[i].lib_name);
390             continue;
391         }
392 
393         VkEnumerateInstanceVersionChain *chain_link =
394             loader_alloc(NULL, sizeof(VkEnumerateInstanceVersionChain), VK_SYSTEM_ALLOCATION_SCOPE_COMMAND);
395         if (chain_link == NULL) {
396             res = VK_ERROR_OUT_OF_HOST_MEMORY;
397             break;
398         }
399         memset(chain_link, 0, sizeof(VkEnumerateInstanceLayerPropertiesChain));
400         chain_link->header.type = VK_CHAIN_TYPE_ENUMERATE_INSTANCE_VERSION;
401         chain_link->header.version = VK_CURRENT_CHAIN_VERSION;
402         chain_link->header.size = sizeof(*chain_link);
403         chain_link->pfnNextLayer = pfn;
404         chain_link->pNextLink = chain_head;
405 
406         chain_head = chain_link;
407     }
408 
409     // Call down the chain
410     if (res == VK_SUCCESS) {
411         res = chain_head->pfnNextLayer(chain_head->pNextLink, pApiVersion);
412     }
413 
414     // Free up the layers
415     loader_delete_layer_list_and_properties(NULL, &layers);
416 
417     // Tear down the chain
418     while (chain_head != &chain_tail) {
419         VkEnumerateInstanceVersionChain *holder = chain_head;
420         chain_head = (VkEnumerateInstanceVersionChain *)chain_head->pNextLink;
421         loader_free(NULL, holder);
422     }
423 
424     // Close the dl handles
425     for (size_t i = 0; i < lib_count; ++i) {
426         loader_platform_close_library(libs[i]);
427     }
428     loader_free(NULL, libs);
429 
430     return res;
431 }
432 
vkCreateInstance(const VkInstanceCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkInstance * pInstance)433 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo,
434                                                               const VkAllocationCallbacks *pAllocator, VkInstance *pInstance) {
435     struct loader_instance *ptr_instance = NULL;
436     VkInstance created_instance = VK_NULL_HANDLE;
437     VkResult res = VK_ERROR_INITIALIZATION_FAILED;
438 
439     LOADER_PLATFORM_THREAD_ONCE(&once_init, loader_initialize);
440 
441     if (pCreateInfo == NULL) {
442         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
443                    "vkCreateInstance: \'pCreateInfo\' is NULL (VUID-vkCreateInstance-pCreateInfo-parameter)");
444         goto out;
445     }
446     if (pInstance == NULL) {
447         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
448                    "vkCreateInstance \'pInstance\' not valid (VUID-vkCreateInstance-pInstance-parameter)");
449         goto out;
450     }
451 
452     ptr_instance =
453         (struct loader_instance *)loader_calloc(pAllocator, sizeof(struct loader_instance), VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
454 
455     VkInstanceCreateInfo ici = *pCreateInfo;
456 
457     if (ptr_instance == NULL) {
458         res = VK_ERROR_OUT_OF_HOST_MEMORY;
459         goto out;
460     }
461 
462     loader_platform_thread_lock_mutex(&loader_lock);
463     if (pAllocator) {
464         ptr_instance->alloc_callbacks = *pAllocator;
465     }
466     ptr_instance->magic = LOADER_MAGIC_NUMBER;
467 
468     // Save the application version
469     if (NULL == pCreateInfo->pApplicationInfo || 0 == pCreateInfo->pApplicationInfo->apiVersion) {
470         ptr_instance->app_api_version = LOADER_VERSION_1_0_0;
471     } else {
472         ptr_instance->app_api_version = loader_make_version(pCreateInfo->pApplicationInfo->apiVersion);
473         // zero out the patch version since we don't actually want to compare with it
474         ptr_instance->app_api_version.patch = 0;
475     }
476 
477     // Look for one or more VK_EXT_debug_report or VK_EXT_debug_utils create info structures
478     // and setup a callback(s) for each one found.
479 
480     // Handle cases of VK_EXT_debug_utils
481     // Setup the temporary messenger(s) here to catch early issues:
482     res = util_CreateDebugUtilsMessengers(ptr_instance, pCreateInfo->pNext, pAllocator);
483     if (VK_ERROR_OUT_OF_HOST_MEMORY == res) {
484         // Failure of setting up one or more of the messenger.
485         goto out;
486     }
487 
488     // Handle cases of VK_EXT_debug_report
489     // Setup the temporary callback(s) here to catch early issues:
490     res = util_CreateDebugReportCallbacks(ptr_instance, pCreateInfo->pNext, pAllocator);
491     if (VK_ERROR_OUT_OF_HOST_MEMORY == res) {
492         // Failure of setting up one or more of the callback.
493         goto out;
494     }
495 
496     // Check the VkInstanceCreateInfoFlags wether to allow the portability enumeration flag
497     if ((pCreateInfo->flags & VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR) == 1) {
498         // Make sure the extension has been enabled
499         for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
500             if (strcmp(pCreateInfo->ppEnabledExtensionNames[i], VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME) == 0) {
501                 ptr_instance->portability_enumeration_enabled = true;
502                 loader_log(ptr_instance, VULKAN_LOADER_INFO_BIT, 0,
503                            "Portability enumeration bit was set, enumerating portability drivers.");
504             }
505         }
506     }
507 
508     // Make sure the application provided API version has 0 for its variant
509     if (NULL != pCreateInfo->pApplicationInfo) {
510         uint32_t variant_version = VK_API_VERSION_VARIANT(pCreateInfo->pApplicationInfo->apiVersion);
511         if (0 != variant_version) {
512             loader_log(ptr_instance, VULKAN_LOADER_WARN_BIT, 0,
513                        "vkCreateInstance: The API Variant specified in pCreateInfo->pApplicationInfo.apiVersion is %d instead of "
514                        "the expected value of 0.",
515                        variant_version);
516         }
517     }
518 
519     // Due to implicit layers need to get layer list even if
520     // enabledLayerCount == 0 and VK_INSTANCE_LAYERS is unset. For now always
521     // get layer list via loader_scan_for_layers().
522     memset(&ptr_instance->instance_layer_list, 0, sizeof(ptr_instance->instance_layer_list));
523     loader_scan_for_layers(ptr_instance, &ptr_instance->instance_layer_list);
524 
525     // Validate the app requested layers to be enabled
526     if (pCreateInfo->enabledLayerCount > 0) {
527         res = loader_validate_layers(ptr_instance, pCreateInfo->enabledLayerCount, pCreateInfo->ppEnabledLayerNames,
528                                      &ptr_instance->instance_layer_list);
529         if (res != VK_SUCCESS) {
530             goto out;
531         }
532     }
533 
534     // Scan/discover all ICD libraries
535     memset(&ptr_instance->icd_tramp_list, 0, sizeof(ptr_instance->icd_tramp_list));
536     bool skipped_portability_drivers = false;
537     res = loader_icd_scan(ptr_instance, &ptr_instance->icd_tramp_list, &skipped_portability_drivers);
538     if (res == VK_ERROR_OUT_OF_HOST_MEMORY) {
539         goto out;
540     } else if (ptr_instance->icd_tramp_list.count == 0) {
541         // No drivers found
542         if (skipped_portability_drivers) {
543             loader_log(
544                 ptr_instance, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_DRIVER_BIT, 0,
545                 "vkCreateInstance: Found drivers that contain devices which support the portability subset, but the "
546                 "portability enumeration bit was not set! Applications that wish to enumerate portability drivers must set the "
547                 "VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR bit in the VkInstanceCreateInfo flags and "
548                 "enable the VK_KHR_portability_enumeration instance extension.");
549         }
550         loader_log(ptr_instance, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_DRIVER_BIT, 0, "vkCreateInstance: Found no drivers!");
551         res = VK_ERROR_INCOMPATIBLE_DRIVER;
552         goto out;
553     }
554 
555     // Get extensions from all ICD's, merge so no duplicates, then validate
556     res = loader_get_icd_loader_instance_extensions(ptr_instance, &ptr_instance->icd_tramp_list, &ptr_instance->ext_list);
557     if (res != VK_SUCCESS) {
558         goto out;
559     }
560     res = loader_validate_instance_extensions(ptr_instance, &ptr_instance->ext_list, &ptr_instance->instance_layer_list, &ici);
561     if (res != VK_SUCCESS) {
562         goto out;
563     }
564 
565     ptr_instance->disp = loader_instance_heap_alloc(ptr_instance, sizeof(struct loader_instance_dispatch_table),
566                                                     VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
567     if (ptr_instance->disp == NULL) {
568         loader_log(ptr_instance, VULKAN_LOADER_ERROR_BIT, 0,
569                    "vkCreateInstance:  Failed to allocate Loader's full Instance dispatch table.");
570         res = VK_ERROR_OUT_OF_HOST_MEMORY;
571         goto out;
572     }
573     memcpy(&ptr_instance->disp->layer_inst_disp, &instance_disp, sizeof(instance_disp));
574 
575     loader_platform_thread_lock_mutex(&loader_global_instance_list_lock);
576     ptr_instance->next = loader.instances;
577     loader.instances = ptr_instance;
578     loader_platform_thread_unlock_mutex(&loader_global_instance_list_lock);
579 
580     // Activate any layers on instance chain
581     res = loader_enable_instance_layers(ptr_instance, &ici, &ptr_instance->instance_layer_list);
582     if (res != VK_SUCCESS) {
583         goto out;
584     }
585 
586     created_instance = (VkInstance)ptr_instance;
587     res = loader_create_instance_chain(&ici, pAllocator, ptr_instance, &created_instance);
588 
589     if (VK_SUCCESS == res) {
590         // Check for enabled extensions here to setup the loader structures so the loader knows what extensions
591         // it needs to worry about.
592         // We do it in the terminator and again above the layers here since we may think different extensions
593         // are enabled than what's down in the terminator.
594         // This is why we don't clear inside of these function calls.
595         // The clearing should actually be handled by the overall memset of the pInstance structure above.
596         wsi_create_instance(ptr_instance, &ici);
597         check_for_enabled_debug_extensions(ptr_instance, &ici);
598         extensions_create_instance(ptr_instance, &ici);
599 
600         *pInstance = (VkInstance)ptr_instance;
601 
602         // Finally have the layers in place and everyone has seen
603         // the CreateInstance command go by. This allows the layer's
604         // GetInstanceProcAddr functions to return valid extension functions
605         // if enabled.
606         loader_activate_instance_layer_extensions(ptr_instance, created_instance);
607     } else if (VK_ERROR_EXTENSION_NOT_PRESENT == res && !ptr_instance->create_terminator_invalid_extension) {
608         loader_log(ptr_instance, VULKAN_LOADER_WARN_BIT, 0,
609                    "vkCreateInstance: Layer returning invalid extension error not triggered by ICD/Loader (Policy #LLP_LAYER_17).");
610     }
611 
612 out:
613 
614     if (NULL != ptr_instance) {
615         if (res != VK_SUCCESS) {
616             loader_platform_thread_lock_mutex(&loader_global_instance_list_lock);
617             // error path, should clean everything up
618             if (loader.instances == ptr_instance) {
619                 loader.instances = ptr_instance->next;
620             }
621             loader_platform_thread_unlock_mutex(&loader_global_instance_list_lock);
622 
623             loader_instance_heap_free(ptr_instance, ptr_instance->disp);
624             // Remove any created VK_EXT_debug_report or VK_EXT_debug_utils items
625             destroy_debug_callbacks_chain(ptr_instance, pAllocator);
626 
627             if (NULL != ptr_instance->expanded_activated_layer_list.list) {
628                 loader_deactivate_layers(ptr_instance, NULL, &ptr_instance->expanded_activated_layer_list);
629             }
630             if (NULL != ptr_instance->app_activated_layer_list.list) {
631                 loader_destroy_layer_list(ptr_instance, NULL, &ptr_instance->app_activated_layer_list);
632             }
633 
634             loader_delete_layer_list_and_properties(ptr_instance, &ptr_instance->instance_layer_list);
635             loader_scanned_icd_clear(ptr_instance, &ptr_instance->icd_tramp_list);
636             loader_destroy_generic_list(ptr_instance, (struct loader_generic_list *)&ptr_instance->ext_list);
637 
638             // Free any icd_terms that were created.
639             // If an OOM occurs from a layer, terminator_CreateInstance won't be reached where this kind of
640             // cleanup normally occurs
641             struct loader_icd_term *icd_term = NULL;
642             while (NULL != ptr_instance->icd_terms) {
643                 icd_term = ptr_instance->icd_terms;
644                 ptr_instance->icd_terms = icd_term->next;
645                 loader_icd_destroy(ptr_instance, icd_term, pAllocator);
646             }
647 
648             loader_instance_heap_free(ptr_instance, ptr_instance);
649         } else {
650             // success path, swap out created debug callbacks out so they aren't used until instance destruction
651             ptr_instance->InstanceCreationDeletionDebugFunctionHead = ptr_instance->DbgFunctionHead;
652             ptr_instance->DbgFunctionHead = NULL;
653         }
654         // Only unlock when ptr_instance isn't NULL, as if it is, the above code didn't make it to when loader_lock was locked.
655         loader_platform_thread_unlock_mutex(&loader_lock);
656     }
657 
658     return res;
659 }
660 
vkDestroyInstance(VkInstance instance,const VkAllocationCallbacks * pAllocator)661 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) {
662     const VkLayerInstanceDispatchTable *disp;
663     struct loader_instance *ptr_instance = NULL;
664 
665     if (instance == VK_NULL_HANDLE) {
666         return;
667     }
668     loader_platform_thread_lock_mutex(&loader_lock);
669 
670     ptr_instance = loader_get_instance(instance);
671     if (ptr_instance == NULL) {
672         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
673                    "vkDestroyInstance: Invalid instance [VUID-vkDestroyInstance-instance-parameter]");
674         loader_platform_thread_unlock_mutex(&loader_lock);
675         abort(); /* Intentionally fail so user can correct issue. */
676     }
677 
678     if (pAllocator) {
679         ptr_instance->alloc_callbacks = *pAllocator;
680     }
681 
682     // Remove any callbacks that weren't cleaned up by the application
683     destroy_debug_callbacks_chain(ptr_instance, pAllocator);
684 
685     // Swap in the debug callbacks created during instance creation
686     ptr_instance->DbgFunctionHead = ptr_instance->InstanceCreationDeletionDebugFunctionHead;
687     ptr_instance->InstanceCreationDeletionDebugFunctionHead = NULL;
688 
689     disp = loader_get_instance_layer_dispatch(instance);
690     disp->DestroyInstance(ptr_instance->instance, pAllocator);
691 
692     if (NULL != ptr_instance->expanded_activated_layer_list.list) {
693         loader_deactivate_layers(ptr_instance, NULL, &ptr_instance->expanded_activated_layer_list);
694     }
695     if (NULL != ptr_instance->app_activated_layer_list.list) {
696         loader_destroy_layer_list(ptr_instance, NULL, &ptr_instance->app_activated_layer_list);
697     }
698 
699     if (ptr_instance->phys_devs_tramp) {
700         for (uint32_t i = 0; i < ptr_instance->phys_dev_count_tramp; i++) {
701             loader_instance_heap_free(ptr_instance, ptr_instance->phys_devs_tramp[i]);
702         }
703         loader_instance_heap_free(ptr_instance, ptr_instance->phys_devs_tramp);
704     }
705 
706     // Destroy the debug callbacks created during instance creation
707     destroy_debug_callbacks_chain(ptr_instance, pAllocator);
708 
709     loader_instance_heap_free(ptr_instance, ptr_instance->disp);
710     loader_instance_heap_free(ptr_instance, ptr_instance);
711     loader_platform_thread_unlock_mutex(&loader_lock);
712 
713     // Unload preloaded layers, so if vkEnumerateInstanceExtensionProperties or vkCreateInstance is called again, the ICD's are up
714     // to date
715     loader_unload_preloaded_icds();
716 }
717 
vkEnumeratePhysicalDevices(VkInstance instance,uint32_t * pPhysicalDeviceCount,VkPhysicalDevice * pPhysicalDevices)718 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount,
719                                                                         VkPhysicalDevice *pPhysicalDevices) {
720     VkResult res = VK_SUCCESS;
721     struct loader_instance *inst;
722 
723     loader_platform_thread_lock_mutex(&loader_lock);
724 
725     inst = loader_get_instance(instance);
726     if (NULL == inst) {
727         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
728                    "vkEnumeratePhysicalDevices: Invalid instance [VUID-vkEnumeratePhysicalDevices-instance-parameter]");
729         abort(); /* Intentionally fail so user can correct issue. */
730     }
731 
732     if (NULL == pPhysicalDeviceCount) {
733         loader_log(inst, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
734                    "vkEnumeratePhysicalDevices: Received NULL pointer for physical device count return value. "
735                    "[VUID-vkEnumeratePhysicalDevices-pPhysicalDeviceCount-parameter]");
736         res = VK_ERROR_INITIALIZATION_FAILED;
737         goto out;
738     }
739 
740     // Call down the chain to get the physical device info
741     res = inst->disp->layer_inst_disp.EnumeratePhysicalDevices(inst->instance, pPhysicalDeviceCount, pPhysicalDevices);
742 
743     if (NULL != pPhysicalDevices && (VK_SUCCESS == res || VK_INCOMPLETE == res)) {
744         // Wrap the PhysDev object for loader usage, return wrapped objects
745         VkResult update_res = setup_loader_tramp_phys_devs(inst, *pPhysicalDeviceCount, pPhysicalDevices);
746         if (VK_SUCCESS != update_res) {
747             res = update_res;
748         }
749     }
750 
751 out:
752 
753     loader_platform_thread_unlock_mutex(&loader_lock);
754     return res;
755 }
756 
vkGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice,VkPhysicalDeviceFeatures * pFeatures)757 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice,
758                                                                      VkPhysicalDeviceFeatures *pFeatures) {
759     const VkLayerInstanceDispatchTable *disp;
760     VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
761     if (VK_NULL_HANDLE == unwrapped_phys_dev) {
762         loader_log(
763             NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
764             "vkGetPhysicalDeviceFeatures: Invalid physicalDevice [VUID-vkGetPhysicalDeviceFeatures-physicalDevice-parameter]");
765         abort(); /* Intentionally fail so user can correct issue. */
766     }
767     disp = loader_get_instance_layer_dispatch(physicalDevice);
768     disp->GetPhysicalDeviceFeatures(unwrapped_phys_dev, pFeatures);
769 }
770 
vkGetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice,VkFormat format,VkFormatProperties * pFormatInfo)771 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format,
772                                                                              VkFormatProperties *pFormatInfo) {
773     const VkLayerInstanceDispatchTable *disp;
774     VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
775     if (VK_NULL_HANDLE == unwrapped_phys_dev) {
776         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
777                    "vkGetPhysicalDeviceFormatProperties: Invalid physicalDevice "
778                    "[VUID-vkGetPhysicalDeviceFormatProperties-physicalDevice-parameter]");
779         abort(); /* Intentionally fail so user can correct issue. */
780     }
781     disp = loader_get_instance_layer_dispatch(physicalDevice);
782     disp->GetPhysicalDeviceFormatProperties(unwrapped_phys_dev, format, pFormatInfo);
783 }
784 
vkGetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice,VkFormat format,VkImageType type,VkImageTiling tiling,VkImageUsageFlags usage,VkImageCreateFlags flags,VkImageFormatProperties * pImageFormatProperties)785 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceImageFormatProperties(
786     VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage,
787     VkImageCreateFlags flags, VkImageFormatProperties *pImageFormatProperties) {
788     const VkLayerInstanceDispatchTable *disp;
789     VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
790     if (VK_NULL_HANDLE == unwrapped_phys_dev) {
791         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
792                    "vkGetPhysicalDeviceImageFormatProperties: Invalid physicalDevice "
793                    "[VUID-vkGetPhysicalDeviceImageFormatProperties-physicalDevice-parameter]");
794         abort(); /* Intentionally fail so user can correct issue. */
795     }
796     disp = loader_get_instance_layer_dispatch(physicalDevice);
797     return disp->GetPhysicalDeviceImageFormatProperties(unwrapped_phys_dev, format, type, tiling, usage, flags,
798                                                         pImageFormatProperties);
799 }
800 
vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice,VkPhysicalDeviceProperties * pProperties)801 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice,
802                                                                        VkPhysicalDeviceProperties *pProperties) {
803     const VkLayerInstanceDispatchTable *disp;
804     VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
805     if (VK_NULL_HANDLE == unwrapped_phys_dev) {
806         loader_log(
807             NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
808             "vkGetPhysicalDeviceProperties: Invalid physicalDevice [VUID-vkGetPhysicalDeviceProperties-physicalDevice-parameter]");
809         abort(); /* Intentionally fail so user can correct issue. */
810     }
811     disp = loader_get_instance_layer_dispatch(physicalDevice);
812     disp->GetPhysicalDeviceProperties(unwrapped_phys_dev, pProperties);
813 }
814 
vkGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,uint32_t * pQueueFamilyPropertyCount,VkQueueFamilyProperties * pQueueProperties)815 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,
816                                                                                   uint32_t *pQueueFamilyPropertyCount,
817                                                                                   VkQueueFamilyProperties *pQueueProperties) {
818     const VkLayerInstanceDispatchTable *disp;
819     VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
820     if (VK_NULL_HANDLE == unwrapped_phys_dev) {
821         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
822                    "vkGetPhysicalDeviceQueueFamilyProperties: Invalid physicalDevice "
823                    "[VUID-vkGetPhysicalDeviceQueueFamilyProperties-physicalDevice-parameter]");
824         abort(); /* Intentionally fail so user can correct issue. */
825     }
826     disp = loader_get_instance_layer_dispatch(physicalDevice);
827     disp->GetPhysicalDeviceQueueFamilyProperties(unwrapped_phys_dev, pQueueFamilyPropertyCount, pQueueProperties);
828 }
829 
vkGetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,VkPhysicalDeviceMemoryProperties * pMemoryProperties)830 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,
831                                                                              VkPhysicalDeviceMemoryProperties *pMemoryProperties) {
832     const VkLayerInstanceDispatchTable *disp;
833     VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
834     if (VK_NULL_HANDLE == unwrapped_phys_dev) {
835         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
836                    "vkGetPhysicalDeviceMemoryProperties: Invalid physicalDevice "
837                    "[VUID-vkGetPhysicalDeviceMemoryProperties-physicalDevice-parameter]");
838         abort(); /* Intentionally fail so user can correct issue. */
839     }
840     disp = loader_get_instance_layer_dispatch(physicalDevice);
841     disp->GetPhysicalDeviceMemoryProperties(unwrapped_phys_dev, pMemoryProperties);
842 }
843 
vkCreateDevice(VkPhysicalDevice physicalDevice,const VkDeviceCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkDevice * pDevice)844 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
845                                                             const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) {
846     if (VK_NULL_HANDLE == loader_unwrap_physical_device(physicalDevice)) {
847         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
848                    "vkCreateDevice: Invalid physicalDevice [VUID-vkCreateDevice-physicalDevice-parameter]");
849         abort(); /* Intentionally fail so user can correct issue. */
850     }
851     loader_platform_thread_lock_mutex(&loader_lock);
852     VkResult res = loader_layer_create_device(NULL, physicalDevice, pCreateInfo, pAllocator, pDevice, NULL, NULL);
853     loader_platform_thread_unlock_mutex(&loader_lock);
854     return res;
855 }
856 
vkDestroyDevice(VkDevice device,const VkAllocationCallbacks * pAllocator)857 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
858     const VkLayerDispatchTable *disp;
859 
860     if (device == VK_NULL_HANDLE) {
861         return;
862     }
863     disp = loader_get_dispatch(device);
864     if (NULL == disp) {
865         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
866                    "vkDestroyDevice: Invalid device [VUID-vkDestroyDevice-device-parameter]");
867         abort(); /* Intentionally fail so user can correct issue. */
868     }
869 
870     loader_platform_thread_lock_mutex(&loader_lock);
871 
872     loader_layer_destroy_device(device, pAllocator, disp->DestroyDevice);
873 
874     loader_platform_thread_unlock_mutex(&loader_lock);
875 }
876 
vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,const char * pLayerName,uint32_t * pPropertyCount,VkExtensionProperties * pProperties)877 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
878                                                                                   const char *pLayerName, uint32_t *pPropertyCount,
879                                                                                   VkExtensionProperties *pProperties) {
880     VkResult res = VK_SUCCESS;
881     struct loader_physical_device_tramp *phys_dev;
882     const VkLayerInstanceDispatchTable *disp;
883     phys_dev = (struct loader_physical_device_tramp *)physicalDevice;
884     if (VK_NULL_HANDLE == physicalDevice || PHYS_TRAMP_MAGIC_NUMBER != phys_dev->magic) {
885         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
886                    "vkEnumerateDeviceExtensionProperties: Invalid physicalDevice "
887                    "[VUID-vkEnumerateDeviceExtensionProperties-physicalDevice-parameter]");
888         abort(); /* Intentionally fail so user can correct issue. */
889     }
890 
891     loader_platform_thread_lock_mutex(&loader_lock);
892 
893     // always pass this call down the instance chain which will terminate
894     // in the ICD. This allows layers to filter the extensions coming back
895     // up the chain. In the terminator we look up layer extensions from the
896     // manifest file if it wasn't provided by the layer itself.
897     disp = loader_get_instance_layer_dispatch(physicalDevice);
898     res = disp->EnumerateDeviceExtensionProperties(phys_dev->phys_dev, pLayerName, pPropertyCount, pProperties);
899 
900     loader_platform_thread_unlock_mutex(&loader_lock);
901     return res;
902 }
903 
vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice,uint32_t * pPropertyCount,VkLayerProperties * pProperties)904 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice,
905                                                                               uint32_t *pPropertyCount,
906                                                                               VkLayerProperties *pProperties) {
907     uint32_t copy_size;
908     struct loader_physical_device_tramp *phys_dev;
909     struct loader_layer_list *enabled_layers, layers_list;
910     memset(&layers_list, 0, sizeof(layers_list));
911     loader_platform_thread_lock_mutex(&loader_lock);
912 
913     // Don't dispatch this call down the instance chain, want all device layers
914     // enumerated and instance chain may not contain all device layers
915     // TODO re-evaluate the above statement we maybe able to start calling
916     // down the chain
917 
918     phys_dev = (struct loader_physical_device_tramp *)physicalDevice;
919     if (VK_NULL_HANDLE == physicalDevice || PHYS_TRAMP_MAGIC_NUMBER != phys_dev->magic) {
920         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
921                    "vkEnumerateDeviceLayerProperties: Invalid physicalDevice "
922                    "[VUID-vkEnumerateDeviceLayerProperties-physicalDevice-parameter]");
923         loader_platform_thread_unlock_mutex(&loader_lock);
924         abort(); /* Intentionally fail so user can correct issue. */
925     }
926 
927     const struct loader_instance *inst = phys_dev->this_instance;
928 
929     uint32_t count = inst->app_activated_layer_list.count;
930     if (count == 0 || pProperties == NULL) {
931         *pPropertyCount = count;
932         loader_platform_thread_unlock_mutex(&loader_lock);
933         return VK_SUCCESS;
934     }
935     enabled_layers = (struct loader_layer_list *)&inst->app_activated_layer_list;
936 
937     copy_size = (*pPropertyCount < count) ? *pPropertyCount : count;
938     for (uint32_t i = 0; i < copy_size; i++) {
939         memcpy(&pProperties[i], &(enabled_layers->list[i].info), sizeof(VkLayerProperties));
940     }
941     *pPropertyCount = copy_size;
942 
943     if (copy_size < count) {
944         loader_platform_thread_unlock_mutex(&loader_lock);
945         return VK_INCOMPLETE;
946     }
947 
948     loader_platform_thread_unlock_mutex(&loader_lock);
949     return VK_SUCCESS;
950 }
951 
vkGetDeviceQueue(VkDevice device,uint32_t queueNodeIndex,uint32_t queueIndex,VkQueue * pQueue)952 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetDeviceQueue(VkDevice device, uint32_t queueNodeIndex, uint32_t queueIndex,
953                                                           VkQueue *pQueue) {
954     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
955     if (NULL == disp) {
956         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
957                    "vkGetDeviceQueue: Invalid device [VUID-vkGetDeviceQueue-device-parameter]");
958         abort(); /* Intentionally fail so user can correct issue. */
959     }
960 
961     disp->GetDeviceQueue(device, queueNodeIndex, queueIndex, pQueue);
962     if (pQueue != NULL && *pQueue != NULL) {
963         loader_set_dispatch(*pQueue, disp);
964     }
965 }
966 
vkQueueSubmit(VkQueue queue,uint32_t submitCount,const VkSubmitInfo * pSubmits,VkFence fence)967 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits,
968                                                            VkFence fence) {
969     const VkLayerDispatchTable *disp = loader_get_dispatch(queue);
970     if (NULL == disp) {
971         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
972                    "vkQueueSubmit: Invalid queue [VUID-vkQueueSubmit-queue-parameter]");
973         abort(); /* Intentionally fail so user can correct issue. */
974     }
975 
976     return disp->QueueSubmit(queue, submitCount, pSubmits, fence);
977 }
978 
vkQueueWaitIdle(VkQueue queue)979 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueWaitIdle(VkQueue queue) {
980     const VkLayerDispatchTable *disp = loader_get_dispatch(queue);
981     if (NULL == disp) {
982         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
983                    "vkQueueWaitIdle: Invalid queue [VUID-vkQueueWaitIdle-queue-parameter]");
984         abort(); /* Intentionally fail so user can correct issue. */
985     }
986 
987     return disp->QueueWaitIdle(queue);
988 }
989 
vkDeviceWaitIdle(VkDevice device)990 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkDeviceWaitIdle(VkDevice device) {
991     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
992     if (NULL == disp) {
993         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
994                    "vkDeviceWaitIdle: Invalid device [VUID-vkDeviceWaitIdle-device-parameter]");
995         abort(); /* Intentionally fail so user can correct issue. */
996     }
997 
998     return disp->DeviceWaitIdle(device);
999 }
1000 
vkAllocateMemory(VkDevice device,const VkMemoryAllocateInfo * pAllocateInfo,const VkAllocationCallbacks * pAllocator,VkDeviceMemory * pMemory)1001 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo,
1002                                                               const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) {
1003     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1004     if (NULL == disp) {
1005         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1006                    "vkAllocateMemory: Invalid device [VUID-vkAllocateMemory-device-parameter]");
1007         abort(); /* Intentionally fail so user can correct issue. */
1008     }
1009 
1010     return disp->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
1011 }
1012 
vkFreeMemory(VkDevice device,VkDeviceMemory mem,const VkAllocationCallbacks * pAllocator)1013 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkFreeMemory(VkDevice device, VkDeviceMemory mem,
1014                                                       const VkAllocationCallbacks *pAllocator) {
1015     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1016     if (NULL == disp) {
1017         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1018                    "vkFreeMemory: Invalid device [VUID-vkFreeMemory-device-parameter]");
1019         abort(); /* Intentionally fail so user can correct issue. */
1020     }
1021 
1022     disp->FreeMemory(device, mem, pAllocator);
1023 }
1024 
vkMapMemory(VkDevice device,VkDeviceMemory mem,VkDeviceSize offset,VkDeviceSize size,VkFlags flags,void ** ppData)1025 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset,
1026                                                          VkDeviceSize size, VkFlags flags, void **ppData) {
1027     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1028     if (NULL == disp) {
1029         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1030                    "vkMapMemory: Invalid device [VUID-vkMapMemory-device-parameter]");
1031         abort(); /* Intentionally fail so user can correct issue. */
1032     }
1033 
1034     return disp->MapMemory(device, mem, offset, size, flags, ppData);
1035 }
1036 
vkUnmapMemory(VkDevice device,VkDeviceMemory mem)1037 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkUnmapMemory(VkDevice device, VkDeviceMemory mem) {
1038     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1039     if (NULL == disp) {
1040         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1041                    "vkUnmapMemory: Invalid device [VUID-vkUnmapMemory-device-parameter]");
1042         abort(); /* Intentionally fail so user can correct issue. */
1043     }
1044 
1045     disp->UnmapMemory(device, mem);
1046 }
1047 
vkFlushMappedMemoryRanges(VkDevice device,uint32_t memoryRangeCount,const VkMappedMemoryRange * pMemoryRanges)1048 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1049                                                                        const VkMappedMemoryRange *pMemoryRanges) {
1050     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1051     if (NULL == disp) {
1052         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1053                    "vkFlushMappedMemoryRanges: Invalid device [VUID-vkFlushMappedMemoryRanges-device-parameter]");
1054         abort(); /* Intentionally fail so user can correct issue. */
1055     }
1056 
1057     return disp->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1058 }
1059 
vkInvalidateMappedMemoryRanges(VkDevice device,uint32_t memoryRangeCount,const VkMappedMemoryRange * pMemoryRanges)1060 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkInvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
1061                                                                             const VkMappedMemoryRange *pMemoryRanges) {
1062     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1063     if (NULL == disp) {
1064         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1065                    "vkInvalidateMappedMemoryRanges: Invalid device [VUID-vkInvalidateMappedMemoryRanges-device-parameter]");
1066         abort(); /* Intentionally fail so user can correct issue. */
1067     }
1068 
1069     return disp->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
1070 }
1071 
vkGetDeviceMemoryCommitment(VkDevice device,VkDeviceMemory memory,VkDeviceSize * pCommittedMemoryInBytes)1072 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
1073                                                                      VkDeviceSize *pCommittedMemoryInBytes) {
1074     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1075     if (NULL == disp) {
1076         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1077                    "vkGetDeviceMemoryCommitment: Invalid device [VUID-vkGetDeviceMemoryCommitment-device-parameter]");
1078         abort(); /* Intentionally fail so user can correct issue. */
1079     }
1080 
1081     disp->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
1082 }
1083 
vkBindBufferMemory(VkDevice device,VkBuffer buffer,VkDeviceMemory mem,VkDeviceSize offset)1084 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem,
1085                                                                 VkDeviceSize offset) {
1086     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1087     if (NULL == disp) {
1088         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1089                    "vkBindBufferMemory: Invalid device [VUID-vkBindBufferMemory-device-parameter]");
1090         abort(); /* Intentionally fail so user can correct issue. */
1091     }
1092 
1093     return disp->BindBufferMemory(device, buffer, mem, offset);
1094 }
1095 
vkBindImageMemory(VkDevice device,VkImage image,VkDeviceMemory mem,VkDeviceSize offset)1096 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem,
1097                                                                VkDeviceSize offset) {
1098     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1099     if (NULL == disp) {
1100         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1101                    "vkBindImageMemory: Invalid device [VUID-vkBindImageMemory-device-parameter]");
1102         abort(); /* Intentionally fail so user can correct issue. */
1103     }
1104 
1105     return disp->BindImageMemory(device, image, mem, offset);
1106 }
1107 
vkGetBufferMemoryRequirements(VkDevice device,VkBuffer buffer,VkMemoryRequirements * pMemoryRequirements)1108 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
1109                                                                        VkMemoryRequirements *pMemoryRequirements) {
1110     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1111     if (NULL == disp) {
1112         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1113                    "vkGetBufferMemoryRequirements: Invalid device [VUID-vkGetBufferMemoryRequirements-device-parameter]");
1114         abort(); /* Intentionally fail so user can correct issue. */
1115     }
1116 
1117     disp->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
1118 }
1119 
vkGetImageMemoryRequirements(VkDevice device,VkImage image,VkMemoryRequirements * pMemoryRequirements)1120 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetImageMemoryRequirements(VkDevice device, VkImage image,
1121                                                                       VkMemoryRequirements *pMemoryRequirements) {
1122     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1123     if (NULL == disp) {
1124         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1125                    "vkGetImageMemoryRequirements: Invalid device [VUID-vkGetImageMemoryRequirements-device-parameter]");
1126         abort(); /* Intentionally fail so user can correct issue. */
1127     }
1128 
1129     disp->GetImageMemoryRequirements(device, image, pMemoryRequirements);
1130 }
1131 
1132 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL
vkGetImageSparseMemoryRequirements(VkDevice device,VkImage image,uint32_t * pSparseMemoryRequirementCount,VkSparseImageMemoryRequirements * pSparseMemoryRequirements)1133 vkGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount,
1134                                    VkSparseImageMemoryRequirements *pSparseMemoryRequirements) {
1135     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1136     if (NULL == disp) {
1137         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1138                    "vkGetImageSparseMemoryRequirements: Invalid device [VUID-vkGetImageSparseMemoryRequirements-device-parameter]");
1139         abort(); /* Intentionally fail so user can correct issue. */
1140     }
1141 
1142     disp->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
1143 }
1144 
vkGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice,VkFormat format,VkImageType type,VkSampleCountFlagBits samples,VkImageUsageFlags usage,VkImageTiling tiling,uint32_t * pPropertyCount,VkSparseImageFormatProperties * pProperties)1145 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceSparseImageFormatProperties(
1146     VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkSampleCountFlagBits samples, VkImageUsageFlags usage,
1147     VkImageTiling tiling, uint32_t *pPropertyCount, VkSparseImageFormatProperties *pProperties) {
1148     const VkLayerInstanceDispatchTable *disp;
1149     VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
1150     if (VK_NULL_HANDLE == unwrapped_phys_dev) {
1151         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1152                    "vkGetPhysicalDeviceSparseImageFormatProperties: Invalid physicalDevice "
1153                    "[VUID-vkGetPhysicalDeviceSparseImageFormatProperties-physicalDevice-parameter]");
1154         abort(); /* Intentionally fail so user can correct issue. */
1155     }
1156 
1157     disp = loader_get_instance_layer_dispatch(physicalDevice);
1158     disp->GetPhysicalDeviceSparseImageFormatProperties(unwrapped_phys_dev, format, type, samples, usage, tiling, pPropertyCount,
1159                                                        pProperties);
1160 }
1161 
vkQueueBindSparse(VkQueue queue,uint32_t bindInfoCount,const VkBindSparseInfo * pBindInfo,VkFence fence)1162 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueBindSparse(VkQueue queue, uint32_t bindInfoCount,
1163                                                                const VkBindSparseInfo *pBindInfo, VkFence fence) {
1164     const VkLayerDispatchTable *disp = loader_get_dispatch(queue);
1165     if (NULL == disp) {
1166         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1167                    "vkQueueBindSparse: Invalid queue [VUID-vkQueueBindSparse-queue-parameter]");
1168         abort(); /* Intentionally fail so user can correct issue. */
1169     }
1170 
1171     return disp->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
1172 }
1173 
vkCreateFence(VkDevice device,const VkFenceCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkFence * pFence)1174 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo,
1175                                                            const VkAllocationCallbacks *pAllocator, VkFence *pFence) {
1176     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1177     if (NULL == disp) {
1178         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1179                    "vkCreateFence: Invalid device [VUID-vkCreateFence-device-parameter]");
1180         abort(); /* Intentionally fail so user can correct issue. */
1181     }
1182 
1183     return disp->CreateFence(device, pCreateInfo, pAllocator, pFence);
1184 }
1185 
vkDestroyFence(VkDevice device,VkFence fence,const VkAllocationCallbacks * pAllocator)1186 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) {
1187     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1188     if (NULL == disp) {
1189         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1190                    "vkDestroyFence: Invalid device [VUID-vkDestroyFence-device-parameter]");
1191         abort(); /* Intentionally fail so user can correct issue. */
1192     }
1193 
1194     disp->DestroyFence(device, fence, pAllocator);
1195 }
1196 
vkResetFences(VkDevice device,uint32_t fenceCount,const VkFence * pFences)1197 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) {
1198     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1199     if (NULL == disp) {
1200         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1201                    "vkResetFences: Invalid device [VUID-vkResetFences-device-parameter]");
1202         abort(); /* Intentionally fail so user can correct issue. */
1203     }
1204 
1205     return disp->ResetFences(device, fenceCount, pFences);
1206 }
1207 
vkGetFenceStatus(VkDevice device,VkFence fence)1208 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceStatus(VkDevice device, VkFence fence) {
1209     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1210     if (NULL == disp) {
1211         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1212                    "vkGetFenceStatus: Invalid device [VUID-vkGetFenceStatus-device-parameter]");
1213         abort(); /* Intentionally fail so user can correct issue. */
1214     }
1215 
1216     return disp->GetFenceStatus(device, fence);
1217 }
1218 
vkWaitForFences(VkDevice device,uint32_t fenceCount,const VkFence * pFences,VkBool32 waitAll,uint64_t timeout)1219 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences,
1220                                                              VkBool32 waitAll, uint64_t timeout) {
1221     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1222     if (NULL == disp) {
1223         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1224                    "vkWaitForFences: Invalid device [VUID-vkWaitForFences-device-parameter]");
1225         abort(); /* Intentionally fail so user can correct issue. */
1226     }
1227 
1228     return disp->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
1229 }
1230 
vkCreateSemaphore(VkDevice device,const VkSemaphoreCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkSemaphore * pSemaphore)1231 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo,
1232                                                                const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) {
1233     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1234     if (NULL == disp) {
1235         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1236                    "vkCreateSemaphore: Invalid device [VUID-vkCreateSemaphore-device-parameter]");
1237         abort(); /* Intentionally fail so user can correct issue. */
1238     }
1239 
1240     return disp->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
1241 }
1242 
vkDestroySemaphore(VkDevice device,VkSemaphore semaphore,const VkAllocationCallbacks * pAllocator)1243 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroySemaphore(VkDevice device, VkSemaphore semaphore,
1244                                                             const VkAllocationCallbacks *pAllocator) {
1245     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1246     if (NULL == disp) {
1247         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1248                    "vkDestroySemaphore: Invalid device [VUID-vkDestroySemaphore-device-parameter]");
1249         abort(); /* Intentionally fail so user can correct issue. */
1250     }
1251 
1252     disp->DestroySemaphore(device, semaphore, pAllocator);
1253 }
1254 
vkCreateEvent(VkDevice device,const VkEventCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkEvent * pEvent)1255 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo,
1256                                                            const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) {
1257     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1258     if (NULL == disp) {
1259         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1260                    "vkCreateEvent: Invalid device [VUID-vkCreateEvent-device-parameter]");
1261         abort(); /* Intentionally fail so user can correct issue. */
1262     }
1263 
1264     return disp->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
1265 }
1266 
vkDestroyEvent(VkDevice device,VkEvent event,const VkAllocationCallbacks * pAllocator)1267 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) {
1268     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1269     if (NULL == disp) {
1270         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1271                    "vkDestroyEvent: Invalid device [VUID-vkDestroyEvent-device-parameter]");
1272         abort(); /* Intentionally fail so user can correct issue. */
1273     }
1274 
1275     disp->DestroyEvent(device, event, pAllocator);
1276 }
1277 
vkGetEventStatus(VkDevice device,VkEvent event)1278 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetEventStatus(VkDevice device, VkEvent event) {
1279     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1280     if (NULL == disp) {
1281         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1282                    "vkGetEventStatus: Invalid device [VUID-vkGetEventStatus-device-parameter]");
1283         abort(); /* Intentionally fail so user can correct issue. */
1284     }
1285 
1286     return disp->GetEventStatus(device, event);
1287 }
1288 
vkSetEvent(VkDevice device,VkEvent event)1289 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkSetEvent(VkDevice device, VkEvent event) {
1290     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1291     if (NULL == disp) {
1292         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1293                    "vkSetEvent: Invalid device [VUID-vkSetEvent-device-parameter]");
1294         abort(); /* Intentionally fail so user can correct issue. */
1295     }
1296 
1297     return disp->SetEvent(device, event);
1298 }
1299 
vkResetEvent(VkDevice device,VkEvent event)1300 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetEvent(VkDevice device, VkEvent event) {
1301     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1302     if (NULL == disp) {
1303         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1304                    "vkResetEvent: Invalid device [VUID-vkResetEvent-device-parameter]");
1305         abort(); /* Intentionally fail so user can correct issue. */
1306     }
1307 
1308     return disp->ResetEvent(device, event);
1309 }
1310 
vkCreateQueryPool(VkDevice device,const VkQueryPoolCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkQueryPool * pQueryPool)1311 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
1312                                                                const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) {
1313     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1314     if (NULL == disp) {
1315         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1316                    "vkCreateQueryPool: Invalid device [VUID-vkCreateQueryPool-device-parameter]");
1317         abort(); /* Intentionally fail so user can correct issue. */
1318     }
1319 
1320     return disp->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
1321 }
1322 
vkDestroyQueryPool(VkDevice device,VkQueryPool queryPool,const VkAllocationCallbacks * pAllocator)1323 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyQueryPool(VkDevice device, VkQueryPool queryPool,
1324                                                             const VkAllocationCallbacks *pAllocator) {
1325     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1326     if (NULL == disp) {
1327         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1328                    "vkDestroyQueryPool: Invalid device [VUID-vkDestroyQueryPool-device-parameter]");
1329         abort(); /* Intentionally fail so user can correct issue. */
1330     }
1331 
1332     disp->DestroyQueryPool(device, queryPool, pAllocator);
1333 }
1334 
vkGetQueryPoolResults(VkDevice device,VkQueryPool queryPool,uint32_t firstQuery,uint32_t queryCount,size_t dataSize,void * pData,VkDeviceSize stride,VkQueryResultFlags flags)1335 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
1336                                                                    uint32_t queryCount, size_t dataSize, void *pData,
1337                                                                    VkDeviceSize stride, VkQueryResultFlags flags) {
1338     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1339     if (NULL == disp) {
1340         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1341                    "vkGetQueryPoolResults: Invalid device [VUID-vkGetQueryPoolResults-device-parameter]");
1342         abort(); /* Intentionally fail so user can correct issue. */
1343     }
1344 
1345     return disp->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
1346 }
1347 
vkCreateBuffer(VkDevice device,const VkBufferCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkBuffer * pBuffer)1348 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
1349                                                             const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) {
1350     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1351     if (NULL == disp) {
1352         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1353                    "vkCreateBuffer: Invalid device [VUID-vkCreateBuffer-device-parameter]");
1354         abort(); /* Intentionally fail so user can correct issue. */
1355     }
1356 
1357     return disp->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
1358 }
1359 
vkDestroyBuffer(VkDevice device,VkBuffer buffer,const VkAllocationCallbacks * pAllocator)1360 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyBuffer(VkDevice device, VkBuffer buffer,
1361                                                          const VkAllocationCallbacks *pAllocator) {
1362     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1363     if (NULL == disp) {
1364         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1365                    "vkDestroyBuffer: Invalid device [VUID-vkDestroyBuffer-device-parameter]");
1366         abort(); /* Intentionally fail so user can correct issue. */
1367     }
1368 
1369     disp->DestroyBuffer(device, buffer, pAllocator);
1370 }
1371 
vkCreateBufferView(VkDevice device,const VkBufferViewCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkBufferView * pView)1372 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo,
1373                                                                 const VkAllocationCallbacks *pAllocator, VkBufferView *pView) {
1374     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1375     if (NULL == disp) {
1376         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1377                    "vkCreateBufferView: Invalid device [VUID-vkCreateBufferView-device-parameter]");
1378         abort(); /* Intentionally fail so user can correct issue. */
1379     }
1380 
1381     return disp->CreateBufferView(device, pCreateInfo, pAllocator, pView);
1382 }
1383 
vkDestroyBufferView(VkDevice device,VkBufferView bufferView,const VkAllocationCallbacks * pAllocator)1384 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyBufferView(VkDevice device, VkBufferView bufferView,
1385                                                              const VkAllocationCallbacks *pAllocator) {
1386     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1387     if (NULL == disp) {
1388         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1389                    "vkDestroyBufferView: Invalid device [VUID-vkDestroyBufferView-device-parameter]");
1390         abort(); /* Intentionally fail so user can correct issue. */
1391     }
1392 
1393     disp->DestroyBufferView(device, bufferView, pAllocator);
1394 }
1395 
vkCreateImage(VkDevice device,const VkImageCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkImage * pImage)1396 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
1397                                                            const VkAllocationCallbacks *pAllocator, VkImage *pImage) {
1398     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1399     if (NULL == disp) {
1400         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1401                    "vkCreateImage: Invalid device [VUID-vkCreateImage-device-parameter]");
1402         abort(); /* Intentionally fail so user can correct issue. */
1403     }
1404 
1405     return disp->CreateImage(device, pCreateInfo, pAllocator, pImage);
1406 }
1407 
vkDestroyImage(VkDevice device,VkImage image,const VkAllocationCallbacks * pAllocator)1408 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
1409     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1410     if (NULL == disp) {
1411         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1412                    "vkDestroyImage: Invalid device [VUID-vkDestroyImage-device-parameter]");
1413         abort(); /* Intentionally fail so user can correct issue. */
1414     }
1415 
1416     disp->DestroyImage(device, image, pAllocator);
1417 }
1418 
vkGetImageSubresourceLayout(VkDevice device,VkImage image,const VkImageSubresource * pSubresource,VkSubresourceLayout * pLayout)1419 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetImageSubresourceLayout(VkDevice device, VkImage image,
1420                                                                      const VkImageSubresource *pSubresource,
1421                                                                      VkSubresourceLayout *pLayout) {
1422     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1423     if (NULL == disp) {
1424         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1425                    "vkGetImageSubresourceLayout: Invalid device [VUID-vkGetImageSubresourceLayout-device-parameter]");
1426         abort(); /* Intentionally fail so user can correct issue. */
1427     }
1428 
1429     disp->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
1430 }
1431 
vkCreateImageView(VkDevice device,const VkImageViewCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkImageView * pView)1432 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
1433                                                                const VkAllocationCallbacks *pAllocator, VkImageView *pView) {
1434     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1435     if (NULL == disp) {
1436         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1437                    "vkCreateImageView: Invalid device [VUID-vkCreateImageView-device-parameter]");
1438         abort(); /* Intentionally fail so user can correct issue. */
1439     }
1440 
1441     return disp->CreateImageView(device, pCreateInfo, pAllocator, pView);
1442 }
1443 
vkDestroyImageView(VkDevice device,VkImageView imageView,const VkAllocationCallbacks * pAllocator)1444 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyImageView(VkDevice device, VkImageView imageView,
1445                                                             const VkAllocationCallbacks *pAllocator) {
1446     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1447     if (NULL == disp) {
1448         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1449                    "vkDestroyImageView: Invalid device [VUID-vkDestroyImageView-device-parameter]");
1450         abort(); /* Intentionally fail so user can correct issue. */
1451     }
1452 
1453     disp->DestroyImageView(device, imageView, pAllocator);
1454 }
1455 
vkCreateShaderModule(VkDevice device,const VkShaderModuleCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkShaderModule * pShader)1456 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo,
1457                                                                   const VkAllocationCallbacks *pAllocator,
1458                                                                   VkShaderModule *pShader) {
1459     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1460     if (NULL == disp) {
1461         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1462                    "vkCreateShaderModule: Invalid device [VUID-vkCreateShaderModule-device-parameter]");
1463         abort(); /* Intentionally fail so user can correct issue. */
1464     }
1465 
1466     return disp->CreateShaderModule(device, pCreateInfo, pAllocator, pShader);
1467 }
1468 
vkDestroyShaderModule(VkDevice device,VkShaderModule shaderModule,const VkAllocationCallbacks * pAllocator)1469 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
1470                                                                const VkAllocationCallbacks *pAllocator) {
1471     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1472     if (NULL == disp) {
1473         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1474                    "vkDestroyShaderModule: Invalid device [VUID-vkDestroyShaderModule-device-parameter]");
1475         abort(); /* Intentionally fail so user can correct issue. */
1476     }
1477 
1478     disp->DestroyShaderModule(device, shaderModule, pAllocator);
1479 }
1480 
vkCreatePipelineCache(VkDevice device,const VkPipelineCacheCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkPipelineCache * pPipelineCache)1481 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
1482                                                                    const VkAllocationCallbacks *pAllocator,
1483                                                                    VkPipelineCache *pPipelineCache) {
1484     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1485     if (NULL == disp) {
1486         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1487                    "vkCreatePipelineCache: Invalid device [VUID-vkCreatePipelineCache-device-parameter]");
1488         abort(); /* Intentionally fail so user can correct issue. */
1489     }
1490 
1491     return disp->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
1492 }
1493 
vkDestroyPipelineCache(VkDevice device,VkPipelineCache pipelineCache,const VkAllocationCallbacks * pAllocator)1494 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
1495                                                                 const VkAllocationCallbacks *pAllocator) {
1496     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1497     if (NULL == disp) {
1498         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1499                    "vkDestroyPipelineCache: Invalid device [VUID-vkDestroyPipelineCache-device-parameter]");
1500         abort(); /* Intentionally fail so user can correct issue. */
1501     }
1502 
1503     disp->DestroyPipelineCache(device, pipelineCache, pAllocator);
1504 }
1505 
vkGetPipelineCacheData(VkDevice device,VkPipelineCache pipelineCache,size_t * pDataSize,void * pData)1506 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache,
1507                                                                     size_t *pDataSize, void *pData) {
1508     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1509     if (NULL == disp) {
1510         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1511                    "vkGetPipelineCacheData: Invalid device [VUID-vkGetPipelineCacheData-device-parameter]");
1512         abort(); /* Intentionally fail so user can correct issue. */
1513     }
1514 
1515     return disp->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
1516 }
1517 
vkMergePipelineCaches(VkDevice device,VkPipelineCache dstCache,uint32_t srcCacheCount,const VkPipelineCache * pSrcCaches)1518 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkMergePipelineCaches(VkDevice device, VkPipelineCache dstCache,
1519                                                                    uint32_t srcCacheCount, const VkPipelineCache *pSrcCaches) {
1520     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1521     if (NULL == disp) {
1522         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1523                    "vkMergePipelineCaches: Invalid device [VUID-vkMergePipelineCaches-device-parameter]");
1524         abort(); /* Intentionally fail so user can correct issue. */
1525     }
1526 
1527     return disp->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
1528 }
1529 
vkCreateGraphicsPipelines(VkDevice device,VkPipelineCache pipelineCache,uint32_t createInfoCount,const VkGraphicsPipelineCreateInfo * pCreateInfos,const VkAllocationCallbacks * pAllocator,VkPipeline * pPipelines)1530 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache,
1531                                                                        uint32_t createInfoCount,
1532                                                                        const VkGraphicsPipelineCreateInfo *pCreateInfos,
1533                                                                        const VkAllocationCallbacks *pAllocator,
1534                                                                        VkPipeline *pPipelines) {
1535     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1536     if (NULL == disp) {
1537         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1538                    "vkCreateGraphicsPipelines: Invalid device [VUID-vkCreateGraphicsPipelines-device-parameter]");
1539         abort(); /* Intentionally fail so user can correct issue. */
1540     }
1541 
1542     return disp->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
1543 }
1544 
vkCreateComputePipelines(VkDevice device,VkPipelineCache pipelineCache,uint32_t createInfoCount,const VkComputePipelineCreateInfo * pCreateInfos,const VkAllocationCallbacks * pAllocator,VkPipeline * pPipelines)1545 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache,
1546                                                                       uint32_t createInfoCount,
1547                                                                       const VkComputePipelineCreateInfo *pCreateInfos,
1548                                                                       const VkAllocationCallbacks *pAllocator,
1549                                                                       VkPipeline *pPipelines) {
1550     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1551     if (NULL == disp) {
1552         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1553                    "vkCreateComputePipelines: Invalid device [VUID-vkCreateComputePipelines-device-parameter]");
1554         abort(); /* Intentionally fail so user can correct issue. */
1555     }
1556 
1557     return disp->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
1558 }
1559 
vkDestroyPipeline(VkDevice device,VkPipeline pipeline,const VkAllocationCallbacks * pAllocator)1560 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyPipeline(VkDevice device, VkPipeline pipeline,
1561                                                            const VkAllocationCallbacks *pAllocator) {
1562     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1563     if (NULL == disp) {
1564         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1565                    "vkDestroyPipeline: Invalid device [VUID-vkDestroyPipeline-device-parameter]");
1566         abort(); /* Intentionally fail so user can correct issue. */
1567     }
1568 
1569     disp->DestroyPipeline(device, pipeline, pAllocator);
1570 }
1571 
vkCreatePipelineLayout(VkDevice device,const VkPipelineLayoutCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkPipelineLayout * pPipelineLayout)1572 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo,
1573                                                                     const VkAllocationCallbacks *pAllocator,
1574                                                                     VkPipelineLayout *pPipelineLayout) {
1575     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1576     if (NULL == disp) {
1577         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1578                    "vkCreatePipelineLayout: Invalid device [VUID-vkCreatePipelineLayout-device-parameter]");
1579         abort(); /* Intentionally fail so user can correct issue. */
1580     }
1581 
1582     return disp->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
1583 }
1584 
vkDestroyPipelineLayout(VkDevice device,VkPipelineLayout pipelineLayout,const VkAllocationCallbacks * pAllocator)1585 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
1586                                                                  const VkAllocationCallbacks *pAllocator) {
1587     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1588     if (NULL == disp) {
1589         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1590                    "vkDestroyPipelineLayout: Invalid device [VUID-vkDestroyPipelineLayout-device-parameter]");
1591         abort(); /* Intentionally fail so user can correct issue. */
1592     }
1593 
1594     disp->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
1595 }
1596 
vkCreateSampler(VkDevice device,const VkSamplerCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkSampler * pSampler)1597 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
1598                                                              const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) {
1599     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1600     if (NULL == disp) {
1601         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1602                    "vkCreateSampler: Invalid device [VUID-vkCreateSampler-device-parameter]");
1603         abort(); /* Intentionally fail so user can correct issue. */
1604     }
1605 
1606     return disp->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
1607 }
1608 
vkDestroySampler(VkDevice device,VkSampler sampler,const VkAllocationCallbacks * pAllocator)1609 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroySampler(VkDevice device, VkSampler sampler,
1610                                                           const VkAllocationCallbacks *pAllocator) {
1611     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1612     if (NULL == disp) {
1613         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1614                    "vkDestroySampler: Invalid device [VUID-vkDestroySampler-device-parameter]");
1615         abort(); /* Intentionally fail so user can correct issue. */
1616     }
1617 
1618     disp->DestroySampler(device, sampler, pAllocator);
1619 }
1620 
vkCreateDescriptorSetLayout(VkDevice device,const VkDescriptorSetLayoutCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkDescriptorSetLayout * pSetLayout)1621 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorSetLayout(VkDevice device,
1622                                                                          const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
1623                                                                          const VkAllocationCallbacks *pAllocator,
1624                                                                          VkDescriptorSetLayout *pSetLayout) {
1625     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1626     if (NULL == disp) {
1627         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1628                    "vkCreateDescriptorSetLayout: Invalid device [VUID-vkCreateDescriptorSetLayout-device-parameter]");
1629         abort(); /* Intentionally fail so user can correct issue. */
1630     }
1631 
1632     return disp->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
1633 }
1634 
vkDestroyDescriptorSetLayout(VkDevice device,VkDescriptorSetLayout descriptorSetLayout,const VkAllocationCallbacks * pAllocator)1635 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
1636                                                                       const VkAllocationCallbacks *pAllocator) {
1637     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1638     if (NULL == disp) {
1639         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1640                    "vkDestroyDescriptorSetLayout: Invalid device [VUID-vkDestroyDescriptorSetLayout-device-parameter]");
1641         abort(); /* Intentionally fail so user can correct issue. */
1642     }
1643 
1644     disp->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
1645 }
1646 
vkCreateDescriptorPool(VkDevice device,const VkDescriptorPoolCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkDescriptorPool * pDescriptorPool)1647 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo,
1648                                                                     const VkAllocationCallbacks *pAllocator,
1649                                                                     VkDescriptorPool *pDescriptorPool) {
1650     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1651     if (NULL == disp) {
1652         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1653                    "vkCreateDescriptorPool: Invalid device [VUID-vkCreateDescriptorPool-device-parameter]");
1654         abort(); /* Intentionally fail so user can correct issue. */
1655     }
1656 
1657     return disp->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
1658 }
1659 
vkDestroyDescriptorPool(VkDevice device,VkDescriptorPool descriptorPool,const VkAllocationCallbacks * pAllocator)1660 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
1661                                                                  const VkAllocationCallbacks *pAllocator) {
1662     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1663     if (NULL == disp) {
1664         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1665                    "vkDestroyDescriptorPool: Invalid device [VUID-vkDestroyDescriptorPool-device-parameter]");
1666         abort(); /* Intentionally fail so user can correct issue. */
1667     }
1668 
1669     disp->DestroyDescriptorPool(device, descriptorPool, pAllocator);
1670 }
1671 
vkResetDescriptorPool(VkDevice device,VkDescriptorPool descriptorPool,VkDescriptorPoolResetFlags flags)1672 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
1673                                                                    VkDescriptorPoolResetFlags flags) {
1674     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1675     if (NULL == disp) {
1676         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1677                    "vkResetDescriptorPool: Invalid device [VUID-vkResetDescriptorPool-device-parameter]");
1678         abort(); /* Intentionally fail so user can correct issue. */
1679     }
1680 
1681     return disp->ResetDescriptorPool(device, descriptorPool, flags);
1682 }
1683 
vkAllocateDescriptorSets(VkDevice device,const VkDescriptorSetAllocateInfo * pAllocateInfo,VkDescriptorSet * pDescriptorSets)1684 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateDescriptorSets(VkDevice device,
1685                                                                       const VkDescriptorSetAllocateInfo *pAllocateInfo,
1686                                                                       VkDescriptorSet *pDescriptorSets) {
1687     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1688     if (NULL == disp) {
1689         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1690                    "vkAllocateDescriptorSets: Invalid device [VUID-vkAllocateDescriptorSets-device-parameter]");
1691         abort(); /* Intentionally fail so user can correct issue. */
1692     }
1693 
1694     return disp->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
1695 }
1696 
vkFreeDescriptorSets(VkDevice device,VkDescriptorPool descriptorPool,uint32_t descriptorSetCount,const VkDescriptorSet * pDescriptorSets)1697 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool,
1698                                                                   uint32_t descriptorSetCount,
1699                                                                   const VkDescriptorSet *pDescriptorSets) {
1700     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1701     if (NULL == disp) {
1702         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1703                    "vkFreeDescriptorSets: Invalid device [VUID-vkFreeDescriptorSets-device-parameter]");
1704         abort(); /* Intentionally fail so user can correct issue. */
1705     }
1706 
1707     return disp->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
1708 }
1709 
vkUpdateDescriptorSets(VkDevice device,uint32_t descriptorWriteCount,const VkWriteDescriptorSet * pDescriptorWrites,uint32_t descriptorCopyCount,const VkCopyDescriptorSet * pDescriptorCopies)1710 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
1711                                                                 const VkWriteDescriptorSet *pDescriptorWrites,
1712                                                                 uint32_t descriptorCopyCount,
1713                                                                 const VkCopyDescriptorSet *pDescriptorCopies) {
1714     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1715     if (NULL == disp) {
1716         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1717                    "vkUpdateDescriptorSets: Invalid device [VUID-vkUpdateDescriptorSets-device-parameter]");
1718         abort(); /* Intentionally fail so user can correct issue. */
1719     }
1720 
1721     disp->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
1722 }
1723 
vkCreateFramebuffer(VkDevice device,const VkFramebufferCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkFramebuffer * pFramebuffer)1724 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
1725                                                                  const VkAllocationCallbacks *pAllocator,
1726                                                                  VkFramebuffer *pFramebuffer) {
1727     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1728     if (NULL == disp) {
1729         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1730                    "vkCreateFramebuffer: Invalid device [VUID-vkCreateFramebuffer-device-parameter]");
1731         abort(); /* Intentionally fail so user can correct issue. */
1732     }
1733 
1734     return disp->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
1735 }
1736 
vkDestroyFramebuffer(VkDevice device,VkFramebuffer framebuffer,const VkAllocationCallbacks * pAllocator)1737 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer,
1738                                                               const VkAllocationCallbacks *pAllocator) {
1739     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1740     if (NULL == disp) {
1741         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1742                    "vkDestroyFramebuffer: Invalid device [VUID-vkDestroyFramebuffer-device-parameter]");
1743         abort(); /* Intentionally fail so user can correct issue. */
1744     }
1745 
1746     disp->DestroyFramebuffer(device, framebuffer, pAllocator);
1747 }
1748 
vkCreateRenderPass(VkDevice device,const VkRenderPassCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkRenderPass * pRenderPass)1749 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo,
1750                                                                 const VkAllocationCallbacks *pAllocator,
1751                                                                 VkRenderPass *pRenderPass) {
1752     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1753     if (NULL == disp) {
1754         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1755                    "vkCreateRenderPass: Invalid device [VUID-vkCreateRenderPass-device-parameter]");
1756         abort(); /* Intentionally fail so user can correct issue. */
1757     }
1758 
1759     return disp->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
1760 }
1761 
vkDestroyRenderPass(VkDevice device,VkRenderPass renderPass,const VkAllocationCallbacks * pAllocator)1762 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyRenderPass(VkDevice device, VkRenderPass renderPass,
1763                                                              const VkAllocationCallbacks *pAllocator) {
1764     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1765     if (NULL == disp) {
1766         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1767                    "vkDestroyRenderPass: Invalid device [VUID-vkDestroyRenderPass-device-parameter]");
1768         abort(); /* Intentionally fail so user can correct issue. */
1769     }
1770 
1771     disp->DestroyRenderPass(device, renderPass, pAllocator);
1772 }
1773 
vkGetRenderAreaGranularity(VkDevice device,VkRenderPass renderPass,VkExtent2D * pGranularity)1774 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass,
1775                                                                     VkExtent2D *pGranularity) {
1776     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1777     if (NULL == disp) {
1778         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1779                    "vkGetRenderAreaGranularity: Invalid device [VUID-vkGetRenderAreaGranularity-device-parameter]");
1780         abort(); /* Intentionally fail so user can correct issue. */
1781     }
1782 
1783     disp->GetRenderAreaGranularity(device, renderPass, pGranularity);
1784 }
1785 
vkCreateCommandPool(VkDevice device,const VkCommandPoolCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkCommandPool * pCommandPool)1786 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
1787                                                                  const VkAllocationCallbacks *pAllocator,
1788                                                                  VkCommandPool *pCommandPool) {
1789     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1790     if (NULL == disp) {
1791         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1792                    "vkCreateCommandPool: Invalid device [VUID-vkCreateCommandPool-device-parameter]");
1793         abort(); /* Intentionally fail so user can correct issue. */
1794     }
1795 
1796     return disp->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
1797 }
1798 
vkDestroyCommandPool(VkDevice device,VkCommandPool commandPool,const VkAllocationCallbacks * pAllocator)1799 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyCommandPool(VkDevice device, VkCommandPool commandPool,
1800                                                               const VkAllocationCallbacks *pAllocator) {
1801     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1802     if (NULL == disp) {
1803         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1804                    "vkDestroyCommandPool: Invalid device [VUID-vkDestroyCommandPool-device-parameter]");
1805         abort(); /* Intentionally fail so user can correct issue. */
1806     }
1807 
1808     disp->DestroyCommandPool(device, commandPool, pAllocator);
1809 }
1810 
vkResetCommandPool(VkDevice device,VkCommandPool commandPool,VkCommandPoolResetFlags flags)1811 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetCommandPool(VkDevice device, VkCommandPool commandPool,
1812                                                                 VkCommandPoolResetFlags flags) {
1813     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1814     if (NULL == disp) {
1815         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1816                    "vkResetCommandPool: Invalid device [VUID-vkResetCommandPool-device-parameter]");
1817         abort(); /* Intentionally fail so user can correct issue. */
1818     }
1819 
1820     return disp->ResetCommandPool(device, commandPool, flags);
1821 }
1822 
vkAllocateCommandBuffers(VkDevice device,const VkCommandBufferAllocateInfo * pAllocateInfo,VkCommandBuffer * pCommandBuffers)1823 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateCommandBuffers(VkDevice device,
1824                                                                       const VkCommandBufferAllocateInfo *pAllocateInfo,
1825                                                                       VkCommandBuffer *pCommandBuffers) {
1826     VkResult res;
1827     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1828     if (NULL == disp) {
1829         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1830                    "vkAllocateCommandBuffers: Invalid device [VUID-vkAllocateCommandBuffers-device-parameter]");
1831         abort(); /* Intentionally fail so user can correct issue. */
1832     }
1833 
1834     res = disp->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
1835     if (res == VK_SUCCESS) {
1836         for (uint32_t i = 0; i < pAllocateInfo->commandBufferCount; i++) {
1837             if (pCommandBuffers[i]) {
1838                 loader_init_dispatch(pCommandBuffers[i], disp);
1839             }
1840         }
1841     }
1842 
1843     return res;
1844 }
1845 
vkFreeCommandBuffers(VkDevice device,VkCommandPool commandPool,uint32_t commandBufferCount,const VkCommandBuffer * pCommandBuffers)1846 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
1847                                                               uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) {
1848     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
1849     if (NULL == disp) {
1850         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1851                    "vkFreeCommandBuffers: Invalid device [VUID-vkFreeCommandBuffers-device-parameter]");
1852         abort(); /* Intentionally fail so user can correct issue. */
1853     }
1854 
1855     disp->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
1856 }
1857 
vkBeginCommandBuffer(VkCommandBuffer commandBuffer,const VkCommandBufferBeginInfo * pBeginInfo)1858 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBeginCommandBuffer(VkCommandBuffer commandBuffer,
1859                                                                   const VkCommandBufferBeginInfo *pBeginInfo) {
1860     const VkLayerDispatchTable *disp;
1861 
1862     disp = loader_get_dispatch(commandBuffer);
1863     if (NULL == disp) {
1864         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1865                    "vkBeginCommandBuffer: Invalid commandBuffer [VUID-vkBeginCommandBuffer-commandBuffer-parameter]");
1866         abort(); /* Intentionally fail so user can correct issue. */
1867     }
1868 
1869     return disp->BeginCommandBuffer(commandBuffer, pBeginInfo);
1870 }
1871 
vkEndCommandBuffer(VkCommandBuffer commandBuffer)1872 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer(VkCommandBuffer commandBuffer) {
1873     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
1874     if (NULL == disp) {
1875         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1876                    "vkEndCommandBuffer: Invalid commandBuffer [VUID-vkEndCommandBuffer-commandBuffer-parameter]");
1877         abort(); /* Intentionally fail so user can correct issue. */
1878     }
1879 
1880     return disp->EndCommandBuffer(commandBuffer);
1881 }
1882 
vkResetCommandBuffer(VkCommandBuffer commandBuffer,VkCommandBufferResetFlags flags)1883 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) {
1884     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
1885     if (NULL == disp) {
1886         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1887                    "vkResetCommandBuffer: Invalid commandBuffer [VUID-vkResetCommandBuffer-commandBuffer-parameter]");
1888         abort(); /* Intentionally fail so user can correct issue. */
1889     }
1890 
1891     return disp->ResetCommandBuffer(commandBuffer, flags);
1892 }
1893 
vkCmdBindPipeline(VkCommandBuffer commandBuffer,VkPipelineBindPoint pipelineBindPoint,VkPipeline pipeline)1894 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
1895                                                            VkPipeline pipeline) {
1896     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
1897     if (NULL == disp) {
1898         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1899                    "vkCmdBindPipeline: Invalid commandBuffer [VUID-vkCmdBindPipeline-commandBuffer-parameter]");
1900         abort(); /* Intentionally fail so user can correct issue. */
1901     }
1902 
1903     disp->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
1904 }
1905 
vkCmdSetViewport(VkCommandBuffer commandBuffer,uint32_t firstViewport,uint32_t viewportCount,const VkViewport * pViewports)1906 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport,
1907                                                           uint32_t viewportCount, const VkViewport *pViewports) {
1908     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
1909     if (NULL == disp) {
1910         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1911                    "vkCmdSetViewport: Invalid commandBuffer [VUID-vkCmdSetViewport-commandBuffer-parameter]");
1912         abort(); /* Intentionally fail so user can correct issue. */
1913     }
1914 
1915     disp->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
1916 }
1917 
vkCmdSetScissor(VkCommandBuffer commandBuffer,uint32_t firstScissor,uint32_t scissorCount,const VkRect2D * pScissors)1918 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor,
1919                                                          uint32_t scissorCount, const VkRect2D *pScissors) {
1920     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
1921     if (NULL == disp) {
1922         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1923                    "vkCmdSetScissor: Invalid commandBuffer [VUID-vkCmdSetScissor-commandBuffer-parameter]");
1924         abort(); /* Intentionally fail so user can correct issue. */
1925     }
1926 
1927     disp->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
1928 }
1929 
vkCmdSetLineWidth(VkCommandBuffer commandBuffer,float lineWidth)1930 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
1931     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
1932     if (NULL == disp) {
1933         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1934                    "vkCmdSetLineWidth: Invalid commandBuffer [VUID-vkCmdSetLineWidth-commandBuffer-parameter]");
1935         abort(); /* Intentionally fail so user can correct issue. */
1936     }
1937 
1938     disp->CmdSetLineWidth(commandBuffer, lineWidth);
1939 }
1940 
vkCmdSetDepthBias(VkCommandBuffer commandBuffer,float depthBiasConstantFactor,float depthBiasClamp,float depthBiasSlopeFactor)1941 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor,
1942                                                            float depthBiasClamp, float depthBiasSlopeFactor) {
1943     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
1944     if (NULL == disp) {
1945         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1946                    "vkCmdSetDepthBias: Invalid commandBuffer [VUID-vkCmdSetDepthBias-commandBuffer-parameter]");
1947         abort(); /* Intentionally fail so user can correct issue. */
1948     }
1949 
1950     disp->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
1951 }
1952 
vkCmdSetBlendConstants(VkCommandBuffer commandBuffer,const float blendConstants[4])1953 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
1954     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
1955     if (NULL == disp) {
1956         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1957                    "vkCmdSetBlendConstants: Invalid commandBuffer [VUID-vkCmdSetBlendConstants-commandBuffer-parameter]");
1958         abort(); /* Intentionally fail so user can correct issue. */
1959     }
1960 
1961     disp->CmdSetBlendConstants(commandBuffer, blendConstants);
1962 }
1963 
vkCmdSetDepthBounds(VkCommandBuffer commandBuffer,float minDepthBounds,float maxDepthBounds)1964 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds,
1965                                                              float maxDepthBounds) {
1966     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
1967     if (NULL == disp) {
1968         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1969                    "vkCmdSetDepthBounds: Invalid commandBuffer [VUID-vkCmdSetDepthBounds-commandBuffer-parameter]");
1970         abort(); /* Intentionally fail so user can correct issue. */
1971     }
1972 
1973     disp->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
1974 }
1975 
vkCmdSetStencilCompareMask(VkCommandBuffer commandBuffer,VkStencilFaceFlags faceMask,uint32_t compareMask)1976 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
1977                                                                     uint32_t compareMask) {
1978     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
1979     if (NULL == disp) {
1980         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1981                    "vkCmdSetStencilCompareMask: Invalid commandBuffer [VUID-vkCmdSetStencilCompareMask-commandBuffer-parameter]");
1982         abort(); /* Intentionally fail so user can correct issue. */
1983     }
1984 
1985     disp->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
1986 }
1987 
vkCmdSetStencilWriteMask(VkCommandBuffer commandBuffer,VkStencilFaceFlags faceMask,uint32_t writeMask)1988 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
1989                                                                   uint32_t writeMask) {
1990     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
1991     if (NULL == disp) {
1992         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
1993                    "vkCmdSetStencilWriteMask: Invalid commandBuffer [VUID-vkCmdSetStencilWriteMask-commandBuffer-parameter]");
1994         abort(); /* Intentionally fail so user can correct issue. */
1995     }
1996 
1997     disp->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
1998 }
1999 
vkCmdSetStencilReference(VkCommandBuffer commandBuffer,VkStencilFaceFlags faceMask,uint32_t reference)2000 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
2001                                                                   uint32_t reference) {
2002     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2003     if (NULL == disp) {
2004         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2005                    "vkCmdSetStencilReference: Invalid commandBuffer [VUID-vkCmdSetStencilReference-commandBuffer-parameter]");
2006         abort(); /* Intentionally fail so user can correct issue. */
2007     }
2008 
2009     disp->CmdSetStencilReference(commandBuffer, faceMask, reference);
2010 }
2011 
vkCmdBindDescriptorSets(VkCommandBuffer commandBuffer,VkPipelineBindPoint pipelineBindPoint,VkPipelineLayout layout,uint32_t firstSet,uint32_t descriptorSetCount,const VkDescriptorSet * pDescriptorSets,uint32_t dynamicOffsetCount,const uint32_t * pDynamicOffsets)2012 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorSets(VkCommandBuffer commandBuffer,
2013                                                                  VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
2014                                                                  uint32_t firstSet, uint32_t descriptorSetCount,
2015                                                                  const VkDescriptorSet *pDescriptorSets,
2016                                                                  uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets) {
2017     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2018     if (NULL == disp) {
2019         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2020                    "vkCmdBindDescriptorSets: Invalid commandBuffer [VUID-vkCmdBindDescriptorSets-commandBuffer-parameter]");
2021         abort(); /* Intentionally fail so user can correct issue. */
2022     }
2023 
2024     disp->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets,
2025                                 dynamicOffsetCount, pDynamicOffsets);
2026 }
2027 
vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,VkIndexType indexType)2028 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
2029                                                               VkIndexType indexType) {
2030     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2031     if (NULL == disp) {
2032         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2033                    "vkCmdBindIndexBuffer: Invalid commandBuffer [VUID-vkCmdBindIndexBuffer-commandBuffer-parameter]");
2034         abort(); /* Intentionally fail so user can correct issue. */
2035     }
2036 
2037     disp->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
2038 }
2039 
vkCmdBindVertexBuffers(VkCommandBuffer commandBuffer,uint32_t firstBinding,uint32_t bindingCount,const VkBuffer * pBuffers,const VkDeviceSize * pOffsets)2040 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
2041                                                                 uint32_t bindingCount, const VkBuffer *pBuffers,
2042                                                                 const VkDeviceSize *pOffsets) {
2043     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2044     if (NULL == disp) {
2045         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2046                    "vkCmdBindVertexBuffers: Invalid commandBuffer [VUID-vkCmdBindVertexBuffers-commandBuffer-parameter]");
2047         abort(); /* Intentionally fail so user can correct issue. */
2048     }
2049 
2050     disp->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
2051 }
2052 
vkCmdDraw(VkCommandBuffer commandBuffer,uint32_t vertexCount,uint32_t instanceCount,uint32_t firstVertex,uint32_t firstInstance)2053 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
2054                                                    uint32_t firstVertex, uint32_t firstInstance) {
2055     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2056     if (NULL == disp) {
2057         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2058                    "vkCmdDraw: Invalid commandBuffer [VUID-vkCmdDraw-commandBuffer-parameter]");
2059         abort(); /* Intentionally fail so user can correct issue. */
2060     }
2061 
2062     disp->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
2063 }
2064 
vkCmdDrawIndexed(VkCommandBuffer commandBuffer,uint32_t indexCount,uint32_t instanceCount,uint32_t firstIndex,int32_t vertexOffset,uint32_t firstInstance)2065 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
2066                                                           uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
2067                                                           uint32_t firstInstance) {
2068     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2069     if (NULL == disp) {
2070         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2071                    "vkCmdDrawIndexed: Invalid commandBuffer [VUID-vkCmdDrawIndexed-commandBuffer-parameter]");
2072         abort(); /* Intentionally fail so user can correct issue. */
2073     }
2074 
2075     disp->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
2076 }
2077 
vkCmdDrawIndirect(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,uint32_t drawCount,uint32_t stride)2078 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
2079                                                            uint32_t drawCount, uint32_t stride) {
2080     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2081     if (NULL == disp) {
2082         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2083                    "vkCmdDrawIndirect: Invalid commandBuffer [VUID-vkCmdDrawIndirect-commandBuffer-parameter]");
2084         abort(); /* Intentionally fail so user can correct issue. */
2085     }
2086 
2087     disp->CmdDrawIndirect(commandBuffer, buffer, offset, drawCount, stride);
2088 }
2089 
vkCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,uint32_t drawCount,uint32_t stride)2090 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
2091                                                                   VkDeviceSize offset, uint32_t drawCount, uint32_t stride) {
2092     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2093     if (NULL == disp) {
2094         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2095                    "vkCmdDrawIndexedIndirect: Invalid commandBuffer [VUID-vkCmdDrawIndexedIndirect-commandBuffer-parameter]");
2096         abort(); /* Intentionally fail so user can correct issue. */
2097     }
2098 
2099     disp->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, drawCount, stride);
2100 }
2101 
vkCmdDispatch(VkCommandBuffer commandBuffer,uint32_t x,uint32_t y,uint32_t z)2102 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
2103     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2104     if (NULL == disp) {
2105         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2106                    "vkCmdDispatch: Invalid commandBuffer [VUID-vkCmdDispatch-commandBuffer-parameter]");
2107         abort(); /* Intentionally fail so user can correct issue. */
2108     }
2109 
2110     disp->CmdDispatch(commandBuffer, x, y, z);
2111 }
2112 
vkCmdDispatchIndirect(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset)2113 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
2114                                                                VkDeviceSize offset) {
2115     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2116     if (NULL == disp) {
2117         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2118                    "vkCmdDispatchIndirect: Invalid commandBuffer [VUID-vkCmdDispatchIndirect-commandBuffer-parameter]");
2119         abort(); /* Intentionally fail so user can correct issue. */
2120     }
2121 
2122     disp->CmdDispatchIndirect(commandBuffer, buffer, offset);
2123 }
2124 
vkCmdCopyBuffer(VkCommandBuffer commandBuffer,VkBuffer srcBuffer,VkBuffer dstBuffer,uint32_t regionCount,const VkBufferCopy * pRegions)2125 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
2126                                                          uint32_t regionCount, const VkBufferCopy *pRegions) {
2127     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2128     if (NULL == disp) {
2129         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2130                    "vkCmdCopyBuffer: Invalid commandBuffer [VUID-vkCmdCopyBuffer-commandBuffer-parameter]");
2131         abort(); /* Intentionally fail so user can correct issue. */
2132     }
2133 
2134     disp->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
2135 }
2136 
vkCmdCopyImage(VkCommandBuffer commandBuffer,VkImage srcImage,VkImageLayout srcImageLayout,VkImage dstImage,VkImageLayout dstImageLayout,uint32_t regionCount,const VkImageCopy * pRegions)2137 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage,
2138                                                         VkImageLayout srcImageLayout, VkImage dstImage,
2139                                                         VkImageLayout dstImageLayout, uint32_t regionCount,
2140                                                         const VkImageCopy *pRegions) {
2141     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2142     if (NULL == disp) {
2143         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2144                    "vkCmdCopyImage: Invalid commandBuffer [VUID-vkCmdCopyImage-devcommandBufferice-parameter]");
2145         abort(); /* Intentionally fail so user can correct issue. */
2146     }
2147 
2148     disp->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
2149 }
2150 
vkCmdBlitImage(VkCommandBuffer commandBuffer,VkImage srcImage,VkImageLayout srcImageLayout,VkImage dstImage,VkImageLayout dstImageLayout,uint32_t regionCount,const VkImageBlit * pRegions,VkFilter filter)2151 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage,
2152                                                         VkImageLayout srcImageLayout, VkImage dstImage,
2153                                                         VkImageLayout dstImageLayout, uint32_t regionCount,
2154                                                         const VkImageBlit *pRegions, VkFilter filter) {
2155     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2156     if (NULL == disp) {
2157         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2158                    "vkCmdBlitImage: Invalid commandBuffer [VUID-vkCmdBlitImage-commandBuffer-parameter]");
2159         abort(); /* Intentionally fail so user can correct issue. */
2160     }
2161 
2162     disp->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
2163 }
2164 
vkCmdCopyBufferToImage(VkCommandBuffer commandBuffer,VkBuffer srcBuffer,VkImage dstImage,VkImageLayout dstImageLayout,uint32_t regionCount,const VkBufferImageCopy * pRegions)2165 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
2166                                                                 VkImageLayout dstImageLayout, uint32_t regionCount,
2167                                                                 const VkBufferImageCopy *pRegions) {
2168     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2169     if (NULL == disp) {
2170         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2171                    "vkCmdCopyBufferToImage: Invalid commandBuffer [VUID-vkCmdCopyBufferToImage-commandBuffer-parameter]");
2172         abort(); /* Intentionally fail so user can correct issue. */
2173     }
2174 
2175     disp->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
2176 }
2177 
vkCmdCopyImageToBuffer(VkCommandBuffer commandBuffer,VkImage srcImage,VkImageLayout srcImageLayout,VkBuffer dstBuffer,uint32_t regionCount,const VkBufferImageCopy * pRegions)2178 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
2179                                                                 VkImageLayout srcImageLayout, VkBuffer dstBuffer,
2180                                                                 uint32_t regionCount, const VkBufferImageCopy *pRegions) {
2181     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2182     if (NULL == disp) {
2183         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2184                    "vkCmdCopyImageToBuffer: Invalid commandBuffer [VUID-vkCmdCopyImageToBuffer-commandBuffer-parameter]");
2185         abort(); /* Intentionally fail so user can correct issue. */
2186     }
2187 
2188     disp->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
2189 }
2190 
vkCmdUpdateBuffer(VkCommandBuffer commandBuffer,VkBuffer dstBuffer,VkDeviceSize dstOffset,VkDeviceSize dataSize,const void * pData)2191 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
2192                                                            VkDeviceSize dstOffset, VkDeviceSize dataSize, const void *pData) {
2193     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2194     if (NULL == disp) {
2195         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2196                    "vkCmdUpdateBuffer: Invalid commandBuffer [VUID-vkCmdUpdateBuffer-commandBuffer-parameter]");
2197         abort(); /* Intentionally fail so user can correct issue. */
2198     }
2199 
2200     disp->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
2201 }
2202 
vkCmdFillBuffer(VkCommandBuffer commandBuffer,VkBuffer dstBuffer,VkDeviceSize dstOffset,VkDeviceSize size,uint32_t data)2203 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
2204                                                          VkDeviceSize size, uint32_t data) {
2205     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2206     if (NULL == disp) {
2207         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2208                    "vkCmdFillBuffer: Invalid commandBuffer [VUID-vkCmdFillBuffer-commandBuffer-parameter]");
2209         abort(); /* Intentionally fail so user can correct issue. */
2210     }
2211 
2212     disp->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
2213 }
2214 
vkCmdClearColorImage(VkCommandBuffer commandBuffer,VkImage image,VkImageLayout imageLayout,const VkClearColorValue * pColor,uint32_t rangeCount,const VkImageSubresourceRange * pRanges)2215 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
2216                                                               VkImageLayout imageLayout, const VkClearColorValue *pColor,
2217                                                               uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
2218     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2219     if (NULL == disp) {
2220         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2221                    "vkCmdClearColorImage: Invalid commandBuffer [VUID-vkCmdClearColorImage-commandBuffer-parameter]");
2222         abort(); /* Intentionally fail so user can correct issue. */
2223     }
2224 
2225     disp->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
2226 }
2227 
vkCmdClearDepthStencilImage(VkCommandBuffer commandBuffer,VkImage image,VkImageLayout imageLayout,const VkClearDepthStencilValue * pDepthStencil,uint32_t rangeCount,const VkImageSubresourceRange * pRanges)2228 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image,
2229                                                                      VkImageLayout imageLayout,
2230                                                                      const VkClearDepthStencilValue *pDepthStencil,
2231                                                                      uint32_t rangeCount, const VkImageSubresourceRange *pRanges) {
2232     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2233     if (NULL == disp) {
2234         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2235                    "vkCmdClearDepthStencilImage: Invalid commandBuffer [VUID-vkCmdClearDepthStencilImage-commandBuffer-parameter]");
2236         abort(); /* Intentionally fail so user can correct issue. */
2237     }
2238 
2239     disp->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
2240 }
2241 
vkCmdClearAttachments(VkCommandBuffer commandBuffer,uint32_t attachmentCount,const VkClearAttachment * pAttachments,uint32_t rectCount,const VkClearRect * pRects)2242 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
2243                                                                const VkClearAttachment *pAttachments, uint32_t rectCount,
2244                                                                const VkClearRect *pRects) {
2245     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2246     if (NULL == disp) {
2247         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2248                    "vkCmdClearAttachments: Invalid commandBuffer [VUID-vkCmdClearAttachments-commandBuffer-parameter]");
2249         abort(); /* Intentionally fail so user can correct issue. */
2250     }
2251 
2252     disp->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
2253 }
2254 
vkCmdResolveImage(VkCommandBuffer commandBuffer,VkImage srcImage,VkImageLayout srcImageLayout,VkImage dstImage,VkImageLayout dstImageLayout,uint32_t regionCount,const VkImageResolve * pRegions)2255 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage,
2256                                                            VkImageLayout srcImageLayout, VkImage dstImage,
2257                                                            VkImageLayout dstImageLayout, uint32_t regionCount,
2258                                                            const VkImageResolve *pRegions) {
2259     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2260     if (NULL == disp) {
2261         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2262                    "vkCmdResolveImage: Invalid commandBuffer [VUID-vkCmdResolveImage-commandBuffer-parameter]");
2263         abort(); /* Intentionally fail so user can correct issue. */
2264     }
2265 
2266     disp->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
2267 }
2268 
vkCmdSetEvent(VkCommandBuffer commandBuffer,VkEvent event,VkPipelineStageFlags stageMask)2269 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event,
2270                                                        VkPipelineStageFlags stageMask) {
2271     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2272     if (NULL == disp) {
2273         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2274                    "vkCmdSetEvent: Invalid commandBuffer [VUID-vkCmdSetEvent-commandBuffer-parameter]");
2275         abort(); /* Intentionally fail so user can correct issue. */
2276     }
2277 
2278     disp->CmdSetEvent(commandBuffer, event, stageMask);
2279 }
2280 
vkCmdResetEvent(VkCommandBuffer commandBuffer,VkEvent event,VkPipelineStageFlags stageMask)2281 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event,
2282                                                          VkPipelineStageFlags stageMask) {
2283     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2284     if (NULL == disp) {
2285         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2286                    "vkCmdResetEvent: Invalid commandBuffer [VUID-vkCmdResetEvent-commandBuffer-parameter]");
2287         abort(); /* Intentionally fail so user can correct issue. */
2288     }
2289 
2290     disp->CmdResetEvent(commandBuffer, event, stageMask);
2291 }
2292 
vkCmdWaitEvents(VkCommandBuffer commandBuffer,uint32_t eventCount,const VkEvent * pEvents,VkPipelineStageFlags sourceStageMask,VkPipelineStageFlags dstStageMask,uint32_t memoryBarrierCount,const VkMemoryBarrier * pMemoryBarriers,uint32_t bufferMemoryBarrierCount,const VkBufferMemoryBarrier * pBufferMemoryBarriers,uint32_t imageMemoryBarrierCount,const VkImageMemoryBarrier * pImageMemoryBarriers)2293 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
2294                                                          VkPipelineStageFlags sourceStageMask, VkPipelineStageFlags dstStageMask,
2295                                                          uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2296                                                          uint32_t bufferMemoryBarrierCount,
2297                                                          const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2298                                                          uint32_t imageMemoryBarrierCount,
2299                                                          const VkImageMemoryBarrier *pImageMemoryBarriers) {
2300     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2301     if (NULL == disp) {
2302         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2303                    "vkCmdWaitEvents: Invalid commandBuffer [VUID-vkCmdWaitEvents-commandBuffer-parameter]");
2304         abort(); /* Intentionally fail so user can correct issue. */
2305     }
2306 
2307     disp->CmdWaitEvents(commandBuffer, eventCount, pEvents, sourceStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers,
2308                         bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
2309 }
2310 
vkCmdPipelineBarrier(VkCommandBuffer commandBuffer,VkPipelineStageFlags srcStageMask,VkPipelineStageFlags dstStageMask,VkDependencyFlags dependencyFlags,uint32_t memoryBarrierCount,const VkMemoryBarrier * pMemoryBarriers,uint32_t bufferMemoryBarrierCount,const VkBufferMemoryBarrier * pBufferMemoryBarriers,uint32_t imageMemoryBarrierCount,const VkImageMemoryBarrier * pImageMemoryBarriers)2311 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
2312                                                               VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
2313                                                               uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
2314                                                               uint32_t bufferMemoryBarrierCount,
2315                                                               const VkBufferMemoryBarrier *pBufferMemoryBarriers,
2316                                                               uint32_t imageMemoryBarrierCount,
2317                                                               const VkImageMemoryBarrier *pImageMemoryBarriers) {
2318     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2319     if (NULL == disp) {
2320         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2321                    "vkCmdPipelineBarrier: Invalid commandBuffer [VUID-vkCmdPipelineBarrier-commandBuffer-parameter]");
2322         abort(); /* Intentionally fail so user can correct issue. */
2323     }
2324 
2325     disp->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
2326                              bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
2327 }
2328 
vkCmdBeginQuery(VkCommandBuffer commandBuffer,VkQueryPool queryPool,uint32_t slot,VkFlags flags)2329 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
2330                                                          VkFlags flags) {
2331     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2332     if (NULL == disp) {
2333         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2334                    "vkCmdBeginQuery: Invalid commandBuffer [VUID-vkCmdBeginQuery-commandBuffer-parameter]");
2335         abort(); /* Intentionally fail so user can correct issue. */
2336     }
2337 
2338     disp->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
2339 }
2340 
vkCmdEndQuery(VkCommandBuffer commandBuffer,VkQueryPool queryPool,uint32_t slot)2341 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
2342     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2343     if (NULL == disp) {
2344         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2345                    "vkCmdEndQuery: Invalid commandBuffer [VUID-vkCmdEndQuery-commandBuffer-parameter]");
2346         abort(); /* Intentionally fail so user can correct issue. */
2347     }
2348 
2349     disp->CmdEndQuery(commandBuffer, queryPool, slot);
2350 }
2351 
vkCmdResetQueryPool(VkCommandBuffer commandBuffer,VkQueryPool queryPool,uint32_t firstQuery,uint32_t queryCount)2352 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
2353                                                              uint32_t firstQuery, uint32_t queryCount) {
2354     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2355     if (NULL == disp) {
2356         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2357                    "vkCmdResetQueryPool: Invalid commandBuffer [VUID-vkCmdResetQueryPool-commandBuffer-parameter]");
2358         abort(); /* Intentionally fail so user can correct issue. */
2359     }
2360 
2361     disp->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
2362 }
2363 
vkCmdWriteTimestamp(VkCommandBuffer commandBuffer,VkPipelineStageFlagBits pipelineStage,VkQueryPool queryPool,uint32_t slot)2364 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
2365                                                              VkQueryPool queryPool, uint32_t slot) {
2366     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2367     if (NULL == disp) {
2368         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2369                    "vkCmdWriteTimestamp: Invalid commandBuffer [VUID-vkCmdWriteTimestamp-commandBuffer-parameter]");
2370         abort(); /* Intentionally fail so user can correct issue. */
2371     }
2372 
2373     disp->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, slot);
2374 }
2375 
vkCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer,VkQueryPool queryPool,uint32_t firstQuery,uint32_t queryCount,VkBuffer dstBuffer,VkDeviceSize dstOffset,VkDeviceSize stride,VkFlags flags)2376 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
2377                                                                    uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer,
2378                                                                    VkDeviceSize dstOffset, VkDeviceSize stride, VkFlags flags) {
2379     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2380     if (NULL == disp) {
2381         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2382                    "vkCmdCopyQueryPoolResults: Invalid commandBuffer [VUID-vkCmdCopyQueryPoolResults-commandBuffer-parameter]");
2383         abort(); /* Intentionally fail so user can correct issue. */
2384     }
2385 
2386     disp->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
2387 }
2388 
vkCmdPushConstants(VkCommandBuffer commandBuffer,VkPipelineLayout layout,VkShaderStageFlags stageFlags,uint32_t offset,uint32_t size,const void * pValues)2389 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
2390                                                             VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
2391                                                             const void *pValues) {
2392     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2393     if (NULL == disp) {
2394         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2395                    "vkCmdPushConstants: Invalid commandBuffer [VUID-vkCmdPushConstants-commandBuffer-parameter]");
2396         abort(); /* Intentionally fail so user can correct issue. */
2397     }
2398 
2399     disp->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
2400 }
2401 
vkCmdBeginRenderPass(VkCommandBuffer commandBuffer,const VkRenderPassBeginInfo * pRenderPassBegin,VkSubpassContents contents)2402 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBeginRenderPass(VkCommandBuffer commandBuffer,
2403                                                               const VkRenderPassBeginInfo *pRenderPassBegin,
2404                                                               VkSubpassContents contents) {
2405     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2406     if (NULL == disp) {
2407         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2408                    "vkCmdBeginRenderPass: Invalid commandBuffer [VUID-vkCmdBeginRenderPass-commandBuffer-parameter]");
2409         abort(); /* Intentionally fail so user can correct issue. */
2410     }
2411 
2412     disp->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
2413 }
2414 
vkCmdNextSubpass(VkCommandBuffer commandBuffer,VkSubpassContents contents)2415 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
2416     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2417     if (NULL == disp) {
2418         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2419                    "vkCmdNextSubpass: Invalid commandBuffer [VUID-vkCmdNextSubpass-commandBuffer-parameter]");
2420         abort(); /* Intentionally fail so user can correct issue. */
2421     }
2422 
2423     disp->CmdNextSubpass(commandBuffer, contents);
2424 }
2425 
vkCmdEndRenderPass(VkCommandBuffer commandBuffer)2426 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass(VkCommandBuffer commandBuffer) {
2427     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2428     if (NULL == disp) {
2429         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2430                    "vkCmdEndRenderPass: Invalid commandBuffer [VUID-vkCmdEndRenderPass-commandBuffer-parameter]");
2431         abort(); /* Intentionally fail so user can correct issue. */
2432     }
2433 
2434     disp->CmdEndRenderPass(commandBuffer);
2435 }
2436 
vkCmdExecuteCommands(VkCommandBuffer commandBuffer,uint32_t commandBuffersCount,const VkCommandBuffer * pCommandBuffers)2437 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBuffersCount,
2438                                                               const VkCommandBuffer *pCommandBuffers) {
2439     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2440     if (NULL == disp) {
2441         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2442                    "vkCmdExecuteCommands: Invalid commandBuffer [VUID-vkCmdExecuteCommands-commandBuffer-parameter]");
2443         abort(); /* Intentionally fail so user can correct issue. */
2444     }
2445 
2446     disp->CmdExecuteCommands(commandBuffer, commandBuffersCount, pCommandBuffers);
2447 }
2448 
2449 // ---- Vulkan core 1.1 trampolines
2450 
vkEnumeratePhysicalDeviceGroups(VkInstance instance,uint32_t * pPhysicalDeviceGroupCount,VkPhysicalDeviceGroupProperties * pPhysicalDeviceGroupProperties)2451 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDeviceGroups(
2452     VkInstance instance, uint32_t *pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupProperties *pPhysicalDeviceGroupProperties) {
2453     VkResult res = VK_SUCCESS;
2454     struct loader_instance *inst = NULL;
2455 
2456     loader_platform_thread_lock_mutex(&loader_lock);
2457 
2458     inst = loader_get_instance(instance);
2459     if (NULL == inst) {
2460         loader_log(
2461             NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2462             "vkEnumeratePhysicalDeviceGroupsKHR: Invalid instance [VUID-vkEnumeratePhysicalDeviceGroups-instance-parameter]");
2463         abort(); /* Intentionally fail so user can correct issue. */
2464     }
2465 
2466     if (NULL == pPhysicalDeviceGroupCount) {
2467         loader_log(inst, VULKAN_LOADER_ERROR_BIT, 0,
2468                    "vkEnumeratePhysicalDeviceGroupsKHR: Received NULL pointer for physical "
2469                    "device group count return value.");
2470         res = VK_ERROR_INITIALIZATION_FAILED;
2471         goto out;
2472     }
2473 
2474     // Call down the chain to get the physical device group info.
2475     res = inst->disp->layer_inst_disp.EnumeratePhysicalDeviceGroups(inst->instance, pPhysicalDeviceGroupCount,
2476                                                                     pPhysicalDeviceGroupProperties);
2477     if (NULL != pPhysicalDeviceGroupProperties && (VK_SUCCESS == res || VK_INCOMPLETE == res)) {
2478         // Wrap the PhysDev object for loader usage, return wrapped objects
2479         VkResult update_res = setup_loader_tramp_phys_dev_groups(inst, *pPhysicalDeviceGroupCount, pPhysicalDeviceGroupProperties);
2480         if (VK_SUCCESS != update_res) {
2481             res = update_res;
2482         }
2483     }
2484 
2485 out:
2486 
2487     loader_platform_thread_unlock_mutex(&loader_lock);
2488     return res;
2489 }
2490 
vkGetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,VkPhysicalDeviceFeatures2 * pFeatures)2491 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
2492                                                                       VkPhysicalDeviceFeatures2 *pFeatures) {
2493     VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
2494     if (VK_NULL_HANDLE == unwrapped_phys_dev) {
2495         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2496                    "vkGetPhysicalDeviceFeatures2: Invalid physicalDevice "
2497                    "[VUID-vkGetPhysicalDeviceFeatures2-physicalDevice-parameter]");
2498         abort(); /* Intentionally fail so user can correct issue. */
2499     }
2500     const VkLayerInstanceDispatchTable *disp = loader_get_instance_layer_dispatch(physicalDevice);
2501     const struct loader_instance *inst = ((struct loader_physical_device_tramp *)physicalDevice)->this_instance;
2502 
2503     if (inst != NULL && inst->enabled_known_extensions.khr_get_physical_device_properties2) {
2504         disp->GetPhysicalDeviceFeatures2KHR(unwrapped_phys_dev, pFeatures);
2505     } else {
2506         disp->GetPhysicalDeviceFeatures2(unwrapped_phys_dev, pFeatures);
2507     }
2508 }
2509 
vkGetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice,VkPhysicalDeviceProperties2 * pProperties)2510 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice,
2511                                                                         VkPhysicalDeviceProperties2 *pProperties) {
2512     VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
2513     if (VK_NULL_HANDLE == unwrapped_phys_dev) {
2514         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2515                    "vkGetPhysicalDeviceProperties2: Invalid physicalDevice "
2516                    "[VUID-vkGetPhysicalDeviceProperties2-physicalDevice-parameter]");
2517         abort(); /* Intentionally fail so user can correct issue. */
2518     }
2519     const VkLayerInstanceDispatchTable *disp = loader_get_instance_layer_dispatch(physicalDevice);
2520     const struct loader_instance *inst = ((struct loader_physical_device_tramp *)physicalDevice)->this_instance;
2521 
2522     if (inst != NULL && inst->enabled_known_extensions.khr_get_physical_device_properties2) {
2523         disp->GetPhysicalDeviceProperties2KHR(unwrapped_phys_dev, pProperties);
2524     } else {
2525         disp->GetPhysicalDeviceProperties2(unwrapped_phys_dev, pProperties);
2526     }
2527 }
2528 
vkGetPhysicalDeviceFormatProperties2(VkPhysicalDevice physicalDevice,VkFormat format,VkFormatProperties2 * pFormatProperties)2529 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFormatProperties2(VkPhysicalDevice physicalDevice, VkFormat format,
2530                                                                               VkFormatProperties2 *pFormatProperties) {
2531     VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
2532     if (VK_NULL_HANDLE == unwrapped_phys_dev) {
2533         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2534                    "vkGetPhysicalDeviceFormatProperties2: Invalid physicalDevice "
2535                    "[VUID-vkGetPhysicalDeviceFormatProperties2-physicalDevice-parameter]");
2536         abort(); /* Intentionally fail so user can correct issue. */
2537     }
2538     const VkLayerInstanceDispatchTable *disp = loader_get_instance_layer_dispatch(physicalDevice);
2539     const struct loader_instance *inst = ((struct loader_physical_device_tramp *)physicalDevice)->this_instance;
2540 
2541     if (inst != NULL && inst->enabled_known_extensions.khr_get_physical_device_properties2) {
2542         disp->GetPhysicalDeviceFormatProperties2KHR(unwrapped_phys_dev, format, pFormatProperties);
2543     } else {
2544         disp->GetPhysicalDeviceFormatProperties2(unwrapped_phys_dev, format, pFormatProperties);
2545     }
2546 }
2547 
2548 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
vkGetPhysicalDeviceImageFormatProperties2(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceImageFormatInfo2 * pImageFormatInfo,VkImageFormatProperties2 * pImageFormatProperties)2549 vkGetPhysicalDeviceImageFormatProperties2(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2 *pImageFormatInfo,
2550                                           VkImageFormatProperties2 *pImageFormatProperties) {
2551     VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
2552     if (VK_NULL_HANDLE == unwrapped_phys_dev) {
2553         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2554                    "vkGetPhysicalDeviceImageFormatProperties2: Invalid physicalDevice "
2555                    "[VUID-vkGetPhysicalDeviceImageFormatProperties2-physicalDevice-parameter]");
2556         abort(); /* Intentionally fail so user can correct issue. */
2557     }
2558     const VkLayerInstanceDispatchTable *disp = loader_get_instance_layer_dispatch(physicalDevice);
2559     const struct loader_instance *inst = ((struct loader_physical_device_tramp *)physicalDevice)->this_instance;
2560 
2561     if (inst != NULL && inst->enabled_known_extensions.khr_get_physical_device_properties2) {
2562         return disp->GetPhysicalDeviceImageFormatProperties2KHR(unwrapped_phys_dev, pImageFormatInfo, pImageFormatProperties);
2563     } else {
2564         return disp->GetPhysicalDeviceImageFormatProperties2(unwrapped_phys_dev, pImageFormatInfo, pImageFormatProperties);
2565     }
2566 }
2567 
vkGetPhysicalDeviceQueueFamilyProperties2(VkPhysicalDevice physicalDevice,uint32_t * pQueueFamilyPropertyCount,VkQueueFamilyProperties2 * pQueueFamilyProperties)2568 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyProperties2(
2569     VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, VkQueueFamilyProperties2 *pQueueFamilyProperties) {
2570     VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
2571     if (VK_NULL_HANDLE == unwrapped_phys_dev) {
2572         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2573                    "vkGetPhysicalDeviceQueueFamilyProperties2: Invalid physicalDevice "
2574                    "[VUID-vkGetPhysicalDeviceQueueFamilyProperties2-physicalDevice-parameter]");
2575         abort(); /* Intentionally fail so user can correct issue. */
2576     }
2577     const VkLayerInstanceDispatchTable *disp = loader_get_instance_layer_dispatch(physicalDevice);
2578     const struct loader_instance *inst = ((struct loader_physical_device_tramp *)physicalDevice)->this_instance;
2579 
2580     if (inst != NULL && inst->enabled_known_extensions.khr_get_physical_device_properties2) {
2581         disp->GetPhysicalDeviceQueueFamilyProperties2KHR(unwrapped_phys_dev, pQueueFamilyPropertyCount, pQueueFamilyProperties);
2582     } else {
2583         disp->GetPhysicalDeviceQueueFamilyProperties2(unwrapped_phys_dev, pQueueFamilyPropertyCount, pQueueFamilyProperties);
2584     }
2585 }
2586 
2587 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL
vkGetPhysicalDeviceMemoryProperties2(VkPhysicalDevice physicalDevice,VkPhysicalDeviceMemoryProperties2 * pMemoryProperties)2588 vkGetPhysicalDeviceMemoryProperties2(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties2 *pMemoryProperties) {
2589     VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
2590     if (VK_NULL_HANDLE == unwrapped_phys_dev) {
2591         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2592                    "vkGetPhysicalDeviceMemoryProperties2: Invalid physicalDevice "
2593                    "[VUID-vkGetPhysicalDeviceMemoryProperties2-physicalDevice-parameter]");
2594         abort(); /* Intentionally fail so user can correct issue. */
2595     }
2596     const VkLayerInstanceDispatchTable *disp = loader_get_instance_layer_dispatch(physicalDevice);
2597     const struct loader_instance *inst = ((struct loader_physical_device_tramp *)physicalDevice)->this_instance;
2598 
2599     if (inst != NULL && inst->enabled_known_extensions.khr_get_physical_device_properties2) {
2600         disp->GetPhysicalDeviceMemoryProperties2KHR(unwrapped_phys_dev, pMemoryProperties);
2601     } else {
2602         disp->GetPhysicalDeviceMemoryProperties2(unwrapped_phys_dev, pMemoryProperties);
2603     }
2604 }
2605 
vkGetPhysicalDeviceSparseImageFormatProperties2(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceSparseImageFormatInfo2 * pFormatInfo,uint32_t * pPropertyCount,VkSparseImageFormatProperties2 * pProperties)2606 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceSparseImageFormatProperties2(
2607     VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2 *pFormatInfo, uint32_t *pPropertyCount,
2608     VkSparseImageFormatProperties2 *pProperties) {
2609     VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
2610     if (VK_NULL_HANDLE == unwrapped_phys_dev) {
2611         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2612                    "vkGetPhysicalDeviceSparseImageFormatProperties2: Invalid physicalDevice "
2613                    "[VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-physicalDevice-parameter]");
2614         abort(); /* Intentionally fail so user can correct issue. */
2615     }
2616     const VkLayerInstanceDispatchTable *disp = loader_get_instance_layer_dispatch(physicalDevice);
2617     const struct loader_instance *inst = ((struct loader_physical_device_tramp *)physicalDevice)->this_instance;
2618 
2619     if (inst != NULL && inst->enabled_known_extensions.khr_get_physical_device_properties2) {
2620         disp->GetPhysicalDeviceSparseImageFormatProperties2KHR(unwrapped_phys_dev, pFormatInfo, pPropertyCount, pProperties);
2621     } else {
2622         disp->GetPhysicalDeviceSparseImageFormatProperties2(unwrapped_phys_dev, pFormatInfo, pPropertyCount, pProperties);
2623     }
2624 }
2625 
vkGetPhysicalDeviceExternalBufferProperties(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceExternalBufferInfo * pExternalBufferInfo,VkExternalBufferProperties * pExternalBufferProperties)2626 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalBufferProperties(
2627     VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfo *pExternalBufferInfo,
2628     VkExternalBufferProperties *pExternalBufferProperties) {
2629     VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
2630     if (VK_NULL_HANDLE == unwrapped_phys_dev) {
2631         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2632                    "vkGetPhysicalDeviceExternalBufferProperties: Invalid physicalDevice "
2633                    "[VUID-vkGetPhysicalDeviceExternalBufferProperties-physicalDevice-parameter]");
2634         abort(); /* Intentionally fail so user can correct issue. */
2635     }
2636     const VkLayerInstanceDispatchTable *disp = loader_get_instance_layer_dispatch(physicalDevice);
2637     const struct loader_instance *inst = ((struct loader_physical_device_tramp *)physicalDevice)->this_instance;
2638 
2639     if (inst != NULL && inst->enabled_known_extensions.khr_external_memory_capabilities) {
2640         disp->GetPhysicalDeviceExternalBufferPropertiesKHR(unwrapped_phys_dev, pExternalBufferInfo, pExternalBufferProperties);
2641     } else {
2642         disp->GetPhysicalDeviceExternalBufferProperties(unwrapped_phys_dev, pExternalBufferInfo, pExternalBufferProperties);
2643     }
2644 }
2645 
vkGetPhysicalDeviceExternalSemaphoreProperties(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceExternalSemaphoreInfoKHR * pExternalSemaphoreInfo,VkExternalSemaphoreProperties * pExternalSemaphoreProperties)2646 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalSemaphoreProperties(
2647     VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalSemaphoreInfoKHR *pExternalSemaphoreInfo,
2648     VkExternalSemaphoreProperties *pExternalSemaphoreProperties) {
2649     VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
2650     if (VK_NULL_HANDLE == unwrapped_phys_dev) {
2651         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2652                    "vkGetPhysicalDeviceExternalSemaphoreProperties: Invalid physicalDevice "
2653                    "[VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-physicalDevice-parameter]");
2654         abort(); /* Intentionally fail so user can correct issue. */
2655     }
2656     const VkLayerInstanceDispatchTable *disp = loader_get_instance_layer_dispatch(physicalDevice);
2657     const struct loader_instance *inst = ((struct loader_physical_device_tramp *)physicalDevice)->this_instance;
2658 
2659     if (inst != NULL && inst->enabled_known_extensions.khr_external_semaphore_capabilities) {
2660         disp->GetPhysicalDeviceExternalSemaphorePropertiesKHR(unwrapped_phys_dev, pExternalSemaphoreInfo,
2661                                                               pExternalSemaphoreProperties);
2662     } else {
2663         disp->GetPhysicalDeviceExternalSemaphoreProperties(unwrapped_phys_dev, pExternalSemaphoreInfo,
2664                                                            pExternalSemaphoreProperties);
2665     }
2666 }
2667 
vkGetPhysicalDeviceExternalFenceProperties(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceExternalFenceInfo * pExternalFenceInfo,VkExternalFenceProperties * pExternalFenceProperties)2668 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalFenceProperties(
2669     VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfo *pExternalFenceInfo,
2670     VkExternalFenceProperties *pExternalFenceProperties) {
2671     VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
2672     if (VK_NULL_HANDLE == unwrapped_phys_dev) {
2673         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2674                    "vkGetPhysicalDeviceExternalFenceProperties: Invalid physicalDevice "
2675                    "[VUID-vkGetPhysicalDeviceExternalFenceProperties-physicalDevice-parameter]");
2676         abort(); /* Intentionally fail so user can correct issue. */
2677     }
2678     const VkLayerInstanceDispatchTable *disp = loader_get_instance_layer_dispatch(physicalDevice);
2679     const struct loader_instance *inst = ((struct loader_physical_device_tramp *)physicalDevice)->this_instance;
2680 
2681     if (inst != NULL && inst->enabled_known_extensions.khr_external_fence_capabilities) {
2682         disp->GetPhysicalDeviceExternalFencePropertiesKHR(unwrapped_phys_dev, pExternalFenceInfo, pExternalFenceProperties);
2683     } else {
2684         disp->GetPhysicalDeviceExternalFenceProperties(unwrapped_phys_dev, pExternalFenceInfo, pExternalFenceProperties);
2685     }
2686 }
2687 
vkBindBufferMemory2(VkDevice device,uint32_t bindInfoCount,const VkBindBufferMemoryInfo * pBindInfos)2688 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindBufferMemory2(VkDevice device, uint32_t bindInfoCount,
2689                                                                  const VkBindBufferMemoryInfo *pBindInfos) {
2690     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
2691     if (NULL == disp) {
2692         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2693                    "vkBindBufferMemory2: Invalid device [VUID-vkBindBufferMemory2-device-parameter]");
2694         abort(); /* Intentionally fail so user can correct issue. */
2695     }
2696     return disp->BindBufferMemory2(device, bindInfoCount, pBindInfos);
2697 }
2698 
vkBindImageMemory2(VkDevice device,uint32_t bindInfoCount,const VkBindImageMemoryInfo * pBindInfos)2699 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory2(VkDevice device, uint32_t bindInfoCount,
2700                                                                 const VkBindImageMemoryInfo *pBindInfos) {
2701     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
2702     if (NULL == disp) {
2703         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2704                    "vkBindImageMemory2: Invalid device [VUID-vkBindImageMemory2-device-parameter]");
2705         abort(); /* Intentionally fail so user can correct issue. */
2706     }
2707     return disp->BindImageMemory2(device, bindInfoCount, pBindInfos);
2708 }
2709 
vkGetDeviceGroupPeerMemoryFeatures(VkDevice device,uint32_t heapIndex,uint32_t localDeviceIndex,uint32_t remoteDeviceIndex,VkPeerMemoryFeatureFlags * pPeerMemoryFeatures)2710 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetDeviceGroupPeerMemoryFeatures(VkDevice device, uint32_t heapIndex,
2711                                                                             uint32_t localDeviceIndex, uint32_t remoteDeviceIndex,
2712                                                                             VkPeerMemoryFeatureFlags *pPeerMemoryFeatures) {
2713     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
2714     if (NULL == disp) {
2715         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2716                    "vkGetDeviceGroupPeerMemoryFeatures: Invalid device [VUID-vkGetDeviceGroupPeerMemoryFeatures-device-parameter]");
2717         abort(); /* Intentionally fail so user can correct issue. */
2718     }
2719     disp->GetDeviceGroupPeerMemoryFeatures(device, heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures);
2720 }
2721 
vkCmdSetDeviceMask(VkCommandBuffer commandBuffer,uint32_t deviceMask)2722 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetDeviceMask(VkCommandBuffer commandBuffer, uint32_t deviceMask) {
2723     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2724     if (NULL == disp) {
2725         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2726                    "vkCmdSetDeviceMask: Invalid commandBuffer [VUID-vkCmdSetDeviceMask-commandBuffer-parameter]");
2727         abort(); /* Intentionally fail so user can correct issue. */
2728     }
2729     disp->CmdSetDeviceMask(commandBuffer, deviceMask);
2730 }
2731 
vkCmdDispatchBase(VkCommandBuffer commandBuffer,uint32_t baseGroupX,uint32_t baseGroupY,uint32_t baseGroupZ,uint32_t groupCountX,uint32_t groupCountY,uint32_t groupCountZ)2732 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY,
2733                                                            uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY,
2734                                                            uint32_t groupCountZ) {
2735     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2736     if (NULL == disp) {
2737         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2738                    "vkCmdDispatchBase: Invalid commandBuffer [VUID-vkCmdDispatchBase-commandBuffer-parameter]");
2739         abort(); /* Intentionally fail so user can correct issue. */
2740     }
2741     disp->CmdDispatchBase(commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
2742 }
2743 
vkGetImageMemoryRequirements2(VkDevice device,const VkImageMemoryRequirementsInfo2 * pInfo,VkMemoryRequirements2 * pMemoryRequirements)2744 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetImageMemoryRequirements2(VkDevice device, const VkImageMemoryRequirementsInfo2 *pInfo,
2745                                                                        VkMemoryRequirements2 *pMemoryRequirements) {
2746     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
2747     if (NULL == disp) {
2748         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2749                    "vkGetImageMemoryRequirements2: Invalid device [VUID-vkGetImageMemoryRequirements2-device-parameter]");
2750         abort(); /* Intentionally fail so user can correct issue. */
2751     }
2752     disp->GetImageMemoryRequirements2(device, pInfo, pMemoryRequirements);
2753 }
2754 
vkGetBufferMemoryRequirements2(VkDevice device,const VkBufferMemoryRequirementsInfo2 * pInfo,VkMemoryRequirements2 * pMemoryRequirements)2755 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetBufferMemoryRequirements2(VkDevice device,
2756                                                                         const VkBufferMemoryRequirementsInfo2 *pInfo,
2757                                                                         VkMemoryRequirements2 *pMemoryRequirements) {
2758     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
2759     if (NULL == disp) {
2760         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2761                    "vkGetBufferMemoryRequirements2: Invalid device [VUID-vkGetBufferMemoryRequirements2-device-parameter]");
2762         abort(); /* Intentionally fail so user can correct issue. */
2763     }
2764     disp->GetBufferMemoryRequirements2(device, pInfo, pMemoryRequirements);
2765 }
2766 
vkGetImageSparseMemoryRequirements2(VkDevice device,const VkImageSparseMemoryRequirementsInfo2 * pInfo,uint32_t * pSparseMemoryRequirementCount,VkSparseImageMemoryRequirements2 * pSparseMemoryRequirements)2767 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetImageSparseMemoryRequirements2(
2768     VkDevice device, const VkImageSparseMemoryRequirementsInfo2 *pInfo, uint32_t *pSparseMemoryRequirementCount,
2769     VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) {
2770     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
2771     if (NULL == disp) {
2772         loader_log(
2773             NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2774             "vkGetImageSparseMemoryRequirements2: Invalid device [VUID-vkGetImageSparseMemoryRequirements2-device-parameter]");
2775         abort(); /* Intentionally fail so user can correct issue. */
2776     }
2777     disp->GetImageSparseMemoryRequirements2(device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
2778 }
2779 
vkTrimCommandPool(VkDevice device,VkCommandPool commandPool,VkCommandPoolTrimFlags flags)2780 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkTrimCommandPool(VkDevice device, VkCommandPool commandPool,
2781                                                            VkCommandPoolTrimFlags flags) {
2782     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
2783     if (NULL == disp) {
2784         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2785                    "vkTrimCommandPool: Invalid device [VUID-vkTrimCommandPool-device-parameter]");
2786         abort(); /* Intentionally fail so user can correct issue. */
2787     }
2788     disp->TrimCommandPool(device, commandPool, flags);
2789 }
2790 
vkGetDeviceQueue2(VkDevice device,const VkDeviceQueueInfo2 * pQueueInfo,VkQueue * pQueue)2791 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetDeviceQueue2(VkDevice device, const VkDeviceQueueInfo2 *pQueueInfo, VkQueue *pQueue) {
2792     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
2793     if (NULL == disp) {
2794         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2795                    "vkGetDeviceQueue2: Invalid device [VUID-vkGetDeviceQueue2-device-parameter]");
2796         abort(); /* Intentionally fail so user can correct issue. */
2797     }
2798     disp->GetDeviceQueue2(device, pQueueInfo, pQueue);
2799     if (pQueue != NULL && *pQueue != NULL) {
2800         loader_set_dispatch(*pQueue, disp);
2801     }
2802 }
2803 
vkCreateSamplerYcbcrConversion(VkDevice device,const VkSamplerYcbcrConversionCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkSamplerYcbcrConversion * pYcbcrConversion)2804 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSamplerYcbcrConversion(VkDevice device,
2805                                                                             const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
2806                                                                             const VkAllocationCallbacks *pAllocator,
2807                                                                             VkSamplerYcbcrConversion *pYcbcrConversion) {
2808     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
2809     if (NULL == disp) {
2810         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2811                    "vkCreateSamplerYcbcrConversion: Invalid device [VUID-vkCreateSamplerYcbcrConversion-device-parameter]");
2812         abort(); /* Intentionally fail so user can correct issue. */
2813     }
2814     return disp->CreateSamplerYcbcrConversion(device, pCreateInfo, pAllocator, pYcbcrConversion);
2815 }
2816 
vkDestroySamplerYcbcrConversion(VkDevice device,VkSamplerYcbcrConversion ycbcrConversion,const VkAllocationCallbacks * pAllocator)2817 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroySamplerYcbcrConversion(VkDevice device, VkSamplerYcbcrConversion ycbcrConversion,
2818                                                                          const VkAllocationCallbacks *pAllocator) {
2819     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
2820     if (NULL == disp) {
2821         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2822                    "vkDestroySamplerYcbcrConversion: Invalid device [VUID-vkDestroySamplerYcbcrConversion-device-parameter]");
2823         abort(); /* Intentionally fail so user can correct issue. */
2824     }
2825     disp->DestroySamplerYcbcrConversion(device, ycbcrConversion, pAllocator);
2826 }
2827 
vkGetDescriptorSetLayoutSupport(VkDevice device,const VkDescriptorSetLayoutCreateInfo * pCreateInfo,VkDescriptorSetLayoutSupport * pSupport)2828 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetDescriptorSetLayoutSupport(VkDevice device,
2829                                                                          const VkDescriptorSetLayoutCreateInfo *pCreateInfo,
2830                                                                          VkDescriptorSetLayoutSupport *pSupport) {
2831     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
2832     if (NULL == disp) {
2833         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2834                    "vkGetDescriptorSetLayoutSupport: Invalid device [VUID-vkGetDescriptorSetLayoutSupport-device-parameter]");
2835         abort(); /* Intentionally fail so user can correct issue. */
2836     }
2837     disp->GetDescriptorSetLayoutSupport(device, pCreateInfo, pSupport);
2838 }
2839 
2840 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL
vkCreateDescriptorUpdateTemplate(VkDevice device,const VkDescriptorUpdateTemplateCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkDescriptorUpdateTemplate * pDescriptorUpdateTemplate)2841 vkCreateDescriptorUpdateTemplate(VkDevice device, const VkDescriptorUpdateTemplateCreateInfo *pCreateInfo,
2842                                  const VkAllocationCallbacks *pAllocator, VkDescriptorUpdateTemplate *pDescriptorUpdateTemplate) {
2843     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
2844     if (NULL == disp) {
2845         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2846                    "vkCreateDescriptorUpdateTemplate: Invalid device [VUID-vkCreateDescriptorUpdateTemplate-device-parameter]");
2847         abort(); /* Intentionally fail so user can correct issue. */
2848     }
2849     return disp->CreateDescriptorUpdateTemplate(device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate);
2850 }
2851 
vkDestroyDescriptorUpdateTemplate(VkDevice device,VkDescriptorUpdateTemplate descriptorUpdateTemplate,const VkAllocationCallbacks * pAllocator)2852 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDescriptorUpdateTemplate(VkDevice device,
2853                                                                            VkDescriptorUpdateTemplate descriptorUpdateTemplate,
2854                                                                            const VkAllocationCallbacks *pAllocator) {
2855     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
2856     if (NULL == disp) {
2857         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2858                    "vkDestroyDescriptorUpdateTemplate: Invalid device [VUID-vkDestroyDescriptorUpdateTemplate-device-parameter]");
2859         abort(); /* Intentionally fail so user can correct issue. */
2860     }
2861     disp->DestroyDescriptorUpdateTemplate(device, descriptorUpdateTemplate, pAllocator);
2862 }
2863 
vkUpdateDescriptorSetWithTemplate(VkDevice device,VkDescriptorSet descriptorSet,VkDescriptorUpdateTemplate descriptorUpdateTemplate,const void * pData)2864 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkUpdateDescriptorSetWithTemplate(VkDevice device, VkDescriptorSet descriptorSet,
2865                                                                            VkDescriptorUpdateTemplate descriptorUpdateTemplate,
2866                                                                            const void *pData) {
2867     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
2868     if (NULL == disp) {
2869         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2870                    "vkUpdateDescriptorSetWithTemplate: Invalid device [VUID-vkUpdateDescriptorSetWithTemplate-device-parameter]");
2871         abort(); /* Intentionally fail so user can correct issue. */
2872     }
2873     disp->UpdateDescriptorSetWithTemplate(device, descriptorSet, descriptorUpdateTemplate, pData);
2874 }
2875 
2876 // ---- Vulkan core 1.2 trampolines
2877 
vkCreateRenderPass2(VkDevice device,const VkRenderPassCreateInfo2 * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkRenderPass * pRenderPass)2878 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass2(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
2879                                                                  const VkAllocationCallbacks *pAllocator,
2880                                                                  VkRenderPass *pRenderPass) {
2881     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
2882     if (NULL == disp) {
2883         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2884                    "vkCreateRenderPass2: Invalid device [VUID-vkCreateRenderPass2-device-parameter]");
2885         abort(); /* Intentionally fail so user can correct issue. */
2886     }
2887     return disp->CreateRenderPass2(device, pCreateInfo, pAllocator, pRenderPass);
2888 }
2889 
vkCmdBeginRenderPass2(VkCommandBuffer commandBuffer,const VkRenderPassBeginInfo * pRenderPassBegin,const VkSubpassBeginInfo * pSubpassBeginInfo)2890 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBeginRenderPass2(VkCommandBuffer commandBuffer,
2891                                                                const VkRenderPassBeginInfo *pRenderPassBegin,
2892                                                                const VkSubpassBeginInfo *pSubpassBeginInfo) {
2893     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2894     if (NULL == disp) {
2895         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2896                    "vkCmdBeginRenderPass2: Invalid commandBuffer [VUID-vkCmdBeginRenderPass2-commandBuffer-parameter]");
2897         abort(); /* Intentionally fail so user can correct issue. */
2898     }
2899     disp->CmdBeginRenderPass2(commandBuffer, pRenderPassBegin, pSubpassBeginInfo);
2900 }
2901 
vkCmdNextSubpass2(VkCommandBuffer commandBuffer,const VkSubpassBeginInfo * pSubpassBeginInfo,const VkSubpassEndInfo * pSubpassEndInfo)2902 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass2(VkCommandBuffer commandBuffer,
2903                                                            const VkSubpassBeginInfo *pSubpassBeginInfo,
2904                                                            const VkSubpassEndInfo *pSubpassEndInfo) {
2905     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2906     if (NULL == disp) {
2907         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2908                    "vkCmdNextSubpass2: Invalid commandBuffer [VUID-vkCmdNextSubpass2-commandBuffer-parameter]");
2909         abort(); /* Intentionally fail so user can correct issue. */
2910     }
2911     disp->CmdNextSubpass2(commandBuffer, pSubpassBeginInfo, pSubpassEndInfo);
2912 }
2913 
vkCmdEndRenderPass2(VkCommandBuffer commandBuffer,const VkSubpassEndInfo * pSubpassEndInfo)2914 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass2(VkCommandBuffer commandBuffer,
2915                                                              const VkSubpassEndInfo *pSubpassEndInfo) {
2916     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2917     if (NULL == disp) {
2918         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2919                    "vkCmdEndRenderPass2: Invalid commandBuffer [VUID-vkCmdEndRenderPass2-commandBuffer-parameter]");
2920         abort(); /* Intentionally fail so user can correct issue. */
2921     }
2922     disp->CmdEndRenderPass2(commandBuffer, pSubpassEndInfo);
2923 }
2924 
vkCmdDrawIndirectCount(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,VkBuffer countBuffer,VkDeviceSize countBufferOffset,uint32_t maxDrawCount,uint32_t stride)2925 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
2926                                                                 VkBuffer countBuffer, VkDeviceSize countBufferOffset,
2927                                                                 uint32_t maxDrawCount, uint32_t stride) {
2928     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2929     if (NULL == disp) {
2930         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2931                    "vkCmdDrawIndirectCount: Invalid commandBuffer [VUID-vkCmdDrawIndirectCount-commandBuffer-parameter]");
2932         abort(); /* Intentionally fail so user can correct issue. */
2933     }
2934     disp->CmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
2935 }
2936 
vkCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,VkBuffer countBuffer,VkDeviceSize countBufferOffset,uint32_t maxDrawCount,uint32_t stride)2937 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer,
2938                                                                        VkDeviceSize offset, VkBuffer countBuffer,
2939                                                                        VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
2940                                                                        uint32_t stride) {
2941     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
2942     if (NULL == disp) {
2943         loader_log(
2944             NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2945             "vkCmdDrawIndexedIndirectCount: Invalid commandBuffer [VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-parameter]");
2946         abort(); /* Intentionally fail so user can correct issue. */
2947     }
2948     disp->CmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
2949 }
2950 
vkGetSemaphoreCounterValue(VkDevice device,VkSemaphore semaphore,uint64_t * pValue)2951 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreCounterValue(VkDevice device, VkSemaphore semaphore, uint64_t *pValue) {
2952     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
2953     if (NULL == disp) {
2954         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2955                    "vkGetSemaphoreCounterValue: Invalid device [VUID-vkGetSemaphoreCounterValue-device-parameter]");
2956         abort(); /* Intentionally fail so user can correct issue. */
2957     }
2958     return disp->GetSemaphoreCounterValue(device, semaphore, pValue);
2959 }
2960 
vkWaitSemaphores(VkDevice device,const VkSemaphoreWaitInfo * pWaitInfo,uint64_t timeout)2961 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo,
2962                                                               uint64_t timeout) {
2963     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
2964     if (NULL == disp) {
2965         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2966                    "vkWaitSemaphores: Invalid device [VUID-vkWaitSemaphores-device-parameter]");
2967         abort(); /* Intentionally fail so user can correct issue. */
2968     }
2969     return disp->WaitSemaphores(device, pWaitInfo, timeout);
2970 }
2971 
vkSignalSemaphore(VkDevice device,const VkSemaphoreSignalInfo * pSignalInfo)2972 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkSignalSemaphore(VkDevice device, const VkSemaphoreSignalInfo *pSignalInfo) {
2973     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
2974     if (NULL == disp) {
2975         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2976                    "vkSignalSemaphore: Invalid device [VUID-vkSignalSemaphore-device-parameter]");
2977         abort(); /* Intentionally fail so user can correct issue. */
2978     }
2979     return disp->SignalSemaphore(device, pSignalInfo);
2980 }
2981 
vkGetBufferDeviceAddress(VkDevice device,const VkBufferDeviceAddressInfo * pInfo)2982 LOADER_EXPORT VKAPI_ATTR VkDeviceAddress VKAPI_CALL vkGetBufferDeviceAddress(VkDevice device,
2983                                                                              const VkBufferDeviceAddressInfo *pInfo) {
2984     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
2985     if (NULL == disp) {
2986         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2987                    "vkGetBufferDeviceAddress: Invalid device [VUID-vkGetBufferDeviceAddress-device-parameter]");
2988         abort(); /* Intentionally fail so user can correct issue. */
2989     }
2990     return disp->GetBufferDeviceAddress(device, pInfo);
2991 }
2992 
vkGetBufferOpaqueCaptureAddress(VkDevice device,const VkBufferDeviceAddressInfo * pInfo)2993 LOADER_EXPORT VKAPI_ATTR uint64_t VKAPI_CALL vkGetBufferOpaqueCaptureAddress(VkDevice device,
2994                                                                              const VkBufferDeviceAddressInfo *pInfo) {
2995     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
2996     if (NULL == disp) {
2997         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
2998                    "vkGetBufferOpaqueCaptureAddress: Invalid device [VUID-vkGetBufferOpaqueCaptureAddress-device-parameter]");
2999         abort(); /* Intentionally fail so user can correct issue. */
3000     }
3001     return disp->GetBufferOpaqueCaptureAddress(device, pInfo);
3002 }
3003 
3004 LOADER_EXPORT VKAPI_ATTR uint64_t VKAPI_CALL
vkGetDeviceMemoryOpaqueCaptureAddress(VkDevice device,const VkDeviceMemoryOpaqueCaptureAddressInfo * pInfo)3005 vkGetDeviceMemoryOpaqueCaptureAddress(VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo *pInfo) {
3006     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
3007     if (NULL == disp) {
3008         loader_log(
3009             NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
3010             "vkGetDeviceMemoryOpaqueCaptureAddress: Invalid device [VUID-vkGetDeviceMemoryOpaqueCaptureAddress-device-parameter]");
3011         abort(); /* Intentionally fail so user can correct issue. */
3012     }
3013     return disp->GetDeviceMemoryOpaqueCaptureAddress(device, pInfo);
3014 }
3015 
vkResetQueryPool(VkDevice device,VkQueryPool queryPool,uint32_t firstQuery,uint32_t queryCount)3016 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
3017                                                           uint32_t queryCount) {
3018     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
3019     if (NULL == disp) {
3020         loader_log(NULL, VULKAN_LOADER_ERROR_BIT | VULKAN_LOADER_VALIDATION_BIT, 0,
3021                    "vkResetQueryPool: Invalid device [VUID-vkResetQueryPool-device-parameter]");
3022         abort(); /* Intentionally fail so user can correct issue. */
3023     }
3024     disp->ResetQueryPool(device, queryPool, firstQuery, queryCount);
3025 }
3026 
3027 // ---- Vulkan core 1.3 trampolines
3028 
3029 // Instance
3030 
vkGetPhysicalDeviceToolProperties(VkPhysicalDevice physicalDevice,uint32_t * pToolCount,VkPhysicalDeviceToolProperties * pToolProperties)3031 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceToolProperties(VkPhysicalDevice physicalDevice,
3032                                                                                uint32_t *pToolCount,
3033                                                                                VkPhysicalDeviceToolProperties *pToolProperties) {
3034     VkPhysicalDevice unwrapped_phys_dev = loader_unwrap_physical_device(physicalDevice);
3035     const VkLayerInstanceDispatchTable *disp = loader_get_instance_layer_dispatch(physicalDevice);
3036 
3037     return disp->GetPhysicalDeviceToolProperties(unwrapped_phys_dev, pToolCount, pToolProperties);
3038 }
3039 
3040 // Device
3041 
vkCmdBeginRendering(VkCommandBuffer commandBuffer,const VkRenderingInfo * pRenderingInfo)3042 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBeginRendering(VkCommandBuffer commandBuffer, const VkRenderingInfo *pRenderingInfo) {
3043     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3044     disp->CmdBeginRendering(commandBuffer, pRenderingInfo);
3045 }
3046 
vkCmdBindVertexBuffers2(VkCommandBuffer commandBuffer,uint32_t firstBinding,uint32_t bindingCount,const VkBuffer * pBuffers,const VkDeviceSize * pOffsets,const VkDeviceSize * pSizes,const VkDeviceSize * pStrides)3047 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers2(VkCommandBuffer commandBuffer, uint32_t firstBinding,
3048                                                                  uint32_t bindingCount, const VkBuffer *pBuffers,
3049                                                                  const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes,
3050                                                                  const VkDeviceSize *pStrides) {
3051     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3052     disp->CmdBindVertexBuffers2(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes, pStrides);
3053 }
3054 
vkCmdBlitImage2(VkCommandBuffer commandBuffer,const VkBlitImageInfo2 * pBlitImageInfo)3055 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBlitImage2(VkCommandBuffer commandBuffer, const VkBlitImageInfo2 *pBlitImageInfo) {
3056     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3057     disp->CmdBlitImage2(commandBuffer, pBlitImageInfo);
3058 }
3059 
vkCmdCopyBuffer2(VkCommandBuffer commandBuffer,const VkCopyBufferInfo2 * pCopyBufferInfo)3060 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCopyBufferInfo) {
3061     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3062     disp->CmdCopyBuffer2(commandBuffer, pCopyBufferInfo);
3063 }
3064 
vkCmdCopyBufferToImage2(VkCommandBuffer commandBuffer,const VkCopyBufferToImageInfo2 * pCopyBufferToImageInfo)3065 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage2(VkCommandBuffer commandBuffer,
3066                                                                  const VkCopyBufferToImageInfo2 *pCopyBufferToImageInfo) {
3067     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3068     disp->CmdCopyBufferToImage2(commandBuffer, pCopyBufferToImageInfo);
3069 }
3070 
vkCmdCopyImage2(VkCommandBuffer commandBuffer,const VkCopyImageInfo2 * pCopyImageInfo)3071 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyImageInfo) {
3072     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3073     disp->CmdCopyImage2(commandBuffer, pCopyImageInfo);
3074 }
3075 
vkCmdCopyImageToBuffer2(VkCommandBuffer commandBuffer,const VkCopyImageToBufferInfo2 * pCopyImageToBufferInfo)3076 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer2(VkCommandBuffer commandBuffer,
3077                                                                  const VkCopyImageToBufferInfo2 *pCopyImageToBufferInfo) {
3078     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3079     disp->CmdCopyImageToBuffer2(commandBuffer, pCopyImageToBufferInfo);
3080 }
3081 
vkCmdEndRendering(VkCommandBuffer commandBuffer)3082 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndRendering(VkCommandBuffer commandBuffer) {
3083     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3084     disp->CmdEndRendering(commandBuffer);
3085 }
3086 
vkCmdPipelineBarrier2(VkCommandBuffer commandBuffer,const VkDependencyInfo * pDependencyInfo)3087 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPipelineBarrier2(VkCommandBuffer commandBuffer,
3088                                                                const VkDependencyInfo *pDependencyInfo) {
3089     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3090     disp->CmdPipelineBarrier2(commandBuffer, pDependencyInfo);
3091 }
3092 
vkCmdResetEvent2(VkCommandBuffer commandBuffer,VkEvent event,VkPipelineStageFlags2 stageMask)3093 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent event,
3094                                                           VkPipelineStageFlags2 stageMask) {
3095     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3096     disp->CmdResetEvent2(commandBuffer, event, stageMask);
3097 }
3098 
vkCmdResolveImage2(VkCommandBuffer commandBuffer,const VkResolveImageInfo2 * pResolveImageInfo)3099 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResolveImage2(VkCommandBuffer commandBuffer,
3100                                                             const VkResolveImageInfo2 *pResolveImageInfo) {
3101     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3102     disp->CmdResolveImage2(commandBuffer, pResolveImageInfo);
3103 }
3104 
vkCmdSetCullMode(VkCommandBuffer commandBuffer,VkCullModeFlags cullMode)3105 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetCullMode(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) {
3106     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3107     disp->CmdSetCullMode(commandBuffer, cullMode);
3108 }
3109 
vkCmdSetDepthBiasEnable(VkCommandBuffer commandBuffer,VkBool32 depthBiasEnable)3110 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBiasEnable(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable) {
3111     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3112     disp->CmdSetDepthBiasEnable(commandBuffer, depthBiasEnable);
3113 }
3114 
vkCmdSetDepthBoundsTestEnable(VkCommandBuffer commandBuffer,VkBool32 depthBoundsTestEnable)3115 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBoundsTestEnable(VkCommandBuffer commandBuffer,
3116                                                                        VkBool32 depthBoundsTestEnable) {
3117     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3118     disp->CmdSetDepthBoundsTestEnable(commandBuffer, depthBoundsTestEnable);
3119 }
3120 
vkCmdSetDepthCompareOp(VkCommandBuffer commandBuffer,VkCompareOp depthCompareOp)3121 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthCompareOp(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) {
3122     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3123     disp->CmdSetDepthCompareOp(commandBuffer, depthCompareOp);
3124 }
3125 
vkCmdSetDepthTestEnable(VkCommandBuffer commandBuffer,VkBool32 depthTestEnable)3126 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthTestEnable(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) {
3127     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3128     disp->CmdSetDepthTestEnable(commandBuffer, depthTestEnable);
3129 }
3130 
vkCmdSetDepthWriteEnable(VkCommandBuffer commandBuffer,VkBool32 depthWriteEnable)3131 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthWriteEnable(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) {
3132     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3133     disp->CmdSetDepthWriteEnable(commandBuffer, depthWriteEnable);
3134 }
3135 
vkCmdSetEvent2(VkCommandBuffer commandBuffer,VkEvent event,const VkDependencyInfo * pDependencyInfo)3136 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent event,
3137                                                         const VkDependencyInfo *pDependencyInfo) {
3138     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3139     disp->CmdSetEvent2(commandBuffer, event, pDependencyInfo);
3140 }
3141 
vkCmdSetFrontFace(VkCommandBuffer commandBuffer,VkFrontFace frontFace)3142 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetFrontFace(VkCommandBuffer commandBuffer, VkFrontFace frontFace) {
3143     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3144     disp->CmdSetFrontFace(commandBuffer, frontFace);
3145 }
3146 
vkCmdSetPrimitiveRestartEnable(VkCommandBuffer commandBuffer,VkBool32 primitiveRestartEnable)3147 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetPrimitiveRestartEnable(VkCommandBuffer commandBuffer,
3148                                                                         VkBool32 primitiveRestartEnable) {
3149     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3150     disp->CmdSetPrimitiveRestartEnable(commandBuffer, primitiveRestartEnable);
3151 }
3152 
vkCmdSetPrimitiveTopology(VkCommandBuffer commandBuffer,VkPrimitiveTopology primitiveTopology)3153 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetPrimitiveTopology(VkCommandBuffer commandBuffer,
3154                                                                    VkPrimitiveTopology primitiveTopology) {
3155     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3156     disp->CmdSetPrimitiveTopology(commandBuffer, primitiveTopology);
3157 }
3158 
vkCmdSetRasterizerDiscardEnable(VkCommandBuffer commandBuffer,VkBool32 rasterizerDiscardEnable)3159 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetRasterizerDiscardEnable(VkCommandBuffer commandBuffer,
3160                                                                          VkBool32 rasterizerDiscardEnable) {
3161     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3162     disp->CmdSetRasterizerDiscardEnable(commandBuffer, rasterizerDiscardEnable);
3163 }
3164 
vkCmdSetScissorWithCount(VkCommandBuffer commandBuffer,uint32_t scissorCount,const VkRect2D * pScissors)3165 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetScissorWithCount(VkCommandBuffer commandBuffer, uint32_t scissorCount,
3166                                                                   const VkRect2D *pScissors) {
3167     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3168     disp->CmdSetScissorWithCount(commandBuffer, scissorCount, pScissors);
3169 }
3170 
vkCmdSetStencilOp(VkCommandBuffer commandBuffer,VkStencilFaceFlags faceMask,VkStencilOp failOp,VkStencilOp passOp,VkStencilOp depthFailOp,VkCompareOp compareOp)3171 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilOp(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
3172                                                            VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp,
3173                                                            VkCompareOp compareOp) {
3174     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3175     disp->CmdSetStencilOp(commandBuffer, faceMask, failOp, passOp, depthFailOp, compareOp);
3176 }
3177 
vkCmdSetStencilTestEnable(VkCommandBuffer commandBuffer,VkBool32 stencilTestEnable)3178 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilTestEnable(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) {
3179     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3180     disp->CmdSetStencilTestEnable(commandBuffer, stencilTestEnable);
3181 }
3182 
vkCmdSetViewportWithCount(VkCommandBuffer commandBuffer,uint32_t viewportCount,const VkViewport * pViewports)3183 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetViewportWithCount(VkCommandBuffer commandBuffer, uint32_t viewportCount,
3184                                                                    const VkViewport *pViewports) {
3185     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3186     disp->CmdSetViewportWithCount(commandBuffer, viewportCount, pViewports);
3187 }
3188 
vkCmdWaitEvents2(VkCommandBuffer commandBuffer,uint32_t eventCount,const VkEvent * pEvents,const VkDependencyInfo * pDependencyInfos)3189 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount,
3190                                                           const VkEvent *pEvents, const VkDependencyInfo *pDependencyInfos) {
3191     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3192     disp->CmdWaitEvents2(commandBuffer, eventCount, pEvents, pDependencyInfos);
3193 }
3194 
vkCmdWriteTimestamp2(VkCommandBuffer commandBuffer,VkPipelineStageFlags2 stage,VkQueryPool queryPool,uint32_t query)3195 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp2(VkCommandBuffer commandBuffer, VkPipelineStageFlags2 stage,
3196                                                               VkQueryPool queryPool, uint32_t query) {
3197     const VkLayerDispatchTable *disp = loader_get_dispatch(commandBuffer);
3198     disp->CmdWriteTimestamp2(commandBuffer, stage, queryPool, query);
3199 }
3200 
vkCreatePrivateDataSlot(VkDevice device,const VkPrivateDataSlotCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkPrivateDataSlot * pPrivateDataSlot)3201 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreatePrivateDataSlot(VkDevice device,
3202                                                                      const VkPrivateDataSlotCreateInfo *pCreateInfo,
3203                                                                      const VkAllocationCallbacks *pAllocator,
3204                                                                      VkPrivateDataSlot *pPrivateDataSlot) {
3205     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
3206     return disp->CreatePrivateDataSlot(device, pCreateInfo, pAllocator, pPrivateDataSlot);
3207 }
3208 
vkDestroyPrivateDataSlot(VkDevice device,VkPrivateDataSlot privateDataSlot,const VkAllocationCallbacks * pAllocator)3209 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyPrivateDataSlot(VkDevice device, VkPrivateDataSlot privateDataSlot,
3210                                                                   const VkAllocationCallbacks *pAllocator) {
3211     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
3212     disp->DestroyPrivateDataSlot(device, privateDataSlot, pAllocator);
3213 }
3214 
vkGetDeviceBufferMemoryRequirements(VkDevice device,const VkDeviceBufferMemoryRequirements * pInfo,VkMemoryRequirements2 * pMemoryRequirements)3215 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetDeviceBufferMemoryRequirements(VkDevice device,
3216                                                                              const VkDeviceBufferMemoryRequirements *pInfo,
3217                                                                              VkMemoryRequirements2 *pMemoryRequirements) {
3218     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
3219     disp->GetDeviceBufferMemoryRequirements(device, pInfo, pMemoryRequirements);
3220 }
3221 
vkGetDeviceImageMemoryRequirements(VkDevice device,const VkDeviceImageMemoryRequirements * pInfo,VkMemoryRequirements2 * pMemoryRequirements)3222 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetDeviceImageMemoryRequirements(VkDevice device,
3223                                                                             const VkDeviceImageMemoryRequirements *pInfo,
3224                                                                             VkMemoryRequirements2 *pMemoryRequirements) {
3225     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
3226     disp->GetDeviceImageMemoryRequirements(device, pInfo, pMemoryRequirements);
3227 }
3228 
vkGetDeviceImageSparseMemoryRequirements(VkDevice device,const VkDeviceImageMemoryRequirements * pInfo,uint32_t * pSparseMemoryRequirementCount,VkSparseImageMemoryRequirements2 * pSparseMemoryRequirements)3229 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetDeviceImageSparseMemoryRequirements(
3230     VkDevice device, const VkDeviceImageMemoryRequirements *pInfo, uint32_t *pSparseMemoryRequirementCount,
3231     VkSparseImageMemoryRequirements2 *pSparseMemoryRequirements) {
3232     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
3233     disp->GetDeviceImageSparseMemoryRequirements(device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
3234 }
3235 
vkGetPrivateData(VkDevice device,VkObjectType objectType,uint64_t objectHandle,VkPrivateDataSlot privateDataSlot,uint64_t * pData)3236 LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPrivateData(VkDevice device, VkObjectType objectType, uint64_t objectHandle,
3237                                                           VkPrivateDataSlot privateDataSlot, uint64_t *pData) {
3238     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
3239     disp->GetPrivateData(device, objectType, objectHandle, privateDataSlot, pData);
3240 }
3241 
vkSetPrivateData(VkDevice device,VkObjectType objectType,uint64_t objectHandle,VkPrivateDataSlot privateDataSlot,uint64_t data)3242 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkSetPrivateData(VkDevice device, VkObjectType objectType, uint64_t objectHandle,
3243                                                               VkPrivateDataSlot privateDataSlot, uint64_t data) {
3244     const VkLayerDispatchTable *disp = loader_get_dispatch(device);
3245     return disp->SetPrivateData(device, objectType, objectHandle, privateDataSlot, data);
3246 }
3247 
vkQueueSubmit2(VkQueue queue,uint32_t submitCount,const VkSubmitInfo2 * pSubmits,VkFence fence)3248 LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueSubmit2(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2 *pSubmits,
3249                                                             VkFence fence) {
3250     const VkLayerDispatchTable *disp = loader_get_dispatch(queue);
3251     return disp->QueueSubmit2(queue, submitCount, pSubmits, fence);
3252 }
3253