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