Documentation
#include "loader.h"
#include "vulkan/vulkan_core.h"

VkInstance			instance;
VkDevice			device;
VkPhysicalDevice	physicalDevice;
uint				memory_idx[2];
VkQueue				queue;
VkCommandPool       transient_pool;

VkResult CreateInstance(
    const VkInstanceCreateInfo*                 pCreateInfo) {
        load_fn();
        VkResult result = vkCreateInstance(pCreateInfo, 0, &instance);
        load_instance_fn(instance);
        return result;
}

void SetPhysicalDevice(VkPhysicalDevice pdev) {
    physicalDevice = pdev;
}

VkResult CreateDevice(
    const VkDeviceCreateInfo*                   pCreateInfo) {
        VkResult result =  vkCreateDevice(physicalDevice, pCreateInfo, 0, &device);
        load_device_fn(device);
        return result;
}

void DestroyInstance() {
        vkDestroyInstance(instance, 0);
}

VkResult EnumeratePhysicalDevices(
    uint32_t*                                   pPhysicalDeviceCount,
    VkPhysicalDevice*                           pPhysicalDevices) {
        return vkEnumeratePhysicalDevices(instance, pPhysicalDeviceCount, pPhysicalDevices);
}

void GetPhysicalDeviceFeatures(
    VkPhysicalDeviceFeatures*                   pFeatures) {
        vkGetPhysicalDeviceFeatures(physicalDevice, pFeatures);
}

void GetPhysicalDeviceFormatProperties(
    VkFormat                                    format,
    VkFormatProperties*                         pFormatProperties) {
        vkGetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
}

VkResult GetPhysicalDeviceImageFormatProperties(
    VkFormat                                    format,
    VkImageType                                 type,
    VkImageTiling                               tiling,
    VkImageUsageFlags                           usage,
    VkImageCreateFlags                          flags,
    VkImageFormatProperties*                    pImageFormatProperties) {
        return vkGetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
}

void GetPhysicalDeviceProperties(
    VkPhysicalDeviceProperties*                 pProperties) {
        vkGetPhysicalDeviceProperties(physicalDevice, pProperties);
}

void GetPhysicalDeviceQueueFamilyProperties(
    uint32_t*                                   pQueueFamilyPropertyCount,
    VkQueueFamilyProperties*                    pQueueFamilyProperties) {
        vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
}

void GetPhysicalDeviceMemoryProperties(
    VkPhysicalDeviceMemoryProperties*           pMemoryProperties) {
        vkGetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
}

PFN_vkVoidFunction GetInstanceProcAddr(
    const char*                                 pName) {
        return vkGetInstanceProcAddr(instance, pName);
}

PFN_vkVoidFunction GetDeviceProcAddr(
    const char*                                 pName) {
        return vkGetDeviceProcAddr(device, pName);
}

void DestroyDevice() {
        vkDestroyDevice(device, 0);
}

VkResult EnumerateInstanceExtensionProperties(
    const char*                                 pLayerName,
    uint32_t*                                   pPropertyCount,
    VkExtensionProperties*                      pProperties) {
        return vkEnumerateInstanceExtensionProperties(pLayerName, pPropertyCount, pProperties);
}

VkResult EnumerateDeviceExtensionProperties(
    const char*                                 pLayerName,
    uint32_t*                                   pPropertyCount,
    VkExtensionProperties*                      pProperties) {
        return vkEnumerateDeviceExtensionProperties(physicalDevice, pLayerName, pPropertyCount, pProperties);
}

VkResult EnumerateInstanceLayerProperties(
    uint32_t*                                   pPropertyCount,
    VkLayerProperties*                          pProperties) {
        return vkEnumerateInstanceLayerProperties(pPropertyCount, pProperties);
}

VkResult EnumerateDeviceLayerProperties(
    uint32_t*                                   pPropertyCount,
    VkLayerProperties*                          pProperties) {
        return vkEnumerateDeviceLayerProperties(physicalDevice, pPropertyCount, pProperties);
}

void GetDeviceQueue(
    uint32_t                                    queueFamilyIndex,
    uint32_t                                    queueIndex,
    VkQueue*                                    pQueue) {
        vkGetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
}

void SetDeviceQueue(    
    uint32_t                                    queueFamilyIndex,
    uint32_t                                    queueIndex) {
    GetDeviceQueue(queueFamilyIndex, queueIndex, &queue);
}

VkResult QueueSubmit(
    uint32_t                                    submitCount,
    const VkSubmitInfo*                         pSubmits,
    VkFence                                     fence) {
        return vkQueueSubmit(queue, submitCount, pSubmits, fence);
}

VkResult QueueWaitIdle(
    VkQueue                                     queue) {
        return vkQueueWaitIdle(queue);
}

VkResult DeviceWaitIdle() {
        return vkDeviceWaitIdle(device);
}

VkResult AllocateMemory(
    const VkMemoryAllocateInfo*                 pAllocateInfo,
    VkDeviceMemory*                             pMemory) {
        return vkAllocateMemory(device, pAllocateInfo, 0, pMemory);
}

void FreeMemory(
    VkDeviceMemory                              memory) {
        vkFreeMemory(device, memory, 0);
}

VkResult MapMemory(
    VkDeviceMemory                              memory,
    VkDeviceSize                                offset,
    VkDeviceSize                                size,
    VkMemoryMapFlags                            flags,
    void**                                      ppData) {
        return vkMapMemory(device, memory, offset, size, flags, ppData);
}

void UnmapMemory(
    VkDeviceMemory                              memory) {
        vkUnmapMemory(device, memory);
}

VkResult FlushMappedMemoryRanges(
    uint32_t                                    memoryRangeCount,
    const VkMappedMemoryRange*                  pMemoryRanges) {
        return vkFlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
}

VkResult InvalidateMappedMemoryRanges(
    uint32_t                                    memoryRangeCount,
    const VkMappedMemoryRange*                  pMemoryRanges) {
        return vkInvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
}

void GetDeviceMemoryCommitment(
    VkDeviceMemory                              memory,
    VkDeviceSize*                               pCommittedMemoryInBytes) {
        vkGetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
}

VkResult BindBufferMemory(
    VkBuffer                                    buffer,
    VkDeviceMemory                              memory,
    VkDeviceSize                                memoryOffset) {
        return vkBindBufferMemory(device, buffer, memory, memoryOffset);
}

VkResult BindImageMemory(
    VkImage                                     image,
    VkDeviceMemory                              memory,
    VkDeviceSize                                memoryOffset) {
        return vkBindImageMemory(device, image, memory, memoryOffset);
}

void GetBufferMemoryRequirements(
    VkBuffer                                    buffer,
    VkMemoryRequirements*                       pMemoryRequirements) {
        vkGetBufferMemoryRequirements(device, buffer, pMemoryRequirements);
}

void GetImageMemoryRequirements(
    VkImage                                     image,
    VkMemoryRequirements*                       pMemoryRequirements) {
        vkGetImageMemoryRequirements(device, image, pMemoryRequirements);
}

void GetImageSparseMemoryRequirements(
    VkImage                                     image,
    uint32_t*                                   pSparseMemoryRequirementCount,
    VkSparseImageMemoryRequirements*            pSparseMemoryRequirements) {
        vkGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
}

void GetPhysicalDeviceSparseImageFormatProperties(
    VkFormat                                    format,
    VkImageType                                 type,
    VkSampleCountFlagBits                       samples,
    VkImageUsageFlags                           usage,
    VkImageTiling                               tiling,
    uint32_t*                                   pPropertyCount,
    VkSparseImageFormatProperties*              pProperties) {
        vkGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount, pProperties);
}

VkResult QueueBindSparse(
    VkQueue                                     queue,
    uint32_t                                    bindInfoCount,
    const VkBindSparseInfo*                     pBindInfo,
    VkFence                                     fence) {
        return vkQueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
}

VkResult CreateFence(
    const VkFenceCreateInfo*                    pCreateInfo,
    VkFence*                                    pFence) {
        return vkCreateFence(device, pCreateInfo, 0, pFence);
}

void DestroyFence(
    VkFence                                     fence) {
        vkDestroyFence(device, fence, 0);
}

VkResult ResetFences(
    uint32_t                                    fenceCount,
    const VkFence*                              pFences) {
        return vkResetFences(device, fenceCount, pFences);
}

VkResult GetFenceStatus(
    VkFence                                     fence) {
        return vkGetFenceStatus(device, fence);
}

VkResult WaitForFences(
    uint32_t                                    fenceCount,
    const VkFence*                              pFences,
    VkBool32                                    waitAll,
    uint64_t                                    timeout) {
        return vkWaitForFences(device, fenceCount, pFences, waitAll, timeout);
}

VkResult CreateSemaphore(
    const VkSemaphoreCreateInfo*                pCreateInfo,
    VkSemaphore*                                pSemaphore) {
        return vkCreateSemaphore(device, pCreateInfo, 0, pSemaphore);
}

void DestroySemaphore(
    VkSemaphore                                 semaphore) {
        vkDestroySemaphore(device, semaphore, 0);
}

VkResult CreateEvent(
    const VkEventCreateInfo*                    pCreateInfo,
    VkEvent*                                    pEvent) {
        return vkCreateEvent(device, pCreateInfo, 0, pEvent);
}

void DestroyEvent(
    VkEvent                                     event) {
        vkDestroyEvent(device, event, 0);
}

VkResult GetEventStatus(
    VkEvent                                     event) {
        return vkGetEventStatus(device, event);
}

VkResult SetEvent(
    VkEvent                                     event) {
        return vkSetEvent(device, event);
}

VkResult ResetEvent(
    VkEvent                                     event) {
        return vkResetEvent(device, event);
}

VkResult CreateQueryPool(
    const VkQueryPoolCreateInfo*                pCreateInfo,
    VkQueryPool*                                pQueryPool) {
        return vkCreateQueryPool(device, pCreateInfo, 0, pQueryPool);
}

void DestroyQueryPool(
    VkQueryPool                                 queryPool) {
        vkDestroyQueryPool(device, queryPool, 0);
}

VkResult GetQueryPoolResults(
    VkQueryPool                                 queryPool,
    uint32_t                                    firstQuery,
    uint32_t                                    queryCount,
    size_t                                      dataSize,
    void*                                       pData,
    VkDeviceSize                                stride,
    VkQueryResultFlags                          flags) {
        return vkGetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
}

VkResult CreateBuffer(
    const VkBufferCreateInfo*                   pCreateInfo,
    VkBuffer*                                   pBuffer) {
        return vkCreateBuffer(device, pCreateInfo, 0, pBuffer);
}

void DestroyBuffer(
    VkBuffer                                    buffer) {
        vkDestroyBuffer(device, buffer, 0);
}

VkResult CreateBufferView(
    const VkBufferViewCreateInfo*               pCreateInfo,
    VkBufferView*                               pView) {
        return vkCreateBufferView(device, pCreateInfo, 0, pView);
}

void DestroyBufferView(
    VkBufferView                                bufferView) {
        vkDestroyBufferView(device, bufferView, 0);
}

VkResult CreateImage(
    const VkImageCreateInfo*                    pCreateInfo,
    VkImage*                                    pImage) {
        return vkCreateImage(device, pCreateInfo, 0, pImage);
}

void DestroyImage(
    VkImage                                     image) {
        vkDestroyImage(device, image, 0);
}

void GetImageSubresourceLayout(
    VkImage                                     image,
    const VkImageSubresource*                   pSubresource,
    VkSubresourceLayout*                        pLayout) {
        vkGetImageSubresourceLayout(device, image, pSubresource, pLayout);
}

VkResult CreateImageView(
    const VkImageViewCreateInfo*                pCreateInfo,
    VkImageView*                                pView) {
        return vkCreateImageView(device, pCreateInfo, 0, pView);
}

void DestroyImageView(
    VkImageView                                 imageView) {
        vkDestroyImageView(device, imageView, 0);
}

VkResult CreateShaderModule(
    const VkShaderModuleCreateInfo*             pCreateInfo,
    VkShaderModule*                             pShaderModule) {
        return vkCreateShaderModule(device, pCreateInfo, 0, pShaderModule);
}

void DestroyShaderModule(
    VkShaderModule                              shaderModule) {
        vkDestroyShaderModule(device, shaderModule, 0);
}

VkResult CreatePipelineCache(
    const VkPipelineCacheCreateInfo*            pCreateInfo,
    VkPipelineCache*                            pPipelineCache) {
        return vkCreatePipelineCache(device, pCreateInfo, 0, pPipelineCache);
}

void DestroyPipelineCache(
    VkPipelineCache                             pipelineCache) {
        vkDestroyPipelineCache(device, pipelineCache, 0);
}

