Coverage Report

Created: 2025-07-11 06:48

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