zorldo

Goofing around with Ebiten
git clone git://bsandro.tech/zorldo
Log | Files | Refs | README

glad_vulkan.c (37298B)


      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <string.h>
      4 #include <glad/vulkan.h>
      5 
      6 #ifndef GLAD_IMPL_UTIL_C_
      7 #define GLAD_IMPL_UTIL_C_
      8 
      9 #ifdef _MSC_VER
     10 #define GLAD_IMPL_UTIL_SSCANF sscanf_s
     11 #else
     12 #define GLAD_IMPL_UTIL_SSCANF sscanf
     13 #endif
     14 
     15 #endif /* GLAD_IMPL_UTIL_C_ */
     16 
     17 
     18 int GLAD_VK_VERSION_1_0 = 0;
     19 int GLAD_VK_VERSION_1_1 = 0;
     20 int GLAD_VK_EXT_debug_report = 0;
     21 int GLAD_VK_KHR_surface = 0;
     22 int GLAD_VK_KHR_swapchain = 0;
     23 
     24 
     25 
     26 PFN_vkAcquireNextImage2KHR glad_vkAcquireNextImage2KHR = NULL;
     27 PFN_vkAcquireNextImageKHR glad_vkAcquireNextImageKHR = NULL;
     28 PFN_vkAllocateCommandBuffers glad_vkAllocateCommandBuffers = NULL;
     29 PFN_vkAllocateDescriptorSets glad_vkAllocateDescriptorSets = NULL;
     30 PFN_vkAllocateMemory glad_vkAllocateMemory = NULL;
     31 PFN_vkBeginCommandBuffer glad_vkBeginCommandBuffer = NULL;
     32 PFN_vkBindBufferMemory glad_vkBindBufferMemory = NULL;
     33 PFN_vkBindBufferMemory2 glad_vkBindBufferMemory2 = NULL;
     34 PFN_vkBindImageMemory glad_vkBindImageMemory = NULL;
     35 PFN_vkBindImageMemory2 glad_vkBindImageMemory2 = NULL;
     36 PFN_vkCmdBeginQuery glad_vkCmdBeginQuery = NULL;
     37 PFN_vkCmdBeginRenderPass glad_vkCmdBeginRenderPass = NULL;
     38 PFN_vkCmdBindDescriptorSets glad_vkCmdBindDescriptorSets = NULL;
     39 PFN_vkCmdBindIndexBuffer glad_vkCmdBindIndexBuffer = NULL;
     40 PFN_vkCmdBindPipeline glad_vkCmdBindPipeline = NULL;
     41 PFN_vkCmdBindVertexBuffers glad_vkCmdBindVertexBuffers = NULL;
     42 PFN_vkCmdBlitImage glad_vkCmdBlitImage = NULL;
     43 PFN_vkCmdClearAttachments glad_vkCmdClearAttachments = NULL;
     44 PFN_vkCmdClearColorImage glad_vkCmdClearColorImage = NULL;
     45 PFN_vkCmdClearDepthStencilImage glad_vkCmdClearDepthStencilImage = NULL;
     46 PFN_vkCmdCopyBuffer glad_vkCmdCopyBuffer = NULL;
     47 PFN_vkCmdCopyBufferToImage glad_vkCmdCopyBufferToImage = NULL;
     48 PFN_vkCmdCopyImage glad_vkCmdCopyImage = NULL;
     49 PFN_vkCmdCopyImageToBuffer glad_vkCmdCopyImageToBuffer = NULL;
     50 PFN_vkCmdCopyQueryPoolResults glad_vkCmdCopyQueryPoolResults = NULL;
     51 PFN_vkCmdDispatch glad_vkCmdDispatch = NULL;
     52 PFN_vkCmdDispatchBase glad_vkCmdDispatchBase = NULL;
     53 PFN_vkCmdDispatchIndirect glad_vkCmdDispatchIndirect = NULL;
     54 PFN_vkCmdDraw glad_vkCmdDraw = NULL;
     55 PFN_vkCmdDrawIndexed glad_vkCmdDrawIndexed = NULL;
     56 PFN_vkCmdDrawIndexedIndirect glad_vkCmdDrawIndexedIndirect = NULL;
     57 PFN_vkCmdDrawIndirect glad_vkCmdDrawIndirect = NULL;
     58 PFN_vkCmdEndQuery glad_vkCmdEndQuery = NULL;
     59 PFN_vkCmdEndRenderPass glad_vkCmdEndRenderPass = NULL;
     60 PFN_vkCmdExecuteCommands glad_vkCmdExecuteCommands = NULL;
     61 PFN_vkCmdFillBuffer glad_vkCmdFillBuffer = NULL;
     62 PFN_vkCmdNextSubpass glad_vkCmdNextSubpass = NULL;
     63 PFN_vkCmdPipelineBarrier glad_vkCmdPipelineBarrier = NULL;
     64 PFN_vkCmdPushConstants glad_vkCmdPushConstants = NULL;
     65 PFN_vkCmdResetEvent glad_vkCmdResetEvent = NULL;
     66 PFN_vkCmdResetQueryPool glad_vkCmdResetQueryPool = NULL;
     67 PFN_vkCmdResolveImage glad_vkCmdResolveImage = NULL;
     68 PFN_vkCmdSetBlendConstants glad_vkCmdSetBlendConstants = NULL;
     69 PFN_vkCmdSetDepthBias glad_vkCmdSetDepthBias = NULL;
     70 PFN_vkCmdSetDepthBounds glad_vkCmdSetDepthBounds = NULL;
     71 PFN_vkCmdSetDeviceMask glad_vkCmdSetDeviceMask = NULL;
     72 PFN_vkCmdSetEvent glad_vkCmdSetEvent = NULL;
     73 PFN_vkCmdSetLineWidth glad_vkCmdSetLineWidth = NULL;
     74 PFN_vkCmdSetScissor glad_vkCmdSetScissor = NULL;
     75 PFN_vkCmdSetStencilCompareMask glad_vkCmdSetStencilCompareMask = NULL;
     76 PFN_vkCmdSetStencilReference glad_vkCmdSetStencilReference = NULL;
     77 PFN_vkCmdSetStencilWriteMask glad_vkCmdSetStencilWriteMask = NULL;
     78 PFN_vkCmdSetViewport glad_vkCmdSetViewport = NULL;
     79 PFN_vkCmdUpdateBuffer glad_vkCmdUpdateBuffer = NULL;
     80 PFN_vkCmdWaitEvents glad_vkCmdWaitEvents = NULL;
     81 PFN_vkCmdWriteTimestamp glad_vkCmdWriteTimestamp = NULL;
     82 PFN_vkCreateBuffer glad_vkCreateBuffer = NULL;
     83 PFN_vkCreateBufferView glad_vkCreateBufferView = NULL;
     84 PFN_vkCreateCommandPool glad_vkCreateCommandPool = NULL;
     85 PFN_vkCreateComputePipelines glad_vkCreateComputePipelines = NULL;
     86 PFN_vkCreateDebugReportCallbackEXT glad_vkCreateDebugReportCallbackEXT = NULL;
     87 PFN_vkCreateDescriptorPool glad_vkCreateDescriptorPool = NULL;
     88 PFN_vkCreateDescriptorSetLayout glad_vkCreateDescriptorSetLayout = NULL;
     89 PFN_vkCreateDescriptorUpdateTemplate glad_vkCreateDescriptorUpdateTemplate = NULL;
     90 PFN_vkCreateDevice glad_vkCreateDevice = NULL;
     91 PFN_vkCreateEvent glad_vkCreateEvent = NULL;
     92 PFN_vkCreateFence glad_vkCreateFence = NULL;
     93 PFN_vkCreateFramebuffer glad_vkCreateFramebuffer = NULL;
     94 PFN_vkCreateGraphicsPipelines glad_vkCreateGraphicsPipelines = NULL;
     95 PFN_vkCreateImage glad_vkCreateImage = NULL;
     96 PFN_vkCreateImageView glad_vkCreateImageView = NULL;
     97 PFN_vkCreateInstance glad_vkCreateInstance = NULL;
     98 PFN_vkCreatePipelineCache glad_vkCreatePipelineCache = NULL;
     99 PFN_vkCreatePipelineLayout glad_vkCreatePipelineLayout = NULL;
    100 PFN_vkCreateQueryPool glad_vkCreateQueryPool = NULL;
    101 PFN_vkCreateRenderPass glad_vkCreateRenderPass = NULL;
    102 PFN_vkCreateSampler glad_vkCreateSampler = NULL;
    103 PFN_vkCreateSamplerYcbcrConversion glad_vkCreateSamplerYcbcrConversion = NULL;
    104 PFN_vkCreateSemaphore glad_vkCreateSemaphore = NULL;
    105 PFN_vkCreateShaderModule glad_vkCreateShaderModule = NULL;
    106 PFN_vkCreateSwapchainKHR glad_vkCreateSwapchainKHR = NULL;
    107 PFN_vkDebugReportMessageEXT glad_vkDebugReportMessageEXT = NULL;
    108 PFN_vkDestroyBuffer glad_vkDestroyBuffer = NULL;
    109 PFN_vkDestroyBufferView glad_vkDestroyBufferView = NULL;
    110 PFN_vkDestroyCommandPool glad_vkDestroyCommandPool = NULL;
    111 PFN_vkDestroyDebugReportCallbackEXT glad_vkDestroyDebugReportCallbackEXT = NULL;
    112 PFN_vkDestroyDescriptorPool glad_vkDestroyDescriptorPool = NULL;
    113 PFN_vkDestroyDescriptorSetLayout glad_vkDestroyDescriptorSetLayout = NULL;
    114 PFN_vkDestroyDescriptorUpdateTemplate glad_vkDestroyDescriptorUpdateTemplate = NULL;
    115 PFN_vkDestroyDevice glad_vkDestroyDevice = NULL;
    116 PFN_vkDestroyEvent glad_vkDestroyEvent = NULL;
    117 PFN_vkDestroyFence glad_vkDestroyFence = NULL;
    118 PFN_vkDestroyFramebuffer glad_vkDestroyFramebuffer = NULL;
    119 PFN_vkDestroyImage glad_vkDestroyImage = NULL;
    120 PFN_vkDestroyImageView glad_vkDestroyImageView = NULL;
    121 PFN_vkDestroyInstance glad_vkDestroyInstance = NULL;
    122 PFN_vkDestroyPipeline glad_vkDestroyPipeline = NULL;
    123 PFN_vkDestroyPipelineCache glad_vkDestroyPipelineCache = NULL;
    124 PFN_vkDestroyPipelineLayout glad_vkDestroyPipelineLayout = NULL;
    125 PFN_vkDestroyQueryPool glad_vkDestroyQueryPool = NULL;
    126 PFN_vkDestroyRenderPass glad_vkDestroyRenderPass = NULL;
    127 PFN_vkDestroySampler glad_vkDestroySampler = NULL;
    128 PFN_vkDestroySamplerYcbcrConversion glad_vkDestroySamplerYcbcrConversion = NULL;
    129 PFN_vkDestroySemaphore glad_vkDestroySemaphore = NULL;
    130 PFN_vkDestroyShaderModule glad_vkDestroyShaderModule = NULL;
    131 PFN_vkDestroySurfaceKHR glad_vkDestroySurfaceKHR = NULL;
    132 PFN_vkDestroySwapchainKHR glad_vkDestroySwapchainKHR = NULL;
    133 PFN_vkDeviceWaitIdle glad_vkDeviceWaitIdle = NULL;
    134 PFN_vkEndCommandBuffer glad_vkEndCommandBuffer = NULL;
    135 PFN_vkEnumerateDeviceExtensionProperties glad_vkEnumerateDeviceExtensionProperties = NULL;
    136 PFN_vkEnumerateDeviceLayerProperties glad_vkEnumerateDeviceLayerProperties = NULL;
    137 PFN_vkEnumerateInstanceExtensionProperties glad_vkEnumerateInstanceExtensionProperties = NULL;
    138 PFN_vkEnumerateInstanceLayerProperties glad_vkEnumerateInstanceLayerProperties = NULL;
    139 PFN_vkEnumerateInstanceVersion glad_vkEnumerateInstanceVersion = NULL;
    140 PFN_vkEnumeratePhysicalDeviceGroups glad_vkEnumeratePhysicalDeviceGroups = NULL;
    141 PFN_vkEnumeratePhysicalDevices glad_vkEnumeratePhysicalDevices = NULL;
    142 PFN_vkFlushMappedMemoryRanges glad_vkFlushMappedMemoryRanges = NULL;
    143 PFN_vkFreeCommandBuffers glad_vkFreeCommandBuffers = NULL;
    144 PFN_vkFreeDescriptorSets glad_vkFreeDescriptorSets = NULL;
    145 PFN_vkFreeMemory glad_vkFreeMemory = NULL;
    146 PFN_vkGetBufferMemoryRequirements glad_vkGetBufferMemoryRequirements = NULL;
    147 PFN_vkGetBufferMemoryRequirements2 glad_vkGetBufferMemoryRequirements2 = NULL;
    148 PFN_vkGetDescriptorSetLayoutSupport glad_vkGetDescriptorSetLayoutSupport = NULL;
    149 PFN_vkGetDeviceGroupPeerMemoryFeatures glad_vkGetDeviceGroupPeerMemoryFeatures = NULL;
    150 PFN_vkGetDeviceGroupPresentCapabilitiesKHR glad_vkGetDeviceGroupPresentCapabilitiesKHR = NULL;
    151 PFN_vkGetDeviceGroupSurfacePresentModesKHR glad_vkGetDeviceGroupSurfacePresentModesKHR = NULL;
    152 PFN_vkGetDeviceMemoryCommitment glad_vkGetDeviceMemoryCommitment = NULL;
    153 PFN_vkGetDeviceProcAddr glad_vkGetDeviceProcAddr = NULL;
    154 PFN_vkGetDeviceQueue glad_vkGetDeviceQueue = NULL;
    155 PFN_vkGetDeviceQueue2 glad_vkGetDeviceQueue2 = NULL;
    156 PFN_vkGetEventStatus glad_vkGetEventStatus = NULL;
    157 PFN_vkGetFenceStatus glad_vkGetFenceStatus = NULL;
    158 PFN_vkGetImageMemoryRequirements glad_vkGetImageMemoryRequirements = NULL;
    159 PFN_vkGetImageMemoryRequirements2 glad_vkGetImageMemoryRequirements2 = NULL;
    160 PFN_vkGetImageSparseMemoryRequirements glad_vkGetImageSparseMemoryRequirements = NULL;
    161 PFN_vkGetImageSparseMemoryRequirements2 glad_vkGetImageSparseMemoryRequirements2 = NULL;
    162 PFN_vkGetImageSubresourceLayout glad_vkGetImageSubresourceLayout = NULL;
    163 PFN_vkGetInstanceProcAddr glad_vkGetInstanceProcAddr = NULL;
    164 PFN_vkGetPhysicalDeviceExternalBufferProperties glad_vkGetPhysicalDeviceExternalBufferProperties = NULL;
    165 PFN_vkGetPhysicalDeviceExternalFenceProperties glad_vkGetPhysicalDeviceExternalFenceProperties = NULL;
    166 PFN_vkGetPhysicalDeviceExternalSemaphoreProperties glad_vkGetPhysicalDeviceExternalSemaphoreProperties = NULL;
    167 PFN_vkGetPhysicalDeviceFeatures glad_vkGetPhysicalDeviceFeatures = NULL;
    168 PFN_vkGetPhysicalDeviceFeatures2 glad_vkGetPhysicalDeviceFeatures2 = NULL;
    169 PFN_vkGetPhysicalDeviceFormatProperties glad_vkGetPhysicalDeviceFormatProperties = NULL;
    170 PFN_vkGetPhysicalDeviceFormatProperties2 glad_vkGetPhysicalDeviceFormatProperties2 = NULL;
    171 PFN_vkGetPhysicalDeviceImageFormatProperties glad_vkGetPhysicalDeviceImageFormatProperties = NULL;
    172 PFN_vkGetPhysicalDeviceImageFormatProperties2 glad_vkGetPhysicalDeviceImageFormatProperties2 = NULL;
    173 PFN_vkGetPhysicalDeviceMemoryProperties glad_vkGetPhysicalDeviceMemoryProperties = NULL;
    174 PFN_vkGetPhysicalDeviceMemoryProperties2 glad_vkGetPhysicalDeviceMemoryProperties2 = NULL;
    175 PFN_vkGetPhysicalDevicePresentRectanglesKHR glad_vkGetPhysicalDevicePresentRectanglesKHR = NULL;
    176 PFN_vkGetPhysicalDeviceProperties glad_vkGetPhysicalDeviceProperties = NULL;
    177 PFN_vkGetPhysicalDeviceProperties2 glad_vkGetPhysicalDeviceProperties2 = NULL;
    178 PFN_vkGetPhysicalDeviceQueueFamilyProperties glad_vkGetPhysicalDeviceQueueFamilyProperties = NULL;
    179 PFN_vkGetPhysicalDeviceQueueFamilyProperties2 glad_vkGetPhysicalDeviceQueueFamilyProperties2 = NULL;
    180 PFN_vkGetPhysicalDeviceSparseImageFormatProperties glad_vkGetPhysicalDeviceSparseImageFormatProperties = NULL;
    181 PFN_vkGetPhysicalDeviceSparseImageFormatProperties2 glad_vkGetPhysicalDeviceSparseImageFormatProperties2 = NULL;
    182 PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR glad_vkGetPhysicalDeviceSurfaceCapabilitiesKHR = NULL;
    183 PFN_vkGetPhysicalDeviceSurfaceFormatsKHR glad_vkGetPhysicalDeviceSurfaceFormatsKHR = NULL;
    184 PFN_vkGetPhysicalDeviceSurfacePresentModesKHR glad_vkGetPhysicalDeviceSurfacePresentModesKHR = NULL;
    185 PFN_vkGetPhysicalDeviceSurfaceSupportKHR glad_vkGetPhysicalDeviceSurfaceSupportKHR = NULL;
    186 PFN_vkGetPipelineCacheData glad_vkGetPipelineCacheData = NULL;
    187 PFN_vkGetQueryPoolResults glad_vkGetQueryPoolResults = NULL;
    188 PFN_vkGetRenderAreaGranularity glad_vkGetRenderAreaGranularity = NULL;
    189 PFN_vkGetSwapchainImagesKHR glad_vkGetSwapchainImagesKHR = NULL;
    190 PFN_vkInvalidateMappedMemoryRanges glad_vkInvalidateMappedMemoryRanges = NULL;
    191 PFN_vkMapMemory glad_vkMapMemory = NULL;
    192 PFN_vkMergePipelineCaches glad_vkMergePipelineCaches = NULL;
    193 PFN_vkQueueBindSparse glad_vkQueueBindSparse = NULL;
    194 PFN_vkQueuePresentKHR glad_vkQueuePresentKHR = NULL;
    195 PFN_vkQueueSubmit glad_vkQueueSubmit = NULL;
    196 PFN_vkQueueWaitIdle glad_vkQueueWaitIdle = NULL;
    197 PFN_vkResetCommandBuffer glad_vkResetCommandBuffer = NULL;
    198 PFN_vkResetCommandPool glad_vkResetCommandPool = NULL;
    199 PFN_vkResetDescriptorPool glad_vkResetDescriptorPool = NULL;
    200 PFN_vkResetEvent glad_vkResetEvent = NULL;
    201 PFN_vkResetFences glad_vkResetFences = NULL;
    202 PFN_vkSetEvent glad_vkSetEvent = NULL;
    203 PFN_vkTrimCommandPool glad_vkTrimCommandPool = NULL;
    204 PFN_vkUnmapMemory glad_vkUnmapMemory = NULL;
    205 PFN_vkUpdateDescriptorSetWithTemplate glad_vkUpdateDescriptorSetWithTemplate = NULL;
    206 PFN_vkUpdateDescriptorSets glad_vkUpdateDescriptorSets = NULL;
    207 PFN_vkWaitForFences glad_vkWaitForFences = NULL;
    208 
    209 
    210 static void glad_vk_load_VK_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) {
    211     if(!GLAD_VK_VERSION_1_0) return;
    212     vkAllocateCommandBuffers = (PFN_vkAllocateCommandBuffers) load("vkAllocateCommandBuffers", userptr);
    213     vkAllocateDescriptorSets = (PFN_vkAllocateDescriptorSets) load("vkAllocateDescriptorSets", userptr);
    214     vkAllocateMemory = (PFN_vkAllocateMemory) load("vkAllocateMemory", userptr);
    215     vkBeginCommandBuffer = (PFN_vkBeginCommandBuffer) load("vkBeginCommandBuffer", userptr);
    216     vkBindBufferMemory = (PFN_vkBindBufferMemory) load("vkBindBufferMemory", userptr);
    217     vkBindImageMemory = (PFN_vkBindImageMemory) load("vkBindImageMemory", userptr);
    218     vkCmdBeginQuery = (PFN_vkCmdBeginQuery) load("vkCmdBeginQuery", userptr);
    219     vkCmdBeginRenderPass = (PFN_vkCmdBeginRenderPass) load("vkCmdBeginRenderPass", userptr);
    220     vkCmdBindDescriptorSets = (PFN_vkCmdBindDescriptorSets) load("vkCmdBindDescriptorSets", userptr);
    221     vkCmdBindIndexBuffer = (PFN_vkCmdBindIndexBuffer) load("vkCmdBindIndexBuffer", userptr);
    222     vkCmdBindPipeline = (PFN_vkCmdBindPipeline) load("vkCmdBindPipeline", userptr);
    223     vkCmdBindVertexBuffers = (PFN_vkCmdBindVertexBuffers) load("vkCmdBindVertexBuffers", userptr);
    224     vkCmdBlitImage = (PFN_vkCmdBlitImage) load("vkCmdBlitImage", userptr);
    225     vkCmdClearAttachments = (PFN_vkCmdClearAttachments) load("vkCmdClearAttachments", userptr);
    226     vkCmdClearColorImage = (PFN_vkCmdClearColorImage) load("vkCmdClearColorImage", userptr);
    227     vkCmdClearDepthStencilImage = (PFN_vkCmdClearDepthStencilImage) load("vkCmdClearDepthStencilImage", userptr);
    228     vkCmdCopyBuffer = (PFN_vkCmdCopyBuffer) load("vkCmdCopyBuffer", userptr);
    229     vkCmdCopyBufferToImage = (PFN_vkCmdCopyBufferToImage) load("vkCmdCopyBufferToImage", userptr);
    230     vkCmdCopyImage = (PFN_vkCmdCopyImage) load("vkCmdCopyImage", userptr);
    231     vkCmdCopyImageToBuffer = (PFN_vkCmdCopyImageToBuffer) load("vkCmdCopyImageToBuffer", userptr);
    232     vkCmdCopyQueryPoolResults = (PFN_vkCmdCopyQueryPoolResults) load("vkCmdCopyQueryPoolResults", userptr);
    233     vkCmdDispatch = (PFN_vkCmdDispatch) load("vkCmdDispatch", userptr);
    234     vkCmdDispatchIndirect = (PFN_vkCmdDispatchIndirect) load("vkCmdDispatchIndirect", userptr);
    235     vkCmdDraw = (PFN_vkCmdDraw) load("vkCmdDraw", userptr);
    236     vkCmdDrawIndexed = (PFN_vkCmdDrawIndexed) load("vkCmdDrawIndexed", userptr);
    237     vkCmdDrawIndexedIndirect = (PFN_vkCmdDrawIndexedIndirect) load("vkCmdDrawIndexedIndirect", userptr);
    238     vkCmdDrawIndirect = (PFN_vkCmdDrawIndirect) load("vkCmdDrawIndirect", userptr);
    239     vkCmdEndQuery = (PFN_vkCmdEndQuery) load("vkCmdEndQuery", userptr);
    240     vkCmdEndRenderPass = (PFN_vkCmdEndRenderPass) load("vkCmdEndRenderPass", userptr);
    241     vkCmdExecuteCommands = (PFN_vkCmdExecuteCommands) load("vkCmdExecuteCommands", userptr);
    242     vkCmdFillBuffer = (PFN_vkCmdFillBuffer) load("vkCmdFillBuffer", userptr);
    243     vkCmdNextSubpass = (PFN_vkCmdNextSubpass) load("vkCmdNextSubpass", userptr);
    244     vkCmdPipelineBarrier = (PFN_vkCmdPipelineBarrier) load("vkCmdPipelineBarrier", userptr);
    245     vkCmdPushConstants = (PFN_vkCmdPushConstants) load("vkCmdPushConstants", userptr);
    246     vkCmdResetEvent = (PFN_vkCmdResetEvent) load("vkCmdResetEvent", userptr);
    247     vkCmdResetQueryPool = (PFN_vkCmdResetQueryPool) load("vkCmdResetQueryPool", userptr);
    248     vkCmdResolveImage = (PFN_vkCmdResolveImage) load("vkCmdResolveImage", userptr);
    249     vkCmdSetBlendConstants = (PFN_vkCmdSetBlendConstants) load("vkCmdSetBlendConstants", userptr);
    250     vkCmdSetDepthBias = (PFN_vkCmdSetDepthBias) load("vkCmdSetDepthBias", userptr);
    251     vkCmdSetDepthBounds = (PFN_vkCmdSetDepthBounds) load("vkCmdSetDepthBounds", userptr);
    252     vkCmdSetEvent = (PFN_vkCmdSetEvent) load("vkCmdSetEvent", userptr);
    253     vkCmdSetLineWidth = (PFN_vkCmdSetLineWidth) load("vkCmdSetLineWidth", userptr);
    254     vkCmdSetScissor = (PFN_vkCmdSetScissor) load("vkCmdSetScissor", userptr);
    255     vkCmdSetStencilCompareMask = (PFN_vkCmdSetStencilCompareMask) load("vkCmdSetStencilCompareMask", userptr);
    256     vkCmdSetStencilReference = (PFN_vkCmdSetStencilReference) load("vkCmdSetStencilReference", userptr);
    257     vkCmdSetStencilWriteMask = (PFN_vkCmdSetStencilWriteMask) load("vkCmdSetStencilWriteMask", userptr);
    258     vkCmdSetViewport = (PFN_vkCmdSetViewport) load("vkCmdSetViewport", userptr);
    259     vkCmdUpdateBuffer = (PFN_vkCmdUpdateBuffer) load("vkCmdUpdateBuffer", userptr);
    260     vkCmdWaitEvents = (PFN_vkCmdWaitEvents) load("vkCmdWaitEvents", userptr);
    261     vkCmdWriteTimestamp = (PFN_vkCmdWriteTimestamp) load("vkCmdWriteTimestamp", userptr);
    262     vkCreateBuffer = (PFN_vkCreateBuffer) load("vkCreateBuffer", userptr);
    263     vkCreateBufferView = (PFN_vkCreateBufferView) load("vkCreateBufferView", userptr);
    264     vkCreateCommandPool = (PFN_vkCreateCommandPool) load("vkCreateCommandPool", userptr);
    265     vkCreateComputePipelines = (PFN_vkCreateComputePipelines) load("vkCreateComputePipelines", userptr);
    266     vkCreateDescriptorPool = (PFN_vkCreateDescriptorPool) load("vkCreateDescriptorPool", userptr);
    267     vkCreateDescriptorSetLayout = (PFN_vkCreateDescriptorSetLayout) load("vkCreateDescriptorSetLayout", userptr);
    268     vkCreateDevice = (PFN_vkCreateDevice) load("vkCreateDevice", userptr);
    269     vkCreateEvent = (PFN_vkCreateEvent) load("vkCreateEvent", userptr);
    270     vkCreateFence = (PFN_vkCreateFence) load("vkCreateFence", userptr);
    271     vkCreateFramebuffer = (PFN_vkCreateFramebuffer) load("vkCreateFramebuffer", userptr);
    272     vkCreateGraphicsPipelines = (PFN_vkCreateGraphicsPipelines) load("vkCreateGraphicsPipelines", userptr);
    273     vkCreateImage = (PFN_vkCreateImage) load("vkCreateImage", userptr);
    274     vkCreateImageView = (PFN_vkCreateImageView) load("vkCreateImageView", userptr);
    275     vkCreateInstance = (PFN_vkCreateInstance) load("vkCreateInstance", userptr);
    276     vkCreatePipelineCache = (PFN_vkCreatePipelineCache) load("vkCreatePipelineCache", userptr);
    277     vkCreatePipelineLayout = (PFN_vkCreatePipelineLayout) load("vkCreatePipelineLayout", userptr);
    278     vkCreateQueryPool = (PFN_vkCreateQueryPool) load("vkCreateQueryPool", userptr);
    279     vkCreateRenderPass = (PFN_vkCreateRenderPass) load("vkCreateRenderPass", userptr);
    280     vkCreateSampler = (PFN_vkCreateSampler) load("vkCreateSampler", userptr);
    281     vkCreateSemaphore = (PFN_vkCreateSemaphore) load("vkCreateSemaphore", userptr);
    282     vkCreateShaderModule = (PFN_vkCreateShaderModule) load("vkCreateShaderModule", userptr);
    283     vkDestroyBuffer = (PFN_vkDestroyBuffer) load("vkDestroyBuffer", userptr);
    284     vkDestroyBufferView = (PFN_vkDestroyBufferView) load("vkDestroyBufferView", userptr);
    285     vkDestroyCommandPool = (PFN_vkDestroyCommandPool) load("vkDestroyCommandPool", userptr);
    286     vkDestroyDescriptorPool = (PFN_vkDestroyDescriptorPool) load("vkDestroyDescriptorPool", userptr);
    287     vkDestroyDescriptorSetLayout = (PFN_vkDestroyDescriptorSetLayout) load("vkDestroyDescriptorSetLayout", userptr);
    288     vkDestroyDevice = (PFN_vkDestroyDevice) load("vkDestroyDevice", userptr);
    289     vkDestroyEvent = (PFN_vkDestroyEvent) load("vkDestroyEvent", userptr);
    290     vkDestroyFence = (PFN_vkDestroyFence) load("vkDestroyFence", userptr);
    291     vkDestroyFramebuffer = (PFN_vkDestroyFramebuffer) load("vkDestroyFramebuffer", userptr);
    292     vkDestroyImage = (PFN_vkDestroyImage) load("vkDestroyImage", userptr);
    293     vkDestroyImageView = (PFN_vkDestroyImageView) load("vkDestroyImageView", userptr);
    294     vkDestroyInstance = (PFN_vkDestroyInstance) load("vkDestroyInstance", userptr);
    295     vkDestroyPipeline = (PFN_vkDestroyPipeline) load("vkDestroyPipeline", userptr);
    296     vkDestroyPipelineCache = (PFN_vkDestroyPipelineCache) load("vkDestroyPipelineCache", userptr);
    297     vkDestroyPipelineLayout = (PFN_vkDestroyPipelineLayout) load("vkDestroyPipelineLayout", userptr);
    298     vkDestroyQueryPool = (PFN_vkDestroyQueryPool) load("vkDestroyQueryPool", userptr);
    299     vkDestroyRenderPass = (PFN_vkDestroyRenderPass) load("vkDestroyRenderPass", userptr);
    300     vkDestroySampler = (PFN_vkDestroySampler) load("vkDestroySampler", userptr);
    301     vkDestroySemaphore = (PFN_vkDestroySemaphore) load("vkDestroySemaphore", userptr);
    302     vkDestroyShaderModule = (PFN_vkDestroyShaderModule) load("vkDestroyShaderModule", userptr);
    303     vkDeviceWaitIdle = (PFN_vkDeviceWaitIdle) load("vkDeviceWaitIdle", userptr);
    304     vkEndCommandBuffer = (PFN_vkEndCommandBuffer) load("vkEndCommandBuffer", userptr);
    305     vkEnumerateDeviceExtensionProperties = (PFN_vkEnumerateDeviceExtensionProperties) load("vkEnumerateDeviceExtensionProperties", userptr);
    306     vkEnumerateDeviceLayerProperties = (PFN_vkEnumerateDeviceLayerProperties) load("vkEnumerateDeviceLayerProperties", userptr);
    307     vkEnumerateInstanceExtensionProperties = (PFN_vkEnumerateInstanceExtensionProperties) load("vkEnumerateInstanceExtensionProperties", userptr);
    308     vkEnumerateInstanceLayerProperties = (PFN_vkEnumerateInstanceLayerProperties) load("vkEnumerateInstanceLayerProperties", userptr);
    309     vkEnumeratePhysicalDevices = (PFN_vkEnumeratePhysicalDevices) load("vkEnumeratePhysicalDevices", userptr);
    310     vkFlushMappedMemoryRanges = (PFN_vkFlushMappedMemoryRanges) load("vkFlushMappedMemoryRanges", userptr);
    311     vkFreeCommandBuffers = (PFN_vkFreeCommandBuffers) load("vkFreeCommandBuffers", userptr);
    312     vkFreeDescriptorSets = (PFN_vkFreeDescriptorSets) load("vkFreeDescriptorSets", userptr);
    313     vkFreeMemory = (PFN_vkFreeMemory) load("vkFreeMemory", userptr);
    314     vkGetBufferMemoryRequirements = (PFN_vkGetBufferMemoryRequirements) load("vkGetBufferMemoryRequirements", userptr);
    315     vkGetDeviceMemoryCommitment = (PFN_vkGetDeviceMemoryCommitment) load("vkGetDeviceMemoryCommitment", userptr);
    316     vkGetDeviceProcAddr = (PFN_vkGetDeviceProcAddr) load("vkGetDeviceProcAddr", userptr);
    317     vkGetDeviceQueue = (PFN_vkGetDeviceQueue) load("vkGetDeviceQueue", userptr);
    318     vkGetEventStatus = (PFN_vkGetEventStatus) load("vkGetEventStatus", userptr);
    319     vkGetFenceStatus = (PFN_vkGetFenceStatus) load("vkGetFenceStatus", userptr);
    320     vkGetImageMemoryRequirements = (PFN_vkGetImageMemoryRequirements) load("vkGetImageMemoryRequirements", userptr);
    321     vkGetImageSparseMemoryRequirements = (PFN_vkGetImageSparseMemoryRequirements) load("vkGetImageSparseMemoryRequirements", userptr);
    322     vkGetImageSubresourceLayout = (PFN_vkGetImageSubresourceLayout) load("vkGetImageSubresourceLayout", userptr);
    323     vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr) load("vkGetInstanceProcAddr", userptr);
    324     vkGetPhysicalDeviceFeatures = (PFN_vkGetPhysicalDeviceFeatures) load("vkGetPhysicalDeviceFeatures", userptr);
    325     vkGetPhysicalDeviceFormatProperties = (PFN_vkGetPhysicalDeviceFormatProperties) load("vkGetPhysicalDeviceFormatProperties", userptr);
    326     vkGetPhysicalDeviceImageFormatProperties = (PFN_vkGetPhysicalDeviceImageFormatProperties) load("vkGetPhysicalDeviceImageFormatProperties", userptr);
    327     vkGetPhysicalDeviceMemoryProperties = (PFN_vkGetPhysicalDeviceMemoryProperties) load("vkGetPhysicalDeviceMemoryProperties", userptr);
    328     vkGetPhysicalDeviceProperties = (PFN_vkGetPhysicalDeviceProperties) load("vkGetPhysicalDeviceProperties", userptr);
    329     vkGetPhysicalDeviceQueueFamilyProperties = (PFN_vkGetPhysicalDeviceQueueFamilyProperties) load("vkGetPhysicalDeviceQueueFamilyProperties", userptr);
    330     vkGetPhysicalDeviceSparseImageFormatProperties = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties) load("vkGetPhysicalDeviceSparseImageFormatProperties", userptr);
    331     vkGetPipelineCacheData = (PFN_vkGetPipelineCacheData) load("vkGetPipelineCacheData", userptr);
    332     vkGetQueryPoolResults = (PFN_vkGetQueryPoolResults) load("vkGetQueryPoolResults", userptr);
    333     vkGetRenderAreaGranularity = (PFN_vkGetRenderAreaGranularity) load("vkGetRenderAreaGranularity", userptr);
    334     vkInvalidateMappedMemoryRanges = (PFN_vkInvalidateMappedMemoryRanges) load("vkInvalidateMappedMemoryRanges", userptr);
    335     vkMapMemory = (PFN_vkMapMemory) load("vkMapMemory", userptr);
    336     vkMergePipelineCaches = (PFN_vkMergePipelineCaches) load("vkMergePipelineCaches", userptr);
    337     vkQueueBindSparse = (PFN_vkQueueBindSparse) load("vkQueueBindSparse", userptr);
    338     vkQueueSubmit = (PFN_vkQueueSubmit) load("vkQueueSubmit", userptr);
    339     vkQueueWaitIdle = (PFN_vkQueueWaitIdle) load("vkQueueWaitIdle", userptr);
    340     vkResetCommandBuffer = (PFN_vkResetCommandBuffer) load("vkResetCommandBuffer", userptr);
    341     vkResetCommandPool = (PFN_vkResetCommandPool) load("vkResetCommandPool", userptr);
    342     vkResetDescriptorPool = (PFN_vkResetDescriptorPool) load("vkResetDescriptorPool", userptr);
    343     vkResetEvent = (PFN_vkResetEvent) load("vkResetEvent", userptr);
    344     vkResetFences = (PFN_vkResetFences) load("vkResetFences", userptr);
    345     vkSetEvent = (PFN_vkSetEvent) load("vkSetEvent", userptr);
    346     vkUnmapMemory = (PFN_vkUnmapMemory) load("vkUnmapMemory", userptr);
    347     vkUpdateDescriptorSets = (PFN_vkUpdateDescriptorSets) load("vkUpdateDescriptorSets", userptr);
    348     vkWaitForFences = (PFN_vkWaitForFences) load("vkWaitForFences", userptr);
    349 }
    350 static void glad_vk_load_VK_VERSION_1_1( GLADuserptrloadfunc load, void* userptr) {
    351     if(!GLAD_VK_VERSION_1_1) return;
    352     vkBindBufferMemory2 = (PFN_vkBindBufferMemory2) load("vkBindBufferMemory2", userptr);
    353     vkBindImageMemory2 = (PFN_vkBindImageMemory2) load("vkBindImageMemory2", userptr);
    354     vkCmdDispatchBase = (PFN_vkCmdDispatchBase) load("vkCmdDispatchBase", userptr);
    355     vkCmdSetDeviceMask = (PFN_vkCmdSetDeviceMask) load("vkCmdSetDeviceMask", userptr);
    356     vkCreateDescriptorUpdateTemplate = (PFN_vkCreateDescriptorUpdateTemplate) load("vkCreateDescriptorUpdateTemplate", userptr);
    357     vkCreateSamplerYcbcrConversion = (PFN_vkCreateSamplerYcbcrConversion) load("vkCreateSamplerYcbcrConversion", userptr);
    358     vkDestroyDescriptorUpdateTemplate = (PFN_vkDestroyDescriptorUpdateTemplate) load("vkDestroyDescriptorUpdateTemplate", userptr);
    359     vkDestroySamplerYcbcrConversion = (PFN_vkDestroySamplerYcbcrConversion) load("vkDestroySamplerYcbcrConversion", userptr);
    360     vkEnumerateInstanceVersion = (PFN_vkEnumerateInstanceVersion) load("vkEnumerateInstanceVersion", userptr);
    361     vkEnumeratePhysicalDeviceGroups = (PFN_vkEnumeratePhysicalDeviceGroups) load("vkEnumeratePhysicalDeviceGroups", userptr);
    362     vkGetBufferMemoryRequirements2 = (PFN_vkGetBufferMemoryRequirements2) load("vkGetBufferMemoryRequirements2", userptr);
    363     vkGetDescriptorSetLayoutSupport = (PFN_vkGetDescriptorSetLayoutSupport) load("vkGetDescriptorSetLayoutSupport", userptr);
    364     vkGetDeviceGroupPeerMemoryFeatures = (PFN_vkGetDeviceGroupPeerMemoryFeatures) load("vkGetDeviceGroupPeerMemoryFeatures", userptr);
    365     vkGetDeviceQueue2 = (PFN_vkGetDeviceQueue2) load("vkGetDeviceQueue2", userptr);
    366     vkGetImageMemoryRequirements2 = (PFN_vkGetImageMemoryRequirements2) load("vkGetImageMemoryRequirements2", userptr);
    367     vkGetImageSparseMemoryRequirements2 = (PFN_vkGetImageSparseMemoryRequirements2) load("vkGetImageSparseMemoryRequirements2", userptr);
    368     vkGetPhysicalDeviceExternalBufferProperties = (PFN_vkGetPhysicalDeviceExternalBufferProperties) load("vkGetPhysicalDeviceExternalBufferProperties", userptr);
    369     vkGetPhysicalDeviceExternalFenceProperties = (PFN_vkGetPhysicalDeviceExternalFenceProperties) load("vkGetPhysicalDeviceExternalFenceProperties", userptr);
    370     vkGetPhysicalDeviceExternalSemaphoreProperties = (PFN_vkGetPhysicalDeviceExternalSemaphoreProperties) load("vkGetPhysicalDeviceExternalSemaphoreProperties", userptr);
    371     vkGetPhysicalDeviceFeatures2 = (PFN_vkGetPhysicalDeviceFeatures2) load("vkGetPhysicalDeviceFeatures2", userptr);
    372     vkGetPhysicalDeviceFormatProperties2 = (PFN_vkGetPhysicalDeviceFormatProperties2) load("vkGetPhysicalDeviceFormatProperties2", userptr);
    373     vkGetPhysicalDeviceImageFormatProperties2 = (PFN_vkGetPhysicalDeviceImageFormatProperties2) load("vkGetPhysicalDeviceImageFormatProperties2", userptr);
    374     vkGetPhysicalDeviceMemoryProperties2 = (PFN_vkGetPhysicalDeviceMemoryProperties2) load("vkGetPhysicalDeviceMemoryProperties2", userptr);
    375     vkGetPhysicalDeviceProperties2 = (PFN_vkGetPhysicalDeviceProperties2) load("vkGetPhysicalDeviceProperties2", userptr);
    376     vkGetPhysicalDeviceQueueFamilyProperties2 = (PFN_vkGetPhysicalDeviceQueueFamilyProperties2) load("vkGetPhysicalDeviceQueueFamilyProperties2", userptr);
    377     vkGetPhysicalDeviceSparseImageFormatProperties2 = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties2) load("vkGetPhysicalDeviceSparseImageFormatProperties2", userptr);
    378     vkTrimCommandPool = (PFN_vkTrimCommandPool) load("vkTrimCommandPool", userptr);
    379     vkUpdateDescriptorSetWithTemplate = (PFN_vkUpdateDescriptorSetWithTemplate) load("vkUpdateDescriptorSetWithTemplate", userptr);
    380 }
    381 static void glad_vk_load_VK_EXT_debug_report( GLADuserptrloadfunc load, void* userptr) {
    382     if(!GLAD_VK_EXT_debug_report) return;
    383     vkCreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT) load("vkCreateDebugReportCallbackEXT", userptr);
    384     vkDebugReportMessageEXT = (PFN_vkDebugReportMessageEXT) load("vkDebugReportMessageEXT", userptr);
    385     vkDestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT) load("vkDestroyDebugReportCallbackEXT", userptr);
    386 }
    387 static void glad_vk_load_VK_KHR_surface( GLADuserptrloadfunc load, void* userptr) {
    388     if(!GLAD_VK_KHR_surface) return;
    389     vkDestroySurfaceKHR = (PFN_vkDestroySurfaceKHR) load("vkDestroySurfaceKHR", userptr);
    390     vkGetPhysicalDeviceSurfaceCapabilitiesKHR = (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR) load("vkGetPhysicalDeviceSurfaceCapabilitiesKHR", userptr);
    391     vkGetPhysicalDeviceSurfaceFormatsKHR = (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR) load("vkGetPhysicalDeviceSurfaceFormatsKHR", userptr);
    392     vkGetPhysicalDeviceSurfacePresentModesKHR = (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR) load("vkGetPhysicalDeviceSurfacePresentModesKHR", userptr);
    393     vkGetPhysicalDeviceSurfaceSupportKHR = (PFN_vkGetPhysicalDeviceSurfaceSupportKHR) load("vkGetPhysicalDeviceSurfaceSupportKHR", userptr);
    394 }
    395 static void glad_vk_load_VK_KHR_swapchain( GLADuserptrloadfunc load, void* userptr) {
    396     if(!GLAD_VK_KHR_swapchain) return;
    397     vkAcquireNextImage2KHR = (PFN_vkAcquireNextImage2KHR) load("vkAcquireNextImage2KHR", userptr);
    398     vkAcquireNextImageKHR = (PFN_vkAcquireNextImageKHR) load("vkAcquireNextImageKHR", userptr);
    399     vkCreateSwapchainKHR = (PFN_vkCreateSwapchainKHR) load("vkCreateSwapchainKHR", userptr);
    400     vkDestroySwapchainKHR = (PFN_vkDestroySwapchainKHR) load("vkDestroySwapchainKHR", userptr);
    401     vkGetDeviceGroupPresentCapabilitiesKHR = (PFN_vkGetDeviceGroupPresentCapabilitiesKHR) load("vkGetDeviceGroupPresentCapabilitiesKHR", userptr);
    402     vkGetDeviceGroupSurfacePresentModesKHR = (PFN_vkGetDeviceGroupSurfacePresentModesKHR) load("vkGetDeviceGroupSurfacePresentModesKHR", userptr);
    403     vkGetPhysicalDevicePresentRectanglesKHR = (PFN_vkGetPhysicalDevicePresentRectanglesKHR) load("vkGetPhysicalDevicePresentRectanglesKHR", userptr);
    404     vkGetSwapchainImagesKHR = (PFN_vkGetSwapchainImagesKHR) load("vkGetSwapchainImagesKHR", userptr);
    405     vkQueuePresentKHR = (PFN_vkQueuePresentKHR) load("vkQueuePresentKHR", userptr);
    406 }
    407 
    408 
    409 
    410 static int glad_vk_get_extensions( VkPhysicalDevice physical_device, uint32_t *out_extension_count, char ***out_extensions) {
    411     uint32_t i;
    412     uint32_t instance_extension_count = 0;
    413     uint32_t device_extension_count = 0;
    414     uint32_t max_extension_count;
    415     uint32_t total_extension_count;
    416     char **extensions;
    417     VkExtensionProperties *ext_properties;
    418     VkResult result;
    419 
    420     if (vkEnumerateInstanceExtensionProperties == NULL || (physical_device != NULL && vkEnumerateDeviceExtensionProperties == NULL)) {
    421         return 0;
    422     }
    423 
    424     result = vkEnumerateInstanceExtensionProperties(NULL, &instance_extension_count, NULL);
    425     if (result != VK_SUCCESS) {
    426         return 0;
    427     }
    428 
    429     if (physical_device != NULL) {
    430         result = vkEnumerateDeviceExtensionProperties(physical_device, NULL, &device_extension_count, NULL);
    431         if (result != VK_SUCCESS) {
    432             return 0;
    433         }
    434     }
    435 
    436     total_extension_count = instance_extension_count + device_extension_count;
    437     max_extension_count = instance_extension_count > device_extension_count
    438         ? instance_extension_count : device_extension_count;
    439 
    440     ext_properties = (VkExtensionProperties*) malloc(max_extension_count * sizeof(VkExtensionProperties));
    441     if (ext_properties == NULL) {
    442         return 0;
    443     }
    444 
    445     result = vkEnumerateInstanceExtensionProperties(NULL, &instance_extension_count, ext_properties);
    446     if (result != VK_SUCCESS) {
    447         free((void*) ext_properties);
    448         return 0;
    449     }
    450 
    451     extensions = (char**) calloc(total_extension_count, sizeof(char*));
    452     if (extensions == NULL) {
    453         free((void*) ext_properties);
    454         return 0;
    455     }
    456 
    457     for (i = 0; i < instance_extension_count; ++i) {
    458         VkExtensionProperties ext = ext_properties[i];
    459 
    460         size_t extension_name_length = strlen(ext.extensionName) + 1;
    461         extensions[i] = (char*) malloc(extension_name_length * sizeof(char));
    462         memcpy(extensions[i], ext.extensionName, extension_name_length * sizeof(char));
    463     }
    464 
    465     if (physical_device != NULL) {
    466         result = vkEnumerateDeviceExtensionProperties(physical_device, NULL, &device_extension_count, ext_properties);
    467         if (result != VK_SUCCESS) {
    468             for (i = 0; i < instance_extension_count; ++i) {
    469                 free((void*) extensions[i]);
    470             }
    471             free(extensions);
    472             return 0;
    473         }
    474 
    475         for (i = 0; i < device_extension_count; ++i) {
    476             VkExtensionProperties ext = ext_properties[i];
    477 
    478             size_t extension_name_length = strlen(ext.extensionName) + 1;
    479             extensions[instance_extension_count + i] = (char*) malloc(extension_name_length * sizeof(char));
    480             memcpy(extensions[instance_extension_count + i], ext.extensionName, extension_name_length * sizeof(char));
    481         }
    482     }
    483 
    484     free((void*) ext_properties);
    485 
    486     *out_extension_count = total_extension_count;
    487     *out_extensions = extensions;
    488 
    489     return 1;
    490 }
    491 
    492 static void glad_vk_free_extensions(uint32_t extension_count, char **extensions) {
    493     uint32_t i;
    494 
    495     for(i = 0; i < extension_count ; ++i) {
    496         free((void*) (extensions[i]));
    497     }
    498 
    499     free((void*) extensions);
    500 }
    501 
    502 static int glad_vk_has_extension(const char *name, uint32_t extension_count, char **extensions) {
    503     uint32_t i;
    504 
    505     for (i = 0; i < extension_count; ++i) {
    506         if(strcmp(name, extensions[i]) == 0) {
    507             return 1;
    508         }
    509     }
    510 
    511     return 0;
    512 }
    513 
    514 static GLADapiproc glad_vk_get_proc_from_userptr(const char* name, void *userptr) {
    515     return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name);
    516 }
    517 
    518 static int glad_vk_find_extensions_vulkan( VkPhysicalDevice physical_device) {
    519     uint32_t extension_count = 0;
    520     char **extensions = NULL;
    521     if (!glad_vk_get_extensions(physical_device, &extension_count, &extensions)) return 0;
    522 
    523     GLAD_VK_EXT_debug_report = glad_vk_has_extension("VK_EXT_debug_report", extension_count, extensions);
    524     GLAD_VK_KHR_surface = glad_vk_has_extension("VK_KHR_surface", extension_count, extensions);
    525     GLAD_VK_KHR_swapchain = glad_vk_has_extension("VK_KHR_swapchain", extension_count, extensions);
    526 
    527     glad_vk_free_extensions(extension_count, extensions);
    528 
    529     return 1;
    530 }
    531 
    532 static int glad_vk_find_core_vulkan( VkPhysicalDevice physical_device) {
    533     int major = 1;
    534     int minor = 0;
    535 
    536 #ifdef VK_VERSION_1_1
    537     if (vkEnumerateInstanceVersion  != NULL) {
    538         uint32_t version;
    539         VkResult result;
    540 
    541         result = vkEnumerateInstanceVersion(&version);
    542         if (result == VK_SUCCESS) {
    543             major = (int) VK_VERSION_MAJOR(version);
    544             minor = (int) VK_VERSION_MINOR(version);
    545         }
    546     }
    547 #endif
    548 
    549     if (physical_device != NULL && vkGetPhysicalDeviceProperties  != NULL) {
    550         VkPhysicalDeviceProperties properties;
    551         vkGetPhysicalDeviceProperties(physical_device, &properties);
    552 
    553         major = (int) VK_VERSION_MAJOR(properties.apiVersion);
    554         minor = (int) VK_VERSION_MINOR(properties.apiVersion);
    555     }
    556 
    557     GLAD_VK_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1;
    558     GLAD_VK_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1;
    559 
    560     return GLAD_MAKE_VERSION(major, minor);
    561 }
    562 
    563 int gladLoadVulkanUserPtr( VkPhysicalDevice physical_device, GLADuserptrloadfunc load, void *userptr) {
    564     int version;
    565 
    566 #ifdef VK_VERSION_1_1
    567     vkEnumerateInstanceVersion  = (PFN_vkEnumerateInstanceVersion) load("vkEnumerateInstanceVersion", userptr);
    568 #endif
    569     version = glad_vk_find_core_vulkan( physical_device);
    570     if (!version) {
    571         return 0;
    572     }
    573 
    574     glad_vk_load_VK_VERSION_1_0(load, userptr);
    575     glad_vk_load_VK_VERSION_1_1(load, userptr);
    576 
    577     if (!glad_vk_find_extensions_vulkan( physical_device)) return 0;
    578     glad_vk_load_VK_EXT_debug_report(load, userptr);
    579     glad_vk_load_VK_KHR_surface(load, userptr);
    580     glad_vk_load_VK_KHR_swapchain(load, userptr);
    581 
    582 
    583     return version;
    584 }
    585 
    586 
    587 int gladLoadVulkan( VkPhysicalDevice physical_device, GLADloadfunc load) {
    588     return gladLoadVulkanUserPtr( physical_device, glad_vk_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load);
    589 }
    590 
    591 
    592 
    593