• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <unordered_map>
20 #include <vector>
21 
22 #ifdef __ANDROID__
23 #	include <hardware/hwvulkan.h>
24 #	include <vulkan/vk_android_native_buffer.h>
25 #	include <cerrno>
26 #endif
27 
28 namespace vk {
29 
30 // Functions that can be obtained through GetInstanceProcAddr without an instance
31 #define MAKE_VULKAN_GLOBAL_ENTRY(aFunction)                           \
32 	{                                                                 \
33 #		aFunction, reinterpret_cast < PFN_vkVoidFunction>(aFunction) \
34 	}
35 
36 // TODO(b/208256248): Avoid exit-time destructor.
37 static const std::unordered_map<std::string, PFN_vkVoidFunction> globalFunctionPointers = {
38 	MAKE_VULKAN_GLOBAL_ENTRY(vkGetInstanceProcAddr),
39 	MAKE_VULKAN_GLOBAL_ENTRY(vkCreateInstance),
40 	MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceExtensionProperties),
41 	MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceLayerProperties),
42 	MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceVersion),
43 };
44 #undef MAKE_VULKAN_GLOBAL_ENTRY
45 
46 // Functions that can be obtained through GetInstanceProcAddr with an instance object
47 #define MAKE_VULKAN_INSTANCE_ENTRY(aFunction)                         \
48 	{                                                                 \
49 #		aFunction, reinterpret_cast < PFN_vkVoidFunction>(aFunction) \
50 	}
51 
52 // TODO(b/208256248): Avoid exit-time destructor.
53 static const std::unordered_map<std::string, PFN_vkVoidFunction> instanceFunctionPointers = {
54 
55 	MAKE_VULKAN_INSTANCE_ENTRY(vkDestroyInstance),
56 	MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDevices),
57 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures),
58 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties),
59 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties),
60 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties),
61 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties),
62 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties),
63 	MAKE_VULKAN_INSTANCE_ENTRY(vkCreateDevice),
64 	MAKE_VULKAN_INSTANCE_ENTRY(vkEnumerateDeviceExtensionProperties),
65 	MAKE_VULKAN_INSTANCE_ENTRY(vkEnumerateDeviceLayerProperties),
66 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties),
67 	MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDeviceGroups),
68 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures2),
69 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties2),
70 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties2),
71 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties2),
72 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties2),
73 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties2),
74 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties2),
75 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalBufferProperties),
76 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalFenceProperties),
77 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalSemaphoreProperties),
78 	// VK_KHR_device_group_creation
79 	MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDeviceGroupsKHR),
80 	// VK_KHR_external_fence_capabilities
81 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalFencePropertiesKHR),
82 	// VK_KHR_external_memory_capabilities
83 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalBufferPropertiesKHR),
84 	// VK_KHR_external_semaphore_capabilities
85 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalSemaphorePropertiesKHR),
86 	// VK_KHR_get_physical_device_properties2
87 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures2KHR),
88 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties2KHR),
89 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties2KHR),
90 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties2KHR),
91 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties2KHR),
92 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties2KHR),
93 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties2KHR),
94 	// VK_EXT_debug_utils
95 	MAKE_VULKAN_INSTANCE_ENTRY(vkCmdBeginDebugUtilsLabelEXT),
96 	MAKE_VULKAN_INSTANCE_ENTRY(vkCmdEndDebugUtilsLabelEXT),
97 	MAKE_VULKAN_INSTANCE_ENTRY(vkCmdInsertDebugUtilsLabelEXT),
98 	MAKE_VULKAN_INSTANCE_ENTRY(vkCreateDebugUtilsMessengerEXT),
99 	MAKE_VULKAN_INSTANCE_ENTRY(vkDestroyDebugUtilsMessengerEXT),
100 	MAKE_VULKAN_INSTANCE_ENTRY(vkQueueBeginDebugUtilsLabelEXT),
101 	MAKE_VULKAN_INSTANCE_ENTRY(vkQueueEndDebugUtilsLabelEXT),
102 	MAKE_VULKAN_INSTANCE_ENTRY(vkQueueInsertDebugUtilsLabelEXT),
103 	MAKE_VULKAN_INSTANCE_ENTRY(vkSetDebugUtilsObjectNameEXT),
104 	MAKE_VULKAN_INSTANCE_ENTRY(vkSetDebugUtilsObjectTagEXT),
105 	MAKE_VULKAN_INSTANCE_ENTRY(vkSubmitDebugUtilsMessageEXT),
106 #ifndef __ANDROID__
107 	// VK_KHR_surface
108 	MAKE_VULKAN_INSTANCE_ENTRY(vkDestroySurfaceKHR),
109 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceSupportKHR),
110 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceCapabilitiesKHR),
111 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceFormatsKHR),
112 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfacePresentModesKHR),
113 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDevicePresentRectanglesKHR),
114 #endif
115 #ifdef VK_USE_PLATFORM_XCB_KHR
116 	// VK_KHR_Xcb_surface
117 	MAKE_VULKAN_INSTANCE_ENTRY(vkCreateXcbSurfaceKHR),
118 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceXcbPresentationSupportKHR),
119 #endif
120 #ifdef VK_USE_PLATFORM_WAYLAND_KHR
121 	// VK_KHR_wayland_surface
122 	MAKE_VULKAN_INSTANCE_ENTRY(vkCreateWaylandSurfaceKHR),
123 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceWaylandPresentationSupportKHR),
124 #endif
125 #ifdef VK_USE_PLATFORM_DIRECTFB_EXT
126 	// VK_EXT_directfb_surface
127 	MAKE_VULKAN_INSTANCE_ENTRY(vkCreateDirectFBSurfaceEXT),
128 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceDirectFBPresentationSupportEXT),
129 #endif
130 #ifdef VK_USE_PLATFORM_DISPLAY_KHR
131 	// VK_KHR_display
132 	MAKE_VULKAN_INSTANCE_ENTRY(vkCreateDisplayModeKHR),
133 	MAKE_VULKAN_INSTANCE_ENTRY(vkCreateDisplayPlaneSurfaceKHR),
134 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetDisplayModePropertiesKHR),
135 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetDisplayPlaneCapabilitiesKHR),
136 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetDisplayPlaneSupportedDisplaysKHR),
137 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceDisplayPlanePropertiesKHR),
138 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceDisplayPropertiesKHR),
139 #endif
140 #ifdef VK_USE_PLATFORM_MACOS_MVK
141 	// VK_MVK_macos_surface
142 	MAKE_VULKAN_INSTANCE_ENTRY(vkCreateMacOSSurfaceMVK),
143 #endif
144 #ifdef VK_USE_PLATFORM_METAL_EXT
145 	// VK_EXT_metal_surface
146 	MAKE_VULKAN_INSTANCE_ENTRY(vkCreateMetalSurfaceEXT),
147 #endif
148 #ifdef VK_USE_PLATFORM_WIN32_KHR
149 	// VK_KHR_win32_surface
150 	MAKE_VULKAN_INSTANCE_ENTRY(vkCreateWin32SurfaceKHR),
151 	MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceWin32PresentationSupportKHR),
152 #endif
153 	MAKE_VULKAN_INSTANCE_ENTRY(vkCreateHeadlessSurfaceEXT),
154 };
155 #undef MAKE_VULKAN_INSTANCE_ENTRY
156 
157 // Functions that can be obtained through GetDeviceProcAddr with a device object
158 #define MAKE_VULKAN_DEVICE_ENTRY(aFunction)                           \
159 	{                                                                 \
160 #		aFunction, reinterpret_cast < PFN_vkVoidFunction>(aFunction) \
161 	}
162 
163 // TODO(b/208256248): Avoid exit-time destructor.
164 static const std::unordered_map<std::string, PFN_vkVoidFunction> deviceFunctionPointers = {
165 	MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceProcAddr),
166 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDevice),
167 	MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceQueue),
168 	MAKE_VULKAN_DEVICE_ENTRY(vkQueueSubmit),
169 	MAKE_VULKAN_DEVICE_ENTRY(vkQueueWaitIdle),
170 	MAKE_VULKAN_DEVICE_ENTRY(vkDeviceWaitIdle),
171 	MAKE_VULKAN_DEVICE_ENTRY(vkAllocateMemory),
172 	MAKE_VULKAN_DEVICE_ENTRY(vkFreeMemory),
173 	MAKE_VULKAN_DEVICE_ENTRY(vkMapMemory),
174 	MAKE_VULKAN_DEVICE_ENTRY(vkUnmapMemory),
175 	MAKE_VULKAN_DEVICE_ENTRY(vkFlushMappedMemoryRanges),
176 	MAKE_VULKAN_DEVICE_ENTRY(vkInvalidateMappedMemoryRanges),
177 	MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceMemoryCommitment),
178 	MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory),
179 	MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory),
180 	MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements),
181 	MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements),
182 	MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements),
183 	MAKE_VULKAN_DEVICE_ENTRY(vkQueueBindSparse),
184 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateFence),
185 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyFence),
186 	MAKE_VULKAN_DEVICE_ENTRY(vkResetFences),
187 	MAKE_VULKAN_DEVICE_ENTRY(vkGetFenceStatus),
188 	MAKE_VULKAN_DEVICE_ENTRY(vkWaitForFences),
189 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateSemaphore),
190 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroySemaphore),
191 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateEvent),
192 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyEvent),
193 	MAKE_VULKAN_DEVICE_ENTRY(vkGetEventStatus),
194 	MAKE_VULKAN_DEVICE_ENTRY(vkSetEvent),
195 	MAKE_VULKAN_DEVICE_ENTRY(vkResetEvent),
196 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateQueryPool),
197 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyQueryPool),
198 	MAKE_VULKAN_DEVICE_ENTRY(vkGetQueryPoolResults),
199 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateBuffer),
200 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyBuffer),
201 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateBufferView),
202 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyBufferView),
203 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateImage),
204 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyImage),
205 	MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSubresourceLayout),
206 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateImageView),
207 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyImageView),
208 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateShaderModule),
209 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyShaderModule),
210 	MAKE_VULKAN_DEVICE_ENTRY(vkCreatePipelineCache),
211 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipelineCache),
212 	MAKE_VULKAN_DEVICE_ENTRY(vkGetPipelineCacheData),
213 	MAKE_VULKAN_DEVICE_ENTRY(vkMergePipelineCaches),
214 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateGraphicsPipelines),
215 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateComputePipelines),
216 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipeline),
217 	MAKE_VULKAN_DEVICE_ENTRY(vkCreatePipelineLayout),
218 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipelineLayout),
219 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateSampler),
220 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroySampler),
221 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorSetLayout),
222 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorSetLayout),
223 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorPool),
224 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorPool),
225 	MAKE_VULKAN_DEVICE_ENTRY(vkResetDescriptorPool),
226 	MAKE_VULKAN_DEVICE_ENTRY(vkAllocateDescriptorSets),
227 	MAKE_VULKAN_DEVICE_ENTRY(vkFreeDescriptorSets),
228 	MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSets),
229 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateFramebuffer),
230 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyFramebuffer),
231 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateRenderPass),
232 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyRenderPass),
233 	MAKE_VULKAN_DEVICE_ENTRY(vkGetRenderAreaGranularity),
234 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateCommandPool),
235 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyCommandPool),
236 	MAKE_VULKAN_DEVICE_ENTRY(vkResetCommandPool),
237 	MAKE_VULKAN_DEVICE_ENTRY(vkAllocateCommandBuffers),
238 	MAKE_VULKAN_DEVICE_ENTRY(vkFreeCommandBuffers),
239 	MAKE_VULKAN_DEVICE_ENTRY(vkBeginCommandBuffer),
240 	MAKE_VULKAN_DEVICE_ENTRY(vkEndCommandBuffer),
241 	MAKE_VULKAN_DEVICE_ENTRY(vkResetCommandBuffer),
242 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindPipeline),
243 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetViewport),
244 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetScissor),
245 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetLineWidth),
246 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthBias),
247 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetBlendConstants),
248 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthBounds),
249 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilCompareMask),
250 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilWriteMask),
251 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilReference),
252 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindDescriptorSets),
253 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindIndexBuffer),
254 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindVertexBuffers),
255 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDraw),
256 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexed),
257 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndirect),
258 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexedIndirect),
259 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatch),
260 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchIndirect),
261 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBuffer),
262 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImage),
263 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBlitImage),
264 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBufferToImage),
265 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImageToBuffer),
266 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdUpdateBuffer),
267 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdFillBuffer),
268 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearColorImage),
269 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearDepthStencilImage),
270 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearAttachments),
271 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdResolveImage),
272 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetEvent),
273 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdResetEvent),
274 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdWaitEvents),
275 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdPipelineBarrier),
276 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginQuery),
277 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndQuery),
278 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdResetQueryPool),
279 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdWriteTimestamp),
280 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyQueryPoolResults),
281 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdPushConstants),
282 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginRenderPass),
283 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdNextSubpass),
284 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndRenderPass),
285 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdExecuteCommands),
286 	MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory2),
287 	MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory2),
288 	MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPeerMemoryFeatures),
289 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDeviceMask),
290 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchBase),
291 	MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements2),
292 	MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements2),
293 	MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements2),
294 	MAKE_VULKAN_DEVICE_ENTRY(vkTrimCommandPool),
295 	MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceQueue2),
296 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateSamplerYcbcrConversion),
297 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroySamplerYcbcrConversion),
298 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorUpdateTemplate),
299 	MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorUpdateTemplate),
300 	MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSetWithTemplate),
301 	MAKE_VULKAN_DEVICE_ENTRY(vkGetDescriptorSetLayoutSupport),
302 	// Device level VK_EXT_debug_utils functions
303 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginDebugUtilsLabelEXT),
304 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndDebugUtilsLabelEXT),
305 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdInsertDebugUtilsLabelEXT),
306 	MAKE_VULKAN_DEVICE_ENTRY(vkQueueBeginDebugUtilsLabelEXT),
307 	MAKE_VULKAN_DEVICE_ENTRY(vkQueueEndDebugUtilsLabelEXT),
308 	MAKE_VULKAN_DEVICE_ENTRY(vkQueueInsertDebugUtilsLabelEXT),
309 	MAKE_VULKAN_DEVICE_ENTRY(vkSetDebugUtilsObjectNameEXT),
310 	MAKE_VULKAN_DEVICE_ENTRY(vkSetDebugUtilsObjectTagEXT),
311 #ifdef __ANDROID__
312 	MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainGrallocUsageANDROID),
313 	MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainGrallocUsage2ANDROID),
314 	MAKE_VULKAN_DEVICE_ENTRY(vkAcquireImageANDROID),
315 	MAKE_VULKAN_DEVICE_ENTRY(vkQueueSignalReleaseImageANDROID),
316 #endif
317 	// Vulkan 1.2 Entry point functions
318 	MAKE_VULKAN_DEVICE_ENTRY(vkCreateRenderPass2),
319 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginRenderPass2),
320 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndRenderPass2),
321 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdNextSubpass2),
322 	MAKE_VULKAN_DEVICE_ENTRY(vkResetQueryPool),
323 	// VK_KHR_timeline_semaphore
324 	MAKE_VULKAN_DEVICE_ENTRY(vkGetSemaphoreCounterValue),
325 	MAKE_VULKAN_DEVICE_ENTRY(vkSignalSemaphore),
326 	MAKE_VULKAN_DEVICE_ENTRY(vkWaitSemaphores),
327 	// VK_KHR_buffer_device_address
328 	MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferDeviceAddress),
329 	MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferOpaqueCaptureAddress),
330 	MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceMemoryOpaqueCaptureAddress),
331 	// VK_KHR_draw_indirect_count
332 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndirectCount),
333 	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexedIndirectCount),
334 };
335 
336 // TODO(b/208256248): Avoid exit-time destructor.
337 static const std::vector<std::pair<const char *, std::unordered_map<std::string, PFN_vkVoidFunction>>> deviceExtensionFunctionPointers = {
338 	// VK_KHR_descriptor_update_template
339 	{
340 	    VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME,
341 	    {
342 	        MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorUpdateTemplateKHR),
343 	        MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorUpdateTemplateKHR),
344 	        MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSetWithTemplateKHR),
345 	    } },
346 	// VK_KHR_device_group
347 	{
348 	    VK_KHR_DEVICE_GROUP_EXTENSION_NAME,
349 	    {
350 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPeerMemoryFeaturesKHR),
351 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDeviceMaskKHR),
352 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchBaseKHR),
353 	    } },
354 	// VK_KHR_maintenance1
355 	{
356 	    VK_KHR_MAINTENANCE1_EXTENSION_NAME,
357 	    {
358 	        MAKE_VULKAN_DEVICE_ENTRY(vkTrimCommandPoolKHR),
359 	    } },
360 	// VK_KHR_sampler_ycbcr_conversion
361 	{
362 	    VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME,
363 	    {
364 	        MAKE_VULKAN_DEVICE_ENTRY(vkCreateSamplerYcbcrConversionKHR),
365 	        MAKE_VULKAN_DEVICE_ENTRY(vkDestroySamplerYcbcrConversionKHR),
366 	    } },
367 	// VK_KHR_bind_memory2
368 	{
369 	    VK_KHR_BIND_MEMORY_2_EXTENSION_NAME,
370 	    {
371 	        MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory2KHR),
372 	        MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory2KHR),
373 	    } },
374 	// VK_KHR_copy_commands2
375 	{
376 	    VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME,
377 	    {
378 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdBlitImage2KHR),
379 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBuffer2KHR),
380 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBufferToImage2KHR),
381 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImage2KHR),
382 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImageToBuffer2KHR),
383 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdResolveImage2KHR),
384 	    } },
385 	// VK_KHR_get_memory_requirements2
386 	{
387 	    VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME,
388 	    {
389 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements2KHR),
390 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements2KHR),
391 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements2KHR),
392 	    } },
393 	// VK_KHR_maintenance3
394 	{
395 	    VK_KHR_MAINTENANCE3_EXTENSION_NAME,
396 	    {
397 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetDescriptorSetLayoutSupportKHR),
398 	    } },
399 	// VK_KHR_maintenance4
400 	{
401 	    VK_KHR_MAINTENANCE_4_EXTENSION_NAME,
402 	    {
403 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceBufferMemoryRequirementsKHR),
404 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceImageMemoryRequirementsKHR),
405 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceImageSparseMemoryRequirementsKHR),
406 	    } },
407 	// VK_KHR_create_renderpass2
408 	{
409 	    VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME,
410 	    {
411 	        MAKE_VULKAN_DEVICE_ENTRY(vkCreateRenderPass2KHR),
412 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginRenderPass2KHR),
413 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdNextSubpass2KHR),
414 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndRenderPass2KHR),
415 	    } },
416 	// VK_KHR_timeline_semaphore
417 	{
418 	    VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME,
419 	    {
420 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetSemaphoreCounterValueKHR),
421 	        MAKE_VULKAN_DEVICE_ENTRY(vkSignalSemaphoreKHR),
422 	        MAKE_VULKAN_DEVICE_ENTRY(vkWaitSemaphoresKHR),
423 	    } },
424 	// VK_KHR_buffer_device_address
425 	{
426 	    VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME,
427 	    {
428 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferDeviceAddressKHR),
429 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferOpaqueCaptureAddressKHR),
430 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceMemoryOpaqueCaptureAddressKHR),
431 	    } },
432 	// VK_KHR_draw_indirect_count
433 	{
434 	    VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME,
435 	    {
436 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndirectCountKHR),
437 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexedIndirectCountKHR),
438 	    } },
439 	// VK_KHR_dynamic_rendering
440 	{
441 	    VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME,
442 	    {
443 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginRenderingKHR),
444 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndRenderingKHR),
445 	    } },
446 	// VK_EXT_extended_dynamic_state
447 	{
448 	    VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME,
449 	    {
450 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindVertexBuffers2EXT),
451 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetCullModeEXT),
452 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthBoundsTestEnableEXT),
453 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthCompareOpEXT),
454 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthTestEnableEXT),
455 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthWriteEnableEXT),
456 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetFrontFaceEXT),
457 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetPrimitiveTopologyEXT),
458 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetScissorWithCountEXT),
459 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilOpEXT),
460 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilTestEnableEXT),
461 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetViewportWithCountEXT),
462 	    } },
463 	// VK_EXT_line_rasterization
464 	{
465 	    VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME,
466 	    {
467 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetLineStippleEXT),
468 	    } },
469 	// VK_EXT_host_query_reset
470 	{
471 	    VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME,
472 	    {
473 	        MAKE_VULKAN_DEVICE_ENTRY(vkResetQueryPoolEXT),
474 	    } },
475 	// VK_EXT_tooling_info
476 	{
477 	    VK_EXT_TOOLING_INFO_EXTENSION_NAME,
478 	    {
479 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetPhysicalDeviceToolPropertiesEXT),
480 	    } },
481 	// VK_KHR_synchronization2
482 	{
483 	    VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME,
484 	    {
485 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdPipelineBarrier2KHR),
486 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdResetEvent2KHR),
487 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetEvent2KHR),
488 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdWaitEvents2KHR),
489 	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdWriteTimestamp2KHR),
490 	        MAKE_VULKAN_DEVICE_ENTRY(vkQueueSubmit2KHR),
491 	    } },
492 #ifndef __ANDROID__
493 	// VK_KHR_swapchain
494 	{
495 	    VK_KHR_SWAPCHAIN_EXTENSION_NAME,
496 	    {
497 	        MAKE_VULKAN_DEVICE_ENTRY(vkCreateSwapchainKHR),
498 	        MAKE_VULKAN_DEVICE_ENTRY(vkDestroySwapchainKHR),
499 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainImagesKHR),
500 	        MAKE_VULKAN_DEVICE_ENTRY(vkAcquireNextImageKHR),
501 	        MAKE_VULKAN_DEVICE_ENTRY(vkAcquireNextImage2KHR),
502 	        MAKE_VULKAN_DEVICE_ENTRY(vkQueuePresentKHR),
503 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPresentCapabilitiesKHR),
504 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupSurfacePresentModesKHR),
505 	    } },
506 #endif
507 
508 #if SWIFTSHADER_EXTERNAL_SEMAPHORE_OPAQUE_FD
509 	// VK_KHR_external_semaphore_fd
510 	{
511 	    VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME,
512 	    {
513 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetSemaphoreFdKHR),
514 	        MAKE_VULKAN_DEVICE_ENTRY(vkImportSemaphoreFdKHR),
515 	    } },
516 #endif
517 
518 #if VK_USE_PLATFORM_FUCHSIA
519 	// VK_FUCHSIA_external_semaphore
520 	{
521 	    VK_FUCHSIA_EXTERNAL_SEMAPHORE_EXTENSION_NAME,
522 	    {
523 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetSemaphoreZirconHandleFUCHSIA),
524 	        MAKE_VULKAN_DEVICE_ENTRY(vkImportSemaphoreZirconHandleFUCHSIA),
525 	    } },
526 #endif
527 
528 #if SWIFTSHADER_EXTERNAL_MEMORY_OPAQUE_FD
529 	// VK_KHR_external_memory_fd
530 	{
531 	    VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME,
532 	    {
533 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryFdKHR),
534 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryFdPropertiesKHR),
535 	    } },
536 #endif
537 
538 	// VK_EXT_external_memory_host
539 	{
540 	    VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME,
541 	    {
542 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryHostPointerPropertiesEXT),
543 	    } },
544 
545 	// VK_EXT_private_data
546 	{
547 	    VK_EXT_PRIVATE_DATA_EXTENSION_NAME,
548 	    {
549 	        MAKE_VULKAN_DEVICE_ENTRY(vkCreatePrivateDataSlotEXT),
550 	        MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPrivateDataSlotEXT),
551 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetPrivateDataEXT),
552 	        MAKE_VULKAN_DEVICE_ENTRY(vkSetPrivateDataEXT),
553 	    } },
554 #if SWIFTSHADER_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER
555 	// VK_ANDROID_external_memory_android_hardware_buffer
556 	{
557 	    VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME,
558 	    {
559 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetAndroidHardwareBufferPropertiesANDROID),
560 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryAndroidHardwareBufferANDROID),
561 	    } },
562 #endif
563 
564 #if VK_USE_PLATFORM_FUCHSIA
565 	// VK_FUCHSIA_external_memory
566 	{
567 	    VK_FUCHSIA_EXTERNAL_MEMORY_EXTENSION_NAME,
568 	    {
569 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryZirconHandleFUCHSIA),
570 	        MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryZirconHandlePropertiesFUCHSIA),
571 	    } },
572 #endif
573 };
574 
575 #undef MAKE_VULKAN_DEVICE_ENTRY
576 
GetInstanceProcAddr(Instance * instance,const char * pName)577 PFN_vkVoidFunction GetInstanceProcAddr(Instance *instance, const char *pName)
578 {
579 	auto globalFunction = globalFunctionPointers.find(std::string(pName));
580 	if(globalFunction != globalFunctionPointers.end())
581 	{
582 		return globalFunction->second;
583 	}
584 
585 	if(instance)
586 	{
587 		auto instanceFunction = instanceFunctionPointers.find(std::string(pName));
588 		if(instanceFunction != instanceFunctionPointers.end())
589 		{
590 			return instanceFunction->second;
591 		}
592 
593 		auto deviceFunction = deviceFunctionPointers.find(std::string(pName));
594 		if(deviceFunction != deviceFunctionPointers.end())
595 		{
596 			return deviceFunction->second;
597 		}
598 
599 		for(const auto &deviceExtensionFunctions : deviceExtensionFunctionPointers)
600 		{
601 			deviceFunction = deviceExtensionFunctions.second.find(std::string(pName));
602 			if(deviceFunction != deviceExtensionFunctions.second.end())
603 			{
604 				return deviceFunction->second;
605 			}
606 		}
607 	}
608 
609 	return nullptr;
610 }
611 
GetDeviceProcAddr(Device * device,const char * pName)612 PFN_vkVoidFunction GetDeviceProcAddr(Device *device, const char *pName)
613 {
614 	auto deviceFunction = deviceFunctionPointers.find(std::string(pName));
615 	if(deviceFunction != deviceFunctionPointers.end())
616 	{
617 		return deviceFunction->second;
618 	}
619 
620 	for(const auto &deviceExtensionFunctions : deviceExtensionFunctionPointers)
621 	{
622 		if(device->hasExtension(deviceExtensionFunctions.first))
623 		{
624 			deviceFunction = deviceExtensionFunctions.second.find(std::string(pName));
625 			if(deviceFunction != deviceExtensionFunctions.second.end())
626 			{
627 				return deviceFunction->second;
628 			}
629 		}
630 	}
631 
632 	return nullptr;
633 }
634 
635 }  // namespace vk
636 
637 #ifdef __ANDROID__
638 
639 extern "C" hwvulkan_module_t HAL_MODULE_INFO_SYM;
640 
641 namespace {
642 
CloseDevice(struct hw_device_t *)643 int CloseDevice(struct hw_device_t *)
644 {
645 	return 0;
646 }
647 
648 hwvulkan_device_t hal_device = {
649 	.common = {
650 	    .tag = HARDWARE_DEVICE_TAG,
651 	    .version = HWVULKAN_DEVICE_API_VERSION_0_1,
652 	    .module = &HAL_MODULE_INFO_SYM.common,
653 	    .close = CloseDevice,
654 	},
655 	.EnumerateInstanceExtensionProperties = vkEnumerateInstanceExtensionProperties,
656 	.CreateInstance = vkCreateInstance,
657 	.GetInstanceProcAddr = vkGetInstanceProcAddr,
658 };
659 
OpenDevice(const hw_module_t * module,const char * id,hw_device_t ** device)660 int OpenDevice(const hw_module_t *module, const char *id, hw_device_t **device)
661 {
662 	if(strcmp(id, HWVULKAN_DEVICE_0) != 0) return -ENOENT;
663 	*device = &hal_device.common;
664 	return 0;
665 }
666 
667 hw_module_methods_t module_methods = { .open = OpenDevice };
668 
669 }  // namespace
670 
671 extern "C" hwvulkan_module_t HAL_MODULE_INFO_SYM = {
672 	.common = {
673 	    .tag = HARDWARE_MODULE_TAG,
674 	    .module_api_version = HWVULKAN_MODULE_API_VERSION_0_1,
675 	    .hal_api_version = HARDWARE_HAL_API_VERSION,
676 	    .id = HWVULKAN_HARDWARE_MODULE_ID,
677 	    .name = "Swiftshader Pastel",
678 	    .author = "Google",
679 	    .methods = &module_methods,
680 	}
681 };
682 
683 #endif  // __ANDROID__
684 
685 #if VK_USE_PLATFORM_FUCHSIA
686 PFN_vkConnectToService vk::icdFuchsiaServiceConnectCallback = nullptr;
687 #endif
688