Coverage Report

Created: 2026-08-13 07:19

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