VkResult GetPipelineCacheData(
    VkPipelineCache                             pipelineCache,
    size_t*                                     pDataSize,
    void*                                       pData) {
        return vkGetPipelineCacheData(device, pipelineCache, pDataSize, pData);
}

VkResult MergePipelineCaches(
    VkPipelineCache                             dstCache,
    uint32_t                                    srcCacheCount,
    const VkPipelineCache*                      pSrcCaches) {
        return vkMergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
}

VkResult CreateGraphicsPipelines(
    VkPipelineCache                             pipelineCache,
    uint32_t                                    createInfoCount,
    const VkGraphicsPipelineCreateInfo*         pCreateInfos,
    VkPipeline*                                 pPipelines) {
        return vkCreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, 0, pPipelines);
}

VkResult CreateComputePipelines(
    VkPipelineCache                             pipelineCache,
    uint32_t                                    createInfoCount,
    const VkComputePipelineCreateInfo*          pCreateInfos,
    VkPipeline*                                 pPipelines) {
        return vkCreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, 0, pPipelines);
}

void DestroyPipeline(
    VkPipeline                                  pipeline) {
        vkDestroyPipeline(device, pipeline, 0);
}

VkResult CreatePipelineLayout(
    const VkPipelineLayoutCreateInfo*           pCreateInfo,
    VkPipelineLayout*                           pPipelineLayout) {
        return vkCreatePipelineLayout(device, pCreateInfo, 0, pPipelineLayout);
}

void DestroyPipelineLayout(
    VkPipelineLayout                            pipelineLayout) {
        vkDestroyPipelineLayout(device, pipelineLayout, 0);
}

VkResult CreateSampler(
    const VkSamplerCreateInfo*                  pCreateInfo,
    VkSampler*                                  pSampler) {
        return vkCreateSampler(device, pCreateInfo, 0, pSampler);
}

void DestroySampler(
    VkSampler                                   sampler) {
        vkDestroySampler(device, sampler, 0);
}

VkResult CreateDescriptorSetLayout(
    const VkDescriptorSetLayoutCreateInfo*      pCreateInfo,
    VkDescriptorSetLayout*                      pSetLayout) {
        return vkCreateDescriptorSetLayout(device, pCreateInfo, 0, pSetLayout);
}

void DestroyDescriptorSetLayout(
    VkDescriptorSetLayout                       descriptorSetLayout) {
        vkDestroyDescriptorSetLayout(device, descriptorSetLayout, 0);
}

VkResult CreateDescriptorPool(
    const VkDescriptorPoolCreateInfo*           pCreateInfo,
    VkDescriptorPool*                           pDescriptorPool) {
        return vkCreateDescriptorPool(device, pCreateInfo, 0, pDescriptorPool);
}

void DestroyDescriptorPool(
    VkDescriptorPool                            descriptorPool) {
        vkDestroyDescriptorPool(device, descriptorPool, 0);
}

VkResult ResetDescriptorPool(
    VkDescriptorPool                            descriptorPool,
    VkDescriptorPoolResetFlags                  flags) {
        return vkResetDescriptorPool(device, descriptorPool, flags);
}

VkResult AllocateDescriptorSets(
    const VkDescriptorSetAllocateInfo*          pAllocateInfo,
    VkDescriptorSet*                            pDescriptorSets) {
        return vkAllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
}

VkResult FreeDescriptorSets(
    VkDescriptorPool                            descriptorPool,
    uint32_t                                    descriptorSetCount,
    const VkDescriptorSet*                      pDescriptorSets) {
        return vkFreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets);
}

void UpdateDescriptorSets(
    uint32_t                                    descriptorWriteCount,
    const VkWriteDescriptorSet*                 pDescriptorWrites,
    uint32_t                                    descriptorCopyCount,
    const VkCopyDescriptorSet*                  pDescriptorCopies) {
        vkUpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies);
}

VkResult CreateFramebuffer(
    const VkFramebufferCreateInfo*              pCreateInfo,
    VkFramebuffer*                              pFramebuffer) {
        return vkCreateFramebuffer(device, pCreateInfo, 0, pFramebuffer);
}

void DestroyFramebuffer(
    VkFramebuffer                               framebuffer) {
        vkDestroyFramebuffer(device, framebuffer, 0);
}

VkResult CreateRenderPass(
    const VkRenderPassCreateInfo*               pCreateInfo,
    VkRenderPass*                               pRenderPass) {
        return vkCreateRenderPass(device, pCreateInfo, 0, pRenderPass);
}

void DestroyRenderPass(
    VkRenderPass                                renderPass) {
        vkDestroyRenderPass(device, renderPass, 0);
}

void GetRenderAreaGranularity(
    VkRenderPass                                renderPass,
    VkExtent2D*                                 pGranularity) {
        vkGetRenderAreaGranularity(device, renderPass, pGranularity);
}

VkResult CreateCommandPool(
    const VkCommandPoolCreateInfo*              pCreateInfo,
    VkCommandPool*                              pCommandPool) {
        return vkCreateCommandPool(device, pCreateInfo, 0, pCommandPool);
}

void DestroyCommandPool(
    VkCommandPool                               commandPool) {
        vkDestroyCommandPool(device, commandPool, 0);
}

VkResult ResetCommandPool(
    VkCommandPool                               commandPool,
    VkCommandPoolResetFlags                     flags) {
        return vkResetCommandPool(device, commandPool, flags);
}

VkResult AllocateCommandBuffers(
    const VkCommandBufferAllocateInfo*          pAllocateInfo,
    VkCommandBuffer*                            pCommandBuffers) {
        return vkAllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
}

void FreeCommandBuffers(
    VkCommandPool                               commandPool,
    uint32_t                                    commandBufferCount,
    const VkCommandBuffer*                      pCommandBuffers) {
        vkFreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
}

VkResult BeginCommandBuffer(
    VkCommandBuffer                             commandBuffer,
    const VkCommandBufferBeginInfo*             pBeginInfo) {
        return vkBeginCommandBuffer(commandBuffer, pBeginInfo);
}

VkResult EndCommandBuffer(
    VkCommandBuffer                             commandBuffer) {
        return vkEndCommandBuffer(commandBuffer);
}

VkResult ResetCommandBuffer(
    VkCommandBuffer                             commandBuffer,
    VkCommandBufferResetFlags                   flags) {
        return vkResetCommandBuffer(commandBuffer, flags);
}

void CmdBindPipeline(
    VkCommandBuffer                             commandBuffer,
    VkPipelineBindPoint                         pipelineBindPoint,
    VkPipeline                                  pipeline) {
        vkCmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
}

void CmdSetViewport(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    firstViewport,
    uint32_t                                    viewportCount,
    const VkViewport*                           pViewports) {
        vkCmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
}

void CmdSetScissor(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    firstScissor,
    uint32_t                                    scissorCount,
    const VkRect2D*                             pScissors) {
        vkCmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
}

void CmdSetLineWidth(
    VkCommandBuffer                             commandBuffer,
    float                                       lineWidth) {
        vkCmdSetLineWidth(commandBuffer, lineWidth);
}

void CmdSetDepthBias(
    VkCommandBuffer                             commandBuffer,
    float                                       depthBiasConstantFactor,
    float                                       depthBiasClamp,
    float                                       depthBiasSlopeFactor) {
        vkCmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
}

void CmdSetBlendConstants(
    VkCommandBuffer                             commandBuffer,
    const float                                 blendConstants[4]) {
        vkCmdSetBlendConstants(commandBuffer, blendConstants);
}

void CmdSetDepthBounds(
    VkCommandBuffer                             commandBuffer,
    float                                       minDepthBounds,
    float                                       maxDepthBounds) {
        vkCmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
}

void CmdSetStencilCompareMask(
    VkCommandBuffer                             commandBuffer,
    VkStencilFaceFlags                          faceMask,
    uint32_t                                    compareMask) {
        vkCmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
}

void CmdSetStencilWriteMask(
    VkCommandBuffer                             commandBuffer,
    VkStencilFaceFlags                          faceMask,
    uint32_t                                    writeMask) {
        vkCmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
}

void CmdSetStencilReference(
    VkCommandBuffer                             commandBuffer,
    VkStencilFaceFlags                          faceMask,
    uint32_t                                    reference) {
        vkCmdSetStencilReference(commandBuffer, faceMask, reference);
}

void CmdBindDescriptorSets(
    VkCommandBuffer                             commandBuffer,
    VkPipelineBindPoint                         pipelineBindPoint,
    VkPipelineLayout                            layout,
    uint32_t                                    firstSet,
    uint32_t                                    descriptorSetCount,
    const VkDescriptorSet*                      pDescriptorSets,
    uint32_t                                    dynamicOffsetCount,
    const uint32_t*                             pDynamicOffsets) {
        vkCmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
}

void CmdBindIndexBuffer(
    VkCommandBuffer                             commandBuffer,
    VkBuffer                                    buffer,
    VkDeviceSize                                offset,
    VkIndexType                                 indexType) {
        vkCmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
}

void CmdBindVertexBuffers(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    firstBinding,
    uint32_t                                    bindingCount,
    const VkBuffer*                             pBuffers,
    const VkDeviceSize*                         pOffsets) {
        vkCmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
}

void CmdDraw(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    vertexCount,
    uint32_t                                    instanceCount,
    uint32_t                                    firstVertex,
    uint32_t                                    firstInstance) {
        vkCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
}

void CmdDrawIndexed(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    indexCount,
    uint32_t                                    instanceCount,
    uint32_t                                    firstIndex,
    int32_t                                     vertexOffset,
    uint32_t                                    firstInstance) {
        vkCmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
}

void CmdDrawIndirect(
    VkCommandBuffer                             commandBuffer,
    VkBuffer                                    buffer,
    VkDeviceSize                                offset,
    uint32_t                                    drawCount,
    uint32_t                                    stride) {
        vkCmdDrawIndirect(commandBuffer, buffer, offset, drawCount, stride);
}

void CmdDrawIndexedIndirect(
    VkCommandBuffer                             commandBuffer,
    VkBuffer                                    buffer,
    VkDeviceSize                                offset,
    uint32_t                                    drawCount,
    uint32_t                                    stride) {
        vkCmdDrawIndexedIndirect(commandBuffer, buffer, offset, drawCount, stride);
}

void CmdDispatch(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    groupCountX,
    uint32_t                                    groupCountY,
    uint32_t                                    groupCountZ) {
        vkCmdDispatch(commandBuffer, groupCountX, groupCountY, groupCountZ);
}

void CmdDispatchIndirect(
    VkCommandBuffer                             commandBuffer,
    VkBuffer                                    buffer,
    VkDeviceSize                                offset) {
        vkCmdDispatchIndirect(commandBuffer, buffer, offset);
}

void CmdCopyBuffer(
    VkCommandBuffer                             commandBuffer,
    VkBuffer                                    srcBuffer,
    VkBuffer                                    dstBuffer,
    uint32_t                                    regionCount,
    const VkBufferCopy*                         pRegions) {
        vkCmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
}

void CmdCopyImage(
    VkCommandBuffer                             commandBuffer,
    VkImage                                     srcImage,
    VkImageLayout                               srcImageLayout,
    VkImage                                     dstImage,
    VkImageLayout                               dstImageLayout,
    uint32_t                                    regionCount,
    const VkImageCopy*                          pRegions) {
        vkCmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
}

void CmdBlitImage(
    VkCommandBuffer                             commandBuffer,
    VkImage                                     srcImage,
    VkImageLayout                               srcImageLayout,
    VkImage                                     dstImage,
    VkImageLayout                               dstImageLayout,
    uint32_t                                    regionCount,
    const VkImageBlit*                          pRegions,
    VkFilter                                    filter) {
        vkCmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
}

void CmdCopyBufferToImage(
    VkCommandBuffer                             commandBuffer,
    VkBuffer                                    srcBuffer,
    VkImage                                     dstImage,
    VkImageLayout                               dstImageLayout,
    uint32_t                                    regionCount,
    const VkBufferImageCopy*                    pRegions) {
        vkCmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
}

void CmdCopyImageToBuffer(
    VkCommandBuffer                             commandBuffer,
    VkImage                                     srcImage,
    VkImageLayout                               srcImageLayout,
    VkBuffer                                    dstBuffer,
    uint32_t                                    regionCount,
    const VkBufferImageCopy*                    pRegions) {
        vkCmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
}

void CmdUpdateBuffer(
    VkCommandBuffer                             commandBuffer,
    VkBuffer                                    dstBuffer,
    VkDeviceSize                                dstOffset,
    VkDeviceSize                                dataSize,
    const void*                                 pData) {
        vkCmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
}

