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