Coverage Report

Created: 2026-10-19 07:08

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