void CmdFillBuffer(
    VkCommandBuffer                             commandBuffer,
    VkBuffer                                    dstBuffer,
    VkDeviceSize                                dstOffset,
    VkDeviceSize                                size,
    uint32_t                                    data) {
        vkCmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
}

void CmdClearColorImage(
    VkCommandBuffer                             commandBuffer,
    VkImage                                     image,
    VkImageLayout                               imageLayout,
    const VkClearColorValue*                    pColor,
    uint32_t                                    rangeCount,
    const VkImageSubresourceRange*              pRanges) {
        vkCmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
}

void CmdClearDepthStencilImage(
    VkCommandBuffer                             commandBuffer,
    VkImage                                     image,
    VkImageLayout                               imageLayout,
    const VkClearDepthStencilValue*             pDepthStencil,
    uint32_t                                    rangeCount,
    const VkImageSubresourceRange*              pRanges) {
        vkCmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
}

void CmdClearAttachments(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    attachmentCount,
    const VkClearAttachment*                    pAttachments,
    uint32_t                                    rectCount,
    const VkClearRect*                          pRects) {
        vkCmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
}

void CmdResolveImage(
    VkCommandBuffer                             commandBuffer,
    VkImage                                     srcImage,
    VkImageLayout                               srcImageLayout,
    VkImage                                     dstImage,
    VkImageLayout                               dstImageLayout,
    uint32_t                                    regionCount,
    const VkImageResolve*                       pRegions) {
        vkCmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
}

void CmdSetEvent(
    VkCommandBuffer                             commandBuffer,
    VkEvent                                     event,
    VkPipelineStageFlags                        stageMask) {
        vkCmdSetEvent(commandBuffer, event, stageMask);
}

void CmdResetEvent(
    VkCommandBuffer                             commandBuffer,
    VkEvent                                     event,
    VkPipelineStageFlags                        stageMask) {
        vkCmdResetEvent(commandBuffer, event, stageMask);
}

void CmdWaitEvents(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    eventCount,
    const VkEvent*                              pEvents,
    VkPipelineStageFlags                        srcStageMask,
    VkPipelineStageFlags                        dstStageMask,
    uint32_t                                    memoryBarrierCount,
    const VkMemoryBarrier*                      pMemoryBarriers,
    uint32_t                                    bufferMemoryBarrierCount,
    const VkBufferMemoryBarrier*                pBufferMemoryBarriers,
    uint32_t                                    imageMemoryBarrierCount,
    const VkImageMemoryBarrier*                 pImageMemoryBarriers) {
        vkCmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
}

void CmdPipelineBarrier(
    VkCommandBuffer                             commandBuffer,
    VkPipelineStageFlags                        srcStageMask,
    VkPipelineStageFlags                        dstStageMask,
    VkDependencyFlags                           dependencyFlags,
    uint32_t                                    memoryBarrierCount,
    const VkMemoryBarrier*                      pMemoryBarriers,
    uint32_t                                    bufferMemoryBarrierCount,
    const VkBufferMemoryBarrier*                pBufferMemoryBarriers,
    uint32_t                                    imageMemoryBarrierCount,
    const VkImageMemoryBarrier*                 pImageMemoryBarriers) {
        vkCmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
}

void CmdBeginQuery(
    VkCommandBuffer                             commandBuffer,
    VkQueryPool                                 queryPool,
    uint32_t                                    query,
    VkQueryControlFlags                         flags) {
        vkCmdBeginQuery(commandBuffer, queryPool, query, flags);
}

void CmdEndQuery(
    VkCommandBuffer                             commandBuffer,
    VkQueryPool                                 queryPool,
    uint32_t                                    query) {
        vkCmdEndQuery(commandBuffer, queryPool, query);
}

void CmdResetQueryPool(
    VkCommandBuffer                             commandBuffer,
    VkQueryPool                                 queryPool,
    uint32_t                                    firstQuery,
    uint32_t                                    queryCount) {
        vkCmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
}

void CmdWriteTimestamp(
    VkCommandBuffer                             commandBuffer,
    VkPipelineStageFlagBits                     pipelineStage,
    VkQueryPool                                 queryPool,
    uint32_t                                    query) {
        vkCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
}

void CmdCopyQueryPoolResults(
    VkCommandBuffer                             commandBuffer,
    VkQueryPool                                 queryPool,
    uint32_t                                    firstQuery,
    uint32_t                                    queryCount,
    VkBuffer                                    dstBuffer,
    VkDeviceSize                                dstOffset,
    VkDeviceSize                                stride,
    VkQueryResultFlags                          flags) {
        vkCmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
}

void CmdPushConstants(
    VkCommandBuffer                             commandBuffer,
    VkPipelineLayout                            layout,
    VkShaderStageFlags                          stageFlags,
    uint32_t                                    offset,
    uint32_t                                    size,
    const void*                                 pValues) {
        vkCmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
}

void CmdBeginRenderPass(
    VkCommandBuffer                             commandBuffer,
    const VkRenderPassBeginInfo*                pRenderPassBegin,
    VkSubpassContents                           contents) {
        vkCmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
}

void CmdNextSubpass(
    VkCommandBuffer                             commandBuffer,
    VkSubpassContents                           contents) {
        vkCmdNextSubpass(commandBuffer, contents);
}

void CmdEndRenderPass(
    VkCommandBuffer                             commandBuffer) {
        vkCmdEndRenderPass(commandBuffer);
}

void CmdExecuteCommands(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    commandBufferCount,
    const VkCommandBuffer*                      pCommandBuffers) {
        vkCmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
}

VkResult EnumerateInstanceVersion(
    uint32_t*                                   pApiVersion) {
        return vkEnumerateInstanceVersion(pApiVersion);
}

VkResult BindBufferMemory2(
    uint32_t                                    bindInfoCount,
    const VkBindBufferMemoryInfo*               pBindInfos) {
        return vkBindBufferMemory2(device, bindInfoCount, pBindInfos);
}

VkResult BindImageMemory2(
    uint32_t                                    bindInfoCount,
    const VkBindImageMemoryInfo*                pBindInfos) {
        return vkBindImageMemory2(device, bindInfoCount, pBindInfos);
}

void GetDeviceGroupPeerMemoryFeatures(
    uint32_t                                    heapIndex,
    uint32_t                                    localDeviceIndex,
    uint32_t                                    remoteDeviceIndex,
    VkPeerMemoryFeatureFlags*                   pPeerMemoryFeatures) {
        vkGetDeviceGroupPeerMemoryFeatures(device, heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures);
}

void CmdSetDeviceMask(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    deviceMask) {
        vkCmdSetDeviceMask(commandBuffer, deviceMask);
}

