1 // Copyright 2018 The SwiftShader Authors. All Rights Reserved.
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
7 // http://www.apache.org/licenses/LICENSE-2.0
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
15 #include "VkGetProcAddress.h"
17 #include <unordered_map>
20 #include <vulkan/vulkan.h>
25 #define MAKE_VULKAN_GLOBAL_ENTRY(aFunction) { #aFunction, reinterpret_cast<PFN_vkVoidFunction>(aFunction) }
26 static const std::unordered_map<std::string, PFN_vkVoidFunction> globalFunctionPointers =
28 MAKE_VULKAN_GLOBAL_ENTRY(vkCreateInstance),
29 MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceExtensionProperties),
30 MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceLayerProperties),
31 MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceVersion),
33 #undef MAKE_VULKAN_GLOBAL_ENTRY
35 #define MAKE_VULKAN_INSTANCE_ENTRY(aFunction) { #aFunction, reinterpret_cast<PFN_vkVoidFunction>(aFunction) }
36 static const std::unordered_map<std::string, PFN_vkVoidFunction> instanceFunctionPointers =
38 MAKE_VULKAN_INSTANCE_ENTRY(vkDestroyInstance),
39 MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDevices),
40 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures),
41 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties),
42 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties),
43 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties),
44 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties),
45 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties),
46 MAKE_VULKAN_INSTANCE_ENTRY(vkCreateDevice),
47 MAKE_VULKAN_INSTANCE_ENTRY(vkEnumerateDeviceExtensionProperties),
48 MAKE_VULKAN_INSTANCE_ENTRY(vkEnumerateDeviceLayerProperties),
49 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties),
50 MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDeviceGroups),
51 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures2),
52 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties2),
53 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties2),
54 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties2),
55 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties2),
56 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties2),
57 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties2),
58 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalBufferProperties),
59 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalFenceProperties),
60 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalSemaphoreProperties),
61 // VK_KHR_device_group_creation
62 MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDeviceGroupsKHR),
63 // VK_KHR_external_fence_capabilities
64 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalFencePropertiesKHR),
65 // VK_KHR_external_memory_capabilities
66 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalBufferPropertiesKHR),
67 // VK_KHR_external_semaphore_capabilities
68 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalSemaphorePropertiesKHR),
69 // VK_KHR_get_physical_device_properties2
70 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures2KHR),
71 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties2KHR),
72 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties2KHR),
73 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties2KHR),
74 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties2KHR),
75 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties2KHR),
76 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties2KHR),
79 MAKE_VULKAN_INSTANCE_ENTRY(vkDestroySurfaceKHR),
80 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceSupportKHR),
81 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceCapabilitiesKHR),
82 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceFormatsKHR),
83 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfacePresentModesKHR),
85 #ifdef VK_USE_PLATFORM_XLIB_KHR
86 // VK_KHR_xlib_surface
87 MAKE_VULKAN_INSTANCE_ENTRY(vkCreateXlibSurfaceKHR),
90 #undef MAKE_VULKAN_INSTANCE_ENTRY
92 #define MAKE_VULKAN_DEVICE_ENTRY(aFunction) { #aFunction, reinterpret_cast<PFN_vkVoidFunction>(aFunction) }
93 static const std::unordered_map<std::string, PFN_vkVoidFunction> deviceFunctionPointers =
95 MAKE_VULKAN_DEVICE_ENTRY(vkGetInstanceProcAddr),
96 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceProcAddr),
97 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDevice),
98 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceQueue),
99 MAKE_VULKAN_DEVICE_ENTRY(vkQueueSubmit),
100 MAKE_VULKAN_DEVICE_ENTRY(vkQueueWaitIdle),
101 MAKE_VULKAN_DEVICE_ENTRY(vkDeviceWaitIdle),
102 MAKE_VULKAN_DEVICE_ENTRY(vkAllocateMemory),
103 MAKE_VULKAN_DEVICE_ENTRY(vkFreeMemory),
104 MAKE_VULKAN_DEVICE_ENTRY(vkMapMemory),
105 MAKE_VULKAN_DEVICE_ENTRY(vkUnmapMemory),
106 MAKE_VULKAN_DEVICE_ENTRY(vkFlushMappedMemoryRanges),
107 MAKE_VULKAN_DEVICE_ENTRY(vkInvalidateMappedMemoryRanges),
108 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceMemoryCommitment),
109 MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory),
110 MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory),
111 MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements),
112 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements),
113 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements),
114 MAKE_VULKAN_DEVICE_ENTRY(vkQueueBindSparse),
115 MAKE_VULKAN_DEVICE_ENTRY(vkCreateFence),
116 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyFence),
117 MAKE_VULKAN_DEVICE_ENTRY(vkResetFences),
118 MAKE_VULKAN_DEVICE_ENTRY(vkGetFenceStatus),
119 MAKE_VULKAN_DEVICE_ENTRY(vkWaitForFences),
120 MAKE_VULKAN_DEVICE_ENTRY(vkCreateSemaphore),
121 MAKE_VULKAN_DEVICE_ENTRY(vkDestroySemaphore),
122 MAKE_VULKAN_DEVICE_ENTRY(vkCreateEvent),
123 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyEvent),
124 MAKE_VULKAN_DEVICE_ENTRY(vkGetEventStatus),
125 MAKE_VULKAN_DEVICE_ENTRY(vkSetEvent),
126 MAKE_VULKAN_DEVICE_ENTRY(vkResetEvent),
127 MAKE_VULKAN_DEVICE_ENTRY(vkCreateQueryPool),
128 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyQueryPool),
129 MAKE_VULKAN_DEVICE_ENTRY(vkGetQueryPoolResults),
130 MAKE_VULKAN_DEVICE_ENTRY(vkCreateBuffer),
131 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyBuffer),
132 MAKE_VULKAN_DEVICE_ENTRY(vkCreateBufferView),
133 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyBufferView),
134 MAKE_VULKAN_DEVICE_ENTRY(vkCreateImage),
135 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyImage),
136 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSubresourceLayout),
137 MAKE_VULKAN_DEVICE_ENTRY(vkCreateImageView),
138 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyImageView),
139 MAKE_VULKAN_DEVICE_ENTRY(vkCreateShaderModule),
140 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyShaderModule),
141 MAKE_VULKAN_DEVICE_ENTRY(vkCreatePipelineCache),
142 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipelineCache),
143 MAKE_VULKAN_DEVICE_ENTRY(vkGetPipelineCacheData),
144 MAKE_VULKAN_DEVICE_ENTRY(vkMergePipelineCaches),
145 MAKE_VULKAN_DEVICE_ENTRY(vkCreateGraphicsPipelines),
146 MAKE_VULKAN_DEVICE_ENTRY(vkCreateComputePipelines),
147 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipeline),
148 MAKE_VULKAN_DEVICE_ENTRY(vkCreatePipelineLayout),
149 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipelineLayout),
150 MAKE_VULKAN_DEVICE_ENTRY(vkCreateSampler),
151 MAKE_VULKAN_DEVICE_ENTRY(vkDestroySampler),
152 MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorSetLayout),
153 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorSetLayout),
154 MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorPool),
155 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorPool),
156 MAKE_VULKAN_DEVICE_ENTRY(vkResetDescriptorPool),
157 MAKE_VULKAN_DEVICE_ENTRY(vkAllocateDescriptorSets),
158 MAKE_VULKAN_DEVICE_ENTRY(vkFreeDescriptorSets),
159 MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSets),
160 MAKE_VULKAN_DEVICE_ENTRY(vkCreateFramebuffer),
161 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyFramebuffer),
162 MAKE_VULKAN_DEVICE_ENTRY(vkCreateRenderPass),
163 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyRenderPass),
164 MAKE_VULKAN_DEVICE_ENTRY(vkGetRenderAreaGranularity),
165 MAKE_VULKAN_DEVICE_ENTRY(vkCreateCommandPool),
166 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyCommandPool),
167 MAKE_VULKAN_DEVICE_ENTRY(vkResetCommandPool),
168 MAKE_VULKAN_DEVICE_ENTRY(vkAllocateCommandBuffers),
169 MAKE_VULKAN_DEVICE_ENTRY(vkFreeCommandBuffers),
170 MAKE_VULKAN_DEVICE_ENTRY(vkBeginCommandBuffer),
171 MAKE_VULKAN_DEVICE_ENTRY(vkEndCommandBuffer),
172 MAKE_VULKAN_DEVICE_ENTRY(vkResetCommandBuffer),
173 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindPipeline),
174 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetViewport),
175 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetScissor),
176 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetLineWidth),
177 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthBias),
178 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetBlendConstants),
179 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthBounds),
180 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilCompareMask),
181 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilWriteMask),
182 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilReference),
183 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindDescriptorSets),
184 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindIndexBuffer),
185 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindVertexBuffers),
186 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDraw),
187 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexed),
188 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndirect),
189 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexedIndirect),
190 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatch),
191 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchIndirect),
192 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBuffer),
193 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImage),
194 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBlitImage),
195 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBufferToImage),
196 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImageToBuffer),
197 MAKE_VULKAN_DEVICE_ENTRY(vkCmdUpdateBuffer),
198 MAKE_VULKAN_DEVICE_ENTRY(vkCmdFillBuffer),
199 MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearColorImage),
200 MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearDepthStencilImage),
201 MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearAttachments),
202 MAKE_VULKAN_DEVICE_ENTRY(vkCmdResolveImage),
203 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetEvent),
204 MAKE_VULKAN_DEVICE_ENTRY(vkCmdResetEvent),
205 MAKE_VULKAN_DEVICE_ENTRY(vkCmdWaitEvents),
206 MAKE_VULKAN_DEVICE_ENTRY(vkCmdPipelineBarrier),
207 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginQuery),
208 MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndQuery),
209 MAKE_VULKAN_DEVICE_ENTRY(vkCmdResetQueryPool),
210 MAKE_VULKAN_DEVICE_ENTRY(vkCmdWriteTimestamp),
211 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyQueryPoolResults),
212 MAKE_VULKAN_DEVICE_ENTRY(vkCmdPushConstants),
213 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginRenderPass),
214 MAKE_VULKAN_DEVICE_ENTRY(vkCmdNextSubpass),
215 MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndRenderPass),
216 MAKE_VULKAN_DEVICE_ENTRY(vkCmdExecuteCommands),
217 MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory2),
218 MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory2),
219 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPeerMemoryFeatures),
220 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDeviceMask),
221 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchBase),
222 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements2),
223 MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements2),
224 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements2),
225 MAKE_VULKAN_DEVICE_ENTRY(vkTrimCommandPool),
226 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceQueue2),
227 MAKE_VULKAN_DEVICE_ENTRY(vkCreateSamplerYcbcrConversion),
228 MAKE_VULKAN_DEVICE_ENTRY(vkDestroySamplerYcbcrConversion),
229 MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorUpdateTemplate),
230 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorUpdateTemplate),
231 MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSetWithTemplate),
232 MAKE_VULKAN_DEVICE_ENTRY(vkGetDescriptorSetLayoutSupport),
233 // VK_KHR_descriptor_update_template
234 MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorUpdateTemplateKHR),
235 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorUpdateTemplateKHR),
236 MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSetWithTemplateKHR),
237 // VK_KHR_device_group
238 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPeerMemoryFeaturesKHR),
239 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDeviceMaskKHR),
240 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchBaseKHR),
241 // VK_KHR_maintenance1
242 MAKE_VULKAN_DEVICE_ENTRY(vkTrimCommandPoolKHR),
243 // VK_KHR_sampler_ycbcr_conversion
244 MAKE_VULKAN_DEVICE_ENTRY(vkCreateSamplerYcbcrConversionKHR),
245 MAKE_VULKAN_DEVICE_ENTRY(vkDestroySamplerYcbcrConversionKHR),
246 // VK_KHR_bind_memory2
247 MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory2KHR),
248 MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory2KHR),
249 // VK_KHR_get_memory_requirements2
250 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements2KHR),
251 MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements2KHR),
252 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements2KHR),
253 // VK_KHR_maintenance3
254 MAKE_VULKAN_DEVICE_ENTRY(vkGetDescriptorSetLayoutSupportKHR),
257 MAKE_VULKAN_DEVICE_ENTRY(vkCreateSwapchainKHR),
258 MAKE_VULKAN_DEVICE_ENTRY(vkDestroySwapchainKHR),
259 MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainImagesKHR),
260 MAKE_VULKAN_DEVICE_ENTRY(vkAcquireNextImageKHR),
261 MAKE_VULKAN_DEVICE_ENTRY(vkQueuePresentKHR),
264 #undef MAKE_VULKAN_DEVICE_ENTRY
266 PFN_vkVoidFunction GetInstanceProcAddr(VkInstance instance, const char* pName)
268 auto globalFunction = globalFunctionPointers.find(std::string(pName));
269 if(globalFunction != globalFunctionPointers.end())
271 return globalFunction->second;
274 if(instance != VK_NULL_HANDLE)
276 auto instanceFunction = instanceFunctionPointers.find(std::string(pName));
277 if(instanceFunction != instanceFunctionPointers.end())
279 return instanceFunction->second;
282 auto deviceFunction = deviceFunctionPointers.find(std::string(pName));
283 if(deviceFunction != deviceFunctionPointers.end())
285 return deviceFunction->second;
292 PFN_vkVoidFunction GetDeviceProcAddr(VkDevice device, const char* pName)
294 auto deviceFunction = deviceFunctionPointers.find(std::string(pName));
295 if(deviceFunction != deviceFunctionPointers.end())
297 return deviceFunction->second;