1 module erupted.functions;
2 
3 public import erupted.types;
4 
5 extern( System ) @nogc nothrow {
6 
7 	// VK_VERSION_1_0
8 	alias PFN_vkCreateInstance = VkResult function( const( VkInstanceCreateInfo )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkInstance* pInstance );
9 	alias PFN_vkDestroyInstance = void function( VkInstance instance, const( VkAllocationCallbacks )* pAllocator );
10 	alias PFN_vkEnumeratePhysicalDevices = VkResult function( VkInstance instance, uint32_t* pPhysicalDeviceCount, VkPhysicalDevice* pPhysicalDevices );
11 	alias PFN_vkGetPhysicalDeviceFeatures = void function( VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures* pFeatures );
12 	alias PFN_vkGetPhysicalDeviceFormatProperties = void function( VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties* pFormatProperties );
13 	alias PFN_vkGetPhysicalDeviceImageFormatProperties = VkResult function( VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkImageFormatProperties* pImageFormatProperties );
14 	alias PFN_vkGetPhysicalDeviceProperties = void function( VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties* pProperties );
15 	alias PFN_vkGetPhysicalDeviceQueueFamilyProperties = void function( VkPhysicalDevice physicalDevice, uint32_t* pQueueFamilyPropertyCount, VkQueueFamilyProperties* pQueueFamilyProperties );
16 	alias PFN_vkGetPhysicalDeviceMemoryProperties = void function( VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties* pMemoryProperties );
17 	alias PFN_vkGetInstanceProcAddr = PFN_vkVoidFunction function( VkInstance instance, const( char )* pName );
18 	alias PFN_vkGetDeviceProcAddr = PFN_vkVoidFunction function( VkDevice device, const( char )* pName );
19 	alias PFN_vkCreateDevice = VkResult function( VkPhysicalDevice physicalDevice, const( VkDeviceCreateInfo )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkDevice* pDevice );
20 	alias PFN_vkDestroyDevice = void function( VkDevice device, const( VkAllocationCallbacks )* pAllocator );
21 	alias PFN_vkEnumerateInstanceExtensionProperties = VkResult function( const( char )* pLayerName, uint32_t* pPropertyCount, VkExtensionProperties* pProperties );
22 	alias PFN_vkEnumerateDeviceExtensionProperties = VkResult function( VkPhysicalDevice physicalDevice, const( char )* pLayerName, uint32_t* pPropertyCount, VkExtensionProperties* pProperties );
23 	alias PFN_vkEnumerateInstanceLayerProperties = VkResult function( uint32_t* pPropertyCount, VkLayerProperties* pProperties );
24 	alias PFN_vkEnumerateDeviceLayerProperties = VkResult function( VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkLayerProperties* pProperties );
25 	alias PFN_vkGetDeviceQueue = void function( VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue* pQueue );
26 	alias PFN_vkQueueSubmit = VkResult function( VkQueue queue, uint32_t submitCount, const( VkSubmitInfo )* pSubmits, VkFence fence );
27 	alias PFN_vkQueueWaitIdle = VkResult function( VkQueue queue );
28 	alias PFN_vkDeviceWaitIdle = VkResult function( VkDevice device );
29 	alias PFN_vkAllocateMemory = VkResult function( VkDevice device, const( VkMemoryAllocateInfo )* pAllocateInfo, const( VkAllocationCallbacks )* pAllocator, VkDeviceMemory* pMemory );
30 	alias PFN_vkFreeMemory = void function( VkDevice device, VkDeviceMemory memory, const( VkAllocationCallbacks )* pAllocator );
31 	alias PFN_vkMapMemory = VkResult function( VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void** ppData );
32 	alias PFN_vkUnmapMemory = void function( VkDevice device, VkDeviceMemory memory );
33 	alias PFN_vkFlushMappedMemoryRanges = VkResult function( VkDevice device, uint32_t memoryRangeCount, const( VkMappedMemoryRange )* pMemoryRanges );
34 	alias PFN_vkInvalidateMappedMemoryRanges = VkResult function( VkDevice device, uint32_t memoryRangeCount, const( VkMappedMemoryRange )* pMemoryRanges );
35 	alias PFN_vkGetDeviceMemoryCommitment = void function( VkDevice device, VkDeviceMemory memory, VkDeviceSize* pCommittedMemoryInBytes );
36 	alias PFN_vkBindBufferMemory = VkResult function( VkDevice device, VkBuffer buffer, VkDeviceMemory memory, VkDeviceSize memoryOffset );
37 	alias PFN_vkBindImageMemory = VkResult function( VkDevice device, VkImage image, VkDeviceMemory memory, VkDeviceSize memoryOffset );
38 	alias PFN_vkGetBufferMemoryRequirements = void function( VkDevice device, VkBuffer buffer, VkMemoryRequirements* pMemoryRequirements );
39 	alias PFN_vkGetImageMemoryRequirements = void function( VkDevice device, VkImage image, VkMemoryRequirements* pMemoryRequirements );
40 	alias PFN_vkGetImageSparseMemoryRequirements = void function( VkDevice device, VkImage image, uint32_t* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements* pSparseMemoryRequirements );
41 	alias PFN_vkGetPhysicalDeviceSparseImageFormatProperties = void function( VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling, uint32_t* pPropertyCount, VkSparseImageFormatProperties* pProperties );
42 	alias PFN_vkQueueBindSparse = VkResult function( VkQueue queue, uint32_t bindInfoCount, const( VkBindSparseInfo )* pBindInfo, VkFence fence );
43 	alias PFN_vkCreateFence = VkResult function( VkDevice device, const( VkFenceCreateInfo )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkFence* pFence );
44 	alias PFN_vkDestroyFence = void function( VkDevice device, VkFence fence, const( VkAllocationCallbacks )* pAllocator );
45 	alias PFN_vkResetFences = VkResult function( VkDevice device, uint32_t fenceCount, const( VkFence )* pFences );
46 	alias PFN_vkGetFenceStatus = VkResult function( VkDevice device, VkFence fence );
47 	alias PFN_vkWaitForFences = VkResult function( VkDevice device, uint32_t fenceCount, const( VkFence )* pFences, VkBool32 waitAll, uint64_t timeout );
48 	alias PFN_vkCreateSemaphore = VkResult function( VkDevice device, const( VkSemaphoreCreateInfo )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkSemaphore* pSemaphore );
49 	alias PFN_vkDestroySemaphore = void function( VkDevice device, VkSemaphore semaphore, const( VkAllocationCallbacks )* pAllocator );
50 	alias PFN_vkCreateEvent = VkResult function( VkDevice device, const( VkEventCreateInfo )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkEvent* pEvent );
51 	alias PFN_vkDestroyEvent = void function( VkDevice device, VkEvent event, const( VkAllocationCallbacks )* pAllocator );
52 	alias PFN_vkGetEventStatus = VkResult function( VkDevice device, VkEvent event );
53 	alias PFN_vkSetEvent = VkResult function( VkDevice device, VkEvent event );
54 	alias PFN_vkResetEvent = VkResult function( VkDevice device, VkEvent event );
55 	alias PFN_vkCreateQueryPool = VkResult function( VkDevice device, const( VkQueryPoolCreateInfo )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkQueryPool* pQueryPool );
56 	alias PFN_vkDestroyQueryPool = void function( VkDevice device, VkQueryPool queryPool, const( VkAllocationCallbacks )* pAllocator );
57 	alias PFN_vkGetQueryPoolResults = VkResult function( VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, size_t dataSize, void* pData, VkDeviceSize stride, VkQueryResultFlags flags );
58 	alias PFN_vkCreateBuffer = VkResult function( VkDevice device, const( VkBufferCreateInfo )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkBuffer* pBuffer );
59 	alias PFN_vkDestroyBuffer = void function( VkDevice device, VkBuffer buffer, const( VkAllocationCallbacks )* pAllocator );
60 	alias PFN_vkCreateBufferView = VkResult function( VkDevice device, const( VkBufferViewCreateInfo )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkBufferView* pView );
61 	alias PFN_vkDestroyBufferView = void function( VkDevice device, VkBufferView bufferView, const( VkAllocationCallbacks )* pAllocator );
62 	alias PFN_vkCreateImage = VkResult function( VkDevice device, const( VkImageCreateInfo )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkImage* pImage );
63 	alias PFN_vkDestroyImage = void function( VkDevice device, VkImage image, const( VkAllocationCallbacks )* pAllocator );
64 	alias PFN_vkGetImageSubresourceLayout = void function( VkDevice device, VkImage image, const( VkImageSubresource )* pSubresource, VkSubresourceLayout* pLayout );
65 	alias PFN_vkCreateImageView = VkResult function( VkDevice device, const( VkImageViewCreateInfo )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkImageView* pView );
66 	alias PFN_vkDestroyImageView = void function( VkDevice device, VkImageView imageView, const( VkAllocationCallbacks )* pAllocator );
67 	alias PFN_vkCreateShaderModule = VkResult function( VkDevice device, const( VkShaderModuleCreateInfo )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkShaderModule* pShaderModule );
68 	alias PFN_vkDestroyShaderModule = void function( VkDevice device, VkShaderModule shaderModule, const( VkAllocationCallbacks )* pAllocator );
69 	alias PFN_vkCreatePipelineCache = VkResult function( VkDevice device, const( VkPipelineCacheCreateInfo )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkPipelineCache* pPipelineCache );
70 	alias PFN_vkDestroyPipelineCache = void function( VkDevice device, VkPipelineCache pipelineCache, const( VkAllocationCallbacks )* pAllocator );
71 	alias PFN_vkGetPipelineCacheData = VkResult function( VkDevice device, VkPipelineCache pipelineCache, size_t* pDataSize, void* pData );
72 	alias PFN_vkMergePipelineCaches = VkResult function( VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const( VkPipelineCache )* pSrcCaches );
73 	alias PFN_vkCreateGraphicsPipelines = VkResult function( VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const( VkGraphicsPipelineCreateInfo )* pCreateInfos, const( VkAllocationCallbacks )* pAllocator, VkPipeline* pPipelines );
74 	alias PFN_vkCreateComputePipelines = VkResult function( VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const( VkComputePipelineCreateInfo )* pCreateInfos, const( VkAllocationCallbacks )* pAllocator, VkPipeline* pPipelines );
75 	alias PFN_vkDestroyPipeline = void function( VkDevice device, VkPipeline pipeline, const( VkAllocationCallbacks )* pAllocator );
76 	alias PFN_vkCreatePipelineLayout = VkResult function( VkDevice device, const( VkPipelineLayoutCreateInfo )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkPipelineLayout* pPipelineLayout );
77 	alias PFN_vkDestroyPipelineLayout = void function( VkDevice device, VkPipelineLayout pipelineLayout, const( VkAllocationCallbacks )* pAllocator );
78 	alias PFN_vkCreateSampler = VkResult function( VkDevice device, const( VkSamplerCreateInfo )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkSampler* pSampler );
79 	alias PFN_vkDestroySampler = void function( VkDevice device, VkSampler sampler, const( VkAllocationCallbacks )* pAllocator );
80 	alias PFN_vkCreateDescriptorSetLayout = VkResult function( VkDevice device, const( VkDescriptorSetLayoutCreateInfo )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkDescriptorSetLayout* pSetLayout );
81 	alias PFN_vkDestroyDescriptorSetLayout = void function( VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const( VkAllocationCallbacks )* pAllocator );
82 	alias PFN_vkCreateDescriptorPool = VkResult function( VkDevice device, const( VkDescriptorPoolCreateInfo )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkDescriptorPool* pDescriptorPool );
83 	alias PFN_vkDestroyDescriptorPool = void function( VkDevice device, VkDescriptorPool descriptorPool, const( VkAllocationCallbacks )* pAllocator );
84 	alias PFN_vkResetDescriptorPool = VkResult function( VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags );
85 	alias PFN_vkAllocateDescriptorSets = VkResult function( VkDevice device, const( VkDescriptorSetAllocateInfo )* pAllocateInfo, VkDescriptorSet* pDescriptorSets );
86 	alias PFN_vkFreeDescriptorSets = VkResult function( VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount, const( VkDescriptorSet )* pDescriptorSets );
87 	alias PFN_vkUpdateDescriptorSets = void function( VkDevice device, uint32_t descriptorWriteCount, const( VkWriteDescriptorSet )* pDescriptorWrites, uint32_t descriptorCopyCount, const( VkCopyDescriptorSet )* pDescriptorCopies );
88 	alias PFN_vkCreateFramebuffer = VkResult function( VkDevice device, const( VkFramebufferCreateInfo )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkFramebuffer* pFramebuffer );
89 	alias PFN_vkDestroyFramebuffer = void function( VkDevice device, VkFramebuffer framebuffer, const( VkAllocationCallbacks )* pAllocator );
90 	alias PFN_vkCreateRenderPass = VkResult function( VkDevice device, const( VkRenderPassCreateInfo )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkRenderPass* pRenderPass );
91 	alias PFN_vkDestroyRenderPass = void function( VkDevice device, VkRenderPass renderPass, const( VkAllocationCallbacks )* pAllocator );
92 	alias PFN_vkGetRenderAreaGranularity = void function( VkDevice device, VkRenderPass renderPass, VkExtent2D* pGranularity );
93 	alias PFN_vkCreateCommandPool = VkResult function( VkDevice device, const( VkCommandPoolCreateInfo )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkCommandPool* pCommandPool );
94 	alias PFN_vkDestroyCommandPool = void function( VkDevice device, VkCommandPool commandPool, const( VkAllocationCallbacks )* pAllocator );
95 	alias PFN_vkResetCommandPool = VkResult function( VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags );
96 	alias PFN_vkAllocateCommandBuffers = VkResult function( VkDevice device, const( VkCommandBufferAllocateInfo )* pAllocateInfo, VkCommandBuffer* pCommandBuffers );
97 	alias PFN_vkFreeCommandBuffers = void function( VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount, const( VkCommandBuffer )* pCommandBuffers );
98 	alias PFN_vkBeginCommandBuffer = VkResult function( VkCommandBuffer commandBuffer, const( VkCommandBufferBeginInfo )* pBeginInfo );
99 	alias PFN_vkEndCommandBuffer = VkResult function( VkCommandBuffer commandBuffer );
100 	alias PFN_vkResetCommandBuffer = VkResult function( VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags );
101 	alias PFN_vkCmdBindPipeline = void function( VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline );
102 	alias PFN_vkCmdSetViewport = void function( VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const( VkViewport )* pViewports );
103 	alias PFN_vkCmdSetScissor = void function( VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const( VkRect2D )* pScissors );
104 	alias PFN_vkCmdSetLineWidth = void function( VkCommandBuffer commandBuffer, float lineWidth );
105 	alias PFN_vkCmdSetDepthBias = void function( VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor );
106 	alias PFN_vkCmdSetBlendConstants = void function( VkCommandBuffer commandBuffer, const float[4] blendConstants );
107 	alias PFN_vkCmdSetDepthBounds = void function( VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds );
108 	alias PFN_vkCmdSetStencilCompareMask = void function( VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask );
109 	alias PFN_vkCmdSetStencilWriteMask = void function( VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask );
110 	alias PFN_vkCmdSetStencilReference = void function( VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference );
111 	alias PFN_vkCmdBindDescriptorSets = void function( VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount, const( VkDescriptorSet )* pDescriptorSets, uint32_t dynamicOffsetCount, const( uint32_t )* pDynamicOffsets );
112 	alias PFN_vkCmdBindIndexBuffer = void function( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType );
113 	alias PFN_vkCmdBindVertexBuffers = void function( VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount, const( VkBuffer )* pBuffers, const( VkDeviceSize )* pOffsets );
114 	alias PFN_vkCmdDraw = void function( VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance );
115 	alias PFN_vkCmdDrawIndexed = void function( VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance );
116 	alias PFN_vkCmdDrawIndirect = void function( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride );
117 	alias PFN_vkCmdDrawIndexedIndirect = void function( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride );
118 	alias PFN_vkCmdDispatch = void function( VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z );
119 	alias PFN_vkCmdDispatchIndirect = void function( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset );
120 	alias PFN_vkCmdCopyBuffer = void function( VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const( VkBufferCopy )* pRegions );
121 	alias PFN_vkCmdCopyImage = void function( VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const( VkImageCopy )* pRegions );
122 	alias PFN_vkCmdBlitImage = void function( VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const( VkImageBlit )* pRegions, VkFilter filter );
123 	alias PFN_vkCmdCopyBufferToImage = void function( VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const( VkBufferImageCopy )* pRegions );
124 	alias PFN_vkCmdCopyImageToBuffer = void function( VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint32_t regionCount, const( VkBufferImageCopy )* pRegions );
125 	alias PFN_vkCmdUpdateBuffer = void function( VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const( void )* pData );
126 	alias PFN_vkCmdFillBuffer = void function( VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data );
127 	alias PFN_vkCmdClearColorImage = void function( VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const( VkClearColorValue )* pColor, uint32_t rangeCount, const( VkImageSubresourceRange )* pRanges );
128 	alias PFN_vkCmdClearDepthStencilImage = void function( VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const( VkClearDepthStencilValue )* pDepthStencil, uint32_t rangeCount, const( VkImageSubresourceRange )* pRanges );
129 	alias PFN_vkCmdClearAttachments = void function( VkCommandBuffer commandBuffer, uint32_t attachmentCount, const( VkClearAttachment )* pAttachments, uint32_t rectCount, const( VkClearRect )* pRects );
130 	alias PFN_vkCmdResolveImage = void function( VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const( VkImageResolve )* pRegions );
131 	alias PFN_vkCmdSetEvent = void function( VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask );
132 	alias PFN_vkCmdResetEvent = void function( VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask );
133 	alias PFN_vkCmdWaitEvents = void function( 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 );
134 	alias PFN_vkCmdPipelineBarrier = void function( 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 );
135 	alias PFN_vkCmdBeginQuery = void function( VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags );
136 	alias PFN_vkCmdEndQuery = void function( VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query );
137 	alias PFN_vkCmdResetQueryPool = void function( VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount );
138 	alias PFN_vkCmdWriteTimestamp = void function( VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool, uint32_t query );
139 	alias PFN_vkCmdCopyQueryPoolResults = void function( VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags );
140 	alias PFN_vkCmdPushConstants = void function( VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size, const( void )* pValues );
141 	alias PFN_vkCmdBeginRenderPass = void function( VkCommandBuffer commandBuffer, const( VkRenderPassBeginInfo )* pRenderPassBegin, VkSubpassContents contents );
142 	alias PFN_vkCmdNextSubpass = void function( VkCommandBuffer commandBuffer, VkSubpassContents contents );
143 	alias PFN_vkCmdEndRenderPass = void function( VkCommandBuffer commandBuffer );
144 	alias PFN_vkCmdExecuteCommands = void function( VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const( VkCommandBuffer )* pCommandBuffers );
145 
146 	// VK_KHR_surface
147 	alias PFN_vkDestroySurfaceKHR = void function( VkInstance instance, VkSurfaceKHR surface, const( VkAllocationCallbacks )* pAllocator );
148 	alias PFN_vkGetPhysicalDeviceSurfaceSupportKHR = VkResult function( VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, VkSurfaceKHR surface, VkBool32* pSupported );
149 	alias PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR = VkResult function( VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR* pSurfaceCapabilities );
150 	alias PFN_vkGetPhysicalDeviceSurfaceFormatsKHR = VkResult function( VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t* pSurfaceFormatCount, VkSurfaceFormatKHR* pSurfaceFormats );
151 	alias PFN_vkGetPhysicalDeviceSurfacePresentModesKHR = VkResult function( VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t* pPresentModeCount, VkPresentModeKHR* pPresentModes );
152 
153 	// VK_KHR_swapchain
154 	alias PFN_vkCreateSwapchainKHR = VkResult function( VkDevice device, const( VkSwapchainCreateInfoKHR )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkSwapchainKHR* pSwapchain );
155 	alias PFN_vkDestroySwapchainKHR = void function( VkDevice device, VkSwapchainKHR swapchain, const( VkAllocationCallbacks )* pAllocator );
156 	alias PFN_vkGetSwapchainImagesKHR = VkResult function( VkDevice device, VkSwapchainKHR swapchain, uint32_t* pSwapchainImageCount, VkImage* pSwapchainImages );
157 	alias PFN_vkAcquireNextImageKHR = VkResult function( VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout, VkSemaphore semaphore, VkFence fence, uint32_t* pImageIndex );
158 	alias PFN_vkQueuePresentKHR = VkResult function( VkQueue queue, const( VkPresentInfoKHR )* pPresentInfo );
159 
160 	// VK_KHR_display
161 	alias PFN_vkGetPhysicalDeviceDisplayPropertiesKHR = VkResult function( VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkDisplayPropertiesKHR* pProperties );
162 	alias PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR = VkResult function( VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkDisplayPlanePropertiesKHR* pProperties );
163 	alias PFN_vkGetDisplayPlaneSupportedDisplaysKHR = VkResult function( VkPhysicalDevice physicalDevice, uint32_t planeIndex, uint32_t* pDisplayCount, VkDisplayKHR* pDisplays );
164 	alias PFN_vkGetDisplayModePropertiesKHR = VkResult function( VkPhysicalDevice physicalDevice, VkDisplayKHR display, uint32_t* pPropertyCount, VkDisplayModePropertiesKHR* pProperties );
165 	alias PFN_vkCreateDisplayModeKHR = VkResult function( VkPhysicalDevice physicalDevice, VkDisplayKHR display, const( VkDisplayModeCreateInfoKHR )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkDisplayModeKHR* pMode );
166 	alias PFN_vkGetDisplayPlaneCapabilitiesKHR = VkResult function( VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode, uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR* pCapabilities );
167 	alias PFN_vkCreateDisplayPlaneSurfaceKHR = VkResult function( VkInstance instance, const( VkDisplaySurfaceCreateInfoKHR )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkSurfaceKHR* pSurface );
168 
169 	// VK_KHR_display_swapchain
170 	alias PFN_vkCreateSharedSwapchainsKHR = VkResult function( VkDevice device, uint32_t swapchainCount, const( VkSwapchainCreateInfoKHR )* pCreateInfos, const( VkAllocationCallbacks )* pAllocator, VkSwapchainKHR* pSwapchains );
171 
172 	// VK_KHR_xlib_surface
173 	version( VK_USE_PLATFORM_XLIB_KHR ) {
174 		alias PFN_vkCreateXlibSurfaceKHR = VkResult function( VkInstance instance, const( VkXlibSurfaceCreateInfoKHR )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkSurfaceKHR* pSurface );
175 		alias PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR = VkBool32 function( VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, Display* dpy, VisualID visualID );
176 	}
177 
178 	// VK_KHR_xcb_surface
179 	version( VK_USE_PLATFORM_XCB_KHR ) {
180 		alias PFN_vkCreateXcbSurfaceKHR = VkResult function( VkInstance instance, const( VkXcbSurfaceCreateInfoKHR )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkSurfaceKHR* pSurface );
181 		alias PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR = VkBool32 function( VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, xcb_connection_t* connection, xcb_visualid_t visual_id );
182 	}
183 
184 	// VK_KHR_wayland_surface
185 	version( VK_USE_PLATFORM_WAYLAND_KHR ) {
186 		alias PFN_vkCreateWaylandSurfaceKHR = VkResult function( VkInstance instance, const( VkWaylandSurfaceCreateInfoKHR )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkSurfaceKHR* pSurface );
187 		alias PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR = VkBool32 function( VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, wl_display* display );
188 	}
189 
190 	// VK_KHR_mir_surface
191 	version( VK_USE_PLATFORM_MIR_KHR ) {
192 		alias PFN_vkCreateMirSurfaceKHR = VkResult function( VkInstance instance, const( VkMirSurfaceCreateInfoKHR )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkSurfaceKHR* pSurface );
193 		alias PFN_vkGetPhysicalDeviceMirPresentationSupportKHR = VkBool32 function( VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, MirConnection* connection );
194 	}
195 
196 	// VK_KHR_android_surface
197 	version( VK_USE_PLATFORM_ANDROID_KHR ) {
198 		alias PFN_vkCreateAndroidSurfaceKHR = VkResult function( VkInstance instance, const( VkAndroidSurfaceCreateInfoKHR )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkSurfaceKHR* pSurface );
199 	}
200 
201 	// VK_KHR_win32_surface
202 	version( VK_USE_PLATFORM_WIN32_KHR ) {
203 		alias PFN_vkCreateWin32SurfaceKHR = VkResult function( VkInstance instance, const( VkWin32SurfaceCreateInfoKHR )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkSurfaceKHR* pSurface );
204 		alias PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR = VkBool32 function( VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex );
205 	}
206 
207 	// VK_EXT_debug_report
208 	alias PFN_vkCreateDebugReportCallbackEXT = VkResult function( VkInstance instance, const( VkDebugReportCallbackCreateInfoEXT )* pCreateInfo, const( VkAllocationCallbacks )* pAllocator, VkDebugReportCallbackEXT* pCallback );
209 	alias PFN_vkDestroyDebugReportCallbackEXT = void function( VkInstance instance, VkDebugReportCallbackEXT callback, const( VkAllocationCallbacks )* pAllocator );
210 	alias PFN_vkDebugReportMessageEXT = void function( VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, int32_t messageCode, const( char )* pLayerPrefix, const( char )* pMessage );
211 
212 	// VK_EXT_debug_marker
213 	alias PFN_vkDebugMarkerSetObjectTagEXT = VkResult function( VkDevice device, VkDebugMarkerObjectTagInfoEXT* pTagInfo );
214 	alias PFN_vkDebugMarkerSetObjectNameEXT = VkResult function( VkDevice device, VkDebugMarkerObjectNameInfoEXT* pNameInfo );
215 	alias PFN_vkCmdDebugMarkerBeginEXT = void function( VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT* pMarkerInfo );
216 	alias PFN_vkCmdDebugMarkerEndEXT = void function( VkCommandBuffer commandBuffer );
217 	alias PFN_vkCmdDebugMarkerInsertEXT = void function( VkCommandBuffer commandBuffer, VkDebugMarkerMarkerInfoEXT* pMarkerInfo );
218 
219 	// VK_AMD_draw_indirect_count
220 	alias PFN_vkCmdDrawIndirectCountAMD = void function( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride );
221 	alias PFN_vkCmdDrawIndexedIndirectCountAMD = void function( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride );
222 
223 	// VK_NV_external_memory_capabilities
224 	alias PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV = VkResult function( VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType, VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties );
225 
226 	// VK_NV_external_memory_win32
227 	version( VK_USE_PLATFORM_WIN32_KHR ) {
228 		alias PFN_vkGetMemoryWin32HandleNV = VkResult function( VkDevice device, VkDeviceMemory memory, VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE* pHandle );
229 	}
230 }
231 
232 __gshared {
233 
234 	// VK_VERSION_1_0
235 	PFN_vkCreateInstance vkCreateInstance;
236 	PFN_vkDestroyInstance vkDestroyInstance;
237 	PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices;
238 	PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures;
239 	PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties;
240 	PFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties;
241 	PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties;
242 	PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties;
243 	PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties;
244 	PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;
245 	PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr;
246 	PFN_vkCreateDevice vkCreateDevice;
247 	PFN_vkDestroyDevice vkDestroyDevice;
248 	PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties;
249 	PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties;
250 	PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties;
251 	PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties;
252 	PFN_vkGetDeviceQueue vkGetDeviceQueue;
253 	PFN_vkQueueSubmit vkQueueSubmit;
254 	PFN_vkQueueWaitIdle vkQueueWaitIdle;
255 	PFN_vkDeviceWaitIdle vkDeviceWaitIdle;
256 	PFN_vkAllocateMemory vkAllocateMemory;
257 	PFN_vkFreeMemory vkFreeMemory;
258 	PFN_vkMapMemory vkMapMemory;
259 	PFN_vkUnmapMemory vkUnmapMemory;
260 	PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges;
261 	PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges;
262 	PFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment;
263 	PFN_vkBindBufferMemory vkBindBufferMemory;
264 	PFN_vkBindImageMemory vkBindImageMemory;
265 	PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements;
266 	PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements;
267 	PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements;
268 	PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties;
269 	PFN_vkQueueBindSparse vkQueueBindSparse;
270 	PFN_vkCreateFence vkCreateFence;
271 	PFN_vkDestroyFence vkDestroyFence;
272 	PFN_vkResetFences vkResetFences;
273 	PFN_vkGetFenceStatus vkGetFenceStatus;
274 	PFN_vkWaitForFences vkWaitForFences;
275 	PFN_vkCreateSemaphore vkCreateSemaphore;
276 	PFN_vkDestroySemaphore vkDestroySemaphore;
277 	PFN_vkCreateEvent vkCreateEvent;
278 	PFN_vkDestroyEvent vkDestroyEvent;
279 	PFN_vkGetEventStatus vkGetEventStatus;
280 	PFN_vkSetEvent vkSetEvent;
281 	PFN_vkResetEvent vkResetEvent;
282 	PFN_vkCreateQueryPool vkCreateQueryPool;
283 	PFN_vkDestroyQueryPool vkDestroyQueryPool;
284 	PFN_vkGetQueryPoolResults vkGetQueryPoolResults;
285 	PFN_vkCreateBuffer vkCreateBuffer;
286 	PFN_vkDestroyBuffer vkDestroyBuffer;
287 	PFN_vkCreateBufferView vkCreateBufferView;
288 	PFN_vkDestroyBufferView vkDestroyBufferView;
289 	PFN_vkCreateImage vkCreateImage;
290 	PFN_vkDestroyImage vkDestroyImage;
291 	PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout;
292 	PFN_vkCreateImageView vkCreateImageView;
293 	PFN_vkDestroyImageView vkDestroyImageView;
294 	PFN_vkCreateShaderModule vkCreateShaderModule;
295 	PFN_vkDestroyShaderModule vkDestroyShaderModule;
296 	PFN_vkCreatePipelineCache vkCreatePipelineCache;
297 	PFN_vkDestroyPipelineCache vkDestroyPipelineCache;
298 	PFN_vkGetPipelineCacheData vkGetPipelineCacheData;
299 	PFN_vkMergePipelineCaches vkMergePipelineCaches;
300 	PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines;
301 	PFN_vkCreateComputePipelines vkCreateComputePipelines;
302 	PFN_vkDestroyPipeline vkDestroyPipeline;
303 	PFN_vkCreatePipelineLayout vkCreatePipelineLayout;
304 	PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout;
305 	PFN_vkCreateSampler vkCreateSampler;
306 	PFN_vkDestroySampler vkDestroySampler;
307 	PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout;
308 	PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout;
309 	PFN_vkCreateDescriptorPool vkCreateDescriptorPool;
310 	PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool;
311 	PFN_vkResetDescriptorPool vkResetDescriptorPool;
312 	PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets;
313 	PFN_vkFreeDescriptorSets vkFreeDescriptorSets;
314 	PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets;
315 	PFN_vkCreateFramebuffer vkCreateFramebuffer;
316 	PFN_vkDestroyFramebuffer vkDestroyFramebuffer;
317 	PFN_vkCreateRenderPass vkCreateRenderPass;
318 	PFN_vkDestroyRenderPass vkDestroyRenderPass;
319 	PFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity;
320 	PFN_vkCreateCommandPool vkCreateCommandPool;
321 	PFN_vkDestroyCommandPool vkDestroyCommandPool;
322 	PFN_vkResetCommandPool vkResetCommandPool;
323 	PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers;
324 	PFN_vkFreeCommandBuffers vkFreeCommandBuffers;
325 	PFN_vkBeginCommandBuffer vkBeginCommandBuffer;
326 	PFN_vkEndCommandBuffer vkEndCommandBuffer;
327 	PFN_vkResetCommandBuffer vkResetCommandBuffer;
328 	PFN_vkCmdBindPipeline vkCmdBindPipeline;
329 	PFN_vkCmdSetViewport vkCmdSetViewport;
330 	PFN_vkCmdSetScissor vkCmdSetScissor;
331 	PFN_vkCmdSetLineWidth vkCmdSetLineWidth;
332 	PFN_vkCmdSetDepthBias vkCmdSetDepthBias;
333 	PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants;
334 	PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds;
335 	PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask;
336 	PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask;
337 	PFN_vkCmdSetStencilReference vkCmdSetStencilReference;
338 	PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets;
339 	PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer;
340 	PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers;
341 	PFN_vkCmdDraw vkCmdDraw;
342 	PFN_vkCmdDrawIndexed vkCmdDrawIndexed;
343 	PFN_vkCmdDrawIndirect vkCmdDrawIndirect;
344 	PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect;
345 	PFN_vkCmdDispatch vkCmdDispatch;
346 	PFN_vkCmdDispatchIndirect vkCmdDispatchIndirect;
347 	PFN_vkCmdCopyBuffer vkCmdCopyBuffer;
348 	PFN_vkCmdCopyImage vkCmdCopyImage;
349 	PFN_vkCmdBlitImage vkCmdBlitImage;
350 	PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage;
351 	PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer;
352 	PFN_vkCmdUpdateBuffer vkCmdUpdateBuffer;
353 	PFN_vkCmdFillBuffer vkCmdFillBuffer;
354 	PFN_vkCmdClearColorImage vkCmdClearColorImage;
355 	PFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage;
356 	PFN_vkCmdClearAttachments vkCmdClearAttachments;
357 	PFN_vkCmdResolveImage vkCmdResolveImage;
358 	PFN_vkCmdSetEvent vkCmdSetEvent;
359 	PFN_vkCmdResetEvent vkCmdResetEvent;
360 	PFN_vkCmdWaitEvents vkCmdWaitEvents;
361 	PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier;
362 	PFN_vkCmdBeginQuery vkCmdBeginQuery;
363 	PFN_vkCmdEndQuery vkCmdEndQuery;
364 	PFN_vkCmdResetQueryPool vkCmdResetQueryPool;
365 	PFN_vkCmdWriteTimestamp vkCmdWriteTimestamp;
366 	PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults;
367 	PFN_vkCmdPushConstants vkCmdPushConstants;
368 	PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass;
369 	PFN_vkCmdNextSubpass vkCmdNextSubpass;
370 	PFN_vkCmdEndRenderPass vkCmdEndRenderPass;
371 	PFN_vkCmdExecuteCommands vkCmdExecuteCommands;
372 
373 	// VK_KHR_surface
374 	PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR;
375 	PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR;
376 	PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR;
377 	PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR;
378 	PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR;
379 
380 	// VK_KHR_swapchain
381 	PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR;
382 	PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR;
383 	PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR;
384 	PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR;
385 	PFN_vkQueuePresentKHR vkQueuePresentKHR;
386 
387 	// VK_KHR_display
388 	PFN_vkGetPhysicalDeviceDisplayPropertiesKHR vkGetPhysicalDeviceDisplayPropertiesKHR;
389 	PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR vkGetPhysicalDeviceDisplayPlanePropertiesKHR;
390 	PFN_vkGetDisplayPlaneSupportedDisplaysKHR vkGetDisplayPlaneSupportedDisplaysKHR;
391 	PFN_vkGetDisplayModePropertiesKHR vkGetDisplayModePropertiesKHR;
392 	PFN_vkCreateDisplayModeKHR vkCreateDisplayModeKHR;
393 	PFN_vkGetDisplayPlaneCapabilitiesKHR vkGetDisplayPlaneCapabilitiesKHR;
394 	PFN_vkCreateDisplayPlaneSurfaceKHR vkCreateDisplayPlaneSurfaceKHR;
395 
396 	// VK_KHR_display_swapchain
397 	PFN_vkCreateSharedSwapchainsKHR vkCreateSharedSwapchainsKHR;
398 
399 	// VK_KHR_xlib_surface
400 	version( VK_USE_PLATFORM_XLIB_KHR ) {
401 		PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR;
402 		PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR vkGetPhysicalDeviceXlibPresentationSupportKHR;
403 	}
404 
405 	// VK_KHR_xcb_surface
406 	version( VK_USE_PLATFORM_XCB_KHR ) {
407 		PFN_vkCreateXcbSurfaceKHR vkCreateXcbSurfaceKHR;
408 		PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR vkGetPhysicalDeviceXcbPresentationSupportKHR;
409 	}
410 
411 	// VK_KHR_wayland_surface
412 	version( VK_USE_PLATFORM_WAYLAND_KHR ) {
413 		PFN_vkCreateWaylandSurfaceKHR vkCreateWaylandSurfaceKHR;
414 		PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR vkGetPhysicalDeviceWaylandPresentationSupportKHR;
415 	}
416 
417 	// VK_KHR_mir_surface
418 	version( VK_USE_PLATFORM_MIR_KHR ) {
419 		PFN_vkCreateMirSurfaceKHR vkCreateMirSurfaceKHR;
420 		PFN_vkGetPhysicalDeviceMirPresentationSupportKHR vkGetPhysicalDeviceMirPresentationSupportKHR;
421 	}
422 
423 	// VK_KHR_android_surface
424 	version( VK_USE_PLATFORM_ANDROID_KHR ) {
425 		PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR;
426 	}
427 
428 	// VK_KHR_win32_surface
429 	version( VK_USE_PLATFORM_WIN32_KHR ) {
430 		PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR;
431 		PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR vkGetPhysicalDeviceWin32PresentationSupportKHR;
432 	}
433 
434 	// VK_EXT_debug_report
435 	PFN_vkCreateDebugReportCallbackEXT vkCreateDebugReportCallbackEXT;
436 	PFN_vkDestroyDebugReportCallbackEXT vkDestroyDebugReportCallbackEXT;
437 	PFN_vkDebugReportMessageEXT vkDebugReportMessageEXT;
438 
439 	// VK_EXT_debug_marker
440 	PFN_vkDebugMarkerSetObjectTagEXT vkDebugMarkerSetObjectTagEXT;
441 	PFN_vkDebugMarkerSetObjectNameEXT vkDebugMarkerSetObjectNameEXT;
442 	PFN_vkCmdDebugMarkerBeginEXT vkCmdDebugMarkerBeginEXT;
443 	PFN_vkCmdDebugMarkerEndEXT vkCmdDebugMarkerEndEXT;
444 	PFN_vkCmdDebugMarkerInsertEXT vkCmdDebugMarkerInsertEXT;
445 
446 	// VK_AMD_draw_indirect_count
447 	PFN_vkCmdDrawIndirectCountAMD vkCmdDrawIndirectCountAMD;
448 	PFN_vkCmdDrawIndexedIndirectCountAMD vkCmdDrawIndexedIndirectCountAMD;
449 
450 	// VK_NV_external_memory_capabilities
451 	PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV vkGetPhysicalDeviceExternalImageFormatPropertiesNV;
452 
453 	// VK_NV_external_memory_win32
454 	version( VK_USE_PLATFORM_WIN32_KHR ) {
455 		PFN_vkGetMemoryWin32HandleNV vkGetMemoryWin32HandleNV;
456 	}
457 }
458 
459 /// if not using version "with-derelict-loader" this function must be called first
460 /// sets vkCreateInstance function pointer and acquires basic functions to retrieve information about the implementation
461 void loadGlobalLevelFunctions( typeof( vkGetInstanceProcAddr ) getProcAddr ) {
462 	vkGetInstanceProcAddr = getProcAddr;
463 	vkEnumerateInstanceExtensionProperties = cast( typeof( vkEnumerateInstanceExtensionProperties )) vkGetInstanceProcAddr( null, "vkEnumerateInstanceExtensionProperties" );
464 	vkEnumerateInstanceLayerProperties = cast( typeof( vkEnumerateInstanceLayerProperties )) vkGetInstanceProcAddr( null, "vkEnumerateInstanceLayerProperties" );
465 	vkCreateInstance = cast( typeof( vkCreateInstance )) vkGetInstanceProcAddr( null, "vkCreateInstance" );
466 }
467 
468 /// with a valid VkInstance call this function to retrieve additional VkInstance, VkPhysicalDevice, ... related functions
469 void loadInstanceLevelFunctions( VkInstance instance ) {
470 	assert( vkGetInstanceProcAddr !is null, "Must call loadGlobalLevelFunctions before loadInstanceLevelFunctions" );
471 
472 	// VK_VERSION_1_0
473 	vkDestroyInstance = cast( typeof( vkDestroyInstance )) vkGetInstanceProcAddr( instance, "vkDestroyInstance" );
474 	vkEnumeratePhysicalDevices = cast( typeof( vkEnumeratePhysicalDevices )) vkGetInstanceProcAddr( instance, "vkEnumeratePhysicalDevices" );
475 	vkGetPhysicalDeviceFeatures = cast( typeof( vkGetPhysicalDeviceFeatures )) vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFeatures" );
476 	vkGetPhysicalDeviceFormatProperties = cast( typeof( vkGetPhysicalDeviceFormatProperties )) vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceFormatProperties" );
477 	vkGetPhysicalDeviceImageFormatProperties = cast( typeof( vkGetPhysicalDeviceImageFormatProperties )) vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceImageFormatProperties" );
478 	vkGetPhysicalDeviceProperties = cast( typeof( vkGetPhysicalDeviceProperties )) vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceProperties" );
479 	vkGetPhysicalDeviceQueueFamilyProperties = cast( typeof( vkGetPhysicalDeviceQueueFamilyProperties )) vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceQueueFamilyProperties" );
480 	vkGetPhysicalDeviceMemoryProperties = cast( typeof( vkGetPhysicalDeviceMemoryProperties )) vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceMemoryProperties" );
481 	vkGetDeviceProcAddr = cast( typeof( vkGetDeviceProcAddr )) vkGetInstanceProcAddr( instance, "vkGetDeviceProcAddr" );
482 	vkCreateDevice = cast( typeof( vkCreateDevice )) vkGetInstanceProcAddr( instance, "vkCreateDevice" );
483 	vkEnumerateDeviceExtensionProperties = cast( typeof( vkEnumerateDeviceExtensionProperties )) vkGetInstanceProcAddr( instance, "vkEnumerateDeviceExtensionProperties" );
484 	vkEnumerateDeviceLayerProperties = cast( typeof( vkEnumerateDeviceLayerProperties )) vkGetInstanceProcAddr( instance, "vkEnumerateDeviceLayerProperties" );
485 	vkGetPhysicalDeviceSparseImageFormatProperties = cast( typeof( vkGetPhysicalDeviceSparseImageFormatProperties )) vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSparseImageFormatProperties" );
486 
487 	// VK_KHR_surface
488 	vkDestroySurfaceKHR = cast( typeof( vkDestroySurfaceKHR )) vkGetInstanceProcAddr( instance, "vkDestroySurfaceKHR" );
489 	vkGetPhysicalDeviceSurfaceSupportKHR = cast( typeof( vkGetPhysicalDeviceSurfaceSupportKHR )) vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceSupportKHR" );
490 	vkGetPhysicalDeviceSurfaceCapabilitiesKHR = cast( typeof( vkGetPhysicalDeviceSurfaceCapabilitiesKHR )) vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR" );
491 	vkGetPhysicalDeviceSurfaceFormatsKHR = cast( typeof( vkGetPhysicalDeviceSurfaceFormatsKHR )) vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfaceFormatsKHR" );
492 	vkGetPhysicalDeviceSurfacePresentModesKHR = cast( typeof( vkGetPhysicalDeviceSurfacePresentModesKHR )) vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceSurfacePresentModesKHR" );
493 
494 	// VK_KHR_display
495 	vkGetPhysicalDeviceDisplayPropertiesKHR = cast( typeof( vkGetPhysicalDeviceDisplayPropertiesKHR )) vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceDisplayPropertiesKHR" );
496 	vkGetPhysicalDeviceDisplayPlanePropertiesKHR = cast( typeof( vkGetPhysicalDeviceDisplayPlanePropertiesKHR )) vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR" );
497 	vkGetDisplayPlaneSupportedDisplaysKHR = cast( typeof( vkGetDisplayPlaneSupportedDisplaysKHR )) vkGetInstanceProcAddr( instance, "vkGetDisplayPlaneSupportedDisplaysKHR" );
498 	vkGetDisplayModePropertiesKHR = cast( typeof( vkGetDisplayModePropertiesKHR )) vkGetInstanceProcAddr( instance, "vkGetDisplayModePropertiesKHR" );
499 	vkCreateDisplayModeKHR = cast( typeof( vkCreateDisplayModeKHR )) vkGetInstanceProcAddr( instance, "vkCreateDisplayModeKHR" );
500 	vkGetDisplayPlaneCapabilitiesKHR = cast( typeof( vkGetDisplayPlaneCapabilitiesKHR )) vkGetInstanceProcAddr( instance, "vkGetDisplayPlaneCapabilitiesKHR" );
501 	vkCreateDisplayPlaneSurfaceKHR = cast( typeof( vkCreateDisplayPlaneSurfaceKHR )) vkGetInstanceProcAddr( instance, "vkCreateDisplayPlaneSurfaceKHR" );
502 
503 	// VK_KHR_xlib_surface
504 	version( VK_USE_PLATFORM_XLIB_KHR ) {
505 		vkCreateXlibSurfaceKHR = cast( typeof( vkCreateXlibSurfaceKHR )) vkGetInstanceProcAddr( instance, "vkCreateXlibSurfaceKHR" );
506 		vkGetPhysicalDeviceXlibPresentationSupportKHR = cast( typeof( vkGetPhysicalDeviceXlibPresentationSupportKHR )) vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceXlibPresentationSupportKHR" );
507 	}
508 
509 	// VK_KHR_xcb_surface
510 	version( VK_USE_PLATFORM_XCB_KHR ) {
511 		vkCreateXcbSurfaceKHR = cast( typeof( vkCreateXcbSurfaceKHR )) vkGetInstanceProcAddr( instance, "vkCreateXcbSurfaceKHR" );
512 		vkGetPhysicalDeviceXcbPresentationSupportKHR = cast( typeof( vkGetPhysicalDeviceXcbPresentationSupportKHR )) vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceXcbPresentationSupportKHR" );
513 	}
514 
515 	// VK_KHR_wayland_surface
516 	version( VK_USE_PLATFORM_WAYLAND_KHR ) {
517 		vkCreateWaylandSurfaceKHR = cast( typeof( vkCreateWaylandSurfaceKHR )) vkGetInstanceProcAddr( instance, "vkCreateWaylandSurfaceKHR" );
518 		vkGetPhysicalDeviceWaylandPresentationSupportKHR = cast( typeof( vkGetPhysicalDeviceWaylandPresentationSupportKHR )) vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceWaylandPresentationSupportKHR" );
519 	}
520 
521 	// VK_KHR_mir_surface
522 	version( VK_USE_PLATFORM_MIR_KHR ) {
523 		vkCreateMirSurfaceKHR = cast( typeof( vkCreateMirSurfaceKHR )) vkGetInstanceProcAddr( instance, "vkCreateMirSurfaceKHR" );
524 		vkGetPhysicalDeviceMirPresentationSupportKHR = cast( typeof( vkGetPhysicalDeviceMirPresentationSupportKHR )) vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceMirPresentationSupportKHR" );
525 	}
526 
527 	// VK_KHR_android_surface
528 	version( VK_USE_PLATFORM_ANDROID_KHR ) {
529 		vkCreateAndroidSurfaceKHR = cast( typeof( vkCreateAndroidSurfaceKHR )) vkGetInstanceProcAddr( instance, "vkCreateAndroidSurfaceKHR" );
530 	}
531 
532 	// VK_KHR_win32_surface
533 	version( VK_USE_PLATFORM_WIN32_KHR ) {
534 		vkCreateWin32SurfaceKHR = cast( typeof( vkCreateWin32SurfaceKHR )) vkGetInstanceProcAddr( instance, "vkCreateWin32SurfaceKHR" );
535 		vkGetPhysicalDeviceWin32PresentationSupportKHR = cast( typeof( vkGetPhysicalDeviceWin32PresentationSupportKHR )) vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceWin32PresentationSupportKHR" );
536 	}
537 
538 	// VK_EXT_debug_report
539 	vkCreateDebugReportCallbackEXT = cast( typeof( vkCreateDebugReportCallbackEXT )) vkGetInstanceProcAddr( instance, "vkCreateDebugReportCallbackEXT" );
540 	vkDestroyDebugReportCallbackEXT = cast( typeof( vkDestroyDebugReportCallbackEXT )) vkGetInstanceProcAddr( instance, "vkDestroyDebugReportCallbackEXT" );
541 	vkDebugReportMessageEXT = cast( typeof( vkDebugReportMessageEXT )) vkGetInstanceProcAddr( instance, "vkDebugReportMessageEXT" );
542 
543 	// VK_NV_external_memory_capabilities
544 	vkGetPhysicalDeviceExternalImageFormatPropertiesNV = cast( typeof( vkGetPhysicalDeviceExternalImageFormatPropertiesNV )) vkGetInstanceProcAddr( instance, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV" );
545 }
546 
547 /// with a valid VkInstance call this function to retrieve VkDevice, VkQueue and VkCommandBuffer related functions
548 /// the functions call indirectly through the VkInstance and will be internally dispatched by the implementation
549 /// use loadDeviceLevelFunctions( VkDevice device ) bellow to avoid this indirection and get the pointers directly form a VkDevice
550 void loadDeviceLevelFunctions( VkInstance instance ) {
551 	assert( vkGetInstanceProcAddr !is null, "Must call loadInstanceLevelFunctions before loadDeviceLevelFunctions" );
552 
553 	// VK_VERSION_1_0
554 	vkDestroyDevice = cast( typeof( vkDestroyDevice )) vkGetInstanceProcAddr( instance, "vkDestroyDevice" );
555 	vkGetDeviceQueue = cast( typeof( vkGetDeviceQueue )) vkGetInstanceProcAddr( instance, "vkGetDeviceQueue" );
556 	vkQueueSubmit = cast( typeof( vkQueueSubmit )) vkGetInstanceProcAddr( instance, "vkQueueSubmit" );
557 	vkQueueWaitIdle = cast( typeof( vkQueueWaitIdle )) vkGetInstanceProcAddr( instance, "vkQueueWaitIdle" );
558 	vkDeviceWaitIdle = cast( typeof( vkDeviceWaitIdle )) vkGetInstanceProcAddr( instance, "vkDeviceWaitIdle" );
559 	vkAllocateMemory = cast( typeof( vkAllocateMemory )) vkGetInstanceProcAddr( instance, "vkAllocateMemory" );
560 	vkFreeMemory = cast( typeof( vkFreeMemory )) vkGetInstanceProcAddr( instance, "vkFreeMemory" );
561 	vkMapMemory = cast( typeof( vkMapMemory )) vkGetInstanceProcAddr( instance, "vkMapMemory" );
562 	vkUnmapMemory = cast( typeof( vkUnmapMemory )) vkGetInstanceProcAddr( instance, "vkUnmapMemory" );
563 	vkFlushMappedMemoryRanges = cast( typeof( vkFlushMappedMemoryRanges )) vkGetInstanceProcAddr( instance, "vkFlushMappedMemoryRanges" );
564 	vkInvalidateMappedMemoryRanges = cast( typeof( vkInvalidateMappedMemoryRanges )) vkGetInstanceProcAddr( instance, "vkInvalidateMappedMemoryRanges" );
565 	vkGetDeviceMemoryCommitment = cast( typeof( vkGetDeviceMemoryCommitment )) vkGetInstanceProcAddr( instance, "vkGetDeviceMemoryCommitment" );
566 	vkBindBufferMemory = cast( typeof( vkBindBufferMemory )) vkGetInstanceProcAddr( instance, "vkBindBufferMemory" );
567 	vkBindImageMemory = cast( typeof( vkBindImageMemory )) vkGetInstanceProcAddr( instance, "vkBindImageMemory" );
568 	vkGetBufferMemoryRequirements = cast( typeof( vkGetBufferMemoryRequirements )) vkGetInstanceProcAddr( instance, "vkGetBufferMemoryRequirements" );
569 	vkGetImageMemoryRequirements = cast( typeof( vkGetImageMemoryRequirements )) vkGetInstanceProcAddr( instance, "vkGetImageMemoryRequirements" );
570 	vkGetImageSparseMemoryRequirements = cast( typeof( vkGetImageSparseMemoryRequirements )) vkGetInstanceProcAddr( instance, "vkGetImageSparseMemoryRequirements" );
571 	vkQueueBindSparse = cast( typeof( vkQueueBindSparse )) vkGetInstanceProcAddr( instance, "vkQueueBindSparse" );
572 	vkCreateFence = cast( typeof( vkCreateFence )) vkGetInstanceProcAddr( instance, "vkCreateFence" );
573 	vkDestroyFence = cast( typeof( vkDestroyFence )) vkGetInstanceProcAddr( instance, "vkDestroyFence" );
574 	vkResetFences = cast( typeof( vkResetFences )) vkGetInstanceProcAddr( instance, "vkResetFences" );
575 	vkGetFenceStatus = cast( typeof( vkGetFenceStatus )) vkGetInstanceProcAddr( instance, "vkGetFenceStatus" );
576 	vkWaitForFences = cast( typeof( vkWaitForFences )) vkGetInstanceProcAddr( instance, "vkWaitForFences" );
577 	vkCreateSemaphore = cast( typeof( vkCreateSemaphore )) vkGetInstanceProcAddr( instance, "vkCreateSemaphore" );
578 	vkDestroySemaphore = cast( typeof( vkDestroySemaphore )) vkGetInstanceProcAddr( instance, "vkDestroySemaphore" );
579 	vkCreateEvent = cast( typeof( vkCreateEvent )) vkGetInstanceProcAddr( instance, "vkCreateEvent" );
580 	vkDestroyEvent = cast( typeof( vkDestroyEvent )) vkGetInstanceProcAddr( instance, "vkDestroyEvent" );
581 	vkGetEventStatus = cast( typeof( vkGetEventStatus )) vkGetInstanceProcAddr( instance, "vkGetEventStatus" );
582 	vkSetEvent = cast( typeof( vkSetEvent )) vkGetInstanceProcAddr( instance, "vkSetEvent" );
583 	vkResetEvent = cast( typeof( vkResetEvent )) vkGetInstanceProcAddr( instance, "vkResetEvent" );
584 	vkCreateQueryPool = cast( typeof( vkCreateQueryPool )) vkGetInstanceProcAddr( instance, "vkCreateQueryPool" );
585 	vkDestroyQueryPool = cast( typeof( vkDestroyQueryPool )) vkGetInstanceProcAddr( instance, "vkDestroyQueryPool" );
586 	vkGetQueryPoolResults = cast( typeof( vkGetQueryPoolResults )) vkGetInstanceProcAddr( instance, "vkGetQueryPoolResults" );
587 	vkCreateBuffer = cast( typeof( vkCreateBuffer )) vkGetInstanceProcAddr( instance, "vkCreateBuffer" );
588 	vkDestroyBuffer = cast( typeof( vkDestroyBuffer )) vkGetInstanceProcAddr( instance, "vkDestroyBuffer" );
589 	vkCreateBufferView = cast( typeof( vkCreateBufferView )) vkGetInstanceProcAddr( instance, "vkCreateBufferView" );
590 	vkDestroyBufferView = cast( typeof( vkDestroyBufferView )) vkGetInstanceProcAddr( instance, "vkDestroyBufferView" );
591 	vkCreateImage = cast( typeof( vkCreateImage )) vkGetInstanceProcAddr( instance, "vkCreateImage" );
592 	vkDestroyImage = cast( typeof( vkDestroyImage )) vkGetInstanceProcAddr( instance, "vkDestroyImage" );
593 	vkGetImageSubresourceLayout = cast( typeof( vkGetImageSubresourceLayout )) vkGetInstanceProcAddr( instance, "vkGetImageSubresourceLayout" );
594 	vkCreateImageView = cast( typeof( vkCreateImageView )) vkGetInstanceProcAddr( instance, "vkCreateImageView" );
595 	vkDestroyImageView = cast( typeof( vkDestroyImageView )) vkGetInstanceProcAddr( instance, "vkDestroyImageView" );
596 	vkCreateShaderModule = cast( typeof( vkCreateShaderModule )) vkGetInstanceProcAddr( instance, "vkCreateShaderModule" );
597 	vkDestroyShaderModule = cast( typeof( vkDestroyShaderModule )) vkGetInstanceProcAddr( instance, "vkDestroyShaderModule" );
598 	vkCreatePipelineCache = cast( typeof( vkCreatePipelineCache )) vkGetInstanceProcAddr( instance, "vkCreatePipelineCache" );
599 	vkDestroyPipelineCache = cast( typeof( vkDestroyPipelineCache )) vkGetInstanceProcAddr( instance, "vkDestroyPipelineCache" );
600 	vkGetPipelineCacheData = cast( typeof( vkGetPipelineCacheData )) vkGetInstanceProcAddr( instance, "vkGetPipelineCacheData" );
601 	vkMergePipelineCaches = cast( typeof( vkMergePipelineCaches )) vkGetInstanceProcAddr( instance, "vkMergePipelineCaches" );
602 	vkCreateGraphicsPipelines = cast( typeof( vkCreateGraphicsPipelines )) vkGetInstanceProcAddr( instance, "vkCreateGraphicsPipelines" );
603 	vkCreateComputePipelines = cast( typeof( vkCreateComputePipelines )) vkGetInstanceProcAddr( instance, "vkCreateComputePipelines" );
604 	vkDestroyPipeline = cast( typeof( vkDestroyPipeline )) vkGetInstanceProcAddr( instance, "vkDestroyPipeline" );
605 	vkCreatePipelineLayout = cast( typeof( vkCreatePipelineLayout )) vkGetInstanceProcAddr( instance, "vkCreatePipelineLayout" );
606 	vkDestroyPipelineLayout = cast( typeof( vkDestroyPipelineLayout )) vkGetInstanceProcAddr( instance, "vkDestroyPipelineLayout" );
607 	vkCreateSampler = cast( typeof( vkCreateSampler )) vkGetInstanceProcAddr( instance, "vkCreateSampler" );
608 	vkDestroySampler = cast( typeof( vkDestroySampler )) vkGetInstanceProcAddr( instance, "vkDestroySampler" );
609 	vkCreateDescriptorSetLayout = cast( typeof( vkCreateDescriptorSetLayout )) vkGetInstanceProcAddr( instance, "vkCreateDescriptorSetLayout" );
610 	vkDestroyDescriptorSetLayout = cast( typeof( vkDestroyDescriptorSetLayout )) vkGetInstanceProcAddr( instance, "vkDestroyDescriptorSetLayout" );
611 	vkCreateDescriptorPool = cast( typeof( vkCreateDescriptorPool )) vkGetInstanceProcAddr( instance, "vkCreateDescriptorPool" );
612 	vkDestroyDescriptorPool = cast( typeof( vkDestroyDescriptorPool )) vkGetInstanceProcAddr( instance, "vkDestroyDescriptorPool" );
613 	vkResetDescriptorPool = cast( typeof( vkResetDescriptorPool )) vkGetInstanceProcAddr( instance, "vkResetDescriptorPool" );
614 	vkAllocateDescriptorSets = cast( typeof( vkAllocateDescriptorSets )) vkGetInstanceProcAddr( instance, "vkAllocateDescriptorSets" );
615 	vkFreeDescriptorSets = cast( typeof( vkFreeDescriptorSets )) vkGetInstanceProcAddr( instance, "vkFreeDescriptorSets" );
616 	vkUpdateDescriptorSets = cast( typeof( vkUpdateDescriptorSets )) vkGetInstanceProcAddr( instance, "vkUpdateDescriptorSets" );
617 	vkCreateFramebuffer = cast( typeof( vkCreateFramebuffer )) vkGetInstanceProcAddr( instance, "vkCreateFramebuffer" );
618 	vkDestroyFramebuffer = cast( typeof( vkDestroyFramebuffer )) vkGetInstanceProcAddr( instance, "vkDestroyFramebuffer" );
619 	vkCreateRenderPass = cast( typeof( vkCreateRenderPass )) vkGetInstanceProcAddr( instance, "vkCreateRenderPass" );
620 	vkDestroyRenderPass = cast( typeof( vkDestroyRenderPass )) vkGetInstanceProcAddr( instance, "vkDestroyRenderPass" );
621 	vkGetRenderAreaGranularity = cast( typeof( vkGetRenderAreaGranularity )) vkGetInstanceProcAddr( instance, "vkGetRenderAreaGranularity" );
622 	vkCreateCommandPool = cast( typeof( vkCreateCommandPool )) vkGetInstanceProcAddr( instance, "vkCreateCommandPool" );
623 	vkDestroyCommandPool = cast( typeof( vkDestroyCommandPool )) vkGetInstanceProcAddr( instance, "vkDestroyCommandPool" );
624 	vkResetCommandPool = cast( typeof( vkResetCommandPool )) vkGetInstanceProcAddr( instance, "vkResetCommandPool" );
625 	vkAllocateCommandBuffers = cast( typeof( vkAllocateCommandBuffers )) vkGetInstanceProcAddr( instance, "vkAllocateCommandBuffers" );
626 	vkFreeCommandBuffers = cast( typeof( vkFreeCommandBuffers )) vkGetInstanceProcAddr( instance, "vkFreeCommandBuffers" );
627 	vkBeginCommandBuffer = cast( typeof( vkBeginCommandBuffer )) vkGetInstanceProcAddr( instance, "vkBeginCommandBuffer" );
628 	vkEndCommandBuffer = cast( typeof( vkEndCommandBuffer )) vkGetInstanceProcAddr( instance, "vkEndCommandBuffer" );
629 	vkResetCommandBuffer = cast( typeof( vkResetCommandBuffer )) vkGetInstanceProcAddr( instance, "vkResetCommandBuffer" );
630 	vkCmdBindPipeline = cast( typeof( vkCmdBindPipeline )) vkGetInstanceProcAddr( instance, "vkCmdBindPipeline" );
631 	vkCmdSetViewport = cast( typeof( vkCmdSetViewport )) vkGetInstanceProcAddr( instance, "vkCmdSetViewport" );
632 	vkCmdSetScissor = cast( typeof( vkCmdSetScissor )) vkGetInstanceProcAddr( instance, "vkCmdSetScissor" );
633 	vkCmdSetLineWidth = cast( typeof( vkCmdSetLineWidth )) vkGetInstanceProcAddr( instance, "vkCmdSetLineWidth" );
634 	vkCmdSetDepthBias = cast( typeof( vkCmdSetDepthBias )) vkGetInstanceProcAddr( instance, "vkCmdSetDepthBias" );
635 	vkCmdSetBlendConstants = cast( typeof( vkCmdSetBlendConstants )) vkGetInstanceProcAddr( instance, "vkCmdSetBlendConstants" );
636 	vkCmdSetDepthBounds = cast( typeof( vkCmdSetDepthBounds )) vkGetInstanceProcAddr( instance, "vkCmdSetDepthBounds" );
637 	vkCmdSetStencilCompareMask = cast( typeof( vkCmdSetStencilCompareMask )) vkGetInstanceProcAddr( instance, "vkCmdSetStencilCompareMask" );
638 	vkCmdSetStencilWriteMask = cast( typeof( vkCmdSetStencilWriteMask )) vkGetInstanceProcAddr( instance, "vkCmdSetStencilWriteMask" );
639 	vkCmdSetStencilReference = cast( typeof( vkCmdSetStencilReference )) vkGetInstanceProcAddr( instance, "vkCmdSetStencilReference" );
640 	vkCmdBindDescriptorSets = cast( typeof( vkCmdBindDescriptorSets )) vkGetInstanceProcAddr( instance, "vkCmdBindDescriptorSets" );
641 	vkCmdBindIndexBuffer = cast( typeof( vkCmdBindIndexBuffer )) vkGetInstanceProcAddr( instance, "vkCmdBindIndexBuffer" );
642 	vkCmdBindVertexBuffers = cast( typeof( vkCmdBindVertexBuffers )) vkGetInstanceProcAddr( instance, "vkCmdBindVertexBuffers" );
643 	vkCmdDraw = cast( typeof( vkCmdDraw )) vkGetInstanceProcAddr( instance, "vkCmdDraw" );
644 	vkCmdDrawIndexed = cast( typeof( vkCmdDrawIndexed )) vkGetInstanceProcAddr( instance, "vkCmdDrawIndexed" );
645 	vkCmdDrawIndirect = cast( typeof( vkCmdDrawIndirect )) vkGetInstanceProcAddr( instance, "vkCmdDrawIndirect" );
646 	vkCmdDrawIndexedIndirect = cast( typeof( vkCmdDrawIndexedIndirect )) vkGetInstanceProcAddr( instance, "vkCmdDrawIndexedIndirect" );
647 	vkCmdDispatch = cast( typeof( vkCmdDispatch )) vkGetInstanceProcAddr( instance, "vkCmdDispatch" );
648 	vkCmdDispatchIndirect = cast( typeof( vkCmdDispatchIndirect )) vkGetInstanceProcAddr( instance, "vkCmdDispatchIndirect" );
649 	vkCmdCopyBuffer = cast( typeof( vkCmdCopyBuffer )) vkGetInstanceProcAddr( instance, "vkCmdCopyBuffer" );
650 	vkCmdCopyImage = cast( typeof( vkCmdCopyImage )) vkGetInstanceProcAddr( instance, "vkCmdCopyImage" );
651 	vkCmdBlitImage = cast( typeof( vkCmdBlitImage )) vkGetInstanceProcAddr( instance, "vkCmdBlitImage" );
652 	vkCmdCopyBufferToImage = cast( typeof( vkCmdCopyBufferToImage )) vkGetInstanceProcAddr( instance, "vkCmdCopyBufferToImage" );
653 	vkCmdCopyImageToBuffer = cast( typeof( vkCmdCopyImageToBuffer )) vkGetInstanceProcAddr( instance, "vkCmdCopyImageToBuffer" );
654 	vkCmdUpdateBuffer = cast( typeof( vkCmdUpdateBuffer )) vkGetInstanceProcAddr( instance, "vkCmdUpdateBuffer" );
655 	vkCmdFillBuffer = cast( typeof( vkCmdFillBuffer )) vkGetInstanceProcAddr( instance, "vkCmdFillBuffer" );
656 	vkCmdClearColorImage = cast( typeof( vkCmdClearColorImage )) vkGetInstanceProcAddr( instance, "vkCmdClearColorImage" );
657 	vkCmdClearDepthStencilImage = cast( typeof( vkCmdClearDepthStencilImage )) vkGetInstanceProcAddr( instance, "vkCmdClearDepthStencilImage" );
658 	vkCmdClearAttachments = cast( typeof( vkCmdClearAttachments )) vkGetInstanceProcAddr( instance, "vkCmdClearAttachments" );
659 	vkCmdResolveImage = cast( typeof( vkCmdResolveImage )) vkGetInstanceProcAddr( instance, "vkCmdResolveImage" );
660 	vkCmdSetEvent = cast( typeof( vkCmdSetEvent )) vkGetInstanceProcAddr( instance, "vkCmdSetEvent" );
661 	vkCmdResetEvent = cast( typeof( vkCmdResetEvent )) vkGetInstanceProcAddr( instance, "vkCmdResetEvent" );
662 	vkCmdWaitEvents = cast( typeof( vkCmdWaitEvents )) vkGetInstanceProcAddr( instance, "vkCmdWaitEvents" );
663 	vkCmdPipelineBarrier = cast( typeof( vkCmdPipelineBarrier )) vkGetInstanceProcAddr( instance, "vkCmdPipelineBarrier" );
664 	vkCmdBeginQuery = cast( typeof( vkCmdBeginQuery )) vkGetInstanceProcAddr( instance, "vkCmdBeginQuery" );
665 	vkCmdEndQuery = cast( typeof( vkCmdEndQuery )) vkGetInstanceProcAddr( instance, "vkCmdEndQuery" );
666 	vkCmdResetQueryPool = cast( typeof( vkCmdResetQueryPool )) vkGetInstanceProcAddr( instance, "vkCmdResetQueryPool" );
667 	vkCmdWriteTimestamp = cast( typeof( vkCmdWriteTimestamp )) vkGetInstanceProcAddr( instance, "vkCmdWriteTimestamp" );
668 	vkCmdCopyQueryPoolResults = cast( typeof( vkCmdCopyQueryPoolResults )) vkGetInstanceProcAddr( instance, "vkCmdCopyQueryPoolResults" );
669 	vkCmdPushConstants = cast( typeof( vkCmdPushConstants )) vkGetInstanceProcAddr( instance, "vkCmdPushConstants" );
670 	vkCmdBeginRenderPass = cast( typeof( vkCmdBeginRenderPass )) vkGetInstanceProcAddr( instance, "vkCmdBeginRenderPass" );
671 	vkCmdNextSubpass = cast( typeof( vkCmdNextSubpass )) vkGetInstanceProcAddr( instance, "vkCmdNextSubpass" );
672 	vkCmdEndRenderPass = cast( typeof( vkCmdEndRenderPass )) vkGetInstanceProcAddr( instance, "vkCmdEndRenderPass" );
673 	vkCmdExecuteCommands = cast( typeof( vkCmdExecuteCommands )) vkGetInstanceProcAddr( instance, "vkCmdExecuteCommands" );
674 
675 	// VK_KHR_swapchain
676 	vkCreateSwapchainKHR = cast( typeof( vkCreateSwapchainKHR )) vkGetInstanceProcAddr( instance, "vkCreateSwapchainKHR" );
677 	vkDestroySwapchainKHR = cast( typeof( vkDestroySwapchainKHR )) vkGetInstanceProcAddr( instance, "vkDestroySwapchainKHR" );
678 	vkGetSwapchainImagesKHR = cast( typeof( vkGetSwapchainImagesKHR )) vkGetInstanceProcAddr( instance, "vkGetSwapchainImagesKHR" );
679 	vkAcquireNextImageKHR = cast( typeof( vkAcquireNextImageKHR )) vkGetInstanceProcAddr( instance, "vkAcquireNextImageKHR" );
680 	vkQueuePresentKHR = cast( typeof( vkQueuePresentKHR )) vkGetInstanceProcAddr( instance, "vkQueuePresentKHR" );
681 
682 	// VK_KHR_display_swapchain
683 	vkCreateSharedSwapchainsKHR = cast( typeof( vkCreateSharedSwapchainsKHR )) vkGetInstanceProcAddr( instance, "vkCreateSharedSwapchainsKHR" );
684 
685 	// VK_EXT_debug_marker
686 	vkDebugMarkerSetObjectTagEXT = cast( typeof( vkDebugMarkerSetObjectTagEXT )) vkGetInstanceProcAddr( instance, "vkDebugMarkerSetObjectTagEXT" );
687 	vkDebugMarkerSetObjectNameEXT = cast( typeof( vkDebugMarkerSetObjectNameEXT )) vkGetInstanceProcAddr( instance, "vkDebugMarkerSetObjectNameEXT" );
688 	vkCmdDebugMarkerBeginEXT = cast( typeof( vkCmdDebugMarkerBeginEXT )) vkGetInstanceProcAddr( instance, "vkCmdDebugMarkerBeginEXT" );
689 	vkCmdDebugMarkerEndEXT = cast( typeof( vkCmdDebugMarkerEndEXT )) vkGetInstanceProcAddr( instance, "vkCmdDebugMarkerEndEXT" );
690 	vkCmdDebugMarkerInsertEXT = cast( typeof( vkCmdDebugMarkerInsertEXT )) vkGetInstanceProcAddr( instance, "vkCmdDebugMarkerInsertEXT" );
691 
692 	// VK_AMD_draw_indirect_count
693 	vkCmdDrawIndirectCountAMD = cast( typeof( vkCmdDrawIndirectCountAMD )) vkGetInstanceProcAddr( instance, "vkCmdDrawIndirectCountAMD" );
694 	vkCmdDrawIndexedIndirectCountAMD = cast( typeof( vkCmdDrawIndexedIndirectCountAMD )) vkGetInstanceProcAddr( instance, "vkCmdDrawIndexedIndirectCountAMD" );
695 
696 	// VK_NV_external_memory_win32
697 	version( VK_USE_PLATFORM_WIN32_KHR ) {
698 		vkGetMemoryWin32HandleNV = cast( typeof( vkGetMemoryWin32HandleNV )) vkGetInstanceProcAddr( instance, "vkGetMemoryWin32HandleNV" );
699 	}
700 }
701 
702 /// with a valid VkDevice call this function to retrieve VkDevice, VkQueue and VkCommandBuffer related functions
703 /// the functions call directly VkDevice and related resources and can be retrieved for one and only one VkDevice
704 /// calling this function again with another VkDevices will overwrite the __gshared functions retrieved previously
705 /// use createGroupedDeviceLevelFunctions bellow if usage of multiple VkDevices is required
706 void loadDeviceLevelFunctions( VkDevice device ) {
707 	assert( vkGetDeviceProcAddr !is null, "Must call loadInstanceLevelFunctions before loadDeviceLevelFunctions" );
708 
709 	// VK_VERSION_1_0
710 	vkDestroyDevice = cast( typeof( vkDestroyDevice )) vkGetDeviceProcAddr( device, "vkDestroyDevice" );
711 	vkGetDeviceQueue = cast( typeof( vkGetDeviceQueue )) vkGetDeviceProcAddr( device, "vkGetDeviceQueue" );
712 	vkQueueSubmit = cast( typeof( vkQueueSubmit )) vkGetDeviceProcAddr( device, "vkQueueSubmit" );
713 	vkQueueWaitIdle = cast( typeof( vkQueueWaitIdle )) vkGetDeviceProcAddr( device, "vkQueueWaitIdle" );
714 	vkDeviceWaitIdle = cast( typeof( vkDeviceWaitIdle )) vkGetDeviceProcAddr( device, "vkDeviceWaitIdle" );
715 	vkAllocateMemory = cast( typeof( vkAllocateMemory )) vkGetDeviceProcAddr( device, "vkAllocateMemory" );
716 	vkFreeMemory = cast( typeof( vkFreeMemory )) vkGetDeviceProcAddr( device, "vkFreeMemory" );
717 	vkMapMemory = cast( typeof( vkMapMemory )) vkGetDeviceProcAddr( device, "vkMapMemory" );
718 	vkUnmapMemory = cast( typeof( vkUnmapMemory )) vkGetDeviceProcAddr( device, "vkUnmapMemory" );
719 	vkFlushMappedMemoryRanges = cast( typeof( vkFlushMappedMemoryRanges )) vkGetDeviceProcAddr( device, "vkFlushMappedMemoryRanges" );
720 	vkInvalidateMappedMemoryRanges = cast( typeof( vkInvalidateMappedMemoryRanges )) vkGetDeviceProcAddr( device, "vkInvalidateMappedMemoryRanges" );
721 	vkGetDeviceMemoryCommitment = cast( typeof( vkGetDeviceMemoryCommitment )) vkGetDeviceProcAddr( device, "vkGetDeviceMemoryCommitment" );
722 	vkBindBufferMemory = cast( typeof( vkBindBufferMemory )) vkGetDeviceProcAddr( device, "vkBindBufferMemory" );
723 	vkBindImageMemory = cast( typeof( vkBindImageMemory )) vkGetDeviceProcAddr( device, "vkBindImageMemory" );
724 	vkGetBufferMemoryRequirements = cast( typeof( vkGetBufferMemoryRequirements )) vkGetDeviceProcAddr( device, "vkGetBufferMemoryRequirements" );
725 	vkGetImageMemoryRequirements = cast( typeof( vkGetImageMemoryRequirements )) vkGetDeviceProcAddr( device, "vkGetImageMemoryRequirements" );
726 	vkGetImageSparseMemoryRequirements = cast( typeof( vkGetImageSparseMemoryRequirements )) vkGetDeviceProcAddr( device, "vkGetImageSparseMemoryRequirements" );
727 	vkQueueBindSparse = cast( typeof( vkQueueBindSparse )) vkGetDeviceProcAddr( device, "vkQueueBindSparse" );
728 	vkCreateFence = cast( typeof( vkCreateFence )) vkGetDeviceProcAddr( device, "vkCreateFence" );
729 	vkDestroyFence = cast( typeof( vkDestroyFence )) vkGetDeviceProcAddr( device, "vkDestroyFence" );
730 	vkResetFences = cast( typeof( vkResetFences )) vkGetDeviceProcAddr( device, "vkResetFences" );
731 	vkGetFenceStatus = cast( typeof( vkGetFenceStatus )) vkGetDeviceProcAddr( device, "vkGetFenceStatus" );
732 	vkWaitForFences = cast( typeof( vkWaitForFences )) vkGetDeviceProcAddr( device, "vkWaitForFences" );
733 	vkCreateSemaphore = cast( typeof( vkCreateSemaphore )) vkGetDeviceProcAddr( device, "vkCreateSemaphore" );
734 	vkDestroySemaphore = cast( typeof( vkDestroySemaphore )) vkGetDeviceProcAddr( device, "vkDestroySemaphore" );
735 	vkCreateEvent = cast( typeof( vkCreateEvent )) vkGetDeviceProcAddr( device, "vkCreateEvent" );
736 	vkDestroyEvent = cast( typeof( vkDestroyEvent )) vkGetDeviceProcAddr( device, "vkDestroyEvent" );
737 	vkGetEventStatus = cast( typeof( vkGetEventStatus )) vkGetDeviceProcAddr( device, "vkGetEventStatus" );
738 	vkSetEvent = cast( typeof( vkSetEvent )) vkGetDeviceProcAddr( device, "vkSetEvent" );
739 	vkResetEvent = cast( typeof( vkResetEvent )) vkGetDeviceProcAddr( device, "vkResetEvent" );
740 	vkCreateQueryPool = cast( typeof( vkCreateQueryPool )) vkGetDeviceProcAddr( device, "vkCreateQueryPool" );
741 	vkDestroyQueryPool = cast( typeof( vkDestroyQueryPool )) vkGetDeviceProcAddr( device, "vkDestroyQueryPool" );
742 	vkGetQueryPoolResults = cast( typeof( vkGetQueryPoolResults )) vkGetDeviceProcAddr( device, "vkGetQueryPoolResults" );
743 	vkCreateBuffer = cast( typeof( vkCreateBuffer )) vkGetDeviceProcAddr( device, "vkCreateBuffer" );
744 	vkDestroyBuffer = cast( typeof( vkDestroyBuffer )) vkGetDeviceProcAddr( device, "vkDestroyBuffer" );
745 	vkCreateBufferView = cast( typeof( vkCreateBufferView )) vkGetDeviceProcAddr( device, "vkCreateBufferView" );
746 	vkDestroyBufferView = cast( typeof( vkDestroyBufferView )) vkGetDeviceProcAddr( device, "vkDestroyBufferView" );
747 	vkCreateImage = cast( typeof( vkCreateImage )) vkGetDeviceProcAddr( device, "vkCreateImage" );
748 	vkDestroyImage = cast( typeof( vkDestroyImage )) vkGetDeviceProcAddr( device, "vkDestroyImage" );
749 	vkGetImageSubresourceLayout = cast( typeof( vkGetImageSubresourceLayout )) vkGetDeviceProcAddr( device, "vkGetImageSubresourceLayout" );
750 	vkCreateImageView = cast( typeof( vkCreateImageView )) vkGetDeviceProcAddr( device, "vkCreateImageView" );
751 	vkDestroyImageView = cast( typeof( vkDestroyImageView )) vkGetDeviceProcAddr( device, "vkDestroyImageView" );
752 	vkCreateShaderModule = cast( typeof( vkCreateShaderModule )) vkGetDeviceProcAddr( device, "vkCreateShaderModule" );
753 	vkDestroyShaderModule = cast( typeof( vkDestroyShaderModule )) vkGetDeviceProcAddr( device, "vkDestroyShaderModule" );
754 	vkCreatePipelineCache = cast( typeof( vkCreatePipelineCache )) vkGetDeviceProcAddr( device, "vkCreatePipelineCache" );
755 	vkDestroyPipelineCache = cast( typeof( vkDestroyPipelineCache )) vkGetDeviceProcAddr( device, "vkDestroyPipelineCache" );
756 	vkGetPipelineCacheData = cast( typeof( vkGetPipelineCacheData )) vkGetDeviceProcAddr( device, "vkGetPipelineCacheData" );
757 	vkMergePipelineCaches = cast( typeof( vkMergePipelineCaches )) vkGetDeviceProcAddr( device, "vkMergePipelineCaches" );
758 	vkCreateGraphicsPipelines = cast( typeof( vkCreateGraphicsPipelines )) vkGetDeviceProcAddr( device, "vkCreateGraphicsPipelines" );
759 	vkCreateComputePipelines = cast( typeof( vkCreateComputePipelines )) vkGetDeviceProcAddr( device, "vkCreateComputePipelines" );
760 	vkDestroyPipeline = cast( typeof( vkDestroyPipeline )) vkGetDeviceProcAddr( device, "vkDestroyPipeline" );
761 	vkCreatePipelineLayout = cast( typeof( vkCreatePipelineLayout )) vkGetDeviceProcAddr( device, "vkCreatePipelineLayout" );
762 	vkDestroyPipelineLayout = cast( typeof( vkDestroyPipelineLayout )) vkGetDeviceProcAddr( device, "vkDestroyPipelineLayout" );
763 	vkCreateSampler = cast( typeof( vkCreateSampler )) vkGetDeviceProcAddr( device, "vkCreateSampler" );
764 	vkDestroySampler = cast( typeof( vkDestroySampler )) vkGetDeviceProcAddr( device, "vkDestroySampler" );
765 	vkCreateDescriptorSetLayout = cast( typeof( vkCreateDescriptorSetLayout )) vkGetDeviceProcAddr( device, "vkCreateDescriptorSetLayout" );
766 	vkDestroyDescriptorSetLayout = cast( typeof( vkDestroyDescriptorSetLayout )) vkGetDeviceProcAddr( device, "vkDestroyDescriptorSetLayout" );
767 	vkCreateDescriptorPool = cast( typeof( vkCreateDescriptorPool )) vkGetDeviceProcAddr( device, "vkCreateDescriptorPool" );
768 	vkDestroyDescriptorPool = cast( typeof( vkDestroyDescriptorPool )) vkGetDeviceProcAddr( device, "vkDestroyDescriptorPool" );
769 	vkResetDescriptorPool = cast( typeof( vkResetDescriptorPool )) vkGetDeviceProcAddr( device, "vkResetDescriptorPool" );
770 	vkAllocateDescriptorSets = cast( typeof( vkAllocateDescriptorSets )) vkGetDeviceProcAddr( device, "vkAllocateDescriptorSets" );
771 	vkFreeDescriptorSets = cast( typeof( vkFreeDescriptorSets )) vkGetDeviceProcAddr( device, "vkFreeDescriptorSets" );
772 	vkUpdateDescriptorSets = cast( typeof( vkUpdateDescriptorSets )) vkGetDeviceProcAddr( device, "vkUpdateDescriptorSets" );
773 	vkCreateFramebuffer = cast( typeof( vkCreateFramebuffer )) vkGetDeviceProcAddr( device, "vkCreateFramebuffer" );
774 	vkDestroyFramebuffer = cast( typeof( vkDestroyFramebuffer )) vkGetDeviceProcAddr( device, "vkDestroyFramebuffer" );
775 	vkCreateRenderPass = cast( typeof( vkCreateRenderPass )) vkGetDeviceProcAddr( device, "vkCreateRenderPass" );
776 	vkDestroyRenderPass = cast( typeof( vkDestroyRenderPass )) vkGetDeviceProcAddr( device, "vkDestroyRenderPass" );
777 	vkGetRenderAreaGranularity = cast( typeof( vkGetRenderAreaGranularity )) vkGetDeviceProcAddr( device, "vkGetRenderAreaGranularity" );
778 	vkCreateCommandPool = cast( typeof( vkCreateCommandPool )) vkGetDeviceProcAddr( device, "vkCreateCommandPool" );
779 	vkDestroyCommandPool = cast( typeof( vkDestroyCommandPool )) vkGetDeviceProcAddr( device, "vkDestroyCommandPool" );
780 	vkResetCommandPool = cast( typeof( vkResetCommandPool )) vkGetDeviceProcAddr( device, "vkResetCommandPool" );
781 	vkAllocateCommandBuffers = cast( typeof( vkAllocateCommandBuffers )) vkGetDeviceProcAddr( device, "vkAllocateCommandBuffers" );
782 	vkFreeCommandBuffers = cast( typeof( vkFreeCommandBuffers )) vkGetDeviceProcAddr( device, "vkFreeCommandBuffers" );
783 	vkBeginCommandBuffer = cast( typeof( vkBeginCommandBuffer )) vkGetDeviceProcAddr( device, "vkBeginCommandBuffer" );
784 	vkEndCommandBuffer = cast( typeof( vkEndCommandBuffer )) vkGetDeviceProcAddr( device, "vkEndCommandBuffer" );
785 	vkResetCommandBuffer = cast( typeof( vkResetCommandBuffer )) vkGetDeviceProcAddr( device, "vkResetCommandBuffer" );
786 	vkCmdBindPipeline = cast( typeof( vkCmdBindPipeline )) vkGetDeviceProcAddr( device, "vkCmdBindPipeline" );
787 	vkCmdSetViewport = cast( typeof( vkCmdSetViewport )) vkGetDeviceProcAddr( device, "vkCmdSetViewport" );
788 	vkCmdSetScissor = cast( typeof( vkCmdSetScissor )) vkGetDeviceProcAddr( device, "vkCmdSetScissor" );
789 	vkCmdSetLineWidth = cast( typeof( vkCmdSetLineWidth )) vkGetDeviceProcAddr( device, "vkCmdSetLineWidth" );
790 	vkCmdSetDepthBias = cast( typeof( vkCmdSetDepthBias )) vkGetDeviceProcAddr( device, "vkCmdSetDepthBias" );
791 	vkCmdSetBlendConstants = cast( typeof( vkCmdSetBlendConstants )) vkGetDeviceProcAddr( device, "vkCmdSetBlendConstants" );
792 	vkCmdSetDepthBounds = cast( typeof( vkCmdSetDepthBounds )) vkGetDeviceProcAddr( device, "vkCmdSetDepthBounds" );
793 	vkCmdSetStencilCompareMask = cast( typeof( vkCmdSetStencilCompareMask )) vkGetDeviceProcAddr( device, "vkCmdSetStencilCompareMask" );
794 	vkCmdSetStencilWriteMask = cast( typeof( vkCmdSetStencilWriteMask )) vkGetDeviceProcAddr( device, "vkCmdSetStencilWriteMask" );
795 	vkCmdSetStencilReference = cast( typeof( vkCmdSetStencilReference )) vkGetDeviceProcAddr( device, "vkCmdSetStencilReference" );
796 	vkCmdBindDescriptorSets = cast( typeof( vkCmdBindDescriptorSets )) vkGetDeviceProcAddr( device, "vkCmdBindDescriptorSets" );
797 	vkCmdBindIndexBuffer = cast( typeof( vkCmdBindIndexBuffer )) vkGetDeviceProcAddr( device, "vkCmdBindIndexBuffer" );
798 	vkCmdBindVertexBuffers = cast( typeof( vkCmdBindVertexBuffers )) vkGetDeviceProcAddr( device, "vkCmdBindVertexBuffers" );
799 	vkCmdDraw = cast( typeof( vkCmdDraw )) vkGetDeviceProcAddr( device, "vkCmdDraw" );
800 	vkCmdDrawIndexed = cast( typeof( vkCmdDrawIndexed )) vkGetDeviceProcAddr( device, "vkCmdDrawIndexed" );
801 	vkCmdDrawIndirect = cast( typeof( vkCmdDrawIndirect )) vkGetDeviceProcAddr( device, "vkCmdDrawIndirect" );
802 	vkCmdDrawIndexedIndirect = cast( typeof( vkCmdDrawIndexedIndirect )) vkGetDeviceProcAddr( device, "vkCmdDrawIndexedIndirect" );
803 	vkCmdDispatch = cast( typeof( vkCmdDispatch )) vkGetDeviceProcAddr( device, "vkCmdDispatch" );
804 	vkCmdDispatchIndirect = cast( typeof( vkCmdDispatchIndirect )) vkGetDeviceProcAddr( device, "vkCmdDispatchIndirect" );
805 	vkCmdCopyBuffer = cast( typeof( vkCmdCopyBuffer )) vkGetDeviceProcAddr( device, "vkCmdCopyBuffer" );
806 	vkCmdCopyImage = cast( typeof( vkCmdCopyImage )) vkGetDeviceProcAddr( device, "vkCmdCopyImage" );
807 	vkCmdBlitImage = cast( typeof( vkCmdBlitImage )) vkGetDeviceProcAddr( device, "vkCmdBlitImage" );
808 	vkCmdCopyBufferToImage = cast( typeof( vkCmdCopyBufferToImage )) vkGetDeviceProcAddr( device, "vkCmdCopyBufferToImage" );
809 	vkCmdCopyImageToBuffer = cast( typeof( vkCmdCopyImageToBuffer )) vkGetDeviceProcAddr( device, "vkCmdCopyImageToBuffer" );
810 	vkCmdUpdateBuffer = cast( typeof( vkCmdUpdateBuffer )) vkGetDeviceProcAddr( device, "vkCmdUpdateBuffer" );
811 	vkCmdFillBuffer = cast( typeof( vkCmdFillBuffer )) vkGetDeviceProcAddr( device, "vkCmdFillBuffer" );
812 	vkCmdClearColorImage = cast( typeof( vkCmdClearColorImage )) vkGetDeviceProcAddr( device, "vkCmdClearColorImage" );
813 	vkCmdClearDepthStencilImage = cast( typeof( vkCmdClearDepthStencilImage )) vkGetDeviceProcAddr( device, "vkCmdClearDepthStencilImage" );
814 	vkCmdClearAttachments = cast( typeof( vkCmdClearAttachments )) vkGetDeviceProcAddr( device, "vkCmdClearAttachments" );
815 	vkCmdResolveImage = cast( typeof( vkCmdResolveImage )) vkGetDeviceProcAddr( device, "vkCmdResolveImage" );
816 	vkCmdSetEvent = cast( typeof( vkCmdSetEvent )) vkGetDeviceProcAddr( device, "vkCmdSetEvent" );
817 	vkCmdResetEvent = cast( typeof( vkCmdResetEvent )) vkGetDeviceProcAddr( device, "vkCmdResetEvent" );
818 	vkCmdWaitEvents = cast( typeof( vkCmdWaitEvents )) vkGetDeviceProcAddr( device, "vkCmdWaitEvents" );
819 	vkCmdPipelineBarrier = cast( typeof( vkCmdPipelineBarrier )) vkGetDeviceProcAddr( device, "vkCmdPipelineBarrier" );
820 	vkCmdBeginQuery = cast( typeof( vkCmdBeginQuery )) vkGetDeviceProcAddr( device, "vkCmdBeginQuery" );
821 	vkCmdEndQuery = cast( typeof( vkCmdEndQuery )) vkGetDeviceProcAddr( device, "vkCmdEndQuery" );
822 	vkCmdResetQueryPool = cast( typeof( vkCmdResetQueryPool )) vkGetDeviceProcAddr( device, "vkCmdResetQueryPool" );
823 	vkCmdWriteTimestamp = cast( typeof( vkCmdWriteTimestamp )) vkGetDeviceProcAddr( device, "vkCmdWriteTimestamp" );
824 	vkCmdCopyQueryPoolResults = cast( typeof( vkCmdCopyQueryPoolResults )) vkGetDeviceProcAddr( device, "vkCmdCopyQueryPoolResults" );
825 	vkCmdPushConstants = cast( typeof( vkCmdPushConstants )) vkGetDeviceProcAddr( device, "vkCmdPushConstants" );
826 	vkCmdBeginRenderPass = cast( typeof( vkCmdBeginRenderPass )) vkGetDeviceProcAddr( device, "vkCmdBeginRenderPass" );
827 	vkCmdNextSubpass = cast( typeof( vkCmdNextSubpass )) vkGetDeviceProcAddr( device, "vkCmdNextSubpass" );
828 	vkCmdEndRenderPass = cast( typeof( vkCmdEndRenderPass )) vkGetDeviceProcAddr( device, "vkCmdEndRenderPass" );
829 	vkCmdExecuteCommands = cast( typeof( vkCmdExecuteCommands )) vkGetDeviceProcAddr( device, "vkCmdExecuteCommands" );
830 
831 	// VK_KHR_swapchain
832 	vkCreateSwapchainKHR = cast( typeof( vkCreateSwapchainKHR )) vkGetDeviceProcAddr( device, "vkCreateSwapchainKHR" );
833 	vkDestroySwapchainKHR = cast( typeof( vkDestroySwapchainKHR )) vkGetDeviceProcAddr( device, "vkDestroySwapchainKHR" );
834 	vkGetSwapchainImagesKHR = cast( typeof( vkGetSwapchainImagesKHR )) vkGetDeviceProcAddr( device, "vkGetSwapchainImagesKHR" );
835 	vkAcquireNextImageKHR = cast( typeof( vkAcquireNextImageKHR )) vkGetDeviceProcAddr( device, "vkAcquireNextImageKHR" );
836 	vkQueuePresentKHR = cast( typeof( vkQueuePresentKHR )) vkGetDeviceProcAddr( device, "vkQueuePresentKHR" );
837 
838 	// VK_KHR_display_swapchain
839 	vkCreateSharedSwapchainsKHR = cast( typeof( vkCreateSharedSwapchainsKHR )) vkGetDeviceProcAddr( device, "vkCreateSharedSwapchainsKHR" );
840 
841 	// VK_EXT_debug_marker
842 	vkDebugMarkerSetObjectTagEXT = cast( typeof( vkDebugMarkerSetObjectTagEXT )) vkGetDeviceProcAddr( device, "vkDebugMarkerSetObjectTagEXT" );
843 	vkDebugMarkerSetObjectNameEXT = cast( typeof( vkDebugMarkerSetObjectNameEXT )) vkGetDeviceProcAddr( device, "vkDebugMarkerSetObjectNameEXT" );
844 	vkCmdDebugMarkerBeginEXT = cast( typeof( vkCmdDebugMarkerBeginEXT )) vkGetDeviceProcAddr( device, "vkCmdDebugMarkerBeginEXT" );
845 	vkCmdDebugMarkerEndEXT = cast( typeof( vkCmdDebugMarkerEndEXT )) vkGetDeviceProcAddr( device, "vkCmdDebugMarkerEndEXT" );
846 	vkCmdDebugMarkerInsertEXT = cast( typeof( vkCmdDebugMarkerInsertEXT )) vkGetDeviceProcAddr( device, "vkCmdDebugMarkerInsertEXT" );
847 
848 	// VK_AMD_draw_indirect_count
849 	vkCmdDrawIndirectCountAMD = cast( typeof( vkCmdDrawIndirectCountAMD )) vkGetDeviceProcAddr( device, "vkCmdDrawIndirectCountAMD" );
850 	vkCmdDrawIndexedIndirectCountAMD = cast( typeof( vkCmdDrawIndexedIndirectCountAMD )) vkGetDeviceProcAddr( device, "vkCmdDrawIndexedIndirectCountAMD" );
851 
852 	// VK_NV_external_memory_win32
853 	version( VK_USE_PLATFORM_WIN32_KHR ) {
854 		vkGetMemoryWin32HandleNV = cast( typeof( vkGetMemoryWin32HandleNV )) vkGetDeviceProcAddr( device, "vkGetMemoryWin32HandleNV" );
855 	}
856 }
857 
858 /// with a valid VkDevice call this function to retrieve VkDevice, VkQueue and VkCommandBuffer related functions grouped in a DispatchDevice struct
859 /// the functions call directly VkDevice and related resources and can be retrieved for any VkDevice
860 DispatchDevice createDispatchDeviceLevelFunctions( VkDevice device ) {
861 	assert( vkGetDeviceProcAddr !is null, "Must call loadInstanceLevelFunctions before loadDeviceLevelFunctions" );
862 	
863 	DispatchDevice dispatchDevice;
864 	with( dispatchDevice ) {
865 
866 		// VK_VERSION_1_0
867 		vkDestroyDevice = cast( typeof( vkDestroyDevice )) vkGetDeviceProcAddr( device, "vkDestroyDevice" );
868 		vkGetDeviceQueue = cast( typeof( vkGetDeviceQueue )) vkGetDeviceProcAddr( device, "vkGetDeviceQueue" );
869 		vkQueueSubmit = cast( typeof( vkQueueSubmit )) vkGetDeviceProcAddr( device, "vkQueueSubmit" );
870 		vkQueueWaitIdle = cast( typeof( vkQueueWaitIdle )) vkGetDeviceProcAddr( device, "vkQueueWaitIdle" );
871 		vkDeviceWaitIdle = cast( typeof( vkDeviceWaitIdle )) vkGetDeviceProcAddr( device, "vkDeviceWaitIdle" );
872 		vkAllocateMemory = cast( typeof( vkAllocateMemory )) vkGetDeviceProcAddr( device, "vkAllocateMemory" );
873 		vkFreeMemory = cast( typeof( vkFreeMemory )) vkGetDeviceProcAddr( device, "vkFreeMemory" );
874 		vkMapMemory = cast( typeof( vkMapMemory )) vkGetDeviceProcAddr( device, "vkMapMemory" );
875 		vkUnmapMemory = cast( typeof( vkUnmapMemory )) vkGetDeviceProcAddr( device, "vkUnmapMemory" );
876 		vkFlushMappedMemoryRanges = cast( typeof( vkFlushMappedMemoryRanges )) vkGetDeviceProcAddr( device, "vkFlushMappedMemoryRanges" );
877 		vkInvalidateMappedMemoryRanges = cast( typeof( vkInvalidateMappedMemoryRanges )) vkGetDeviceProcAddr( device, "vkInvalidateMappedMemoryRanges" );
878 		vkGetDeviceMemoryCommitment = cast( typeof( vkGetDeviceMemoryCommitment )) vkGetDeviceProcAddr( device, "vkGetDeviceMemoryCommitment" );
879 		vkBindBufferMemory = cast( typeof( vkBindBufferMemory )) vkGetDeviceProcAddr( device, "vkBindBufferMemory" );
880 		vkBindImageMemory = cast( typeof( vkBindImageMemory )) vkGetDeviceProcAddr( device, "vkBindImageMemory" );
881 		vkGetBufferMemoryRequirements = cast( typeof( vkGetBufferMemoryRequirements )) vkGetDeviceProcAddr( device, "vkGetBufferMemoryRequirements" );
882 		vkGetImageMemoryRequirements = cast( typeof( vkGetImageMemoryRequirements )) vkGetDeviceProcAddr( device, "vkGetImageMemoryRequirements" );
883 		vkGetImageSparseMemoryRequirements = cast( typeof( vkGetImageSparseMemoryRequirements )) vkGetDeviceProcAddr( device, "vkGetImageSparseMemoryRequirements" );
884 		vkQueueBindSparse = cast( typeof( vkQueueBindSparse )) vkGetDeviceProcAddr( device, "vkQueueBindSparse" );
885 		vkCreateFence = cast( typeof( vkCreateFence )) vkGetDeviceProcAddr( device, "vkCreateFence" );
886 		vkDestroyFence = cast( typeof( vkDestroyFence )) vkGetDeviceProcAddr( device, "vkDestroyFence" );
887 		vkResetFences = cast( typeof( vkResetFences )) vkGetDeviceProcAddr( device, "vkResetFences" );
888 		vkGetFenceStatus = cast( typeof( vkGetFenceStatus )) vkGetDeviceProcAddr( device, "vkGetFenceStatus" );
889 		vkWaitForFences = cast( typeof( vkWaitForFences )) vkGetDeviceProcAddr( device, "vkWaitForFences" );
890 		vkCreateSemaphore = cast( typeof( vkCreateSemaphore )) vkGetDeviceProcAddr( device, "vkCreateSemaphore" );
891 		vkDestroySemaphore = cast( typeof( vkDestroySemaphore )) vkGetDeviceProcAddr( device, "vkDestroySemaphore" );
892 		vkCreateEvent = cast( typeof( vkCreateEvent )) vkGetDeviceProcAddr( device, "vkCreateEvent" );
893 		vkDestroyEvent = cast( typeof( vkDestroyEvent )) vkGetDeviceProcAddr( device, "vkDestroyEvent" );
894 		vkGetEventStatus = cast( typeof( vkGetEventStatus )) vkGetDeviceProcAddr( device, "vkGetEventStatus" );
895 		vkSetEvent = cast( typeof( vkSetEvent )) vkGetDeviceProcAddr( device, "vkSetEvent" );
896 		vkResetEvent = cast( typeof( vkResetEvent )) vkGetDeviceProcAddr( device, "vkResetEvent" );
897 		vkCreateQueryPool = cast( typeof( vkCreateQueryPool )) vkGetDeviceProcAddr( device, "vkCreateQueryPool" );
898 		vkDestroyQueryPool = cast( typeof( vkDestroyQueryPool )) vkGetDeviceProcAddr( device, "vkDestroyQueryPool" );
899 		vkGetQueryPoolResults = cast( typeof( vkGetQueryPoolResults )) vkGetDeviceProcAddr( device, "vkGetQueryPoolResults" );
900 		vkCreateBuffer = cast( typeof( vkCreateBuffer )) vkGetDeviceProcAddr( device, "vkCreateBuffer" );
901 		vkDestroyBuffer = cast( typeof( vkDestroyBuffer )) vkGetDeviceProcAddr( device, "vkDestroyBuffer" );
902 		vkCreateBufferView = cast( typeof( vkCreateBufferView )) vkGetDeviceProcAddr( device, "vkCreateBufferView" );
903 		vkDestroyBufferView = cast( typeof( vkDestroyBufferView )) vkGetDeviceProcAddr( device, "vkDestroyBufferView" );
904 		vkCreateImage = cast( typeof( vkCreateImage )) vkGetDeviceProcAddr( device, "vkCreateImage" );
905 		vkDestroyImage = cast( typeof( vkDestroyImage )) vkGetDeviceProcAddr( device, "vkDestroyImage" );
906 		vkGetImageSubresourceLayout = cast( typeof( vkGetImageSubresourceLayout )) vkGetDeviceProcAddr( device, "vkGetImageSubresourceLayout" );
907 		vkCreateImageView = cast( typeof( vkCreateImageView )) vkGetDeviceProcAddr( device, "vkCreateImageView" );
908 		vkDestroyImageView = cast( typeof( vkDestroyImageView )) vkGetDeviceProcAddr( device, "vkDestroyImageView" );
909 		vkCreateShaderModule = cast( typeof( vkCreateShaderModule )) vkGetDeviceProcAddr( device, "vkCreateShaderModule" );
910 		vkDestroyShaderModule = cast( typeof( vkDestroyShaderModule )) vkGetDeviceProcAddr( device, "vkDestroyShaderModule" );
911 		vkCreatePipelineCache = cast( typeof( vkCreatePipelineCache )) vkGetDeviceProcAddr( device, "vkCreatePipelineCache" );
912 		vkDestroyPipelineCache = cast( typeof( vkDestroyPipelineCache )) vkGetDeviceProcAddr( device, "vkDestroyPipelineCache" );
913 		vkGetPipelineCacheData = cast( typeof( vkGetPipelineCacheData )) vkGetDeviceProcAddr( device, "vkGetPipelineCacheData" );
914 		vkMergePipelineCaches = cast( typeof( vkMergePipelineCaches )) vkGetDeviceProcAddr( device, "vkMergePipelineCaches" );
915 		vkCreateGraphicsPipelines = cast( typeof( vkCreateGraphicsPipelines )) vkGetDeviceProcAddr( device, "vkCreateGraphicsPipelines" );
916 		vkCreateComputePipelines = cast( typeof( vkCreateComputePipelines )) vkGetDeviceProcAddr( device, "vkCreateComputePipelines" );
917 		vkDestroyPipeline = cast( typeof( vkDestroyPipeline )) vkGetDeviceProcAddr( device, "vkDestroyPipeline" );
918 		vkCreatePipelineLayout = cast( typeof( vkCreatePipelineLayout )) vkGetDeviceProcAddr( device, "vkCreatePipelineLayout" );
919 		vkDestroyPipelineLayout = cast( typeof( vkDestroyPipelineLayout )) vkGetDeviceProcAddr( device, "vkDestroyPipelineLayout" );
920 		vkCreateSampler = cast( typeof( vkCreateSampler )) vkGetDeviceProcAddr( device, "vkCreateSampler" );
921 		vkDestroySampler = cast( typeof( vkDestroySampler )) vkGetDeviceProcAddr( device, "vkDestroySampler" );
922 		vkCreateDescriptorSetLayout = cast( typeof( vkCreateDescriptorSetLayout )) vkGetDeviceProcAddr( device, "vkCreateDescriptorSetLayout" );
923 		vkDestroyDescriptorSetLayout = cast( typeof( vkDestroyDescriptorSetLayout )) vkGetDeviceProcAddr( device, "vkDestroyDescriptorSetLayout" );
924 		vkCreateDescriptorPool = cast( typeof( vkCreateDescriptorPool )) vkGetDeviceProcAddr( device, "vkCreateDescriptorPool" );
925 		vkDestroyDescriptorPool = cast( typeof( vkDestroyDescriptorPool )) vkGetDeviceProcAddr( device, "vkDestroyDescriptorPool" );
926 		vkResetDescriptorPool = cast( typeof( vkResetDescriptorPool )) vkGetDeviceProcAddr( device, "vkResetDescriptorPool" );
927 		vkAllocateDescriptorSets = cast( typeof( vkAllocateDescriptorSets )) vkGetDeviceProcAddr( device, "vkAllocateDescriptorSets" );
928 		vkFreeDescriptorSets = cast( typeof( vkFreeDescriptorSets )) vkGetDeviceProcAddr( device, "vkFreeDescriptorSets" );
929 		vkUpdateDescriptorSets = cast( typeof( vkUpdateDescriptorSets )) vkGetDeviceProcAddr( device, "vkUpdateDescriptorSets" );
930 		vkCreateFramebuffer = cast( typeof( vkCreateFramebuffer )) vkGetDeviceProcAddr( device, "vkCreateFramebuffer" );
931 		vkDestroyFramebuffer = cast( typeof( vkDestroyFramebuffer )) vkGetDeviceProcAddr( device, "vkDestroyFramebuffer" );
932 		vkCreateRenderPass = cast( typeof( vkCreateRenderPass )) vkGetDeviceProcAddr( device, "vkCreateRenderPass" );
933 		vkDestroyRenderPass = cast( typeof( vkDestroyRenderPass )) vkGetDeviceProcAddr( device, "vkDestroyRenderPass" );
934 		vkGetRenderAreaGranularity = cast( typeof( vkGetRenderAreaGranularity )) vkGetDeviceProcAddr( device, "vkGetRenderAreaGranularity" );
935 		vkCreateCommandPool = cast( typeof( vkCreateCommandPool )) vkGetDeviceProcAddr( device, "vkCreateCommandPool" );
936 		vkDestroyCommandPool = cast( typeof( vkDestroyCommandPool )) vkGetDeviceProcAddr( device, "vkDestroyCommandPool" );
937 		vkResetCommandPool = cast( typeof( vkResetCommandPool )) vkGetDeviceProcAddr( device, "vkResetCommandPool" );
938 		vkAllocateCommandBuffers = cast( typeof( vkAllocateCommandBuffers )) vkGetDeviceProcAddr( device, "vkAllocateCommandBuffers" );
939 		vkFreeCommandBuffers = cast( typeof( vkFreeCommandBuffers )) vkGetDeviceProcAddr( device, "vkFreeCommandBuffers" );
940 		vkBeginCommandBuffer = cast( typeof( vkBeginCommandBuffer )) vkGetDeviceProcAddr( device, "vkBeginCommandBuffer" );
941 		vkEndCommandBuffer = cast( typeof( vkEndCommandBuffer )) vkGetDeviceProcAddr( device, "vkEndCommandBuffer" );
942 		vkResetCommandBuffer = cast( typeof( vkResetCommandBuffer )) vkGetDeviceProcAddr( device, "vkResetCommandBuffer" );
943 		vkCmdBindPipeline = cast( typeof( vkCmdBindPipeline )) vkGetDeviceProcAddr( device, "vkCmdBindPipeline" );
944 		vkCmdSetViewport = cast( typeof( vkCmdSetViewport )) vkGetDeviceProcAddr( device, "vkCmdSetViewport" );
945 		vkCmdSetScissor = cast( typeof( vkCmdSetScissor )) vkGetDeviceProcAddr( device, "vkCmdSetScissor" );
946 		vkCmdSetLineWidth = cast( typeof( vkCmdSetLineWidth )) vkGetDeviceProcAddr( device, "vkCmdSetLineWidth" );
947 		vkCmdSetDepthBias = cast( typeof( vkCmdSetDepthBias )) vkGetDeviceProcAddr( device, "vkCmdSetDepthBias" );
948 		vkCmdSetBlendConstants = cast( typeof( vkCmdSetBlendConstants )) vkGetDeviceProcAddr( device, "vkCmdSetBlendConstants" );
949 		vkCmdSetDepthBounds = cast( typeof( vkCmdSetDepthBounds )) vkGetDeviceProcAddr( device, "vkCmdSetDepthBounds" );
950 		vkCmdSetStencilCompareMask = cast( typeof( vkCmdSetStencilCompareMask )) vkGetDeviceProcAddr( device, "vkCmdSetStencilCompareMask" );
951 		vkCmdSetStencilWriteMask = cast( typeof( vkCmdSetStencilWriteMask )) vkGetDeviceProcAddr( device, "vkCmdSetStencilWriteMask" );
952 		vkCmdSetStencilReference = cast( typeof( vkCmdSetStencilReference )) vkGetDeviceProcAddr( device, "vkCmdSetStencilReference" );
953 		vkCmdBindDescriptorSets = cast( typeof( vkCmdBindDescriptorSets )) vkGetDeviceProcAddr( device, "vkCmdBindDescriptorSets" );
954 		vkCmdBindIndexBuffer = cast( typeof( vkCmdBindIndexBuffer )) vkGetDeviceProcAddr( device, "vkCmdBindIndexBuffer" );
955 		vkCmdBindVertexBuffers = cast( typeof( vkCmdBindVertexBuffers )) vkGetDeviceProcAddr( device, "vkCmdBindVertexBuffers" );
956 		vkCmdDraw = cast( typeof( vkCmdDraw )) vkGetDeviceProcAddr( device, "vkCmdDraw" );
957 		vkCmdDrawIndexed = cast( typeof( vkCmdDrawIndexed )) vkGetDeviceProcAddr( device, "vkCmdDrawIndexed" );
958 		vkCmdDrawIndirect = cast( typeof( vkCmdDrawIndirect )) vkGetDeviceProcAddr( device, "vkCmdDrawIndirect" );
959 		vkCmdDrawIndexedIndirect = cast( typeof( vkCmdDrawIndexedIndirect )) vkGetDeviceProcAddr( device, "vkCmdDrawIndexedIndirect" );
960 		vkCmdDispatch = cast( typeof( vkCmdDispatch )) vkGetDeviceProcAddr( device, "vkCmdDispatch" );
961 		vkCmdDispatchIndirect = cast( typeof( vkCmdDispatchIndirect )) vkGetDeviceProcAddr( device, "vkCmdDispatchIndirect" );
962 		vkCmdCopyBuffer = cast( typeof( vkCmdCopyBuffer )) vkGetDeviceProcAddr( device, "vkCmdCopyBuffer" );
963 		vkCmdCopyImage = cast( typeof( vkCmdCopyImage )) vkGetDeviceProcAddr( device, "vkCmdCopyImage" );
964 		vkCmdBlitImage = cast( typeof( vkCmdBlitImage )) vkGetDeviceProcAddr( device, "vkCmdBlitImage" );
965 		vkCmdCopyBufferToImage = cast( typeof( vkCmdCopyBufferToImage )) vkGetDeviceProcAddr( device, "vkCmdCopyBufferToImage" );
966 		vkCmdCopyImageToBuffer = cast( typeof( vkCmdCopyImageToBuffer )) vkGetDeviceProcAddr( device, "vkCmdCopyImageToBuffer" );
967 		vkCmdUpdateBuffer = cast( typeof( vkCmdUpdateBuffer )) vkGetDeviceProcAddr( device, "vkCmdUpdateBuffer" );
968 		vkCmdFillBuffer = cast( typeof( vkCmdFillBuffer )) vkGetDeviceProcAddr( device, "vkCmdFillBuffer" );
969 		vkCmdClearColorImage = cast( typeof( vkCmdClearColorImage )) vkGetDeviceProcAddr( device, "vkCmdClearColorImage" );
970 		vkCmdClearDepthStencilImage = cast( typeof( vkCmdClearDepthStencilImage )) vkGetDeviceProcAddr( device, "vkCmdClearDepthStencilImage" );
971 		vkCmdClearAttachments = cast( typeof( vkCmdClearAttachments )) vkGetDeviceProcAddr( device, "vkCmdClearAttachments" );
972 		vkCmdResolveImage = cast( typeof( vkCmdResolveImage )) vkGetDeviceProcAddr( device, "vkCmdResolveImage" );
973 		vkCmdSetEvent = cast( typeof( vkCmdSetEvent )) vkGetDeviceProcAddr( device, "vkCmdSetEvent" );
974 		vkCmdResetEvent = cast( typeof( vkCmdResetEvent )) vkGetDeviceProcAddr( device, "vkCmdResetEvent" );
975 		vkCmdWaitEvents = cast( typeof( vkCmdWaitEvents )) vkGetDeviceProcAddr( device, "vkCmdWaitEvents" );
976 		vkCmdPipelineBarrier = cast( typeof( vkCmdPipelineBarrier )) vkGetDeviceProcAddr( device, "vkCmdPipelineBarrier" );
977 		vkCmdBeginQuery = cast( typeof( vkCmdBeginQuery )) vkGetDeviceProcAddr( device, "vkCmdBeginQuery" );
978 		vkCmdEndQuery = cast( typeof( vkCmdEndQuery )) vkGetDeviceProcAddr( device, "vkCmdEndQuery" );
979 		vkCmdResetQueryPool = cast( typeof( vkCmdResetQueryPool )) vkGetDeviceProcAddr( device, "vkCmdResetQueryPool" );
980 		vkCmdWriteTimestamp = cast( typeof( vkCmdWriteTimestamp )) vkGetDeviceProcAddr( device, "vkCmdWriteTimestamp" );
981 		vkCmdCopyQueryPoolResults = cast( typeof( vkCmdCopyQueryPoolResults )) vkGetDeviceProcAddr( device, "vkCmdCopyQueryPoolResults" );
982 		vkCmdPushConstants = cast( typeof( vkCmdPushConstants )) vkGetDeviceProcAddr( device, "vkCmdPushConstants" );
983 		vkCmdBeginRenderPass = cast( typeof( vkCmdBeginRenderPass )) vkGetDeviceProcAddr( device, "vkCmdBeginRenderPass" );
984 		vkCmdNextSubpass = cast( typeof( vkCmdNextSubpass )) vkGetDeviceProcAddr( device, "vkCmdNextSubpass" );
985 		vkCmdEndRenderPass = cast( typeof( vkCmdEndRenderPass )) vkGetDeviceProcAddr( device, "vkCmdEndRenderPass" );
986 		vkCmdExecuteCommands = cast( typeof( vkCmdExecuteCommands )) vkGetDeviceProcAddr( device, "vkCmdExecuteCommands" );
987 
988 		// VK_KHR_swapchain
989 		vkCreateSwapchainKHR = cast( typeof( vkCreateSwapchainKHR )) vkGetDeviceProcAddr( device, "vkCreateSwapchainKHR" );
990 		vkDestroySwapchainKHR = cast( typeof( vkDestroySwapchainKHR )) vkGetDeviceProcAddr( device, "vkDestroySwapchainKHR" );
991 		vkGetSwapchainImagesKHR = cast( typeof( vkGetSwapchainImagesKHR )) vkGetDeviceProcAddr( device, "vkGetSwapchainImagesKHR" );
992 		vkAcquireNextImageKHR = cast( typeof( vkAcquireNextImageKHR )) vkGetDeviceProcAddr( device, "vkAcquireNextImageKHR" );
993 		vkQueuePresentKHR = cast( typeof( vkQueuePresentKHR )) vkGetDeviceProcAddr( device, "vkQueuePresentKHR" );
994 
995 		// VK_KHR_display_swapchain
996 		vkCreateSharedSwapchainsKHR = cast( typeof( vkCreateSharedSwapchainsKHR )) vkGetDeviceProcAddr( device, "vkCreateSharedSwapchainsKHR" );
997 
998 		// VK_EXT_debug_marker
999 		vkDebugMarkerSetObjectTagEXT = cast( typeof( vkDebugMarkerSetObjectTagEXT )) vkGetDeviceProcAddr( device, "vkDebugMarkerSetObjectTagEXT" );
1000 		vkDebugMarkerSetObjectNameEXT = cast( typeof( vkDebugMarkerSetObjectNameEXT )) vkGetDeviceProcAddr( device, "vkDebugMarkerSetObjectNameEXT" );
1001 		vkCmdDebugMarkerBeginEXT = cast( typeof( vkCmdDebugMarkerBeginEXT )) vkGetDeviceProcAddr( device, "vkCmdDebugMarkerBeginEXT" );
1002 		vkCmdDebugMarkerEndEXT = cast( typeof( vkCmdDebugMarkerEndEXT )) vkGetDeviceProcAddr( device, "vkCmdDebugMarkerEndEXT" );
1003 		vkCmdDebugMarkerInsertEXT = cast( typeof( vkCmdDebugMarkerInsertEXT )) vkGetDeviceProcAddr( device, "vkCmdDebugMarkerInsertEXT" );
1004 
1005 		// VK_AMD_draw_indirect_count
1006 		vkCmdDrawIndirectCountAMD = cast( typeof( vkCmdDrawIndirectCountAMD )) vkGetDeviceProcAddr( device, "vkCmdDrawIndirectCountAMD" );
1007 		vkCmdDrawIndexedIndirectCountAMD = cast( typeof( vkCmdDrawIndexedIndirectCountAMD )) vkGetDeviceProcAddr( device, "vkCmdDrawIndexedIndirectCountAMD" );
1008 
1009 		// VK_NV_external_memory_win32
1010 		version( VK_USE_PLATFORM_WIN32_KHR ) {
1011 			vkGetMemoryWin32HandleNV = cast( typeof( vkGetMemoryWin32HandleNV )) vkGetDeviceProcAddr( device, "vkGetMemoryWin32HandleNV" );
1012 		}
1013 	}
1014 
1015 	return dispatchDevice;
1016 }
1017 
1018 
1019 // struct to group per device deviceLevelFunctions into a custom namespace
1020 private struct DispatchDevice {
1021 	PFN_vkDestroyDevice vkDestroyDevice;
1022 	PFN_vkGetDeviceQueue vkGetDeviceQueue;
1023 	PFN_vkQueueSubmit vkQueueSubmit;
1024 	PFN_vkQueueWaitIdle vkQueueWaitIdle;
1025 	PFN_vkDeviceWaitIdle vkDeviceWaitIdle;
1026 	PFN_vkAllocateMemory vkAllocateMemory;
1027 	PFN_vkFreeMemory vkFreeMemory;
1028 	PFN_vkMapMemory vkMapMemory;
1029 	PFN_vkUnmapMemory vkUnmapMemory;
1030 	PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges;
1031 	PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges;
1032 	PFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment;
1033 	PFN_vkBindBufferMemory vkBindBufferMemory;
1034 	PFN_vkBindImageMemory vkBindImageMemory;
1035 	PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements;
1036 	PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements;
1037 	PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements;
1038 	PFN_vkQueueBindSparse vkQueueBindSparse;
1039 	PFN_vkCreateFence vkCreateFence;
1040 	PFN_vkDestroyFence vkDestroyFence;
1041 	PFN_vkResetFences vkResetFences;
1042 	PFN_vkGetFenceStatus vkGetFenceStatus;
1043 	PFN_vkWaitForFences vkWaitForFences;
1044 	PFN_vkCreateSemaphore vkCreateSemaphore;
1045 	PFN_vkDestroySemaphore vkDestroySemaphore;
1046 	PFN_vkCreateEvent vkCreateEvent;
1047 	PFN_vkDestroyEvent vkDestroyEvent;
1048 	PFN_vkGetEventStatus vkGetEventStatus;
1049 	PFN_vkSetEvent vkSetEvent;
1050 	PFN_vkResetEvent vkResetEvent;
1051 	PFN_vkCreateQueryPool vkCreateQueryPool;
1052 	PFN_vkDestroyQueryPool vkDestroyQueryPool;
1053 	PFN_vkGetQueryPoolResults vkGetQueryPoolResults;
1054 	PFN_vkCreateBuffer vkCreateBuffer;
1055 	PFN_vkDestroyBuffer vkDestroyBuffer;
1056 	PFN_vkCreateBufferView vkCreateBufferView;
1057 	PFN_vkDestroyBufferView vkDestroyBufferView;
1058 	PFN_vkCreateImage vkCreateImage;
1059 	PFN_vkDestroyImage vkDestroyImage;
1060 	PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout;
1061 	PFN_vkCreateImageView vkCreateImageView;
1062 	PFN_vkDestroyImageView vkDestroyImageView;
1063 	PFN_vkCreateShaderModule vkCreateShaderModule;
1064 	PFN_vkDestroyShaderModule vkDestroyShaderModule;
1065 	PFN_vkCreatePipelineCache vkCreatePipelineCache;
1066 	PFN_vkDestroyPipelineCache vkDestroyPipelineCache;
1067 	PFN_vkGetPipelineCacheData vkGetPipelineCacheData;
1068 	PFN_vkMergePipelineCaches vkMergePipelineCaches;
1069 	PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines;
1070 	PFN_vkCreateComputePipelines vkCreateComputePipelines;
1071 	PFN_vkDestroyPipeline vkDestroyPipeline;
1072 	PFN_vkCreatePipelineLayout vkCreatePipelineLayout;
1073 	PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout;
1074 	PFN_vkCreateSampler vkCreateSampler;
1075 	PFN_vkDestroySampler vkDestroySampler;
1076 	PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout;
1077 	PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout;
1078 	PFN_vkCreateDescriptorPool vkCreateDescriptorPool;
1079 	PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool;
1080 	PFN_vkResetDescriptorPool vkResetDescriptorPool;
1081 	PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets;
1082 	PFN_vkFreeDescriptorSets vkFreeDescriptorSets;
1083 	PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets;
1084 	PFN_vkCreateFramebuffer vkCreateFramebuffer;
1085 	PFN_vkDestroyFramebuffer vkDestroyFramebuffer;
1086 	PFN_vkCreateRenderPass vkCreateRenderPass;
1087 	PFN_vkDestroyRenderPass vkDestroyRenderPass;
1088 	PFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity;
1089 	PFN_vkCreateCommandPool vkCreateCommandPool;
1090 	PFN_vkDestroyCommandPool vkDestroyCommandPool;
1091 	PFN_vkResetCommandPool vkResetCommandPool;
1092 	PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers;
1093 	PFN_vkFreeCommandBuffers vkFreeCommandBuffers;
1094 	PFN_vkBeginCommandBuffer vkBeginCommandBuffer;
1095 	PFN_vkEndCommandBuffer vkEndCommandBuffer;
1096 	PFN_vkResetCommandBuffer vkResetCommandBuffer;
1097 	PFN_vkCmdBindPipeline vkCmdBindPipeline;
1098 	PFN_vkCmdSetViewport vkCmdSetViewport;
1099 	PFN_vkCmdSetScissor vkCmdSetScissor;
1100 	PFN_vkCmdSetLineWidth vkCmdSetLineWidth;
1101 	PFN_vkCmdSetDepthBias vkCmdSetDepthBias;
1102 	PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants;
1103 	PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds;
1104 	PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask;
1105 	PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask;
1106 	PFN_vkCmdSetStencilReference vkCmdSetStencilReference;
1107 	PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets;
1108 	PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer;
1109 	PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers;
1110 	PFN_vkCmdDraw vkCmdDraw;
1111 	PFN_vkCmdDrawIndexed vkCmdDrawIndexed;
1112 	PFN_vkCmdDrawIndirect vkCmdDrawIndirect;
1113 	PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect;
1114 	PFN_vkCmdDispatch vkCmdDispatch;
1115 	PFN_vkCmdDispatchIndirect vkCmdDispatchIndirect;
1116 	PFN_vkCmdCopyBuffer vkCmdCopyBuffer;
1117 	PFN_vkCmdCopyImage vkCmdCopyImage;
1118 	PFN_vkCmdBlitImage vkCmdBlitImage;
1119 	PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage;
1120 	PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer;
1121 	PFN_vkCmdUpdateBuffer vkCmdUpdateBuffer;
1122 	PFN_vkCmdFillBuffer vkCmdFillBuffer;
1123 	PFN_vkCmdClearColorImage vkCmdClearColorImage;
1124 	PFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage;
1125 	PFN_vkCmdClearAttachments vkCmdClearAttachments;
1126 	PFN_vkCmdResolveImage vkCmdResolveImage;
1127 	PFN_vkCmdSetEvent vkCmdSetEvent;
1128 	PFN_vkCmdResetEvent vkCmdResetEvent;
1129 	PFN_vkCmdWaitEvents vkCmdWaitEvents;
1130 	PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier;
1131 	PFN_vkCmdBeginQuery vkCmdBeginQuery;
1132 	PFN_vkCmdEndQuery vkCmdEndQuery;
1133 	PFN_vkCmdResetQueryPool vkCmdResetQueryPool;
1134 	PFN_vkCmdWriteTimestamp vkCmdWriteTimestamp;
1135 	PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults;
1136 	PFN_vkCmdPushConstants vkCmdPushConstants;
1137 	PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass;
1138 	PFN_vkCmdNextSubpass vkCmdNextSubpass;
1139 	PFN_vkCmdEndRenderPass vkCmdEndRenderPass;
1140 	PFN_vkCmdExecuteCommands vkCmdExecuteCommands;
1141 	PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR;
1142 	PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR;
1143 	PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR;
1144 	PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR;
1145 	PFN_vkQueuePresentKHR vkQueuePresentKHR;
1146 	PFN_vkCreateSharedSwapchainsKHR vkCreateSharedSwapchainsKHR;
1147 	PFN_vkDebugMarkerSetObjectTagEXT vkDebugMarkerSetObjectTagEXT;
1148 	PFN_vkDebugMarkerSetObjectNameEXT vkDebugMarkerSetObjectNameEXT;
1149 	PFN_vkCmdDebugMarkerBeginEXT vkCmdDebugMarkerBeginEXT;
1150 	PFN_vkCmdDebugMarkerEndEXT vkCmdDebugMarkerEndEXT;
1151 	PFN_vkCmdDebugMarkerInsertEXT vkCmdDebugMarkerInsertEXT;
1152 	PFN_vkCmdDrawIndirectCountAMD vkCmdDrawIndirectCountAMD;
1153 	PFN_vkCmdDrawIndexedIndirectCountAMD vkCmdDrawIndexedIndirectCountAMD;
1154 	version( VK_USE_PLATFORM_WIN32_KHR ) {
1155 		PFN_vkGetMemoryWin32HandleNV vkGetMemoryWin32HandleNV;
1156 	}
1157 }
1158 
1159 // Derelict loader to acquire entry point vkGetInstanceProcAddr
1160 version( ERUPTED_FROM_DERELICT ) {
1161 	import derelict.util.loader;
1162 	import derelict.util.system;
1163 	
1164 	private {
1165 		version( Windows )
1166 			enum libNames = "vulkan-1.dll";
1167 
1168 		else version( Posix )
1169 			enum libNames = "libvulkan.so.1";
1170 
1171 		else
1172 			static assert( 0,"Need to implement Vulkan libNames for this operating system." );
1173 	}
1174 	
1175 	class DerelictEruptedLoader : SharedLibLoader {
1176 		this() {
1177 			super( libNames );
1178 		}
1179 		
1180 		protected override void loadSymbols() {
1181 			typeof( vkGetInstanceProcAddr ) getProcAddr;
1182 			bindFunc( cast( void** )&getProcAddr, "vkGetInstanceProcAddr" );
1183 			loadGlobalLevelFunctions( getProcAddr );
1184 		}
1185 	}
1186 	
1187 	__gshared DerelictEruptedLoader DerelictErupted;
1188 
1189 	shared static this() {
1190 		DerelictErupted = new DerelictEruptedLoader();
1191 	}
1192 }
1193 
1194