void CmdDispatchBase(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    baseGroupX,
    uint32_t                                    baseGroupY,
    uint32_t                                    baseGroupZ,
    uint32_t                                    groupCountX,
    uint32_t                                    groupCountY,
    uint32_t                                    groupCountZ) {
        return vkCmdDispatchBase(commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
}

VkResult EnumeratePhysicalDeviceGroups(
    uint32_t*                                   pPhysicalDeviceGroupCount,
    VkPhysicalDeviceGroupProperties*            pPhysicalDeviceGroupProperties) {
        return vkEnumeratePhysicalDeviceGroups(instance, pPhysicalDeviceGroupCount, pPhysicalDeviceGroupProperties);
}

void GetImageMemoryRequirements2(
    const VkImageMemoryRequirementsInfo2*       pInfo,
    VkMemoryRequirements2*                      pMemoryRequirements) {
        return vkGetImageMemoryRequirements2(device, pInfo, pMemoryRequirements);
}

void GetBufferMemoryRequirements2(
    const VkBufferMemoryRequirementsInfo2*      pInfo,
    VkMemoryRequirements2*                      pMemoryRequirements) {
        return vkGetBufferMemoryRequirements2(device, pInfo, pMemoryRequirements);
}

void GetImageSparseMemoryRequirements2(
    const VkImageSparseMemoryRequirementsInfo2* pInfo,
    uint32_t*                                   pSparseMemoryRequirementCount,
    VkSparseImageMemoryRequirements2*           pSparseMemoryRequirements) {
        return vkGetImageSparseMemoryRequirements2(device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
}

void GetPhysicalDeviceFeatures2(
    VkPhysicalDeviceFeatures2*                  pFeatures) {
        return vkGetPhysicalDeviceFeatures2(physicalDevice, pFeatures);
}

void GetPhysicalDeviceProperties2(
    VkPhysicalDeviceProperties2*                pProperties) {
        return vkGetPhysicalDeviceProperties2(physicalDevice, pProperties);
}

void GetPhysicalDeviceFormatProperties2(
    VkFormat                                    format,
    VkFormatProperties2*                        pFormatProperties) {
        return vkGetPhysicalDeviceFormatProperties2(physicalDevice, format, pFormatProperties);
}

VkResult GetPhysicalDeviceImageFormatProperties2(
    const VkPhysicalDeviceImageFormatInfo2*     pImageFormatInfo,
    VkImageFormatProperties2*                   pImageFormatProperties) {
        return vkGetPhysicalDeviceImageFormatProperties2(physicalDevice, pImageFormatInfo, pImageFormatProperties);
}

void GetPhysicalDeviceQueueFamilyProperties2(
    uint32_t*                                   pQueueFamilyPropertyCount,
    VkQueueFamilyProperties2*                   pQueueFamilyProperties) {
        return vkGetPhysicalDeviceQueueFamilyProperties2(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
}

void GetPhysicalDeviceMemoryProperties2(
    VkPhysicalDeviceMemoryProperties2*          pMemoryProperties) {
        return vkGetPhysicalDeviceMemoryProperties2(physicalDevice, pMemoryProperties);
}

void GetPhysicalDeviceSparseImageFormatProperties2(
    const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo,
    uint32_t*                                   pPropertyCount,
    VkSparseImageFormatProperties2*             pProperties) {
        return vkGetPhysicalDeviceSparseImageFormatProperties2(physicalDevice, pFormatInfo, pPropertyCount, pProperties);
}

void TrimCommandPool(
    VkCommandPool                               commandPool,
    VkCommandPoolTrimFlags                      flags) {
        return vkTrimCommandPool(device, commandPool, flags);
}

void GetDeviceQueue2(
    const VkDeviceQueueInfo2*                   pQueueInfo,
    VkQueue*                                    pQueue) {
        return vkGetDeviceQueue2(device, pQueueInfo, pQueue);
}

VkResult CreateSamplerYcbcrConversion(
    const VkSamplerYcbcrConversionCreateInfo*   pCreateInfo,
    VkSamplerYcbcrConversion*                   pYcbcrConversion) {
        return vkCreateSamplerYcbcrConversion(device, pCreateInfo, 0, pYcbcrConversion);
}

void DestroySamplerYcbcrConversion(
    VkSamplerYcbcrConversion                    ycbcrConversion) {
        return vkDestroySamplerYcbcrConversion(device, ycbcrConversion, 0);
}

VkResult CreateDescriptorUpdateTemplate(
    const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
    VkDescriptorUpdateTemplate*                 pDescriptorUpdateTemplate) {
        return vkCreateDescriptorUpdateTemplate(device, pCreateInfo, 0, pDescriptorUpdateTemplate);
}

void DestroyDescriptorUpdateTemplate(
    VkDescriptorUpdateTemplate                  descriptorUpdateTemplate) {
        return vkDestroyDescriptorUpdateTemplate(device, descriptorUpdateTemplate, 0);
}

void UpdateDescriptorSetWithTemplate(
    VkDescriptorSet                             descriptorSet,
    VkDescriptorUpdateTemplate                  descriptorUpdateTemplate,
    const void*                                 pData) {
        return vkUpdateDescriptorSetWithTemplate(device, descriptorSet, descriptorUpdateTemplate, pData);
}

void GetPhysicalDeviceExternalBufferProperties(
    const VkPhysicalDeviceExternalBufferInfo*   pExternalBufferInfo,
    VkExternalBufferProperties*                 pExternalBufferProperties) {
        return vkGetPhysicalDeviceExternalBufferProperties(physicalDevice, pExternalBufferInfo, pExternalBufferProperties);
}

void GetPhysicalDeviceExternalFenceProperties(
    const VkPhysicalDeviceExternalFenceInfo*    pExternalFenceInfo,
    VkExternalFenceProperties*                  pExternalFenceProperties) {
        return vkGetPhysicalDeviceExternalFenceProperties(physicalDevice, pExternalFenceInfo, pExternalFenceProperties);
}

void GetPhysicalDeviceExternalSemaphoreProperties(
    const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,
    VkExternalSemaphoreProperties*              pExternalSemaphoreProperties) {
        return vkGetPhysicalDeviceExternalSemaphoreProperties(physicalDevice, pExternalSemaphoreInfo, pExternalSemaphoreProperties);
}

void GetDescriptorSetLayoutSupport(
    const VkDescriptorSetLayoutCreateInfo*      pCreateInfo,
    VkDescriptorSetLayoutSupport*               pSupport) {
        return vkGetDescriptorSetLayoutSupport(device, pCreateInfo, pSupport);
}

void CmdDrawIndirectCount(
    VkCommandBuffer                             commandBuffer,
    VkBuffer                                    buffer,
    VkDeviceSize                                offset,
    VkBuffer                                    countBuffer,
    VkDeviceSize                                countBufferOffset,
    uint32_t                                    maxDrawCount,
    uint32_t                                    stride) {
        return vkCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
}

void CmdDrawIndexedIndirectCount(
    VkCommandBuffer                             commandBuffer,
    VkBuffer                                    buffer,
    VkDeviceSize                                offset,
    VkBuffer                                    countBuffer,
    VkDeviceSize                                countBufferOffset,
    uint32_t                                    maxDrawCount,
    uint32_t                                    stride) {
        return vkCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
}

VkResult CreateRenderPass2(
    const VkRenderPassCreateInfo2*              pCreateInfo,
    VkRenderPass*                               pRenderPass) {
        return vkCreateRenderPass2(device, pCreateInfo, 0, pRenderPass);
}

void CmdBeginRenderPass2(
    VkCommandBuffer                             commandBuffer,
    const VkRenderPassBeginInfo*                pRenderPassBegin,
    const VkSubpassBeginInfo*                   pSubpassBeginInfo) {
        return vkCmdBeginRenderPass2(commandBuffer, pRenderPassBegin, pSubpassBeginInfo);
}

void CmdNextSubpass2(
    VkCommandBuffer                             commandBuffer,
    const VkSubpassBeginInfo*                   pSubpassBeginInfo,
    const VkSubpassEndInfo*                     pSubpassEndInfo) {
        return vkCmdNextSubpass2(commandBuffer, pSubpassBeginInfo, pSubpassEndInfo);
}

void CmdEndRenderPass2(
    VkCommandBuffer                             commandBuffer,
    const VkSubpassEndInfo*                     pSubpassEndInfo) {
        return vkCmdEndRenderPass2(commandBuffer, pSubpassEndInfo);
}

void ResetQueryPool(
    VkQueryPool                                 queryPool,
    uint32_t                                    firstQuery,
    uint32_t                                    queryCount) {
        return vkResetQueryPool(device, queryPool, firstQuery, queryCount);
}

VkResult GetSemaphoreCounterValue(
    VkSemaphore                                 semaphore,
    uint64_t*                                   pValue) {
        return vkGetSemaphoreCounterValue(device, semaphore, pValue);
}

VkResult WaitSemaphores(
    const VkSemaphoreWaitInfo*                  pWaitInfo,
    uint64_t                                    timeout) {
        return vkWaitSemaphores(device, pWaitInfo, timeout);
}

VkResult SignalSemaphore(
    const VkSemaphoreSignalInfo*                pSignalInfo) {
        return vkSignalSemaphore(device, pSignalInfo);
}

VkDeviceAddress GetBufferDeviceAddress(
    const VkBufferDeviceAddressInfo*            pInfo) {
        return vkGetBufferDeviceAddress(device, pInfo);
}

uint64_t GetBufferOpaqueCaptureAddress(
    const VkBufferDeviceAddressInfo*            pInfo) {
        return vkGetBufferOpaqueCaptureAddress(device, pInfo);
}

uint64_t GetDeviceMemoryOpaqueCaptureAddress(
    const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo) {
        return vkGetDeviceMemoryOpaqueCaptureAddress(device, pInfo);
}

void DestroySurfaceKHR(
    VkSurfaceKHR                                surface) {
        return vkDestroySurfaceKHR(instance, surface, 0);
}

VkResult GetPhysicalDeviceSurfaceSupportKHR(
    uint32_t                                    queueFamilyIndex,
    VkSurfaceKHR                                surface,
    VkBool32*                                   pSupported) {
        return vkGetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
}

VkResult GetPhysicalDeviceSurfaceCapabilitiesKHR(
    VkSurfaceKHR                                surface,
    VkSurfaceCapabilitiesKHR*                   pSurfaceCapabilities) {
        return vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
}

VkResult GetPhysicalDeviceSurfaceFormatsKHR(
    VkSurfaceKHR                                surface,
    uint32_t*                                   pSurfaceFormatCount,
    VkSurfaceFormatKHR*                         pSurfaceFormats) {
        return vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
}

VkResult GetPhysicalDeviceSurfacePresentModesKHR(
    VkSurfaceKHR                                surface,
    uint32_t*                                   pPresentModeCount,
    VkPresentModeKHR*                           pPresentModes) {
        return vkGetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
}

VkResult CreateSwapchainKHR(
    const VkSwapchainCreateInfoKHR*             pCreateInfo,
    VkSwapchainKHR*                             pSwapchain) {
        return vkCreateSwapchainKHR(device, pCreateInfo, 0, pSwapchain);
}

void DestroySwapchainKHR(
    VkSwapchainKHR                              swapchain) {
        return vkDestroySwapchainKHR(device, swapchain, 0);
}

VkResult GetSwapchainImagesKHR(
    VkSwapchainKHR                              swapchain,
    uint32_t*                                   pSwapchainImageCount,
    VkImage*                                    pSwapchainImages) {
        return vkGetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
}

VkResult AcquireNextImageKHR(
    VkSwapchainKHR                              swapchain,
    uint64_t                                    timeout,
    VkSemaphore                                 semaphore,
    VkFence                                     fence,
    uint32_t*                                   pImageIndex) {
        return vkAcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
}

VkResult QueuePresentKHR(
    const VkPresentInfoKHR*                     pPresentInfo) {
        return vkQueuePresentKHR(queue, pPresentInfo);
}

VkResult GetDeviceGroupPresentCapabilitiesKHR(
    VkDeviceGroupPresentCapabilitiesKHR*        pDeviceGroupPresentCapabilities) {
        return vkGetDeviceGroupPresentCapabilitiesKHR(device, pDeviceGroupPresentCapabilities);
}

VkResult GetDeviceGroupSurfacePresentModesKHR(
    VkSurfaceKHR                                surface,
    VkDeviceGroupPresentModeFlagsKHR*           pModes) {
        return vkGetDeviceGroupSurfacePresentModesKHR(device, surface, pModes);
}

VkResult GetPhysicalDevicePresentRectanglesKHR(
    VkSurfaceKHR                                surface,
    uint32_t*                                   pRectCount,
    VkRect2D*                                   pRects) {
        return vkGetPhysicalDevicePresentRectanglesKHR(physicalDevice, surface, pRectCount, pRects);
}

VkResult AcquireNextImage2KHR(
    const VkAcquireNextImageInfoKHR*            pAcquireInfo,
    uint32_t*                                   pImageIndex) {
        return vkAcquireNextImage2KHR(device, pAcquireInfo, pImageIndex);
}

VkResult GetPhysicalDeviceDisplayPropertiesKHR(
    uint32_t*                                   pPropertyCount,
    VkDisplayPropertiesKHR*                     pProperties) {
        return vkGetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, pProperties);
}

VkResult GetPhysicalDeviceDisplayPlanePropertiesKHR(
    uint32_t*                                   pPropertyCount,
    VkDisplayPlanePropertiesKHR*                pProperties) {
        return vkGetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, pPropertyCount, pProperties);
}

VkResult GetDisplayPlaneSupportedDisplaysKHR(
    uint32_t                                    planeIndex,
    uint32_t*                                   pDisplayCount,
    VkDisplayKHR*                               pDisplays) {
        return vkGetDisplayPlaneSupportedDisplaysKHR(physicalDevice, planeIndex, pDisplayCount, pDisplays);
}

VkResult GetDisplayModePropertiesKHR(
    VkDisplayKHR                                display,
    uint32_t*                                   pPropertyCount,
    VkDisplayModePropertiesKHR*                 pProperties) {
        return vkGetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, pProperties);
}

VkResult CreateDisplayModeKHR(
    VkDisplayKHR                                display,
    const VkDisplayModeCreateInfoKHR*           pCreateInfo,
    VkDisplayModeKHR*                           pMode) {
        return vkCreateDisplayModeKHR(physicalDevice, display, pCreateInfo, 0, pMode);
}

VkResult GetDisplayPlaneCapabilitiesKHR(
    VkDisplayModeKHR                            mode,
    uint32_t                                    planeIndex,
    VkDisplayPlaneCapabilitiesKHR*              pCapabilities) {
        return vkGetDisplayPlaneCapabilitiesKHR(physicalDevice, mode, planeIndex, pCapabilities);
}

VkResult CreateDisplayPlaneSurfaceKHR(
    const VkDisplaySurfaceCreateInfoKHR*        pCreateInfo,
    VkSurfaceKHR*                               pSurface) {
        return vkCreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, 0, pSurface);
}

VkResult CreateSharedSwapchainsKHR(
    uint32_t                                    swapchainCount,
    const VkSwapchainCreateInfoKHR*             pCreateInfos,
    VkSwapchainKHR*                             pSwapchains) {
        return vkCreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, 0, pSwapchains);
}

void GetPhysicalDeviceFeatures2KHR(
    VkPhysicalDeviceFeatures2*                  pFeatures) {
        return vkGetPhysicalDeviceFeatures2KHR(physicalDevice, pFeatures);
}

void GetPhysicalDeviceProperties2KHR(
    VkPhysicalDeviceProperties2*                pProperties) {
        return vkGetPhysicalDeviceProperties2KHR(physicalDevice, pProperties);
}

void GetPhysicalDeviceFormatProperties2KHR(
    VkFormat                                    format,
    VkFormatProperties2*                        pFormatProperties) {
        return vkGetPhysicalDeviceFormatProperties2KHR(physicalDevice, format, pFormatProperties);
}

VkResult GetPhysicalDeviceImageFormatProperties2KHR(
    const VkPhysicalDeviceImageFormatInfo2*     pImageFormatInfo,
    VkImageFormatProperties2*                   pImageFormatProperties) {
        return vkGetPhysicalDeviceImageFormatProperties2KHR(physicalDevice, pImageFormatInfo, pImageFormatProperties);
}

