Coverage Report

Created: 2025-08-29 06:28

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