trampoline.c revision 2954dae5bddd8d0686e5baff6f4f3dc7b4e3d2bc
1/*
2 *
3 * Copyright (C) 2015 Valve Corporation
4 * Copyright (C) 2015 Google Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *
24 * Author: Chris Forbes <chrisf@ijw.co.nz>
25 * Author: Cody Northrop <cody@lunarg.com>
26 * Author: Jon Ashburn <jon@lunarg.com>
27 * Author: Tony Barbour <tony@LunarG.com>
28 */
29#define _GNU_SOURCE
30#include <stdlib.h>
31#include <string.h>
32
33#include "vk_loader_platform.h"
34#include "loader.h"
35#include "debug_report.h"
36#include "wsi.h"
37
38
39/* Trampoline entrypoints */
40LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance(
41        const VkInstanceCreateInfo* pCreateInfo,
42        const VkAllocationCallbacks* pAllocator,
43        VkInstance* pInstance)
44{
45    struct loader_instance *ptr_instance = NULL;
46    VkResult res = VK_ERROR_INITIALIZATION_FAILED;
47    VkDebugReportCallbackEXT instance_callback = VK_NULL_HANDLE;
48    void *pNext = (void *) pCreateInfo->pNext;
49
50    loader_platform_thread_once(&once_init, loader_initialize);
51
52    if (pAllocator) {
53        ptr_instance = (struct loader_instance *) pAllocator->pfnAllocation(
54                           pAllocator->pUserData,
55                           sizeof(struct loader_instance),
56                           sizeof(int *),
57                           VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
58    } else {
59        ptr_instance = (struct loader_instance *) malloc(sizeof(struct loader_instance));
60    }
61    if (ptr_instance == NULL) {
62        return VK_ERROR_OUT_OF_HOST_MEMORY;
63    }
64
65    tls_instance = ptr_instance;
66    loader_platform_thread_lock_mutex(&loader_lock);
67    memset(ptr_instance, 0, sizeof(struct loader_instance));
68
69    if (pAllocator) {
70        ptr_instance->alloc_callbacks = *pAllocator;
71    }
72
73    /*
74     * Look for a debug report create info structure
75     * and setup a callback if found.
76     */
77    while (pNext) {
78        if (((VkInstanceCreateInfo *)pNext)->sType == VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT) {
79            instance_callback = (VkDebugReportCallbackEXT) ptr_instance;
80            if (util_CreateDebugReportCallback(ptr_instance, pNext, pAllocator, instance_callback)) {
81                loader_heap_free(ptr_instance, ptr_instance);
82                loader_platform_thread_unlock_mutex(&loader_lock);
83                return VK_ERROR_OUT_OF_HOST_MEMORY;
84            }
85        }
86        pNext = (void *) ((VkInstanceCreateInfo *)pNext)->pNext;
87    }
88
89    /* Due to implicit layers need to get layer list even if
90     * enabledLayerCount == 0 and VK_INSTANCE_LAYERS is unset. For now always
91     * get layer list (both instance and device) via loader_layer_scan(). */
92    memset(&ptr_instance->instance_layer_list, 0, sizeof(ptr_instance->instance_layer_list));
93    memset(&ptr_instance->device_layer_list, 0, sizeof(ptr_instance->device_layer_list));
94    loader_layer_scan(ptr_instance,
95                      &ptr_instance->instance_layer_list,
96                      &ptr_instance->device_layer_list);
97
98    /* validate the app requested layers to be enabled */
99    if (pCreateInfo->enabledLayerCount > 0) {
100        res = loader_validate_layers(pCreateInfo->enabledLayerCount,
101                                     pCreateInfo->ppEnabledLayerNames,
102                                     &ptr_instance->instance_layer_list);
103        if (res != VK_SUCCESS) {
104            util_DestroyDebugReportCallback(ptr_instance, instance_callback, pAllocator);
105            loader_heap_free(ptr_instance, ptr_instance);
106            loader_platform_thread_unlock_mutex(&loader_lock);
107            return res;
108        }
109    }
110
111    /* Scan/discover all ICD libraries */
112    memset(&ptr_instance->icd_libs, 0, sizeof(ptr_instance->icd_libs));
113    loader_icd_scan(ptr_instance, &ptr_instance->icd_libs);
114
115    /* get extensions from all ICD's, merge so no duplicates, then validate */
116    loader_get_icd_loader_instance_extensions(ptr_instance,
117                                              &ptr_instance->icd_libs,
118                                              &ptr_instance->ext_list);
119    res = loader_validate_instance_extensions(&ptr_instance->ext_list,
120                                              &ptr_instance->instance_layer_list,
121                                              pCreateInfo);
122    if (res != VK_SUCCESS) {
123        loader_delete_layer_properties(ptr_instance,
124                                       &ptr_instance->device_layer_list);
125        loader_delete_layer_properties(ptr_instance,
126                                       &ptr_instance->instance_layer_list);
127        loader_scanned_icd_clear(ptr_instance, &ptr_instance->icd_libs);
128        loader_destroy_generic_list(ptr_instance, (struct loader_generic_list *)
129                                    &ptr_instance->ext_list);
130        util_DestroyDebugReportCallback(ptr_instance, instance_callback, pAllocator);
131        loader_platform_thread_unlock_mutex(&loader_lock);
132        loader_heap_free(ptr_instance, ptr_instance);
133        return res;
134    }
135
136    ptr_instance->disp = loader_heap_alloc(
137                             ptr_instance,
138                             sizeof(VkLayerInstanceDispatchTable),
139                             VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
140    if (ptr_instance->disp == NULL) {
141        loader_delete_layer_properties(ptr_instance,
142                                       &ptr_instance->device_layer_list);
143        loader_delete_layer_properties(ptr_instance,
144                                       &ptr_instance->instance_layer_list);
145        loader_scanned_icd_clear(ptr_instance,
146                                 &ptr_instance->icd_libs);
147        loader_destroy_generic_list(ptr_instance, (struct loader_generic_list *)
148                                &ptr_instance->ext_list);
149        util_DestroyDebugReportCallback(ptr_instance, instance_callback, pAllocator);
150        loader_platform_thread_unlock_mutex(&loader_lock);
151        loader_heap_free(ptr_instance, ptr_instance);
152        return VK_ERROR_OUT_OF_HOST_MEMORY;
153    }
154    memcpy(ptr_instance->disp, &instance_disp, sizeof(instance_disp));
155    ptr_instance->next = loader.instances;
156    loader.instances = ptr_instance;
157
158    /* activate any layers on instance chain */
159    res = loader_enable_instance_layers(ptr_instance,
160                                        pCreateInfo,
161                                        &ptr_instance->instance_layer_list);
162    if (res != VK_SUCCESS) {
163        loader_delete_layer_properties(ptr_instance,
164                                       &ptr_instance->device_layer_list);
165        loader_delete_layer_properties(ptr_instance,
166                                       &ptr_instance->instance_layer_list);
167        loader_scanned_icd_clear(ptr_instance,
168                                 &ptr_instance->icd_libs);
169        loader_destroy_generic_list(ptr_instance, (struct loader_generic_list *)
170                                &ptr_instance->ext_list);
171        loader.instances = ptr_instance->next;
172        util_DestroyDebugReportCallback(ptr_instance, instance_callback, pAllocator);
173        loader_platform_thread_unlock_mutex(&loader_lock);
174        loader_heap_free(ptr_instance, ptr_instance->disp);
175        loader_heap_free(ptr_instance, ptr_instance);
176        return res;
177    }
178    loader_activate_instance_layers(ptr_instance);
179
180    wsi_create_instance(ptr_instance, pCreateInfo);
181    debug_report_create_instance(ptr_instance, pCreateInfo);
182
183
184    *pInstance = (VkInstance) ptr_instance;
185
186    res = ptr_instance->disp->CreateInstance(pCreateInfo, pAllocator, pInstance);
187
188    /*
189     * Finally have the layers in place and everyone has seen
190     * the CreateInstance command go by. This allows the layer's
191     * GetInstanceProcAddr functions to return valid extension functions
192     * if enabled.
193     */
194    loader_activate_instance_layer_extensions(ptr_instance, *pInstance);
195    /* Remove temporary debug_report callback */
196    util_DestroyDebugReportCallback(ptr_instance, instance_callback, pAllocator);
197
198    loader_platform_thread_unlock_mutex(&loader_lock);
199    return res;
200}
201
202LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(
203                                            VkInstance instance,
204                                            const VkAllocationCallbacks* pAllocator)
205{
206    const VkLayerInstanceDispatchTable *disp;
207    struct loader_instance *ptr_instance = NULL;
208    disp = loader_get_instance_dispatch(instance);
209
210    loader_platform_thread_lock_mutex(&loader_lock);
211
212    /* TODO: Do we need a temporary callback here to catch cleanup issues? */
213
214    ptr_instance = loader_get_instance(instance);
215    disp->DestroyInstance(instance, pAllocator);
216
217    loader_deactivate_instance_layers(ptr_instance);
218    loader_heap_free(ptr_instance, ptr_instance->disp);
219    loader_heap_free(ptr_instance, ptr_instance);
220    loader_platform_thread_unlock_mutex(&loader_lock);
221}
222
223LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDevices(
224                                            VkInstance instance,
225                                            uint32_t* pPhysicalDeviceCount,
226                                            VkPhysicalDevice* pPhysicalDevices)
227{
228    const VkLayerInstanceDispatchTable *disp;
229    VkResult res;
230    disp = loader_get_instance_dispatch(instance);
231
232    loader_platform_thread_lock_mutex(&loader_lock);
233    res = disp->EnumeratePhysicalDevices(instance, pPhysicalDeviceCount,
234                                         pPhysicalDevices);
235    loader_platform_thread_unlock_mutex(&loader_lock);
236    return res;
237}
238
239LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFeatures(
240                                            VkPhysicalDevice gpu,
241                                            VkPhysicalDeviceFeatures *pFeatures)
242{
243    const VkLayerInstanceDispatchTable *disp;
244
245    disp = loader_get_instance_dispatch(gpu);
246    disp->GetPhysicalDeviceFeatures(gpu, pFeatures);
247}
248
249LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFormatProperties(
250                                            VkPhysicalDevice gpu,
251                                            VkFormat format,
252                                            VkFormatProperties *pFormatInfo)
253{
254    const VkLayerInstanceDispatchTable *disp;
255
256    disp = loader_get_instance_dispatch(gpu);
257    disp->GetPhysicalDeviceFormatProperties(gpu, format, pFormatInfo);
258}
259
260LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties)
261{
262    const VkLayerInstanceDispatchTable *disp;
263
264    disp = loader_get_instance_dispatch(physicalDevice);
265    return disp->GetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
266}
267
268LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceProperties(
269                                            VkPhysicalDevice gpu,
270                                            VkPhysicalDeviceProperties* pProperties)
271{
272    const VkLayerInstanceDispatchTable *disp;
273
274    disp = loader_get_instance_dispatch(gpu);
275    disp->GetPhysicalDeviceProperties(gpu, pProperties);
276}
277
278LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyProperties(
279                                            VkPhysicalDevice gpu,
280                                            uint32_t* pQueueFamilyPropertyCount,
281                                            VkQueueFamilyProperties* pQueueProperties)
282{
283    const VkLayerInstanceDispatchTable *disp;
284
285    disp = loader_get_instance_dispatch(gpu);
286    disp->GetPhysicalDeviceQueueFamilyProperties(gpu, pQueueFamilyPropertyCount, pQueueProperties);
287}
288
289LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceMemoryProperties(
290                                            VkPhysicalDevice gpu,
291                                            VkPhysicalDeviceMemoryProperties* pMemoryProperties)
292{
293    const VkLayerInstanceDispatchTable *disp;
294
295    disp = loader_get_instance_dispatch(gpu);
296    disp->GetPhysicalDeviceMemoryProperties(gpu, pMemoryProperties);
297}
298
299LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(
300        VkPhysicalDevice gpu,
301        const VkDeviceCreateInfo* pCreateInfo,
302        const VkAllocationCallbacks* pAllocator,
303        VkDevice* pDevice)
304{
305    VkResult res;
306
307    loader_platform_thread_lock_mutex(&loader_lock);
308
309    res = loader_CreateDevice(gpu, pCreateInfo, pAllocator, pDevice);
310
311    loader_platform_thread_unlock_mutex(&loader_lock);
312    return res;
313}
314
315LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(VkDevice device, const VkAllocationCallbacks* pAllocator)
316{
317    const VkLayerDispatchTable *disp;
318    struct loader_device *dev;
319    struct loader_icd *icd = loader_get_icd_and_device(device, &dev);
320    const struct loader_instance *inst = icd->this_instance;
321    disp = loader_get_dispatch(device);
322
323    loader_platform_thread_lock_mutex(&loader_lock);
324    disp->DestroyDevice(device, pAllocator);
325    dev->device = NULL;
326    loader_remove_logical_device(inst, icd, dev);
327
328    loader_platform_thread_unlock_mutex(&loader_lock);
329}
330
331LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(
332    VkPhysicalDevice                            physicalDevice,
333    const char*                                 pLayerName,
334    uint32_t*                                   pPropertyCount,
335    VkExtensionProperties*                      pProperties)
336{
337    VkResult res;
338
339    loader_platform_thread_lock_mutex(&loader_lock);
340
341    /* If pLayerName == NULL, then querying ICD extensions, pass this call
342       down the instance chain which will terminate in the ICD. This allows
343       layers to filter the extensions coming back up the chain.
344       If pLayerName != NULL then get layer extensions from manifest file.  */
345    if (pLayerName == NULL  || strlen(pLayerName) == 0) {
346        const VkLayerInstanceDispatchTable *disp;
347
348        disp = loader_get_instance_dispatch(physicalDevice);
349        res = disp->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pPropertyCount, pProperties);
350    } else {
351        res = loader_EnumerateDeviceExtensionProperties(physicalDevice, pLayerName, pPropertyCount, pProperties);
352    }
353
354    loader_platform_thread_unlock_mutex(&loader_lock);
355    return res;
356}
357
358LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(
359    VkPhysicalDevice                            physicalDevice,
360    uint32_t*                                   pPropertyCount,
361    VkLayerProperties*                          pProperties)
362{
363    VkResult res;
364
365    loader_platform_thread_lock_mutex(&loader_lock);
366
367    /* Don't dispatch this call down the instance chain, want all device layers
368       enumerated and instance chain may not contain all device layers */
369    res = loader_EnumerateDeviceLayerProperties(physicalDevice, pPropertyCount, pProperties);
370    loader_platform_thread_unlock_mutex(&loader_lock);
371    return res;
372}
373
374LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetDeviceQueue(VkDevice device, uint32_t queueNodeIndex, uint32_t queueIndex, VkQueue* pQueue)
375{
376    const VkLayerDispatchTable *disp;
377
378    disp = loader_get_dispatch(device);
379
380    disp->GetDeviceQueue(device, queueNodeIndex, queueIndex, pQueue);
381    loader_set_dispatch(*pQueue, disp);
382}
383
384LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence)
385{
386    const VkLayerDispatchTable *disp;
387
388    disp = loader_get_dispatch(queue);
389
390    return disp->QueueSubmit(queue, submitCount, pSubmits, fence);
391}
392
393LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueWaitIdle(VkQueue queue)
394{
395    const VkLayerDispatchTable *disp;
396
397    disp = loader_get_dispatch(queue);
398
399    return disp->QueueWaitIdle(queue);
400}
401
402LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkDeviceWaitIdle(VkDevice device)
403{
404    const VkLayerDispatchTable *disp;
405
406    disp = loader_get_dispatch(device);
407
408    return disp->DeviceWaitIdle(device);
409}
410
411LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateMemory(VkDevice device, const VkMemoryAllocateInfo* pAllocateInfo, const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMemory)
412{
413    const VkLayerDispatchTable *disp;
414
415    disp = loader_get_dispatch(device);
416
417    return disp->AllocateMemory(device, pAllocateInfo, pAllocator, pMemory);
418}
419
420LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkFreeMemory(VkDevice device, VkDeviceMemory mem, const VkAllocationCallbacks* pAllocator)
421{
422    const VkLayerDispatchTable *disp;
423
424    disp = loader_get_dispatch(device);
425
426    disp->FreeMemory(device, mem, pAllocator);
427}
428
429LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkMapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size, VkFlags flags, void** ppData)
430{
431    const VkLayerDispatchTable *disp;
432
433    disp = loader_get_dispatch(device);
434
435    return disp->MapMemory(device, mem, offset, size, flags, ppData);
436}
437
438LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkUnmapMemory(VkDevice device, VkDeviceMemory mem)
439{
440    const VkLayerDispatchTable *disp;
441
442    disp = loader_get_dispatch(device);
443
444    disp->UnmapMemory(device, mem);
445}
446
447LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange* pMemoryRanges)
448{
449    const VkLayerDispatchTable *disp;
450
451    disp = loader_get_dispatch(device);
452
453    return disp->FlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
454}
455
456LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkInvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange* pMemoryRanges)
457{
458    const VkLayerDispatchTable *disp;
459
460    disp = loader_get_dispatch(device);
461
462    return disp->InvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
463}
464
465LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDeviceSize* pCommittedMemoryInBytes)
466{
467    const VkLayerDispatchTable *disp;
468
469    disp = loader_get_dispatch(device);
470
471    disp->GetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
472}
473
474LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize offset)
475{
476    const VkLayerDispatchTable *disp;
477
478    disp = loader_get_dispatch(device);
479
480    return disp->BindBufferMemory(device, buffer, mem, offset);
481}
482
483LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory mem, VkDeviceSize offset)
484{
485    const VkLayerDispatchTable *disp;
486
487    disp = loader_get_dispatch(device);
488
489    return disp->BindImageMemory(device, image, mem, offset);
490}
491
492LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer, VkMemoryRequirements* pMemoryRequirements)
493{
494    const VkLayerDispatchTable *disp;
495
496    disp = loader_get_dispatch(device);
497
498    disp->GetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
499}
500
501LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements* pMemoryRequirements)
502{
503    const VkLayerDispatchTable *disp;
504
505    disp = loader_get_dispatch(device);
506
507    disp->GetImageMemoryRequirements(device, image, pMemoryRequirements);
508}
509
510LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements* pSparseMemoryRequirements)
511{
512    const VkLayerDispatchTable *disp;
513
514    disp = loader_get_dispatch(device);
515
516    disp->GetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
517}
518
519LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling, uint32_t* pPropertyCount, VkSparseImageFormatProperties* pProperties)
520{
521    const VkLayerInstanceDispatchTable *disp;
522
523    disp = loader_get_instance_dispatch(physicalDevice);
524
525    disp->GetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount, pProperties);
526}
527
528LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo* pBindInfo, VkFence fence)
529{
530    const VkLayerDispatchTable *disp;
531
532    disp = loader_get_dispatch(queue);
533
534    return disp->QueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
535}
536
537LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateFence(VkDevice device, const VkFenceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkFence* pFence)
538{
539    const VkLayerDispatchTable *disp;
540
541    disp = loader_get_dispatch(device);
542
543    return disp->CreateFence(device, pCreateInfo, pAllocator, pFence);
544}
545
546LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks* pAllocator)
547{
548    const VkLayerDispatchTable *disp;
549
550    disp = loader_get_dispatch(device);
551
552    disp->DestroyFence(device, fence, pAllocator);
553}
554
555LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetFences(VkDevice device, uint32_t fenceCount, const VkFence* pFences)
556{
557    const VkLayerDispatchTable *disp;
558
559    disp = loader_get_dispatch(device);
560
561    return disp->ResetFences(device, fenceCount, pFences);
562}
563
564LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceStatus(VkDevice device, VkFence fence)
565{
566    const VkLayerDispatchTable *disp;
567
568    disp = loader_get_dispatch(device);
569
570    return disp->GetFenceStatus(device, fence);
571}
572
573LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence* pFences, VkBool32 waitAll, uint64_t timeout)
574{
575    const VkLayerDispatchTable *disp;
576
577    disp = loader_get_dispatch(device);
578
579    return disp->WaitForFences(device, fenceCount, pFences, waitAll, timeout);
580}
581
582LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSemaphore* pSemaphore)
583{
584    const VkLayerDispatchTable *disp;
585
586    disp = loader_get_dispatch(device);
587
588    return disp->CreateSemaphore(device, pCreateInfo, pAllocator, pSemaphore);
589}
590
591LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks* pAllocator)
592{
593    const VkLayerDispatchTable *disp;
594
595    disp = loader_get_dispatch(device);
596
597    disp->DestroySemaphore(device, semaphore, pAllocator);
598}
599
600LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateEvent(VkDevice device, const VkEventCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkEvent* pEvent)
601{
602    const VkLayerDispatchTable *disp;
603
604    disp = loader_get_dispatch(device);
605
606    return disp->CreateEvent(device, pCreateInfo, pAllocator, pEvent);
607}
608
609LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks* pAllocator)
610{
611    const VkLayerDispatchTable *disp;
612
613    disp = loader_get_dispatch(device);
614
615    disp->DestroyEvent(device, event, pAllocator);
616}
617
618LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetEventStatus(VkDevice device, VkEvent event)
619{
620    const VkLayerDispatchTable *disp;
621
622    disp = loader_get_dispatch(device);
623
624    return disp->GetEventStatus(device, event);
625}
626
627LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkSetEvent(VkDevice device, VkEvent event)
628{
629    const VkLayerDispatchTable *disp;
630
631    disp = loader_get_dispatch(device);
632
633    return disp->SetEvent(device, event);
634}
635
636LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetEvent(VkDevice device, VkEvent event)
637{
638    const VkLayerDispatchTable *disp;
639
640    disp = loader_get_dispatch(device);
641
642    return disp->ResetEvent(device, event);
643}
644
645LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkQueryPool* pQueryPool)
646{
647    const VkLayerDispatchTable *disp;
648
649    disp = loader_get_dispatch(device);
650
651    return disp->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
652}
653
654LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks* pAllocator)
655{
656    const VkLayerDispatchTable *disp;
657
658    disp = loader_get_dispatch(device);
659
660    disp->DestroyQueryPool(device, queryPool, pAllocator);
661}
662
663LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, size_t dataSize, void* pData, VkDeviceSize stride, VkQueryResultFlags flags)
664{
665    const VkLayerDispatchTable *disp;
666
667    disp = loader_get_dispatch(device);
668
669    return disp->GetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
670}
671
672LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateBuffer(VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBuffer* pBuffer)
673{
674    const VkLayerDispatchTable *disp;
675
676    disp = loader_get_dispatch(device);
677
678    return disp->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
679}
680
681LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks* pAllocator)
682{
683    const VkLayerDispatchTable *disp;
684
685    disp = loader_get_dispatch(device);
686
687    disp->DestroyBuffer(device, buffer, pAllocator);
688}
689
690LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBufferView* pView)
691{
692    const VkLayerDispatchTable *disp;
693
694    disp = loader_get_dispatch(device);
695
696    return disp->CreateBufferView(device, pCreateInfo, pAllocator, pView);
697}
698
699LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks* pAllocator)
700{
701    const VkLayerDispatchTable *disp;
702
703    disp = loader_get_dispatch(device);
704
705    disp->DestroyBufferView(device, bufferView, pAllocator);
706}
707
708LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImage* pImage)
709{
710    const VkLayerDispatchTable *disp;
711
712    disp = loader_get_dispatch(device);
713
714    return disp->CreateImage(device, pCreateInfo, pAllocator, pImage);
715}
716
717LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks* pAllocator)
718{
719    const VkLayerDispatchTable *disp;
720
721    disp = loader_get_dispatch(device);
722
723    disp->DestroyImage(device, image, pAllocator);
724}
725
726LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource* pSubresource, VkSubresourceLayout* pLayout)
727{
728    const VkLayerDispatchTable *disp;
729
730    disp = loader_get_dispatch(device);
731
732    disp->GetImageSubresourceLayout(device, image, pSubresource, pLayout);
733}
734
735LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImageView(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImageView* pView)
736{
737    const VkLayerDispatchTable *disp;
738
739    disp = loader_get_dispatch(device);
740
741    return disp->CreateImageView(device, pCreateInfo, pAllocator, pView);
742}
743
744LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks* pAllocator)
745{
746    const VkLayerDispatchTable *disp;
747
748    disp = loader_get_dispatch(device);
749
750    disp->DestroyImageView(device, imageView, pAllocator);
751}
752
753LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkShaderModule* pShader)
754{
755    const VkLayerDispatchTable *disp;
756
757    disp = loader_get_dispatch(device);
758
759    return disp->CreateShaderModule(device, pCreateInfo, pAllocator, pShader);
760}
761
762LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyShaderModule(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks* pAllocator)
763{
764    const VkLayerDispatchTable *disp;
765
766    disp = loader_get_dispatch(device);
767
768    disp->DestroyShaderModule(device, shaderModule, pAllocator);
769}
770
771LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineCache* pPipelineCache)
772{
773    const VkLayerDispatchTable *disp;
774
775    disp = loader_get_dispatch(device);
776
777    return disp->CreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
778}
779
780LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks* pAllocator)
781{
782    const VkLayerDispatchTable *disp;
783
784    disp = loader_get_dispatch(device);
785
786    disp->DestroyPipelineCache(device, pipelineCache, pAllocator);
787}
788
789LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t* pDataSize, void* pData)
790{
791    const VkLayerDispatchTable *disp;
792
793    disp = loader_get_dispatch(device);
794
795    return disp->GetPipelineCacheData(device, pipelineCache, pDataSize, pData);
796}
797
798LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkMergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache* pSrcCaches)
799{
800    const VkLayerDispatchTable *disp;
801
802    disp = loader_get_dispatch(device);
803
804    return disp->MergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
805}
806
807LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkGraphicsPipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines)
808{
809    const VkLayerDispatchTable *disp;
810
811    disp = loader_get_dispatch(device);
812
813    return disp->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
814}
815
816LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkComputePipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines)
817{
818    const VkLayerDispatchTable *disp;
819
820    disp = loader_get_dispatch(device);
821
822    return disp->CreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
823}
824
825LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks* pAllocator)
826{
827    const VkLayerDispatchTable *disp;
828
829    disp = loader_get_dispatch(device);
830
831    disp->DestroyPipeline(device, pipeline, pAllocator);
832}
833
834LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineLayout* pPipelineLayout)
835{
836    const VkLayerDispatchTable *disp;
837
838    disp = loader_get_dispatch(device);
839
840    return disp->CreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
841}
842
843LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks* pAllocator)
844{
845    const VkLayerDispatchTable *disp;
846
847    disp = loader_get_dispatch(device);
848
849    disp->DestroyPipelineLayout(device, pipelineLayout, pAllocator);
850}
851
852LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSampler(VkDevice device, const VkSamplerCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSampler* pSampler)
853{
854    const VkLayerDispatchTable *disp;
855
856    disp = loader_get_dispatch(device);
857
858    return disp->CreateSampler(device, pCreateInfo, pAllocator, pSampler);
859}
860
861LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks* pAllocator)
862{
863    const VkLayerDispatchTable *disp;
864
865    disp = loader_get_dispatch(device);
866
867    disp->DestroySampler(device, sampler, pAllocator);
868}
869
870
871LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorSetLayout* pSetLayout)
872{
873    const VkLayerDispatchTable *disp;
874
875    disp = loader_get_dispatch(device);
876
877    return disp->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout);
878}
879
880LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks* pAllocator)
881{
882    const VkLayerDispatchTable *disp;
883
884    disp = loader_get_dispatch(device);
885
886    disp->DestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
887}
888
889LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorPool* pDescriptorPool)
890{
891    const VkLayerDispatchTable *disp;
892
893    disp = loader_get_dispatch(device);
894
895    return disp->CreateDescriptorPool(device, pCreateInfo, pAllocator, pDescriptorPool);
896}
897
898LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks* pAllocator)
899{
900    const VkLayerDispatchTable *disp;
901
902    disp = loader_get_dispatch(device);
903
904    disp->DestroyDescriptorPool(device, descriptorPool, pAllocator);
905}
906
907
908LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags)
909{
910    const VkLayerDispatchTable *disp;
911
912    disp = loader_get_dispatch(device);
913
914    return disp->ResetDescriptorPool(device, descriptorPool, flags);
915}
916
917LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo* pAllocateInfo, VkDescriptorSet* pDescriptorSets)
918{
919    const VkLayerDispatchTable *disp;
920
921    disp = loader_get_dispatch(device);
922
923    return disp->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
924}
925
926LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount, const VkDescriptorSet* pDescriptorSets)
927{
928    const VkLayerDispatchTable *disp;
929
930    disp = loader_get_dispatch(device);
931
932    return disp->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
933}
934
935LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites, uint32_t descriptorCopyCount, const VkCopyDescriptorSet* pDescriptorCopies)
936{
937    const VkLayerDispatchTable *disp;
938
939    disp = loader_get_dispatch(device);
940
941    disp->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
942}
943
944LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkFramebuffer* pFramebuffer)
945{
946    const VkLayerDispatchTable *disp;
947
948    disp = loader_get_dispatch(device);
949
950    return disp->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
951}
952
953LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks* pAllocator)
954{
955    const VkLayerDispatchTable *disp;
956
957    disp = loader_get_dispatch(device);
958
959    disp->DestroyFramebuffer(device, framebuffer, pAllocator);
960}
961
962LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass)
963{
964    const VkLayerDispatchTable *disp;
965
966    disp = loader_get_dispatch(device);
967
968    return disp->CreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
969}
970
971LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks* pAllocator)
972{
973    const VkLayerDispatchTable *disp;
974
975    disp = loader_get_dispatch(device);
976
977    disp->DestroyRenderPass(device, renderPass, pAllocator);
978}
979
980LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkGetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D* pGranularity)
981{
982    const VkLayerDispatchTable *disp;
983
984    disp = loader_get_dispatch(device);
985
986    disp->GetRenderAreaGranularity(device, renderPass, pGranularity);
987}
988
989LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkCommandPool* pCommandPool)
990{
991    const VkLayerDispatchTable *disp;
992
993    disp = loader_get_dispatch(device);
994
995    return disp->CreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
996}
997
998LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks* pAllocator)
999{
1000    const VkLayerDispatchTable *disp;
1001
1002    disp = loader_get_dispatch(device);
1003
1004    disp->DestroyCommandPool(device, commandPool, pAllocator);
1005}
1006
1007LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags)
1008{
1009    const VkLayerDispatchTable *disp;
1010
1011    disp = loader_get_dispatch(device);
1012
1013    return disp->ResetCommandPool(device, commandPool, flags);
1014}
1015
1016LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateCommandBuffers(
1017        VkDevice device,
1018        const VkCommandBufferAllocateInfo* pAllocateInfo,
1019        VkCommandBuffer* pCommandBuffers)
1020{
1021    const VkLayerDispatchTable *disp;
1022    VkResult res;
1023
1024    disp = loader_get_dispatch(device);
1025
1026    res = disp->AllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
1027    if (res == VK_SUCCESS) {
1028        for (uint32_t i =0; i < pAllocateInfo->commandBufferCount; i++) {
1029            if (pCommandBuffers[i]) {
1030                loader_init_dispatch(pCommandBuffers[i], disp);
1031            }
1032        }
1033    }
1034
1035    return res;
1036}
1037
1038LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(
1039        VkDevice                                device,
1040        VkCommandPool                               commandPool,
1041        uint32_t                                commandBufferCount,
1042        const VkCommandBuffer*                      pCommandBuffers)
1043{
1044    const VkLayerDispatchTable *disp;
1045
1046    disp = loader_get_dispatch(device);
1047
1048    disp->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
1049}
1050
1051LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo* pBeginInfo)
1052{
1053    const VkLayerDispatchTable *disp;
1054
1055    disp = loader_get_dispatch(commandBuffer);
1056
1057    return disp->BeginCommandBuffer(commandBuffer, pBeginInfo);
1058}
1059
1060LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer(VkCommandBuffer commandBuffer)
1061{
1062    const VkLayerDispatchTable *disp;
1063
1064    disp = loader_get_dispatch(commandBuffer);
1065
1066    return disp->EndCommandBuffer(commandBuffer);
1067}
1068
1069LOADER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags)
1070{
1071    const VkLayerDispatchTable *disp;
1072
1073    disp = loader_get_dispatch(commandBuffer);
1074
1075    return disp->ResetCommandBuffer(commandBuffer, flags);
1076}
1077
1078LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline)
1079{
1080    const VkLayerDispatchTable *disp;
1081
1082    disp = loader_get_dispatch(commandBuffer);
1083
1084    disp->CmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
1085}
1086
1087LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport* pViewports)
1088{
1089    const VkLayerDispatchTable *disp;
1090
1091    disp = loader_get_dispatch(commandBuffer);
1092
1093    disp->CmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
1094}
1095
1096LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D* pScissors)
1097{
1098    const VkLayerDispatchTable *disp;
1099
1100    disp = loader_get_dispatch(commandBuffer);
1101
1102    disp->CmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
1103}
1104
1105LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth)
1106{
1107    const VkLayerDispatchTable *disp;
1108
1109    disp = loader_get_dispatch(commandBuffer);
1110
1111    disp->CmdSetLineWidth(commandBuffer, lineWidth);
1112}
1113
1114LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor)
1115{
1116    const VkLayerDispatchTable *disp;
1117
1118    disp = loader_get_dispatch(commandBuffer);
1119
1120    disp->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
1121}
1122
1123LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4])
1124{
1125    const VkLayerDispatchTable *disp;
1126
1127    disp = loader_get_dispatch(commandBuffer);
1128
1129    disp->CmdSetBlendConstants(commandBuffer, blendConstants);
1130}
1131
1132LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds)
1133{
1134    const VkLayerDispatchTable *disp;
1135
1136    disp = loader_get_dispatch(commandBuffer);
1137
1138    disp->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
1139}
1140
1141LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask)
1142{
1143    const VkLayerDispatchTable *disp;
1144
1145    disp = loader_get_dispatch(commandBuffer);
1146
1147    disp->CmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
1148}
1149
1150LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask)
1151{
1152    const VkLayerDispatchTable *disp;
1153
1154    disp = loader_get_dispatch(commandBuffer);
1155
1156    disp->CmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
1157}
1158
1159LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference)
1160{
1161    const VkLayerDispatchTable *disp;
1162
1163    disp = loader_get_dispatch(commandBuffer);
1164
1165    disp->CmdSetStencilReference(commandBuffer, faceMask, reference);
1166}
1167
1168LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet* pDescriptorSets, uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets)
1169{
1170    const VkLayerDispatchTable *disp;
1171
1172    disp = loader_get_dispatch(commandBuffer);
1173
1174    disp->CmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
1175}
1176
1177LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType)
1178{
1179    const VkLayerDispatchTable *disp;
1180
1181    disp = loader_get_dispatch(commandBuffer);
1182
1183    disp->CmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
1184}
1185
1186LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets)
1187{
1188    const VkLayerDispatchTable *disp;
1189
1190    disp = loader_get_dispatch(commandBuffer);
1191
1192    disp->CmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
1193}
1194
1195LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance)
1196{
1197    const VkLayerDispatchTable *disp;
1198
1199    disp = loader_get_dispatch(commandBuffer);
1200
1201    disp->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
1202}
1203
1204LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance)
1205{
1206    const VkLayerDispatchTable *disp;
1207
1208    disp = loader_get_dispatch(commandBuffer);
1209
1210    disp->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
1211}
1212
1213LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride)
1214{
1215    const VkLayerDispatchTable *disp;
1216
1217    disp = loader_get_dispatch(commandBuffer);
1218
1219    disp->CmdDrawIndirect(commandBuffer, buffer, offset, drawCount, stride);
1220}
1221
1222LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride)
1223{
1224    const VkLayerDispatchTable *disp;
1225
1226    disp = loader_get_dispatch(commandBuffer);
1227
1228    disp->CmdDrawIndexedIndirect(commandBuffer, buffer, offset, drawCount, stride);
1229}
1230
1231LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z)
1232{
1233    const VkLayerDispatchTable *disp;
1234
1235    disp = loader_get_dispatch(commandBuffer);
1236
1237    disp->CmdDispatch(commandBuffer, x, y, z);
1238}
1239
1240LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset)
1241{
1242    const VkLayerDispatchTable *disp;
1243
1244    disp = loader_get_dispatch(commandBuffer);
1245
1246    disp->CmdDispatchIndirect(commandBuffer, buffer, offset);
1247}
1248
1249LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferCopy* pRegions)
1250{
1251    const VkLayerDispatchTable *disp;
1252
1253    disp = loader_get_dispatch(commandBuffer);
1254
1255    disp->CmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
1256}
1257
1258LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy* pRegions)
1259{
1260    const VkLayerDispatchTable *disp;
1261
1262    disp = loader_get_dispatch(commandBuffer);
1263
1264    disp->CmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
1265}
1266
1267LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit* pRegions, VkFilter filter)
1268{
1269    const VkLayerDispatchTable *disp;
1270
1271    disp = loader_get_dispatch(commandBuffer);
1272
1273    disp->CmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
1274}
1275
1276LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy* pRegions)
1277{
1278    const VkLayerDispatchTable *disp;
1279
1280    disp = loader_get_dispatch(commandBuffer);
1281
1282    disp->CmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
1283}
1284
1285LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy* pRegions)
1286{
1287    const VkLayerDispatchTable *disp;
1288
1289    disp = loader_get_dispatch(commandBuffer);
1290
1291    disp->CmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
1292}
1293
1294LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const uint32_t* pData)
1295{
1296    const VkLayerDispatchTable *disp;
1297
1298    disp = loader_get_dispatch(commandBuffer);
1299
1300    disp->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
1301}
1302
1303LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data)
1304{
1305    const VkLayerDispatchTable *disp;
1306
1307    disp = loader_get_dispatch(commandBuffer);
1308
1309    disp->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
1310}
1311
1312LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges)
1313{
1314    const VkLayerDispatchTable *disp;
1315
1316    disp = loader_get_dispatch(commandBuffer);
1317
1318    disp->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
1319}
1320
1321LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue* pDepthStencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges)
1322{
1323    const VkLayerDispatchTable *disp;
1324
1325    disp = loader_get_dispatch(commandBuffer);
1326
1327    disp->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
1328}
1329
1330LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount, const VkClearAttachment* pAttachments, uint32_t rectCount, const VkClearRect* pRects)
1331{
1332    const VkLayerDispatchTable *disp;
1333
1334    disp = loader_get_dispatch(commandBuffer);
1335
1336    disp->CmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
1337}
1338
1339LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve* pRegions)
1340{
1341    const VkLayerDispatchTable *disp;
1342
1343    disp = loader_get_dispatch(commandBuffer);
1344
1345    disp->CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
1346}
1347
1348LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask)
1349{
1350    const VkLayerDispatchTable *disp;
1351
1352    disp = loader_get_dispatch(commandBuffer);
1353
1354    disp->CmdSetEvent(commandBuffer, event, stageMask);
1355}
1356
1357LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask)
1358{
1359    const VkLayerDispatchTable *disp;
1360
1361    disp = loader_get_dispatch(commandBuffer);
1362
1363    disp->CmdResetEvent(commandBuffer, event, stageMask);
1364}
1365
1366LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWaitEvents(
1367                                VkCommandBuffer commandBuffer,
1368                                uint32_t eventCount,
1369                                const VkEvent* pEvents,
1370                                VkPipelineStageFlags sourceStageMask,
1371                                VkPipelineStageFlags dstStageMask,
1372                                uint32_t memoryBarrierCount,
1373                                const VkMemoryBarrier* pMemoryBarriers,
1374                                uint32_t bufferMemoryBarrierCount,
1375                                const VkBufferMemoryBarrier* pBufferMemoryBarriers,
1376                                uint32_t imageMemoryBarrierCount,
1377                                const VkImageMemoryBarrier* pImageMemoryBarriers)
1378{
1379    const VkLayerDispatchTable *disp;
1380
1381    disp = loader_get_dispatch(commandBuffer);
1382
1383    disp->CmdWaitEvents(commandBuffer, eventCount, pEvents, sourceStageMask,
1384                        dstStageMask, memoryBarrierCount, pMemoryBarriers,
1385                        bufferMemoryBarrierCount, pBufferMemoryBarriers,
1386                        imageMemoryBarrierCount, pImageMemoryBarriers);
1387}
1388
1389LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPipelineBarrier(
1390                                VkCommandBuffer commandBuffer,
1391                                VkPipelineStageFlags srcStageMask,
1392                                VkPipelineStageFlags dstStageMask,
1393                                VkDependencyFlags dependencyFlags,
1394                                uint32_t memoryBarrierCount,
1395                                const VkMemoryBarrier* pMemoryBarriers,
1396                                uint32_t bufferMemoryBarrierCount,
1397                                const VkBufferMemoryBarrier* pBufferMemoryBarriers,
1398                                uint32_t imageMemoryBarrierCount,
1399                                const VkImageMemoryBarrier* pImageMemoryBarriers)
1400{
1401    const VkLayerDispatchTable *disp;
1402
1403    disp = loader_get_dispatch(commandBuffer);
1404
1405    disp->CmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask,
1406                             dependencyFlags, memoryBarrierCount, pMemoryBarriers,
1407                             bufferMemoryBarrierCount, pBufferMemoryBarriers,
1408                             imageMemoryBarrierCount, pImageMemoryBarriers);
1409}
1410
1411LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot, VkFlags flags)
1412{
1413    const VkLayerDispatchTable *disp;
1414
1415    disp = loader_get_dispatch(commandBuffer);
1416
1417    disp->CmdBeginQuery(commandBuffer, queryPool, slot, flags);
1418}
1419
1420LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot)
1421{
1422    const VkLayerDispatchTable *disp;
1423
1424    disp = loader_get_dispatch(commandBuffer);
1425
1426    disp->CmdEndQuery(commandBuffer, queryPool, slot);
1427}
1428
1429LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount)
1430{
1431    const VkLayerDispatchTable *disp;
1432
1433    disp = loader_get_dispatch(commandBuffer);
1434
1435    disp->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
1436}
1437
1438LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool, uint32_t slot)
1439{
1440    const VkLayerDispatchTable *disp;
1441
1442    disp = loader_get_dispatch(commandBuffer);
1443
1444    disp->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, slot);
1445}
1446
1447LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkFlags flags)
1448{
1449    const VkLayerDispatchTable *disp;
1450
1451    disp = loader_get_dispatch(commandBuffer);
1452
1453    disp->CmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
1454}
1455
1456LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size, const void* pValues)
1457{
1458    const VkLayerDispatchTable *disp;
1459
1460    disp = loader_get_dispatch(commandBuffer);
1461
1462    disp->CmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
1463}
1464
1465LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, VkSubpassContents contents)
1466{
1467    const VkLayerDispatchTable *disp;
1468
1469    disp = loader_get_dispatch(commandBuffer);
1470
1471    disp->CmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
1472}
1473
1474LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents)
1475{
1476    const VkLayerDispatchTable *disp;
1477
1478    disp = loader_get_dispatch(commandBuffer);
1479
1480    disp->CmdNextSubpass(commandBuffer, contents);
1481}
1482
1483LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass(VkCommandBuffer commandBuffer)
1484{
1485    const VkLayerDispatchTable *disp;
1486
1487    disp = loader_get_dispatch(commandBuffer);
1488
1489    disp->CmdEndRenderPass(commandBuffer);
1490}
1491
1492LOADER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBuffersCount, const VkCommandBuffer* pCommandBuffers)
1493{
1494    const VkLayerDispatchTable *disp;
1495
1496    disp = loader_get_dispatch(commandBuffer);
1497
1498    disp->CmdExecuteCommands(commandBuffer, commandBuffersCount, pCommandBuffers);
1499}
1500