void GetPhysicalDeviceQueueFamilyProperties2KHR(
    uint32_t*                                   pQueueFamilyPropertyCount,
    VkQueueFamilyProperties2*                   pQueueFamilyProperties) {
        return vkGetPhysicalDeviceQueueFamilyProperties2KHR(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
}

void GetPhysicalDeviceMemoryProperties2KHR(
    VkPhysicalDeviceMemoryProperties2*          pMemoryProperties) {
        return vkGetPhysicalDeviceMemoryProperties2KHR(physicalDevice, pMemoryProperties);
}

void GetPhysicalDeviceSparseImageFormatProperties2KHR(
    const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo,
    uint32_t*                                   pPropertyCount,
    VkSparseImageFormatProperties2*             pProperties) {
        return vkGetPhysicalDeviceSparseImageFormatProperties2KHR(physicalDevice, pFormatInfo, pPropertyCount, pProperties);
}

void GetDeviceGroupPeerMemoryFeaturesKHR(
    uint32_t                                    heapIndex,
    uint32_t                                    localDeviceIndex,
    uint32_t                                    remoteDeviceIndex,
    VkPeerMemoryFeatureFlags*                   pPeerMemoryFeatures) {
        return vkGetDeviceGroupPeerMemoryFeaturesKHR(device, heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures);
}

void CmdSetDeviceMaskKHR(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    deviceMask) {
        return vkCmdSetDeviceMaskKHR(commandBuffer, deviceMask);
}

void CmdDispatchBaseKHR(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    baseGroupX,
    uint32_t                                    baseGroupY,
    uint32_t                                    baseGroupZ,
    uint32_t                                    groupCountX,
    uint32_t                                    groupCountY,
    uint32_t                                    groupCountZ) {
        return vkCmdDispatchBaseKHR(commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
}

void TrimCommandPoolKHR(
    VkCommandPool                               commandPool,
    VkCommandPoolTrimFlags                      flags) {
        return vkTrimCommandPoolKHR(device, commandPool, flags);
}

VkResult EnumeratePhysicalDeviceGroupsKHR(
    uint32_t*                                   pPhysicalDeviceGroupCount,
    VkPhysicalDeviceGroupProperties*            pPhysicalDeviceGroupProperties) {
        return vkEnumeratePhysicalDeviceGroupsKHR(instance, pPhysicalDeviceGroupCount, pPhysicalDeviceGroupProperties);
}

void GetPhysicalDeviceExternalBufferPropertiesKHR(
    const VkPhysicalDeviceExternalBufferInfo*   pExternalBufferInfo,
    VkExternalBufferProperties*                 pExternalBufferProperties) {
        return vkGetPhysicalDeviceExternalBufferPropertiesKHR(physicalDevice, pExternalBufferInfo, pExternalBufferProperties);
}

VkResult GetMemoryFdKHR(
    const VkMemoryGetFdInfoKHR*                 pGetFdInfo,
    int*                                        pFd) {
        return vkGetMemoryFdKHR(device, pGetFdInfo, pFd);
}

VkResult GetMemoryFdPropertiesKHR(
    VkExternalMemoryHandleTypeFlagBits          handleType,
    int                                         fd,
    VkMemoryFdPropertiesKHR*                    pMemoryFdProperties) {
        return vkGetMemoryFdPropertiesKHR(device, handleType, fd, pMemoryFdProperties);
}

void GetPhysicalDeviceExternalSemaphorePropertiesKHR(
    const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,
    VkExternalSemaphoreProperties*              pExternalSemaphoreProperties) {
        return vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(physicalDevice, pExternalSemaphoreInfo, pExternalSemaphoreProperties);
}

VkResult ImportSemaphoreFdKHR(
    const VkImportSemaphoreFdInfoKHR*           pImportSemaphoreFdInfo) {
        return vkImportSemaphoreFdKHR(device, pImportSemaphoreFdInfo);
}

VkResult GetSemaphoreFdKHR(
    const VkSemaphoreGetFdInfoKHR*              pGetFdInfo,
    int*                                        pFd) {
        return vkGetSemaphoreFdKHR(device, pGetFdInfo, pFd);
}

void CmdPushDescriptorSetKHR(
    VkCommandBuffer                             commandBuffer,
    VkPipelineBindPoint                         pipelineBindPoint,
    VkPipelineLayout                            layout,
    uint32_t                                    set,
    uint32_t                                    descriptorWriteCount,
    const VkWriteDescriptorSet*                 pDescriptorWrites) {
        return vkCmdPushDescriptorSetKHR(commandBuffer, pipelineBindPoint, layout, set, descriptorWriteCount, pDescriptorWrites);
}

void CmdPushDescriptorSetWithTemplateKHR(
    VkCommandBuffer                             commandBuffer,
    VkDescriptorUpdateTemplate                  descriptorUpdateTemplate,
    VkPipelineLayout                            layout,
    uint32_t                                    set,
    const void*                                 pData) {
        return vkCmdPushDescriptorSetWithTemplateKHR(commandBuffer, descriptorUpdateTemplate, layout, set, pData);
}

VkResult CreateDescriptorUpdateTemplateKHR(
    const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
    VkDescriptorUpdateTemplate*                 pDescriptorUpdateTemplate) {
        return vkCreateDescriptorUpdateTemplateKHR(device, pCreateInfo, 0, pDescriptorUpdateTemplate);
}

void DestroyDescriptorUpdateTemplateKHR(
    VkDescriptorUpdateTemplate                  descriptorUpdateTemplate) {
        return vkDestroyDescriptorUpdateTemplateKHR(device, descriptorUpdateTemplate, 0);
}

void UpdateDescriptorSetWithTemplateKHR(
    VkDescriptorSet                             descriptorSet,
    VkDescriptorUpdateTemplate                  descriptorUpdateTemplate,
    const void*                                 pData) {
        return vkUpdateDescriptorSetWithTemplateKHR(device, descriptorSet, descriptorUpdateTemplate, pData);
}

VkResult CreateRenderPass2KHR(
    const VkRenderPassCreateInfo2*              pCreateInfo,
    VkRenderPass*                               pRenderPass) {
        return vkCreateRenderPass2KHR(device, pCreateInfo, 0, pRenderPass);
}

void CmdBeginRenderPass2KHR(
    VkCommandBuffer                             commandBuffer,
    const VkRenderPassBeginInfo*                pRenderPassBegin,
    const VkSubpassBeginInfo*                   pSubpassBeginInfo) {
        return vkCmdBeginRenderPass2KHR(commandBuffer, pRenderPassBegin, pSubpassBeginInfo);
}

void CmdNextSubpass2KHR(
    VkCommandBuffer                             commandBuffer,
    const VkSubpassBeginInfo*                   pSubpassBeginInfo,
    const VkSubpassEndInfo*                     pSubpassEndInfo) {
        return vkCmdNextSubpass2KHR(commandBuffer, pSubpassBeginInfo, pSubpassEndInfo);
}

void CmdEndRenderPass2KHR(
    VkCommandBuffer                             commandBuffer,
    const VkSubpassEndInfo*                     pSubpassEndInfo) {
        return vkCmdEndRenderPass2KHR(commandBuffer, pSubpassEndInfo);
}

VkResult GetSwapchainStatusKHR(
    VkSwapchainKHR                              swapchain) {
        return vkGetSwapchainStatusKHR(device, swapchain);
}

void GetPhysicalDeviceExternalFencePropertiesKHR(
    const VkPhysicalDeviceExternalFenceInfo*    pExternalFenceInfo,
    VkExternalFenceProperties*                  pExternalFenceProperties) {
        return vkGetPhysicalDeviceExternalFencePropertiesKHR(physicalDevice, pExternalFenceInfo, pExternalFenceProperties);
}

VkResult ImportFenceFdKHR(
    const VkImportFenceFdInfoKHR*               pImportFenceFdInfo) {
        return vkImportFenceFdKHR(device, pImportFenceFdInfo);
}

VkResult GetFenceFdKHR(
    const VkFenceGetFdInfoKHR*                  pGetFdInfo,
    int*                                        pFd) {
        return vkGetFenceFdKHR(device, pGetFdInfo, pFd);
}

VkResult EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
    uint32_t                                    queueFamilyIndex,
    uint32_t*                                   pCounterCount,
    VkPerformanceCounterKHR*                    pCounters,
    VkPerformanceCounterDescriptionKHR*         pCounterDescriptions) {
        return vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(physicalDevice, queueFamilyIndex, pCounterCount, pCounters, pCounterDescriptions);
}

void GetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(
    const VkQueryPoolPerformanceCreateInfoKHR*  pPerformanceQueryCreateInfo,
    uint32_t*                                   pNumPasses) {
        return vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(physicalDevice, pPerformanceQueryCreateInfo, pNumPasses);
}

VkResult AcquireProfilingLockKHR(
    const VkAcquireProfilingLockInfoKHR*        pInfo) {
        return vkAcquireProfilingLockKHR(device, pInfo);
}

void ReleaseProfilingLockKHR() {
        return vkReleaseProfilingLockKHR(device);
}

VkResult GetPhysicalDeviceSurfaceCapabilities2KHR(
    const VkPhysicalDeviceSurfaceInfo2KHR*      pSurfaceInfo,
    VkSurfaceCapabilities2KHR*                  pSurfaceCapabilities) {
        return vkGetPhysicalDeviceSurfaceCapabilities2KHR(physicalDevice, pSurfaceInfo, pSurfaceCapabilities);
}

VkResult GetPhysicalDeviceSurfaceFormats2KHR(
    const VkPhysicalDeviceSurfaceInfo2KHR*      pSurfaceInfo,
    uint32_t*                                   pSurfaceFormatCount,
    VkSurfaceFormat2KHR*                        pSurfaceFormats) {
        return vkGetPhysicalDeviceSurfaceFormats2KHR(physicalDevice, pSurfaceInfo, pSurfaceFormatCount, pSurfaceFormats);
}

VkResult GetPhysicalDeviceDisplayProperties2KHR(
    uint32_t*                                   pPropertyCount,
    VkDisplayProperties2KHR*                    pProperties) {
        return vkGetPhysicalDeviceDisplayProperties2KHR(physicalDevice, pPropertyCount, pProperties);
}

VkResult GetPhysicalDeviceDisplayPlaneProperties2KHR(
    uint32_t*                                   pPropertyCount,
    VkDisplayPlaneProperties2KHR*               pProperties) {
        return vkGetPhysicalDeviceDisplayPlaneProperties2KHR(physicalDevice, pPropertyCount, pProperties);
}

VkResult GetDisplayModeProperties2KHR(
    VkDisplayKHR                                display,
    uint32_t*                                   pPropertyCount,
    VkDisplayModeProperties2KHR*                pProperties) {
        return vkGetDisplayModeProperties2KHR(physicalDevice, display, pPropertyCount, pProperties);
}

VkResult GetDisplayPlaneCapabilities2KHR(
    const VkDisplayPlaneInfo2KHR*               pDisplayPlaneInfo,
    VkDisplayPlaneCapabilities2KHR*             pCapabilities) {
        return vkGetDisplayPlaneCapabilities2KHR(physicalDevice, pDisplayPlaneInfo, pCapabilities);
}

void GetImageMemoryRequirements2KHR(
    const VkImageMemoryRequirementsInfo2*       pInfo,
    VkMemoryRequirements2*                      pMemoryRequirements) {
        return vkGetImageMemoryRequirements2KHR(device, pInfo, pMemoryRequirements);
}

void GetBufferMemoryRequirements2KHR(
    const VkBufferMemoryRequirementsInfo2*      pInfo,
    VkMemoryRequirements2*                      pMemoryRequirements) {
        return vkGetBufferMemoryRequirements2KHR(device, pInfo, pMemoryRequirements);
}

void GetImageSparseMemoryRequirements2KHR(
    const VkImageSparseMemoryRequirementsInfo2* pInfo,
    uint32_t*                                   pSparseMemoryRequirementCount,
    VkSparseImageMemoryRequirements2*           pSparseMemoryRequirements) {
        return vkGetImageSparseMemoryRequirements2KHR(device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
}

VkResult CreateSamplerYcbcrConversionKHR(
    const VkSamplerYcbcrConversionCreateInfo*   pCreateInfo,
    VkSamplerYcbcrConversion*                   pYcbcrConversion) {
        return vkCreateSamplerYcbcrConversionKHR(device, pCreateInfo, 0, pYcbcrConversion);
}

void DestroySamplerYcbcrConversionKHR(
    VkSamplerYcbcrConversion                    ycbcrConversion) {
        return vkDestroySamplerYcbcrConversionKHR(device, ycbcrConversion, 0);
}

VkResult BindBufferMemory2KHR(
    uint32_t                                    bindInfoCount,
    const VkBindBufferMemoryInfo*               pBindInfos) {
        return vkBindBufferMemory2KHR(device, bindInfoCount, pBindInfos);
}

VkResult BindImageMemory2KHR(
    uint32_t                                    bindInfoCount,
    const VkBindImageMemoryInfo*                pBindInfos) {
        return vkBindImageMemory2KHR(device, bindInfoCount, pBindInfos);
}

void GetDescriptorSetLayoutSupportKHR(
    const VkDescriptorSetLayoutCreateInfo*      pCreateInfo,
    VkDescriptorSetLayoutSupport*               pSupport) {
        return vkGetDescriptorSetLayoutSupportKHR(device, pCreateInfo, pSupport);
}

void CmdDrawIndirectCountKHR(
    VkCommandBuffer                             commandBuffer,
    VkBuffer                                    buffer,
    VkDeviceSize                                offset,
    VkBuffer                                    countBuffer,
    VkDeviceSize                                countBufferOffset,
    uint32_t                                    maxDrawCount,
    uint32_t                                    stride) {
        return vkCmdDrawIndirectCountKHR(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
}

void CmdDrawIndexedIndirectCountKHR(
    VkCommandBuffer                             commandBuffer,
    VkBuffer                                    buffer,
    VkDeviceSize                                offset,
    VkBuffer                                    countBuffer,
    VkDeviceSize                                countBufferOffset,
    uint32_t                                    maxDrawCount,
    uint32_t                                    stride) {
        return vkCmdDrawIndexedIndirectCountKHR(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
}

VkResult GetSemaphoreCounterValueKHR(
    VkSemaphore                                 semaphore,
    uint64_t*                                   pValue) {
        return vkGetSemaphoreCounterValueKHR(device, semaphore, pValue);
}

VkResult WaitSemaphoresKHR(
    const VkSemaphoreWaitInfo*                  pWaitInfo,
    uint64_t                                    timeout) {
        return vkWaitSemaphoresKHR(device, pWaitInfo, timeout);
}

VkResult SignalSemaphoreKHR(
    const VkSemaphoreSignalInfo*                pSignalInfo) {
        return vkSignalSemaphoreKHR(device, pSignalInfo);
}

VkDeviceAddress GetBufferDeviceAddressKHR(
    const VkBufferDeviceAddressInfo*            pInfo) {
        return vkGetBufferDeviceAddressKHR(device, pInfo);
}

uint64_t GetBufferOpaqueCaptureAddressKHR(
    const VkBufferDeviceAddressInfo*            pInfo) {
        return vkGetBufferOpaqueCaptureAddressKHR(device, pInfo);
}

uint64_t GetDeviceMemoryOpaqueCaptureAddressKHR(
    const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo) {
        return vkGetDeviceMemoryOpaqueCaptureAddressKHR(device, pInfo);
}

VkResult GetPipelineExecutablePropertiesKHR(
    const VkPipelineInfoKHR*                    pPipelineInfo,
    uint32_t*                                   pExecutableCount,
    VkPipelineExecutablePropertiesKHR*          pProperties) {
        return vkGetPipelineExecutablePropertiesKHR(device, pPipelineInfo, pExecutableCount, pProperties);
}

VkResult GetPipelineExecutableStatisticsKHR(
    const VkPipelineExecutableInfoKHR*          pExecutableInfo,
    uint32_t*                                   pStatisticCount,
    VkPipelineExecutableStatisticKHR*           pStatistics) {
        return vkGetPipelineExecutableStatisticsKHR(device, pExecutableInfo, pStatisticCount, pStatistics);
}

VkResult GetPipelineExecutableInternalRepresentationsKHR(
    const VkPipelineExecutableInfoKHR*          pExecutableInfo,
    uint32_t*                                   pInternalRepresentationCount,
    VkPipelineExecutableInternalRepresentationKHR* pInternalRepresentations) {
        return vkGetPipelineExecutableInternalRepresentationsKHR(device, pExecutableInfo, pInternalRepresentationCount, pInternalRepresentations);
}

VkResult CreateDebugReportCallbackEXT(
    const VkDebugReportCallbackCreateInfoEXT*   pCreateInfo,
    VkDebugReportCallbackEXT*                   pCallback) {
        return vkCreateDebugReportCallbackEXT(instance, pCreateInfo, 0, pCallback);
}

void DestroyDebugReportCallbackEXT(
    VkDebugReportCallbackEXT                    callback) {
        return vkDestroyDebugReportCallbackEXT(instance, callback, 0);
}

void DebugReportMessageEXT(
    VkDebugReportFlagsEXT                       flags,
    VkDebugReportObjectTypeEXT                  objectType,
    uint64_t                                    object,
    size_t                                      location,
    int32_t                                     messageCode,
    const char*                                 pLayerPrefix,
    const char*                                 pMessage) {
        return vkDebugReportMessageEXT(instance, flags, objectType, object, location, messageCode, pLayerPrefix, pMessage);
}

VkResult DebugMarkerSetObjectTagEXT(
    const VkDebugMarkerObjectTagInfoEXT*        pTagInfo) {
        return vkDebugMarkerSetObjectTagEXT(device, pTagInfo);
}

VkResult DebugMarkerSetObjectNameEXT(
    const VkDebugMarkerObjectNameInfoEXT*       pNameInfo) {
        return vkDebugMarkerSetObjectNameEXT(device, pNameInfo);
}

void CmdDebugMarkerBeginEXT(
    VkCommandBuffer                             commandBuffer,
    const VkDebugMarkerMarkerInfoEXT*           pMarkerInfo) {
        return vkCmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
}

void CmdDebugMarkerEndEXT(
    VkCommandBuffer                             commandBuffer) {
        return vkCmdDebugMarkerEndEXT(commandBuffer);
}

void CmdDebugMarkerInsertEXT(
    VkCommandBuffer                             commandBuffer,
    const VkDebugMarkerMarkerInfoEXT*           pMarkerInfo) {
        return vkCmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
}

void CmdBindTransformFeedbackBuffersEXT(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    firstBinding,
    uint32_t                                    bindingCount,
    const VkBuffer*                             pBuffers,
    const VkDeviceSize*                         pOffsets,
    const VkDeviceSize*                         pSizes) {
        return vkCmdBindTransformFeedbackBuffersEXT(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes);
}

void CmdBeginTransformFeedbackEXT(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    firstCounterBuffer,
    uint32_t                                    counterBufferCount,
    const VkBuffer*                             pCounterBuffers,
    const VkDeviceSize*                         pCounterBufferOffsets) {
        return vkCmdBeginTransformFeedbackEXT(commandBuffer, firstCounterBuffer, counterBufferCount, pCounterBuffers, pCounterBufferOffsets);
}

void CmdEndTransformFeedbackEXT(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    firstCounterBuffer,
    uint32_t                                    counterBufferCount,
    const VkBuffer*                             pCounterBuffers,
    const VkDeviceSize*                         pCounterBufferOffsets) {
        return vkCmdEndTransformFeedbackEXT(commandBuffer, firstCounterBuffer, counterBufferCount, pCounterBuffers, pCounterBufferOffsets);
}

void CmdBeginQueryIndexedEXT(
    VkCommandBuffer                             commandBuffer,
    VkQueryPool                                 queryPool,
    uint32_t                                    query,
    VkQueryControlFlags                         flags,
    uint32_t                                    index) {
        return vkCmdBeginQueryIndexedEXT(commandBuffer, queryPool, query, flags, index);
}

void CmdEndQueryIndexedEXT(
    VkCommandBuffer                             commandBuffer,
    VkQueryPool                                 queryPool,
    uint32_t                                    query,
    uint32_t                                    index) {
        return vkCmdEndQueryIndexedEXT(commandBuffer, queryPool, query, index);
}

void CmdDrawIndirectByteCountEXT(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    instanceCount,
    uint32_t                                    firstInstance,
    VkBuffer                                    counterBuffer,
    VkDeviceSize                                counterBufferOffset,
    uint32_t                                    counterOffset,
    uint32_t                                    vertexStride) {
        return vkCmdDrawIndirectByteCountEXT(commandBuffer, instanceCount, firstInstance, counterBuffer, counterBufferOffset, counterOffset, vertexStride);
}

uint32_t GetImageViewHandleNVX(
    const VkImageViewHandleInfoNVX*             pInfo) {
        return vkGetImageViewHandleNVX(device, pInfo);
}

VkResult GetImageViewAddressNVX(
    VkImageView                                 imageView,
    VkImageViewAddressPropertiesNVX*            pProperties) {
        return vkGetImageViewAddressNVX(device, imageView, pProperties);
}

void CmdDrawIndirectCountAMD(
    VkCommandBuffer                             commandBuffer,
    VkBuffer                                    buffer,
    VkDeviceSize                                offset,
    VkBuffer                                    countBuffer,
    VkDeviceSize                                countBufferOffset,
    uint32_t                                    maxDrawCount,
    uint32_t                                    stride) {
        return vkCmdDrawIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
}

void CmdDrawIndexedIndirectCountAMD(
    VkCommandBuffer                             commandBuffer,
    VkBuffer                                    buffer,
    VkDeviceSize                                offset,
    VkBuffer                                    countBuffer,
    VkDeviceSize                                countBufferOffset,
    uint32_t                                    maxDrawCount,
    uint32_t                                    stride) {
        return vkCmdDrawIndexedIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
}

VkResult GetShaderInfoAMD(
    VkPipeline                                  pipeline,
    VkShaderStageFlagBits                       shaderStage,
    VkShaderInfoTypeAMD                         infoType,
    size_t*                                     pInfoSize,
    void*                                       pInfo) {
        return vkGetShaderInfoAMD(device, pipeline, shaderStage, infoType, pInfoSize, pInfo);
}

VkResult GetPhysicalDeviceExternalImageFormatPropertiesNV(
    VkFormat                                    format,
    VkImageType                                 type,
    VkImageTiling                               tiling,
    VkImageUsageFlags                           usage,
    VkImageCreateFlags                          flags,
    VkExternalMemoryHandleTypeFlagsNV           externalHandleType,
    VkExternalImageFormatPropertiesNV*          pExternalImageFormatProperties) {
        return vkGetPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
}

void CmdBeginConditionalRenderingEXT(
    VkCommandBuffer                             commandBuffer,
    const VkConditionalRenderingBeginInfoEXT*   pConditionalRenderingBegin) {
        return vkCmdBeginConditionalRenderingEXT(commandBuffer, pConditionalRenderingBegin);
}

void CmdEndConditionalRenderingEXT(
    VkCommandBuffer                             commandBuffer) {
        return vkCmdEndConditionalRenderingEXT(commandBuffer);
}

void CmdSetViewportWScalingNV(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    firstViewport,
    uint32_t                                    viewportCount,
    const VkViewportWScalingNV*                 pViewportWScalings) {
        return vkCmdSetViewportWScalingNV(commandBuffer, firstViewport, viewportCount, pViewportWScalings);
}

VkResult ReleaseDisplayEXT(
    VkDisplayKHR                                display) {
        return vkReleaseDisplayEXT(physicalDevice, display);
}

VkResult GetPhysicalDeviceSurfaceCapabilities2EXT(
    VkSurfaceKHR                                surface,
    VkSurfaceCapabilities2EXT*                  pSurfaceCapabilities) {
        return vkGetPhysicalDeviceSurfaceCapabilities2EXT(physicalDevice, surface, pSurfaceCapabilities);
}

VkResult DisplayPowerControlEXT(
    VkDisplayKHR                                display,
    const VkDisplayPowerInfoEXT*                pDisplayPowerInfo) {
        return vkDisplayPowerControlEXT(device, display, pDisplayPowerInfo);
}

VkResult RegisterDeviceEventEXT(
    const VkDeviceEventInfoEXT*                 pDeviceEventInfo,
    VkFence*                                    pFence) {
        return vkRegisterDeviceEventEXT(device, pDeviceEventInfo, 0, pFence);
}

VkResult RegisterDisplayEventEXT(
    VkDisplayKHR                                display,
    const VkDisplayEventInfoEXT*                pDisplayEventInfo,
    VkFence*                                    pFence) {
        return vkRegisterDisplayEventEXT(device, display, pDisplayEventInfo, 0, pFence);
}

VkResult GetSwapchainCounterEXT(
    VkSwapchainKHR                              swapchain,
    VkSurfaceCounterFlagBitsEXT                 counter,
    uint64_t*                                   pCounterValue) {
        return vkGetSwapchainCounterEXT(device, swapchain, counter, pCounterValue);
}

VkResult GetRefreshCycleDurationGOOGLE(
    VkSwapchainKHR                              swapchain,
    VkRefreshCycleDurationGOOGLE*               pDisplayTimingProperties) {
        return vkGetRefreshCycleDurationGOOGLE(device, swapchain, pDisplayTimingProperties);
}

VkResult GetPastPresentationTimingGOOGLE(
    VkSwapchainKHR                              swapchain,
    uint32_t*                                   pPresentationTimingCount,
    VkPastPresentationTimingGOOGLE*             pPresentationTimings) {
        return vkGetPastPresentationTimingGOOGLE(device, swapchain, pPresentationTimingCount, pPresentationTimings);
}

void CmdSetDiscardRectangleEXT(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    firstDiscardRectangle,
    uint32_t                                    discardRectangleCount,
    const VkRect2D*                             pDiscardRectangles) {
        return vkCmdSetDiscardRectangleEXT(commandBuffer, firstDiscardRectangle, discardRectangleCount, pDiscardRectangles);
}

void SetHdrMetadataEXT(
    uint32_t                                    swapchainCount,
    const VkSwapchainKHR*                       pSwapchains,
    const VkHdrMetadataEXT*                     pMetadata) {
        return vkSetHdrMetadataEXT(device, swapchainCount, pSwapchains, pMetadata);
}

VkResult SetDebugUtilsObjectNameEXT(
    const VkDebugUtilsObjectNameInfoEXT*        pNameInfo) {
        return vkSetDebugUtilsObjectNameEXT(device, pNameInfo);
}

VkResult SetDebugUtilsObjectTagEXT(
    const VkDebugUtilsObjectTagInfoEXT*         pTagInfo) {
        return vkSetDebugUtilsObjectTagEXT(device, pTagInfo);
}

void QueueBeginDebugUtilsLabelEXT(
    VkQueue                                     queue,
    const VkDebugUtilsLabelEXT*                 pLabelInfo) {
        return vkQueueBeginDebugUtilsLabelEXT(queue, pLabelInfo);
}

void QueueEndDebugUtilsLabelEXT(
    VkQueue                                     queue) {
        return vkQueueEndDebugUtilsLabelEXT(queue);
}

void QueueInsertDebugUtilsLabelEXT(
    VkQueue                                     queue,
    const VkDebugUtilsLabelEXT*                 pLabelInfo) {
        return vkQueueInsertDebugUtilsLabelEXT(queue, pLabelInfo);
}

void CmdBeginDebugUtilsLabelEXT(
    VkCommandBuffer                             commandBuffer,
    const VkDebugUtilsLabelEXT*                 pLabelInfo) {
        return vkCmdBeginDebugUtilsLabelEXT(commandBuffer, pLabelInfo);
}

void CmdEndDebugUtilsLabelEXT(
    VkCommandBuffer                             commandBuffer) {
        return vkCmdEndDebugUtilsLabelEXT(commandBuffer);
}

void CmdInsertDebugUtilsLabelEXT(
    VkCommandBuffer                             commandBuffer,
    const VkDebugUtilsLabelEXT*                 pLabelInfo) {
        return vkCmdInsertDebugUtilsLabelEXT(commandBuffer, pLabelInfo);
}

VkResult CreateDebugUtilsMessengerEXT(
    const VkDebugUtilsMessengerCreateInfoEXT*   pCreateInfo,
    VkDebugUtilsMessengerEXT*                   pMessenger) {
        return vkCreateDebugUtilsMessengerEXT(instance, pCreateInfo, 0, pMessenger);
}

void DestroyDebugUtilsMessengerEXT(
    VkDebugUtilsMessengerEXT                    messenger) {
        return vkDestroyDebugUtilsMessengerEXT(instance, messenger, 0);
}

void SubmitDebugUtilsMessageEXT(
    VkDebugUtilsMessageSeverityFlagBitsEXT      messageSeverity,
    VkDebugUtilsMessageTypeFlagsEXT             messageTypes,
    const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData) {
        return vkSubmitDebugUtilsMessageEXT(instance, messageSeverity, messageTypes, pCallbackData);
}

void CmdSetSampleLocationsEXT(
    VkCommandBuffer                             commandBuffer,
    const VkSampleLocationsInfoEXT*             pSampleLocationsInfo) {
        return vkCmdSetSampleLocationsEXT(commandBuffer, pSampleLocationsInfo);
}

void GetPhysicalDeviceMultisamplePropertiesEXT(
    VkSampleCountFlagBits                       samples,
    VkMultisamplePropertiesEXT*                 pMultisampleProperties) {
        return vkGetPhysicalDeviceMultisamplePropertiesEXT(physicalDevice, samples, pMultisampleProperties);
}

VkResult GetImageDrmFormatModifierPropertiesEXT(
    VkImage                                     image,
    VkImageDrmFormatModifierPropertiesEXT*      pProperties) {
        return vkGetImageDrmFormatModifierPropertiesEXT(device, image, pProperties);
}

VkResult CreateValidationCacheEXT(
    const VkValidationCacheCreateInfoEXT*       pCreateInfo,
    VkValidationCacheEXT*                       pValidationCache) {
        return vkCreateValidationCacheEXT(device, pCreateInfo, 0, pValidationCache);
}

void DestroyValidationCacheEXT(
    VkValidationCacheEXT                        validationCache) {
        return vkDestroyValidationCacheEXT(device, validationCache, 0);
}

VkResult MergeValidationCachesEXT(
    VkValidationCacheEXT                        dstCache,
    uint32_t                                    srcCacheCount,
    const VkValidationCacheEXT*                 pSrcCaches) {
        return vkMergeValidationCachesEXT(device, dstCache, srcCacheCount, pSrcCaches);
}

VkResult GetValidationCacheDataEXT(
    VkValidationCacheEXT                        validationCache,
    size_t*                                     pDataSize,
    void*                                       pData) {
        return vkGetValidationCacheDataEXT(device, validationCache, pDataSize, pData);
}

void CmdBindShadingRateImageNV(
    VkCommandBuffer                             commandBuffer,
    VkImageView                                 imageView,
    VkImageLayout                               imageLayout) {
        return vkCmdBindShadingRateImageNV(commandBuffer, imageView, imageLayout);
}

void CmdSetViewportShadingRatePaletteNV(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    firstViewport,
    uint32_t                                    viewportCount,
    const VkShadingRatePaletteNV*               pShadingRatePalettes) {
        return vkCmdSetViewportShadingRatePaletteNV(commandBuffer, firstViewport, viewportCount, pShadingRatePalettes);
}

void CmdSetCoarseSampleOrderNV(
    VkCommandBuffer                             commandBuffer,
    VkCoarseSampleOrderTypeNV                   sampleOrderType,
    uint32_t                                    customSampleOrderCount,
    const VkCoarseSampleOrderCustomNV*          pCustomSampleOrders) {
        return vkCmdSetCoarseSampleOrderNV(commandBuffer, sampleOrderType, customSampleOrderCount, pCustomSampleOrders);
}

VkResult CreateAccelerationStructureNV(
    const VkAccelerationStructureCreateInfoNV*  pCreateInfo,
    VkAccelerationStructureNV*                  pAccelerationStructure) {
        return vkCreateAccelerationStructureNV(device, pCreateInfo, 0, pAccelerationStructure);
}

void DestroyAccelerationStructureKHR(
    VkAccelerationStructureKHR                  accelerationStructure) {
        return vkDestroyAccelerationStructureKHR(device, accelerationStructure, 0);
}

void DestroyAccelerationStructureNV(
    VkAccelerationStructureKHR                  accelerationStructure) {
        return vkDestroyAccelerationStructureNV(device, accelerationStructure, 0);
}

void GetAccelerationStructureMemoryRequirementsNV(
    const VkAccelerationStructureMemoryRequirementsInfoNV* pInfo,
    VkMemoryRequirements2KHR*                   pMemoryRequirements) {
        return vkGetAccelerationStructureMemoryRequirementsNV(device, pInfo, pMemoryRequirements);
}

VkResult BindAccelerationStructureMemoryKHR(
    uint32_t                                    bindInfoCount,
    const VkBindAccelerationStructureMemoryInfoKHR* pBindInfos) {
        return vkBindAccelerationStructureMemoryKHR(device, bindInfoCount, pBindInfos);
}

VkResult BindAccelerationStructureMemoryNV(
    uint32_t                                    bindInfoCount,
    const VkBindAccelerationStructureMemoryInfoKHR* pBindInfos) {
        return vkBindAccelerationStructureMemoryNV(device, bindInfoCount, pBindInfos);
}

void CmdBuildAccelerationStructureNV(
    VkCommandBuffer                             commandBuffer,
    const VkAccelerationStructureInfoNV*        pInfo,
    VkBuffer                                    instanceData,
    VkDeviceSize                                instanceOffset,
    VkBool32                                    update,
    VkAccelerationStructureKHR                  dst,
    VkAccelerationStructureKHR                  src,
    VkBuffer                                    scratch,
    VkDeviceSize                                scratchOffset) {
        return vkCmdBuildAccelerationStructureNV(commandBuffer, pInfo, instanceData, instanceOffset, update, dst, src, scratch, scratchOffset);
}

void CmdCopyAccelerationStructureNV(
    VkCommandBuffer                             commandBuffer,
    VkAccelerationStructureKHR                  dst,
    VkAccelerationStructureKHR                  src,
    VkCopyAccelerationStructureModeKHR          mode) {
        return vkCmdCopyAccelerationStructureNV(commandBuffer, dst, src, mode);
}

void CmdTraceRaysNV(
    VkCommandBuffer                             commandBuffer,
    VkBuffer                                    raygenShaderBindingTableBuffer,
    VkDeviceSize                                raygenShaderBindingOffset,
    VkBuffer                                    missShaderBindingTableBuffer,
    VkDeviceSize                                missShaderBindingOffset,
    VkDeviceSize                                missShaderBindingStride,
    VkBuffer                                    hitShaderBindingTableBuffer,
    VkDeviceSize                                hitShaderBindingOffset,
    VkDeviceSize                                hitShaderBindingStride,
    VkBuffer                                    callableShaderBindingTableBuffer,
    VkDeviceSize                                callableShaderBindingOffset,
    VkDeviceSize                                callableShaderBindingStride,
    uint32_t                                    width,
    uint32_t                                    height,
    uint32_t                                    depth) {
        return vkCmdTraceRaysNV(commandBuffer, raygenShaderBindingTableBuffer, raygenShaderBindingOffset, missShaderBindingTableBuffer, missShaderBindingOffset, missShaderBindingStride, hitShaderBindingTableBuffer, hitShaderBindingOffset, hitShaderBindingStride, callableShaderBindingTableBuffer, callableShaderBindingOffset, callableShaderBindingStride, width, height, depth);
}

VkResult CreateRayTracingPipelinesNV(
    VkPipelineCache                             pipelineCache,
    uint32_t                                    createInfoCount,
    const VkRayTracingPipelineCreateInfoNV*     pCreateInfos,
    VkPipeline*                                 pPipelines) {
        return vkCreateRayTracingPipelinesNV(device, pipelineCache, createInfoCount, pCreateInfos, 0, pPipelines);
}

VkResult GetRayTracingShaderGroupHandlesKHR(
    VkPipeline                                  pipeline,
    uint32_t                                    firstGroup,
    uint32_t                                    groupCount,
    size_t                                      dataSize,
    void*                                       pData) {
        return vkGetRayTracingShaderGroupHandlesKHR(device, pipeline, firstGroup, groupCount, dataSize, pData);
}

VkResult GetRayTracingShaderGroupHandlesNV(
    VkPipeline                                  pipeline,
    uint32_t                                    firstGroup,
    uint32_t                                    groupCount,
    size_t                                      dataSize,
    void*                                       pData) {
        return vkGetRayTracingShaderGroupHandlesNV(device, pipeline, firstGroup, groupCount, dataSize, pData);
}

VkResult GetAccelerationStructureHandleNV(
    VkAccelerationStructureKHR                  accelerationStructure,
    size_t                                      dataSize,
    void*                                       pData) {
        return vkGetAccelerationStructureHandleNV(device, accelerationStructure, dataSize, pData);
}

void CmdWriteAccelerationStructuresPropertiesKHR(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    accelerationStructureCount,
    const VkAccelerationStructureKHR*           pAccelerationStructures,
    VkQueryType                                 queryType,
    VkQueryPool                                 queryPool,
    uint32_t                                    firstQuery) {
        return vkCmdWriteAccelerationStructuresPropertiesKHR(commandBuffer, accelerationStructureCount, pAccelerationStructures, queryType, queryPool, firstQuery);
}

void CmdWriteAccelerationStructuresPropertiesNV(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    accelerationStructureCount,
    const VkAccelerationStructureKHR*           pAccelerationStructures,
    VkQueryType                                 queryType,
    VkQueryPool                                 queryPool,
    uint32_t                                    firstQuery) {
        return vkCmdWriteAccelerationStructuresPropertiesNV(commandBuffer, accelerationStructureCount, pAccelerationStructures, queryType, queryPool, firstQuery);
}

VkResult CompileDeferredNV(
    VkPipeline                                  pipeline,
    uint32_t                                    shader) {
        return vkCompileDeferredNV(device, pipeline, shader);
}

VkResult GetMemoryHostPointerPropertiesEXT(
    VkExternalMemoryHandleTypeFlagBits          handleType,
    const void*                                 pHostPointer,
    VkMemoryHostPointerPropertiesEXT*           pMemoryHostPointerProperties) {
        return vkGetMemoryHostPointerPropertiesEXT(device, handleType, pHostPointer, pMemoryHostPointerProperties);
}

void CmdWriteBufferMarkerAMD(
    VkCommandBuffer                             commandBuffer,
    VkPipelineStageFlagBits                     pipelineStage,
    VkBuffer                                    dstBuffer,
    VkDeviceSize                                dstOffset,
    uint32_t                                    marker) {
        return vkCmdWriteBufferMarkerAMD(commandBuffer, pipelineStage, dstBuffer, dstOffset, marker);
}

VkResult GetPhysicalDeviceCalibrateableTimeDomainsEXT(
    uint32_t*                                   pTimeDomainCount,
    VkTimeDomainEXT*                            pTimeDomains) {
        return vkGetPhysicalDeviceCalibrateableTimeDomainsEXT(physicalDevice, pTimeDomainCount, pTimeDomains);
}

VkResult GetCalibratedTimestampsEXT(
    uint32_t                                    timestampCount,
    const VkCalibratedTimestampInfoEXT*         pTimestampInfos,
    uint64_t*                                   pTimestamps,
    uint64_t*                                   pMaxDeviation) {
        return vkGetCalibratedTimestampsEXT(device, timestampCount, pTimestampInfos, pTimestamps, pMaxDeviation);
}

void CmdDrawMeshTasksNV(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    taskCount,
    uint32_t                                    firstTask) {
        return vkCmdDrawMeshTasksNV(commandBuffer, taskCount, firstTask);
}

void CmdDrawMeshTasksIndirectNV(
    VkCommandBuffer                             commandBuffer,
    VkBuffer                                    buffer,
    VkDeviceSize                                offset,
    uint32_t                                    drawCount,
    uint32_t                                    stride) {
        return vkCmdDrawMeshTasksIndirectNV(commandBuffer, buffer, offset, drawCount, stride);
}

void CmdDrawMeshTasksIndirectCountNV(
    VkCommandBuffer                             commandBuffer,
    VkBuffer                                    buffer,
    VkDeviceSize                                offset,
    VkBuffer                                    countBuffer,
    VkDeviceSize                                countBufferOffset,
    uint32_t                                    maxDrawCount,
    uint32_t                                    stride) {
        return vkCmdDrawMeshTasksIndirectCountNV(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
}

void CmdSetExclusiveScissorNV(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    firstExclusiveScissor,
    uint32_t                                    exclusiveScissorCount,
    const VkRect2D*                             pExclusiveScissors) {
        return vkCmdSetExclusiveScissorNV(commandBuffer, firstExclusiveScissor, exclusiveScissorCount, pExclusiveScissors);
}

void CmdSetCheckpointNV(
    VkCommandBuffer                             commandBuffer,
    const void*                                 pCheckpointMarker) {
        return vkCmdSetCheckpointNV(commandBuffer, pCheckpointMarker);
}

void GetQueueCheckpointDataNV(
    VkQueue                                     queue,
    uint32_t*                                   pCheckpointDataCount,
    VkCheckpointDataNV*                         pCheckpointData) {
        return vkGetQueueCheckpointDataNV(queue, pCheckpointDataCount, pCheckpointData);
}

VkResult InitializePerformanceApiINTEL(
    const VkInitializePerformanceApiInfoINTEL*  pInitializeInfo) {
        return vkInitializePerformanceApiINTEL(device, pInitializeInfo);
}

void UninitializePerformanceApiINTEL() {
        return vkUninitializePerformanceApiINTEL(device);
}

VkResult CmdSetPerformanceMarkerINTEL(
    VkCommandBuffer                             commandBuffer,
    const VkPerformanceMarkerInfoINTEL*         pMarkerInfo) {
        return vkCmdSetPerformanceMarkerINTEL(commandBuffer, pMarkerInfo);
}

VkResult CmdSetPerformanceStreamMarkerINTEL(
    VkCommandBuffer                             commandBuffer,
    const VkPerformanceStreamMarkerInfoINTEL*   pMarkerInfo) {
        return vkCmdSetPerformanceStreamMarkerINTEL(commandBuffer, pMarkerInfo);
}

VkResult CmdSetPerformanceOverrideINTEL(
    VkCommandBuffer                             commandBuffer,
    const VkPerformanceOverrideInfoINTEL*       pOverrideInfo) {
        return vkCmdSetPerformanceOverrideINTEL(commandBuffer, pOverrideInfo);
}

VkResult AcquirePerformanceConfigurationINTEL(
    const VkPerformanceConfigurationAcquireInfoINTEL* pAcquireInfo,
    VkPerformanceConfigurationINTEL*            pConfiguration) {
        return vkAcquirePerformanceConfigurationINTEL(device, pAcquireInfo, pConfiguration);
}

VkResult ReleasePerformanceConfigurationINTEL(
    VkPerformanceConfigurationINTEL             configuration) {
        return vkReleasePerformanceConfigurationINTEL(device, configuration);
}

VkResult QueueSetPerformanceConfigurationINTEL(
    VkQueue                                     queue,
    VkPerformanceConfigurationINTEL             configuration) {
        return vkQueueSetPerformanceConfigurationINTEL(queue, configuration);
}

VkResult GetPerformanceParameterINTEL(
    VkPerformanceParameterTypeINTEL             parameter,
    VkPerformanceValueINTEL*                    pValue) {
        return vkGetPerformanceParameterINTEL(device, parameter, pValue);
}

void SetLocalDimmingAMD(
    VkSwapchainKHR                              swapChain,
    VkBool32                                    localDimmingEnable) {
        return vkSetLocalDimmingAMD(device, swapChain, localDimmingEnable);
}

VkDeviceAddress GetBufferDeviceAddressEXT(
    const VkBufferDeviceAddressInfo*            pInfo) {
        return vkGetBufferDeviceAddressEXT(device, pInfo);
}

VkResult GetPhysicalDeviceToolPropertiesEXT(
    uint32_t*                                   pToolCount,
    VkPhysicalDeviceToolPropertiesEXT*          pToolProperties) {
        return vkGetPhysicalDeviceToolPropertiesEXT(physicalDevice, pToolCount, pToolProperties);
}

VkResult GetPhysicalDeviceCooperativeMatrixPropertiesNV(
    uint32_t*                                   pPropertyCount,
    VkCooperativeMatrixPropertiesNV*            pProperties) {
        return vkGetPhysicalDeviceCooperativeMatrixPropertiesNV(physicalDevice, pPropertyCount, pProperties);
}

VkResult GetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(
    uint32_t*                                   pCombinationCount,
    VkFramebufferMixedSamplesCombinationNV*     pCombinations) {
        return vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(physicalDevice, pCombinationCount, pCombinations);
}

VkResult CreateHeadlessSurfaceEXT(
    const VkHeadlessSurfaceCreateInfoEXT*       pCreateInfo,
    VkSurfaceKHR*                               pSurface) {
        return vkCreateHeadlessSurfaceEXT(instance, pCreateInfo, 0, pSurface);
}

void CmdSetLineStippleEXT(
    VkCommandBuffer                             commandBuffer,
    uint32_t                                    lineStippleFactor,
    uint16_t                                    lineStipplePattern) {
        return vkCmdSetLineStippleEXT(commandBuffer, lineStippleFactor, lineStipplePattern);
}

void ResetQueryPoolEXT(
    VkQueryPool                                 queryPool,
    uint32_t                                    firstQuery,
    uint32_t                                    queryCount) {
        return vkResetQueryPoolEXT(device, queryPool, firstQuery, queryCount);
}

void GetGeneratedCommandsMemoryRequirementsNV(
    const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo,
    VkMemoryRequirements2*                      pMemoryRequirements) {
        return vkGetGeneratedCommandsMemoryRequirementsNV(device, pInfo, pMemoryRequirements);
}

void CmdPreprocessGeneratedCommandsNV(
    VkCommandBuffer                             commandBuffer,
    const VkGeneratedCommandsInfoNV*            pGeneratedCommandsInfo) {
        return vkCmdPreprocessGeneratedCommandsNV(commandBuffer, pGeneratedCommandsInfo);
}

void CmdExecuteGeneratedCommandsNV(
    VkCommandBuffer                             commandBuffer,
    VkBool32                                    isPreprocessed,
    const VkGeneratedCommandsInfoNV*            pGeneratedCommandsInfo) {
        return vkCmdExecuteGeneratedCommandsNV(commandBuffer, isPreprocessed, pGeneratedCommandsInfo);
}

void CmdBindPipelineShaderGroupNV(
    VkCommandBuffer                             commandBuffer,
    VkPipelineBindPoint                         pipelineBindPoint,
    VkPipeline                                  pipeline,
    uint32_t                                    groupIndex) {
        return vkCmdBindPipelineShaderGroupNV(commandBuffer, pipelineBindPoint, pipeline, groupIndex);
}

VkResult CreateIndirectCommandsLayoutNV(
    const VkIndirectCommandsLayoutCreateInfoNV* pCreateInfo,
    VkIndirectCommandsLayoutNV*                 pIndirectCommandsLayout) {
        return vkCreateIndirectCommandsLayoutNV(device, pCreateInfo, 0, pIndirectCommandsLayout);
}

void DestroyIndirectCommandsLayoutNV(
    VkIndirectCommandsLayoutNV                  indirectCommandsLayout) {
        return vkDestroyIndirectCommandsLayoutNV(device, indirectCommandsLayout, 0);
}

VkResult CreatePrivateDataSlotEXT(
    const VkPrivateDataSlotCreateInfoEXT*       pCreateInfo,
    VkPrivateDataSlotEXT*                       pPrivateDataSlot) {
        return vkCreatePrivateDataSlotEXT(device, pCreateInfo, 0, pPrivateDataSlot);
}

void DestroyPrivateDataSlotEXT(
    VkPrivateDataSlotEXT                        privateDataSlot) {
        return vkDestroyPrivateDataSlotEXT(device, privateDataSlot, 0);
}

VkResult SetPrivateDataEXT(
    VkObjectType                                objectType,
    uint64_t                                    objectHandle,
    VkPrivateDataSlotEXT                        privateDataSlot,
    uint64_t                                    data) {
        return vkSetPrivateDataEXT(device, objectType, objectHandle, privateDataSlot, data);
}

void GetPrivateDataEXT(
    VkObjectType                                objectType,
    uint64_t                                    objectHandle,
    VkPrivateDataSlotEXT                        privateDataSlot,
    uint64_t*                                   pData) {
        return vkGetPrivateDataEXT(device, objectType, objectHandle, privateDataSlot, pData);
}

#include "stdio.h"
void InitVulkanSimple(const char* surface_extension)
{
    printf("Surface extension is %s\n", surface_extension);
	load_fn();

    const char* extensions[] = { "VK_KHR_surface", surface_extension };
    const char* layers[] = { "VK_LAYER_KHRONOS_validation" };
    const char* device_ext[] = { "VK_KHR_swapchain" };

	VkApplicationInfo appinfo = { 0 };
    appinfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
	appinfo.engineVersion = VK_MAKE_VERSION(1, 2, 0);
	appinfo.applicationVersion = VK_MAKE_VERSION(1, 2, 0);
	appinfo.apiVersion = VK_MAKE_VERSION(1, 2, 0);

	VkInstanceCreateInfo info = { 0 };
    info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
	info.pApplicationInfo = &appinfo;
	info.pNext = 0;
	info.enabledLayerCount = sizeof(layers) / sizeof(char*);
	info.ppEnabledLayerNames = layers;
	info.enabledExtensionCount = sizeof(extensions) / sizeof(char*);
	info.ppEnabledExtensionNames = extensions;

	VkResult res = vkCreateInstance(&info, 0, &instance);
	printf("Instance created %d\n", res);
	load_instance_fn(instance);

	VkPhysicalDevice devices[16];
	uint count;
	vkEnumeratePhysicalDevices(instance, &count, 0);
	vkEnumeratePhysicalDevices(instance, &count, devices);

	physicalDevice = devices[0];
	for (uint i = 0; i < count; ++i)
	{
		VkPhysicalDeviceProperties props;
		vkGetPhysicalDeviceProperties(devices[i], &props);
		if (props.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU)
		{
			physicalDevice = devices[i];
		}
	}

	float prio = 1;
	VkDeviceQueueCreateInfo qinfo = { 0 };
    qinfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
	qinfo.queueCount = 1;
	qinfo.pQueuePriorities = &prio;

	VkPhysicalDeviceFeatures features = { 0 };
	features.fillModeNonSolid = 1;
	features.sampleRateShading = 1;
	features.vertexPipelineStoresAndAtomics = 1;
	features.samplerAnisotropy = 1;

	VkPhysicalDeviceDescriptorIndexingFeatures extFeatures = { 0 };
    extFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES;
	extFeatures.descriptorBindingPartiallyBound = 1;
	extFeatures.descriptorBindingVariableDescriptorCount = 1;

	VkDeviceCreateInfo deviceInfo = { 0 };
    deviceInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
	deviceInfo.queueCreateInfoCount = 1;
	deviceInfo.pNext = &extFeatures;
	deviceInfo.pQueueCreateInfos = &qinfo;
	deviceInfo.pEnabledFeatures = &features;
	deviceInfo.enabledExtensionCount = sizeof(device_ext) / sizeof(char*);
	deviceInfo.ppEnabledExtensionNames = device_ext;
	deviceInfo.enabledLayerCount = sizeof(layers) / sizeof(char*);
	deviceInfo.ppEnabledLayerNames = layers;


	res = vkCreateDevice(physicalDevice, &deviceInfo, 0, &device);
    printf("Device created %d\n", res);
	load_device_fn(device);
	vkGetDeviceQueue(device, 0, 0, &queue);
	VkPhysicalDeviceMemoryProperties props;
    vkGetPhysicalDeviceMemoryProperties(physicalDevice, &props);
	memory_idx[0] = 0xffffffff;
	memory_idx[1] = 0xffffffff;
    
	for (uint i = 0; i < props.memoryTypeCount; ++i)
	{
		VkMemoryPropertyFlags flag = props.memoryTypes[i].propertyFlags;
		if (memory_idx[0] == 0xffffffff && (flag & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) memory_idx[0] = i;
		if (memory_idx[1] == 0xffffffff && (flag & (VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT))) memory_idx[1] = i;
	}

	VkCommandPoolCreateInfo poolInfo = { 0 };
    poolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
	poolInfo.flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT | VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
    vkCreateCommandPool(device, &poolInfo, 0, &transient_pool);
}