xref: /aosp_15_r20/external/swiftshader/src/Vulkan/VkGetProcAddress.cpp (revision 03ce13f70fcc45d86ee91b7ee4cab1936a95046e)
1 // Copyright 2018 The SwiftShader Authors. All Rights Reserved.
2 //
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
6 //
7 //    http://www.apache.org/licenses/LICENSE-2.0
8 //
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.
14 
15 #include "VkGetProcAddress.hpp"
16 #include "VkDevice.hpp"
17 
18 #include <string>
19 #include <tuple>
20 #include <type_traits>
21 #include <unordered_map>
22 #include <vector>
23 
24 #ifdef __ANDROID__
25 #	include <hardware/hwvulkan.h>
26 #	include <vulkan/vk_android_native_buffer.h>
27 #	include <cerrno>
28 #endif
29 
30 namespace vk {
31 
32 // Functions that can be obtained through GetInstanceProcAddr without an instance
33 #define MAKE_VULKAN_GLOBAL_ENTRY(aFunction)                           \
34 	{                                                                 \
35 #		aFunction, reinterpret_cast < PFN_vkVoidFunction>(aFunction) \
36 	}
37 
38 // TODO(b/208256248): Avoid exit-time destructor.
39 static const std::unordered_map<std::string, PFN_vkVoidFunction> globalFunctionPointers = {
40 	MAKE_VULKAN_GLOBAL_ENTRY(vkGetInstanceProcAddr),
41 	MAKE_VULKAN_GLOBAL_ENTRY(vkCreateInstance),
42 	MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceExtensionProperties),
43 	MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceLayerProperties),
44 	MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceVersion),
45 
46 	MAKE_VULKAN_GLOBAL_ENTRY(vk_icdGetInstanceProcAddr),
47 	MAKE_VULKAN_GLOBAL_ENTRY(vk_icdNegotiateLoaderICDInterfaceVersion),
48 #if VK_USE_PLATFORM_WIN32_KHR
49 	MAKE_VULKAN_GLOBAL_ENTRY(vk_icdEnumerateAdapterPhysicalDevices),
50 #endif  // VK_USE_PLATFORM_WIN32_KHR
51 };
52 #undef MAKE_VULKAN_GLOBAL_ENTRY
53 
54 // Functions that can be obtained through GetInstanceProcAddr with an instance object
55 struct InstanceFunctionEntry
56 {
57 	PFN_vkVoidFunction pfn;
58 	// True if the first argument is a VkPhysicalDevice. See
59 	// https://github.com/KhronosGroup/Vulkan-Loader/blob/main/docs/LoaderDriverInterface.md#reason-for-adding-vk_icdgetphysicaldeviceprocaddr
60 	bool isPhysicalDeviceFn;
61 };
62 
63 // Template magic to detect if the first argument of a C function is a VkPhysicalDevice.
64 template<typename T>
65 struct FunctionArgs
66 {};
67 
68 template<typename R, typename... Args>
69 struct FunctionArgs<VKAPI_ATTR R VKAPI_CALL(Args...)>
70 {
71 	using Tuple = std::tuple<Args...>;
72 	using FirstType = typename std::tuple_element<0, Tuple>::type;
73 };
74 
75 template<typename T>
76 constexpr bool HasPhysicalDeviceFirstArgument =
77     std::is_same<typename FunctionArgs<T>::FirstType, VkPhysicalDevice>::value;
78 
79 #define MAKE_VULKAN_INSTANCE_ENTRY(aFunction)                       \
80 	{                                                               \
81 		#aFunction,                                                 \
82 		{                                                           \
83 			reinterpret_cast<PFN_vkVoidFunction>(aFunction),        \
84 			    HasPhysicalDeviceFirstArgument<decltype(aFunction)> \
85 		}                                                           \
86 	}
87 
88 // TODO(b/208256248): Avoid exit-time destructor.
89 static const std::unordered_map<std::string, InstanceFunctionEntry> instanceFunctionPointers = {
90 
91 	MAKE_VULKAN_INSTANCE_ENTRY(vkDestroyInstance),
92 	MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDevices),
93 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures),
94 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties),
95 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties),
96 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties),
97 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties),
98 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties),
99 	MAKE_VULKAN_INSTANCE_ENTRY(vkCreateDevice),
100 	MAKE_VULKAN_INSTANCE_ENTRY(vkEnumerateDeviceExtensionProperties),
101 	MAKE_VULKAN_INSTANCE_ENTRY(vkEnumerateDeviceLayerProperties),
102 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties),
103 	MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDeviceGroups),
104 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures2),
105 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties2),
106 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties2),
107 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties2),
108 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties2),
109 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties2),
110 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties2),
111 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalBufferProperties),
112 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalFenceProperties),
113 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalSemaphoreProperties),
114 	// VK_KHR_device_group_creation
115 	MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDeviceGroupsKHR),
116 	// VK_KHR_external_fence_capabilities
117 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalFencePropertiesKHR),
118 	// VK_KHR_external_memory_capabilities
119 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalBufferPropertiesKHR),
120 	// VK_KHR_external_semaphore_capabilities
121 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalSemaphorePropertiesKHR),
122 	// VK_KHR_get_physical_device_properties2
123 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures2KHR),
124 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties2KHR),
125 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties2KHR),
126 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties2KHR),
127 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties2KHR),
128 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties2KHR),
129 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties2KHR),
130 	// VK_EXT_debug_utils
131 	MAKE_VULKAN_INSTANCE_ENTRY(vkCmdBeginDebugUtilsLabelEXT),
132 	MAKE_VULKAN_INSTANCE_ENTRY(vkCmdEndDebugUtilsLabelEXT),
133 	MAKE_VULKAN_INSTANCE_ENTRY(vkCmdInsertDebugUtilsLabelEXT),
134 	MAKE_VULKAN_INSTANCE_ENTRY(vkCreateDebugUtilsMessengerEXT),
135 	MAKE_VULKAN_INSTANCE_ENTRY(vkDestroyDebugUtilsMessengerEXT),
136 	MAKE_VULKAN_INSTANCE_ENTRY(vkQueueBeginDebugUtilsLabelEXT),
137 	MAKE_VULKAN_INSTANCE_ENTRY(vkQueueEndDebugUtilsLabelEXT),
138 	MAKE_VULKAN_INSTANCE_ENTRY(vkQueueInsertDebugUtilsLabelEXT),
139 	MAKE_VULKAN_INSTANCE_ENTRY(vkSetDebugUtilsObjectNameEXT),
140 	MAKE_VULKAN_INSTANCE_ENTRY(vkSetDebugUtilsObjectTagEXT),
141 	MAKE_VULKAN_INSTANCE_ENTRY(vkSubmitDebugUtilsMessageEXT),
142 	// VK_EXT_tooling_info
143 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceToolProperties),
144 #ifndef __ANDROID__
145 	// VK_KHR_surface
146 	MAKE_VULKAN_INSTANCE_ENTRY(vkDestroySurfaceKHR),
147 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceSupportKHR),
148 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceCapabilitiesKHR),
149 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceFormatsKHR),
150 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfacePresentModesKHR),
151 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDevicePresentRectanglesKHR),
152 	// VK_KHR_get_surface_capabilities2
153 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceCapabilities2KHR),
154 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceFormats2KHR),
155 #endif
156 #ifdef VK_USE_PLATFORM_XCB_KHR
157 	// VK_KHR_Xcb_surface
158 	MAKE_VULKAN_INSTANCE_ENTRY(vkCreateXcbSurfaceKHR),
159 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceXcbPresentationSupportKHR),
160 #endif
161 #ifdef VK_USE_PLATFORM_WAYLAND_KHR
162 	// VK_KHR_wayland_surface
163 	MAKE_VULKAN_INSTANCE_ENTRY(vkCreateWaylandSurfaceKHR),
164 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceWaylandPresentationSupportKHR),
165 #endif
166 #ifdef VK_USE_PLATFORM_DIRECTFB_EXT
167 	// VK_EXT_directfb_surface
168 	MAKE_VULKAN_INSTANCE_ENTRY(vkCreateDirectFBSurfaceEXT),
169 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceDirectFBPresentationSupportEXT),
170 #endif
171 #ifdef VK_USE_PLATFORM_DISPLAY_KHR
172 	// VK_KHR_display
173 	MAKE_VULKAN_INSTANCE_ENTRY(vkCreateDisplayModeKHR),
174 	MAKE_VULKAN_INSTANCE_ENTRY(vkCreateDisplayPlaneSurfaceKHR),
175 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetDisplayModePropertiesKHR),
176 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetDisplayPlaneCapabilitiesKHR),
177 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetDisplayPlaneSupportedDisplaysKHR),
178 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceDisplayPlanePropertiesKHR),
179 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceDisplayPropertiesKHR),
180 #endif
181 #ifdef VK_USE_PLATFORM_MACOS_MVK
182 	// VK_MVK_macos_surface
183 	MAKE_VULKAN_INSTANCE_ENTRY(vkCreateMacOSSurfaceMVK),
184 #endif
185 #ifdef VK_USE_PLATFORM_METAL_EXT
186 	// VK_EXT_metal_surface
187 	MAKE_VULKAN_INSTANCE_ENTRY(vkCreateMetalSurfaceEXT),
188 #endif
189 #ifdef VK_USE_PLATFORM_WIN32_KHR
190 	// VK_KHR_win32_surface
191 	MAKE_VULKAN_INSTANCE_ENTRY(vkCreateWin32SurfaceKHR),
192 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceWin32PresentationSupportKHR),
193 #endif
194 	MAKE_VULKAN_INSTANCE_ENTRY(vkCreateHeadlessSurfaceEXT),
195 };
196 #undef MAKE_VULKAN_INSTANCE_ENTRY
197 
198 // Functions that can be obtained through GetDeviceProcAddr with a device object
199 #define MAKE_VULKAN_DEVICE_ENTRY(aFunction)                           \
200 	{                                                                 \
201 #		aFunction, reinterpret_cast < PFN_vkVoidFunction>(aFunction) \
202 	}
203 
204 // TODO(b/208256248): Avoid exit-time destructor.
205 static const std::unordered_map<std::string, PFN_vkVoidFunction> deviceFunctionPointers = {
206 	MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceProcAddr),
207 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDevice),
208 	MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceQueue),
209 	MAKE_VULKAN_DEVICE_ENTRY(vkQueueSubmit),
210 	MAKE_VULKAN_DEVICE_ENTRY(vkQueueWaitIdle),
211 	MAKE_VULKAN_DEVICE_ENTRY(vkDeviceWaitIdle),
212 	MAKE_VULKAN_DEVICE_ENTRY(vkAllocateMemory),
213 	MAKE_VULKAN_DEVICE_ENTRY(vkFreeMemory),
214 	MAKE_VULKAN_DEVICE_ENTRY(vkMapMemory),
215 	MAKE_VULKAN_DEVICE_ENTRY(vkUnmapMemory),
216 	MAKE_VULKAN_DEVICE_ENTRY(vkFlushMappedMemoryRanges),
217 	MAKE_VULKAN_DEVICE_ENTRY(vkInvalidateMappedMemoryRanges),
218 	MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceMemoryCommitment),
219 	MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory),
220 	MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory),
221 	MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements),
222 	MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements),
223 	MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements),
224 	MAKE_VULKAN_DEVICE_ENTRY(vkQueueBindSparse),
225 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateFence),
226 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyFence),
227 	MAKE_VULKAN_DEVICE_ENTRY(vkResetFences),
228 	MAKE_VULKAN_DEVICE_ENTRY(vkGetFenceStatus),
229 	MAKE_VULKAN_DEVICE_ENTRY(vkWaitForFences),
230 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateSemaphore),
231 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroySemaphore),
232 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateEvent),
233 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyEvent),
234 	MAKE_VULKAN_DEVICE_ENTRY(vkGetEventStatus),
235 	MAKE_VULKAN_DEVICE_ENTRY(vkSetEvent),
236 	MAKE_VULKAN_DEVICE_ENTRY(vkResetEvent),
237 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateQueryPool),
238 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyQueryPool),
239 	MAKE_VULKAN_DEVICE_ENTRY(vkGetQueryPoolResults),
240 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateBuffer),
241 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyBuffer),
242 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateBufferView),
243 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyBufferView),
244 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateImage),
245 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyImage),
246 	MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSubresourceLayout),
247 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateImageView),
248 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyImageView),
249 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateShaderModule),
250 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyShaderModule),
251 	MAKE_VULKAN_DEVICE_ENTRY(vkCreatePipelineCache),
252 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipelineCache),
253 	MAKE_VULKAN_DEVICE_ENTRY(vkGetPipelineCacheData),
254 	MAKE_VULKAN_DEVICE_ENTRY(vkMergePipelineCaches),
255 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateGraphicsPipelines),
256 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateComputePipelines),
257 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipeline),
258 	MAKE_VULKAN_DEVICE_ENTRY(vkCreatePipelineLayout),
259 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipelineLayout),
260 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateSampler),
261 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroySampler),
262 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorSetLayout),
263 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorSetLayout),
264 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorPool),
265 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorPool),
266 	MAKE_VULKAN_DEVICE_ENTRY(vkResetDescriptorPool),
267 	MAKE_VULKAN_DEVICE_ENTRY(vkAllocateDescriptorSets),
268 	MAKE_VULKAN_DEVICE_ENTRY(vkFreeDescriptorSets),
269 	MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSets),
270 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateFramebuffer),
271 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyFramebuffer),
272 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateRenderPass),
273 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyRenderPass),
274 	MAKE_VULKAN_DEVICE_ENTRY(vkGetRenderAreaGranularity),
275 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateCommandPool),
276 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyCommandPool),
277 	MAKE_VULKAN_DEVICE_ENTRY(vkResetCommandPool),
278 	MAKE_VULKAN_DEVICE_ENTRY(vkAllocateCommandBuffers),
279 	MAKE_VULKAN_DEVICE_ENTRY(vkFreeCommandBuffers),
280 	MAKE_VULKAN_DEVICE_ENTRY(vkBeginCommandBuffer),
281 	MAKE_VULKAN_DEVICE_ENTRY(vkEndCommandBuffer),
282 	MAKE_VULKAN_DEVICE_ENTRY(vkResetCommandBuffer),
283 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindPipeline),
284 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetViewport),
285 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetScissor),
286 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetLineWidth),
287 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthBias),
288 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetBlendConstants),
289 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthBounds),
290 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilCompareMask),
291 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilWriteMask),
292 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilReference),
293 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindDescriptorSets),
294 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindIndexBuffer),
295 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindVertexBuffers),
296 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDraw),
297 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexed),
298 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndirect),
299 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexedIndirect),
300 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatch),
301 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchIndirect),
302 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBuffer),
303 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImage),
304 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBlitImage),
305 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBufferToImage),
306 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImageToBuffer),
307 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdUpdateBuffer),
308 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdFillBuffer),
309 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearColorImage),
310 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearDepthStencilImage),
311 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearAttachments),
312 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdResolveImage),
313 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetEvent),
314 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdResetEvent),
315 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdWaitEvents),
316 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdPipelineBarrier),
317 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginQuery),
318 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndQuery),
319 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdResetQueryPool),
320 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdWriteTimestamp),
321 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyQueryPoolResults),
322 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdPushConstants),
323 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginRenderPass),
324 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdNextSubpass),
325 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndRenderPass),
326 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdExecuteCommands),
327 	MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory2),
328 	MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory2),
329 	MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPeerMemoryFeatures),
330 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDeviceMask),
331 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchBase),
332 	MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements2),
333 	MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements2),
334 	MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements2),
335 	MAKE_VULKAN_DEVICE_ENTRY(vkTrimCommandPool),
336 	MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceQueue2),
337 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateSamplerYcbcrConversion),
338 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroySamplerYcbcrConversion),
339 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorUpdateTemplate),
340 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorUpdateTemplate),
341 	MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSetWithTemplate),
342 	MAKE_VULKAN_DEVICE_ENTRY(vkGetDescriptorSetLayoutSupport),
343 	// Device level VK_EXT_debug_utils functions
344 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginDebugUtilsLabelEXT),
345 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndDebugUtilsLabelEXT),
346 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdInsertDebugUtilsLabelEXT),
347 	MAKE_VULKAN_DEVICE_ENTRY(vkQueueBeginDebugUtilsLabelEXT),
348 	MAKE_VULKAN_DEVICE_ENTRY(vkQueueEndDebugUtilsLabelEXT),
349 	MAKE_VULKAN_DEVICE_ENTRY(vkQueueInsertDebugUtilsLabelEXT),
350 	MAKE_VULKAN_DEVICE_ENTRY(vkSetDebugUtilsObjectNameEXT),
351 	MAKE_VULKAN_DEVICE_ENTRY(vkSetDebugUtilsObjectTagEXT),
352 #ifdef __ANDROID__
353 	MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainGrallocUsageANDROID),
354 	MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainGrallocUsage2ANDROID),
355 	MAKE_VULKAN_DEVICE_ENTRY(vkAcquireImageANDROID),
356 	MAKE_VULKAN_DEVICE_ENTRY(vkQueueSignalReleaseImageANDROID),
357 #endif
358 	// Vulkan 1.2 Entry point functions
359 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateRenderPass2),
360 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginRenderPass2),
361 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndRenderPass2),
362 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdNextSubpass2),
363 	MAKE_VULKAN_DEVICE_ENTRY(vkResetQueryPool),
364 	// VK_KHR_timeline_semaphore
365 	MAKE_VULKAN_DEVICE_ENTRY(vkGetSemaphoreCounterValue),
366 	MAKE_VULKAN_DEVICE_ENTRY(vkSignalSemaphore),
367 	MAKE_VULKAN_DEVICE_ENTRY(vkWaitSemaphores),
368 	// VK_KHR_buffer_device_address
369 	MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferDeviceAddress),
370 	MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferOpaqueCaptureAddress),
371 	MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceMemoryOpaqueCaptureAddress),
372 	// VK_KHR_draw_indirect_count
373 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndirectCount),
374 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexedIndirectCount),
375 	// Vulkan 1.3 Entry point functions
376 	// VK_KHR_copy_commands2
377 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBuffer2),
378 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImage2),
379 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBufferToImage2),
380 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImageToBuffer2),
381 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBlitImage2),
382 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdResolveImage2),
383 	// VK_KHR_dynamic_rendering
384 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginRendering),
385 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndRendering),
386 	// VK_KHR_maintenance4
387 	MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceBufferMemoryRequirements),
388 	MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceImageMemoryRequirements),
389 	MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceImageSparseMemoryRequirements),
390 	// VK_KHR_synchronization2
391 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetEvent2),
392 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdResetEvent2),
393 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdWaitEvents2),
394 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdPipelineBarrier2),
395 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdWriteTimestamp2),
396 	MAKE_VULKAN_DEVICE_ENTRY(vkQueueSubmit2),
397 	// VK_EXT_extended_dynamic_state
398 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetCullMode),
399 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetFrontFace),
400 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetPrimitiveTopology),
401 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetViewportWithCount),
402 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetScissorWithCount),
403 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindVertexBuffers2),
404 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthTestEnable),
405 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthWriteEnable),
406 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthCompareOp),
407 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthBoundsTestEnable),
408 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilTestEnable),
409 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilOp),
410 	// VK_EXT_extended_dynamic_state2 (partial promotion, VKCmdSetLogicOpEXT and VKCmdSetPatchControlPointsEXT are not promoted)
411 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetRasterizerDiscardEnable),
412 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthBiasEnable),
413 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetPrimitiveRestartEnable),
414 	// VK_EXT_private_data
415 	MAKE_VULKAN_DEVICE_ENTRY(vkCreatePrivateDataSlot),
416 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPrivateDataSlot),
417 	MAKE_VULKAN_DEVICE_ENTRY(vkSetPrivateData),
418 	MAKE_VULKAN_DEVICE_ENTRY(vkGetPrivateData),
419 };
420 
421 // TODO(b/208256248): Avoid exit-time destructor.
422 static const std::vector<std::pair<const char *, std::unordered_map<std::string, PFN_vkVoidFunction>>> deviceExtensionFunctionPointers = {
423 	// VK_KHR_descriptor_update_template
424 	{
425 	    VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME,
426 	    {
427 	        MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorUpdateTemplateKHR),
428 	        MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorUpdateTemplateKHR),
429 	        MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSetWithTemplateKHR),
430 	    } },
431 	// VK_KHR_device_group
432 	{
433 	    VK_KHR_DEVICE_GROUP_EXTENSION_NAME,
434 	    {
435 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPeerMemoryFeaturesKHR),
436 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDeviceMaskKHR),
437 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchBaseKHR),
438 	    } },
439 	// VK_KHR_maintenance1
440 	{
441 	    VK_KHR_MAINTENANCE1_EXTENSION_NAME,
442 	    {
443 	        MAKE_VULKAN_DEVICE_ENTRY(vkTrimCommandPoolKHR),
444 	    } },
445 	// VK_KHR_sampler_ycbcr_conversion
446 	{
447 	    VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME,
448 	    {
449 	        MAKE_VULKAN_DEVICE_ENTRY(vkCreateSamplerYcbcrConversionKHR),
450 	        MAKE_VULKAN_DEVICE_ENTRY(vkDestroySamplerYcbcrConversionKHR),
451 	    } },
452 	// VK_KHR_bind_memory2
453 	{
454 	    VK_KHR_BIND_MEMORY_2_EXTENSION_NAME,
455 	    {
456 	        MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory2KHR),
457 	        MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory2KHR),
458 	    } },
459 	// VK_KHR_copy_commands2
460 	{
461 	    VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME,
462 	    {
463 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdBlitImage2KHR),
464 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBuffer2KHR),
465 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBufferToImage2KHR),
466 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImage2KHR),
467 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImageToBuffer2KHR),
468 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdResolveImage2KHR),
469 	    } },
470 	// VK_KHR_get_memory_requirements2
471 	{
472 	    VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME,
473 	    {
474 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements2KHR),
475 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements2KHR),
476 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements2KHR),
477 	    } },
478 	// VK_KHR_maintenance3
479 	{
480 	    VK_KHR_MAINTENANCE3_EXTENSION_NAME,
481 	    {
482 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetDescriptorSetLayoutSupportKHR),
483 	    } },
484 	// VK_KHR_maintenance4
485 	{
486 	    VK_KHR_MAINTENANCE_4_EXTENSION_NAME,
487 	    {
488 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceBufferMemoryRequirementsKHR),
489 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceImageMemoryRequirementsKHR),
490 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceImageSparseMemoryRequirementsKHR),
491 	    } },
492 	// VK_KHR_create_renderpass2
493 	{
494 	    VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME,
495 	    {
496 	        MAKE_VULKAN_DEVICE_ENTRY(vkCreateRenderPass2KHR),
497 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginRenderPass2KHR),
498 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdNextSubpass2KHR),
499 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndRenderPass2KHR),
500 	    } },
501 	// VK_KHR_timeline_semaphore
502 	{
503 	    VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME,
504 	    {
505 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetSemaphoreCounterValueKHR),
506 	        MAKE_VULKAN_DEVICE_ENTRY(vkSignalSemaphoreKHR),
507 	        MAKE_VULKAN_DEVICE_ENTRY(vkWaitSemaphoresKHR),
508 	    } },
509 	// VK_KHR_buffer_device_address
510 	{
511 	    VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME,
512 	    {
513 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferDeviceAddressKHR),
514 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferOpaqueCaptureAddressKHR),
515 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceMemoryOpaqueCaptureAddressKHR),
516 	    } },
517 	// VK_KHR_draw_indirect_count
518 	{
519 	    VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME,
520 	    {
521 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndirectCountKHR),
522 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexedIndirectCountKHR),
523 	    } },
524 	// VK_KHR_dynamic_rendering
525 	{
526 	    VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME,
527 	    {
528 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginRenderingKHR),
529 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndRenderingKHR),
530 	    } },
531 	// VK_KHR_dynamic_rendering_local_read
532 	{
533 	    VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_EXTENSION_NAME,
534 	    {
535 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetRenderingAttachmentLocationsKHR),
536 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetRenderingInputAttachmentIndicesKHR),
537 	    } },
538 	// VK_EXT_extended_dynamic_state
539 	{
540 	    VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME,
541 	    {
542 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindVertexBuffers2EXT),
543 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetCullModeEXT),
544 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthBoundsTestEnableEXT),
545 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthCompareOpEXT),
546 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthTestEnableEXT),
547 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthWriteEnableEXT),
548 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetFrontFaceEXT),
549 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetPrimitiveTopologyEXT),
550 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetScissorWithCountEXT),
551 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilOpEXT),
552 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilTestEnableEXT),
553 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetViewportWithCountEXT),
554 	    } },
555 	// VK_EXT_vertex_input_dynamic_state
556 	{
557 	    VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME,
558 	    {
559 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetVertexInputEXT),
560 	    } },
561 	// VK_EXT_line_rasterization
562 	{
563 	    VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME,
564 	    {
565 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetLineStippleEXT),
566 	    } },
567 	// VK_EXT_host_query_reset
568 	{
569 	    VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME,
570 	    {
571 	        MAKE_VULKAN_DEVICE_ENTRY(vkResetQueryPoolEXT),
572 	    } },
573 	// VK_EXT_tooling_info
574 	{
575 	    VK_EXT_TOOLING_INFO_EXTENSION_NAME,
576 	    {
577 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetPhysicalDeviceToolPropertiesEXT),
578 	    } },
579 	// VK_KHR_synchronization2
580 	{
581 	    VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME,
582 	    {
583 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdPipelineBarrier2KHR),
584 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdResetEvent2KHR),
585 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetEvent2KHR),
586 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdWaitEvents2KHR),
587 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdWriteTimestamp2KHR),
588 	        MAKE_VULKAN_DEVICE_ENTRY(vkQueueSubmit2KHR),
589 	    } },
590 #ifndef __ANDROID__
591 	// VK_KHR_swapchain
592 	{
593 	    VK_KHR_SWAPCHAIN_EXTENSION_NAME,
594 	    {
595 	        MAKE_VULKAN_DEVICE_ENTRY(vkCreateSwapchainKHR),
596 	        MAKE_VULKAN_DEVICE_ENTRY(vkDestroySwapchainKHR),
597 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainImagesKHR),
598 	        MAKE_VULKAN_DEVICE_ENTRY(vkAcquireNextImageKHR),
599 	        MAKE_VULKAN_DEVICE_ENTRY(vkAcquireNextImage2KHR),
600 	        MAKE_VULKAN_DEVICE_ENTRY(vkQueuePresentKHR),
601 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPresentCapabilitiesKHR),
602 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupSurfacePresentModesKHR),
603 	    } },
604 	// VK_EXT_swapchain_maintenance1
605 	{
606 	    VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME,
607 	    {
608 	        MAKE_VULKAN_DEVICE_ENTRY(vkReleaseSwapchainImagesEXT),
609 	    } },
610 #endif
611 
612 #if SWIFTSHADER_EXTERNAL_SEMAPHORE_OPAQUE_FD
613 	// VK_KHR_external_semaphore_fd
614 	{
615 	    VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME,
616 	    {
617 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetSemaphoreFdKHR),
618 	        MAKE_VULKAN_DEVICE_ENTRY(vkImportSemaphoreFdKHR),
619 	    } },
620 #endif
621 
622 #if VK_USE_PLATFORM_FUCHSIA
623 	// VK_FUCHSIA_external_semaphore
624 	{
625 	    VK_FUCHSIA_EXTERNAL_SEMAPHORE_EXTENSION_NAME,
626 	    {
627 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetSemaphoreZirconHandleFUCHSIA),
628 	        MAKE_VULKAN_DEVICE_ENTRY(vkImportSemaphoreZirconHandleFUCHSIA),
629 	    } },
630 #endif
631 
632 #if SWIFTSHADER_EXTERNAL_MEMORY_OPAQUE_FD
633 	// VK_KHR_external_memory_fd
634 	{
635 	    VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME,
636 	    {
637 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryFdKHR),
638 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryFdPropertiesKHR),
639 	    } },
640 #endif
641 
642 	// VK_EXT_external_memory_host
643 	{
644 	    VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME,
645 	    {
646 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryHostPointerPropertiesEXT),
647 	    } },
648 
649 	// VK_EXT_private_data
650 	{
651 	    VK_EXT_PRIVATE_DATA_EXTENSION_NAME,
652 	    {
653 	        MAKE_VULKAN_DEVICE_ENTRY(vkCreatePrivateDataSlotEXT),
654 	        MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPrivateDataSlotEXT),
655 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetPrivateDataEXT),
656 	        MAKE_VULKAN_DEVICE_ENTRY(vkSetPrivateDataEXT),
657 	    } },
658 	// VK_EXT_host_image_copy
659 	{
660 	    VK_EXT_HOST_IMAGE_COPY_EXTENSION_NAME,
661 	    {
662 	        MAKE_VULKAN_DEVICE_ENTRY(vkCopyImageToImageEXT),
663 	        MAKE_VULKAN_DEVICE_ENTRY(vkCopyImageToMemoryEXT),
664 	        MAKE_VULKAN_DEVICE_ENTRY(vkCopyMemoryToImageEXT),
665 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSubresourceLayout2EXT),
666 	        MAKE_VULKAN_DEVICE_ENTRY(vkTransitionImageLayoutEXT),
667 	    } },
668 #if SWIFTSHADER_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER
669 	// VK_ANDROID_external_memory_android_hardware_buffer
670 	{
671 	    VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME,
672 	    {
673 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetAndroidHardwareBufferPropertiesANDROID),
674 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryAndroidHardwareBufferANDROID),
675 	    } },
676 #endif
677 
678 #if VK_USE_PLATFORM_FUCHSIA
679 	// VK_FUCHSIA_external_memory
680 	{
681 	    VK_FUCHSIA_EXTERNAL_MEMORY_EXTENSION_NAME,
682 	    {
683 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryZirconHandleFUCHSIA),
684 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryZirconHandlePropertiesFUCHSIA),
685 	    } },
686 #endif
687 };
688 
689 #undef MAKE_VULKAN_DEVICE_ENTRY
690 
GetInstanceProcAddr(Instance * instance,const char * pName)691 PFN_vkVoidFunction GetInstanceProcAddr(Instance *instance, const char *pName)
692 {
693 	auto globalFunction = globalFunctionPointers.find(std::string(pName));
694 	if(globalFunction != globalFunctionPointers.end())
695 	{
696 		return globalFunction->second;
697 	}
698 
699 	if(instance)
700 	{
701 		auto instanceFunction = instanceFunctionPointers.find(std::string(pName));
702 		if(instanceFunction != instanceFunctionPointers.end())
703 		{
704 			return instanceFunction->second.pfn;
705 		}
706 
707 		auto deviceFunction = deviceFunctionPointers.find(std::string(pName));
708 		if(deviceFunction != deviceFunctionPointers.end())
709 		{
710 			return deviceFunction->second;
711 		}
712 
713 		for(const auto &deviceExtensionFunctions : deviceExtensionFunctionPointers)
714 		{
715 			deviceFunction = deviceExtensionFunctions.second.find(std::string(pName));
716 			if(deviceFunction != deviceExtensionFunctions.second.end())
717 			{
718 				return deviceFunction->second;
719 			}
720 		}
721 	}
722 
723 	return nullptr;
724 }
725 
GetPhysicalDeviceProcAddr(Instance * instance,const char * pName)726 PFN_vkVoidFunction GetPhysicalDeviceProcAddr(Instance *instance, const char *pName)
727 {
728 	// This function must return nullptr if the name is not known, or the function doesn't take a
729 	// VkPhysicalDevice as the first argument. All functions that have a VkPhysicalDevice as first
730 	// argument are instance function, except for vkGetPhysicalDeviceToolPropertiesEXT which seems
731 	// to have been miscategorized as a device extension when it was made. So we special case that
732 	// funcion.
733 	std::string name = pName;
734 	if(name == "vkGetPhysicalDeviceToolPropertiesEXT")
735 	{
736 		return reinterpret_cast<PFN_vkVoidFunction>(vkGetPhysicalDeviceToolPropertiesEXT);
737 	}
738 
739 	auto instanceFunction = instanceFunctionPointers.find(name);
740 	if(instanceFunction == instanceFunctionPointers.end())
741 	{
742 		return nullptr;
743 	}
744 
745 	if(!instanceFunction->second.isPhysicalDeviceFn)
746 	{
747 		return nullptr;
748 	}
749 
750 	return instanceFunction->second.pfn;
751 }
752 
GetDeviceProcAddr(Device * device,const char * pName)753 PFN_vkVoidFunction GetDeviceProcAddr(Device *device, const char *pName)
754 {
755 	auto deviceFunction = deviceFunctionPointers.find(std::string(pName));
756 	if(deviceFunction != deviceFunctionPointers.end())
757 	{
758 		return deviceFunction->second;
759 	}
760 
761 	for(const auto &deviceExtensionFunctions : deviceExtensionFunctionPointers)
762 	{
763 		if(device->hasExtension(deviceExtensionFunctions.first))
764 		{
765 			deviceFunction = deviceExtensionFunctions.second.find(std::string(pName));
766 			if(deviceFunction != deviceExtensionFunctions.second.end())
767 			{
768 				return deviceFunction->second;
769 			}
770 		}
771 	}
772 
773 	return nullptr;
774 }
775 
776 }  // namespace vk
777 
778 #ifdef __ANDROID__
779 
780 extern "C" hwvulkan_module_t HAL_MODULE_INFO_SYM;
781 
782 namespace {
783 
CloseDevice(struct hw_device_t *)784 int CloseDevice(struct hw_device_t *)
785 {
786 	return 0;
787 }
788 
789 hwvulkan_device_t hal_device = {
790 	.common = {
791 	    .tag = HARDWARE_DEVICE_TAG,
792 	    .version = HWVULKAN_DEVICE_API_VERSION_0_1,
793 	    .module = &HAL_MODULE_INFO_SYM.common,
794 	    .close = CloseDevice,
795 	},
796 	.EnumerateInstanceExtensionProperties = vkEnumerateInstanceExtensionProperties,
797 	.CreateInstance = vkCreateInstance,
798 	.GetInstanceProcAddr = vkGetInstanceProcAddr,
799 };
800 
OpenDevice(const hw_module_t * module,const char * id,hw_device_t ** device)801 int OpenDevice(const hw_module_t *module, const char *id, hw_device_t **device)
802 {
803 	if(strcmp(id, HWVULKAN_DEVICE_0) != 0) return -ENOENT;
804 	*device = &hal_device.common;
805 	return 0;
806 }
807 
808 hw_module_methods_t module_methods = { .open = OpenDevice };
809 
810 }  // namespace
811 
812 extern "C" hwvulkan_module_t HAL_MODULE_INFO_SYM = {
813 	.common = {
814 	    .tag = HARDWARE_MODULE_TAG,
815 	    .module_api_version = HWVULKAN_MODULE_API_VERSION_0_1,
816 	    .hal_api_version = HARDWARE_HAL_API_VERSION,
817 	    .id = HWVULKAN_HARDWARE_MODULE_ID,
818 	    .name = "Swiftshader Pastel",
819 	    .author = "Google",
820 	    .methods = &module_methods,
821 	}
822 };
823 
824 #endif  // __ANDROID__
825 
826 #if VK_USE_PLATFORM_FUCHSIA
827 PFN_vkConnectToService vk::icdFuchsiaServiceConnectCallback = nullptr;
828 #endif
829