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