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_XLIB_KHR
121 // VK_KHR_xlib_surface
122 MAKE_VULKAN_INSTANCE_ENTRY(vkCreateXlibSurfaceKHR),
123 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceXlibPresentationSupportKHR),
124 #endif
125 #ifdef VK_USE_PLATFORM_WAYLAND_KHR
126 // VK_KHR_wayland_surface
127 MAKE_VULKAN_INSTANCE_ENTRY(vkCreateWaylandSurfaceKHR),
128 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceWaylandPresentationSupportKHR),
129 #endif
130 #ifdef VK_USE_PLATFORM_DIRECTFB_EXT
131 // VK_EXT_directfb_surface
132 MAKE_VULKAN_INSTANCE_ENTRY(vkCreateDirectFBSurfaceEXT),
133 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceDirectFBPresentationSupportEXT),
134 #endif
135 #ifdef VK_USE_PLATFORM_DISPLAY_KHR
136 // VK_KHR_display
137 MAKE_VULKAN_INSTANCE_ENTRY(vkCreateDisplayModeKHR),
138 MAKE_VULKAN_INSTANCE_ENTRY(vkCreateDisplayPlaneSurfaceKHR),
139 MAKE_VULKAN_INSTANCE_ENTRY(vkGetDisplayModePropertiesKHR),
140 MAKE_VULKAN_INSTANCE_ENTRY(vkGetDisplayPlaneCapabilitiesKHR),
141 MAKE_VULKAN_INSTANCE_ENTRY(vkGetDisplayPlaneSupportedDisplaysKHR),
142 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceDisplayPlanePropertiesKHR),
143 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceDisplayPropertiesKHR),
144 #endif
145 #ifdef VK_USE_PLATFORM_MACOS_MVK
146 // VK_MVK_macos_surface
147 MAKE_VULKAN_INSTANCE_ENTRY(vkCreateMacOSSurfaceMVK),
148 #endif
149 #ifdef VK_USE_PLATFORM_METAL_EXT
150 // VK_EXT_metal_surface
151 MAKE_VULKAN_INSTANCE_ENTRY(vkCreateMetalSurfaceEXT),
152 #endif
153 #ifdef VK_USE_PLATFORM_WIN32_KHR
154 // VK_KHR_win32_surface
155 MAKE_VULKAN_INSTANCE_ENTRY(vkCreateWin32SurfaceKHR),
156 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceWin32PresentationSupportKHR),
157 #endif
158 MAKE_VULKAN_INSTANCE_ENTRY(vkCreateHeadlessSurfaceEXT),
159 };
160 #undef MAKE_VULKAN_INSTANCE_ENTRY
161
162 // Functions that can be obtained through GetDeviceProcAddr with a device object
163 #define MAKE_VULKAN_DEVICE_ENTRY(aFunction) \
164 { \
165 # aFunction, reinterpret_cast < PFN_vkVoidFunction>(aFunction) \
166 }
167
168 // TODO(b/208256248): Avoid exit-time destructor.
169 static const std::unordered_map<std::string, PFN_vkVoidFunction> deviceFunctionPointers = {
170 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceProcAddr),
171 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDevice),
172 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceQueue),
173 MAKE_VULKAN_DEVICE_ENTRY(vkQueueSubmit),
174 MAKE_VULKAN_DEVICE_ENTRY(vkQueueWaitIdle),
175 MAKE_VULKAN_DEVICE_ENTRY(vkDeviceWaitIdle),
176 MAKE_VULKAN_DEVICE_ENTRY(vkAllocateMemory),
177 MAKE_VULKAN_DEVICE_ENTRY(vkFreeMemory),
178 MAKE_VULKAN_DEVICE_ENTRY(vkMapMemory),
179 MAKE_VULKAN_DEVICE_ENTRY(vkUnmapMemory),
180 MAKE_VULKAN_DEVICE_ENTRY(vkFlushMappedMemoryRanges),
181 MAKE_VULKAN_DEVICE_ENTRY(vkInvalidateMappedMemoryRanges),
182 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceMemoryCommitment),
183 MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory),
184 MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory),
185 MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements),
186 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements),
187 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements),
188 MAKE_VULKAN_DEVICE_ENTRY(vkQueueBindSparse),
189 MAKE_VULKAN_DEVICE_ENTRY(vkCreateFence),
190 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyFence),
191 MAKE_VULKAN_DEVICE_ENTRY(vkResetFences),
192 MAKE_VULKAN_DEVICE_ENTRY(vkGetFenceStatus),
193 MAKE_VULKAN_DEVICE_ENTRY(vkWaitForFences),
194 MAKE_VULKAN_DEVICE_ENTRY(vkCreateSemaphore),
195 MAKE_VULKAN_DEVICE_ENTRY(vkDestroySemaphore),
196 MAKE_VULKAN_DEVICE_ENTRY(vkCreateEvent),
197 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyEvent),
198 MAKE_VULKAN_DEVICE_ENTRY(vkGetEventStatus),
199 MAKE_VULKAN_DEVICE_ENTRY(vkSetEvent),
200 MAKE_VULKAN_DEVICE_ENTRY(vkResetEvent),
201 MAKE_VULKAN_DEVICE_ENTRY(vkCreateQueryPool),
202 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyQueryPool),
203 MAKE_VULKAN_DEVICE_ENTRY(vkGetQueryPoolResults),
204 MAKE_VULKAN_DEVICE_ENTRY(vkCreateBuffer),
205 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyBuffer),
206 MAKE_VULKAN_DEVICE_ENTRY(vkCreateBufferView),
207 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyBufferView),
208 MAKE_VULKAN_DEVICE_ENTRY(vkCreateImage),
209 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyImage),
210 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSubresourceLayout),
211 MAKE_VULKAN_DEVICE_ENTRY(vkCreateImageView),
212 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyImageView),
213 MAKE_VULKAN_DEVICE_ENTRY(vkCreateShaderModule),
214 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyShaderModule),
215 MAKE_VULKAN_DEVICE_ENTRY(vkCreatePipelineCache),
216 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipelineCache),
217 MAKE_VULKAN_DEVICE_ENTRY(vkGetPipelineCacheData),
218 MAKE_VULKAN_DEVICE_ENTRY(vkMergePipelineCaches),
219 MAKE_VULKAN_DEVICE_ENTRY(vkCreateGraphicsPipelines),
220 MAKE_VULKAN_DEVICE_ENTRY(vkCreateComputePipelines),
221 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipeline),
222 MAKE_VULKAN_DEVICE_ENTRY(vkCreatePipelineLayout),
223 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipelineLayout),
224 MAKE_VULKAN_DEVICE_ENTRY(vkCreateSampler),
225 MAKE_VULKAN_DEVICE_ENTRY(vkDestroySampler),
226 MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorSetLayout),
227 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorSetLayout),
228 MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorPool),
229 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorPool),
230 MAKE_VULKAN_DEVICE_ENTRY(vkResetDescriptorPool),
231 MAKE_VULKAN_DEVICE_ENTRY(vkAllocateDescriptorSets),
232 MAKE_VULKAN_DEVICE_ENTRY(vkFreeDescriptorSets),
233 MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSets),
234 MAKE_VULKAN_DEVICE_ENTRY(vkCreateFramebuffer),
235 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyFramebuffer),
236 MAKE_VULKAN_DEVICE_ENTRY(vkCreateRenderPass),
237 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyRenderPass),
238 MAKE_VULKAN_DEVICE_ENTRY(vkGetRenderAreaGranularity),
239 MAKE_VULKAN_DEVICE_ENTRY(vkCreateCommandPool),
240 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyCommandPool),
241 MAKE_VULKAN_DEVICE_ENTRY(vkResetCommandPool),
242 MAKE_VULKAN_DEVICE_ENTRY(vkAllocateCommandBuffers),
243 MAKE_VULKAN_DEVICE_ENTRY(vkFreeCommandBuffers),
244 MAKE_VULKAN_DEVICE_ENTRY(vkBeginCommandBuffer),
245 MAKE_VULKAN_DEVICE_ENTRY(vkEndCommandBuffer),
246 MAKE_VULKAN_DEVICE_ENTRY(vkResetCommandBuffer),
247 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindPipeline),
248 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetViewport),
249 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetScissor),
250 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetLineWidth),
251 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthBias),
252 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetBlendConstants),
253 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthBounds),
254 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilCompareMask),
255 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilWriteMask),
256 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilReference),
257 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindDescriptorSets),
258 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindIndexBuffer),
259 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindVertexBuffers),
260 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDraw),
261 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexed),
262 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndirect),
263 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexedIndirect),
264 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatch),
265 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchIndirect),
266 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBuffer),
267 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImage),
268 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBlitImage),
269 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBufferToImage),
270 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImageToBuffer),
271 MAKE_VULKAN_DEVICE_ENTRY(vkCmdUpdateBuffer),
272 MAKE_VULKAN_DEVICE_ENTRY(vkCmdFillBuffer),
273 MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearColorImage),
274 MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearDepthStencilImage),
275 MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearAttachments),
276 MAKE_VULKAN_DEVICE_ENTRY(vkCmdResolveImage),
277 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetEvent),
278 MAKE_VULKAN_DEVICE_ENTRY(vkCmdResetEvent),
279 MAKE_VULKAN_DEVICE_ENTRY(vkCmdWaitEvents),
280 MAKE_VULKAN_DEVICE_ENTRY(vkCmdPipelineBarrier),
281 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginQuery),
282 MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndQuery),
283 MAKE_VULKAN_DEVICE_ENTRY(vkCmdResetQueryPool),
284 MAKE_VULKAN_DEVICE_ENTRY(vkCmdWriteTimestamp),
285 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyQueryPoolResults),
286 MAKE_VULKAN_DEVICE_ENTRY(vkCmdPushConstants),
287 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginRenderPass),
288 MAKE_VULKAN_DEVICE_ENTRY(vkCmdNextSubpass),
289 MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndRenderPass),
290 MAKE_VULKAN_DEVICE_ENTRY(vkCmdExecuteCommands),
291 MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory2),
292 MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory2),
293 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPeerMemoryFeatures),
294 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDeviceMask),
295 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchBase),
296 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements2),
297 MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements2),
298 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements2),
299 MAKE_VULKAN_DEVICE_ENTRY(vkTrimCommandPool),
300 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceQueue2),
301 MAKE_VULKAN_DEVICE_ENTRY(vkCreateSamplerYcbcrConversion),
302 MAKE_VULKAN_DEVICE_ENTRY(vkDestroySamplerYcbcrConversion),
303 MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorUpdateTemplate),
304 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorUpdateTemplate),
305 MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSetWithTemplate),
306 MAKE_VULKAN_DEVICE_ENTRY(vkGetDescriptorSetLayoutSupport),
307 // Device level VK_EXT_debug_utils functions
308 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginDebugUtilsLabelEXT),
309 MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndDebugUtilsLabelEXT),
310 MAKE_VULKAN_DEVICE_ENTRY(vkCmdInsertDebugUtilsLabelEXT),
311 MAKE_VULKAN_DEVICE_ENTRY(vkQueueBeginDebugUtilsLabelEXT),
312 MAKE_VULKAN_DEVICE_ENTRY(vkQueueEndDebugUtilsLabelEXT),
313 MAKE_VULKAN_DEVICE_ENTRY(vkQueueInsertDebugUtilsLabelEXT),
314 MAKE_VULKAN_DEVICE_ENTRY(vkSetDebugUtilsObjectNameEXT),
315 MAKE_VULKAN_DEVICE_ENTRY(vkSetDebugUtilsObjectTagEXT),
316 #ifdef __ANDROID__
317 MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainGrallocUsageANDROID),
318 MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainGrallocUsage2ANDROID),
319 MAKE_VULKAN_DEVICE_ENTRY(vkAcquireImageANDROID),
320 MAKE_VULKAN_DEVICE_ENTRY(vkQueueSignalReleaseImageANDROID),
321 #endif
322 // Vulkan 1.2 Entry point functions
323 MAKE_VULKAN_DEVICE_ENTRY(vkCreateRenderPass2),
324 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginRenderPass2),
325 MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndRenderPass2),
326 MAKE_VULKAN_DEVICE_ENTRY(vkCmdNextSubpass2),
327 MAKE_VULKAN_DEVICE_ENTRY(vkResetQueryPool),
328 // VK_KHR_timeline_semaphore
329 MAKE_VULKAN_DEVICE_ENTRY(vkGetSemaphoreCounterValue),
330 MAKE_VULKAN_DEVICE_ENTRY(vkSignalSemaphore),
331 MAKE_VULKAN_DEVICE_ENTRY(vkWaitSemaphores),
332 // VK_KHR_buffer_device_address
333 MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferDeviceAddress),
334 MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferOpaqueCaptureAddress),
335 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceMemoryOpaqueCaptureAddress),
336 // VK_KHR_draw_indirect_count
337 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndirectCount),
338 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexedIndirectCount),
339 };
340
341 // TODO(b/208256248): Avoid exit-time destructor.
342 static const std::vector<std::pair<const char *, std::unordered_map<std::string, PFN_vkVoidFunction>>> deviceExtensionFunctionPointers = {
343 // VK_KHR_descriptor_update_template
344 {
345 VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME,
346 {
347 MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorUpdateTemplateKHR),
348 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorUpdateTemplateKHR),
349 MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSetWithTemplateKHR),
350 } },
351 // VK_KHR_device_group
352 {
353 VK_KHR_DEVICE_GROUP_EXTENSION_NAME,
354 {
355 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPeerMemoryFeaturesKHR),
356 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDeviceMaskKHR),
357 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchBaseKHR),
358 } },
359 // VK_KHR_maintenance1
360 {
361 VK_KHR_MAINTENANCE1_EXTENSION_NAME,
362 {
363 MAKE_VULKAN_DEVICE_ENTRY(vkTrimCommandPoolKHR),
364 } },
365 // VK_KHR_sampler_ycbcr_conversion
366 {
367 VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME,
368 {
369 MAKE_VULKAN_DEVICE_ENTRY(vkCreateSamplerYcbcrConversionKHR),
370 MAKE_VULKAN_DEVICE_ENTRY(vkDestroySamplerYcbcrConversionKHR),
371 } },
372 // VK_KHR_bind_memory2
373 {
374 VK_KHR_BIND_MEMORY_2_EXTENSION_NAME,
375 {
376 MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory2KHR),
377 MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory2KHR),
378 } },
379 // VK_KHR_copy_commands2
380 {
381 VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME,
382 {
383 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBlitImage2KHR),
384 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBuffer2KHR),
385 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBufferToImage2KHR),
386 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImage2KHR),
387 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImageToBuffer2KHR),
388 MAKE_VULKAN_DEVICE_ENTRY(vkCmdResolveImage2KHR),
389 } },
390 // VK_KHR_get_memory_requirements2
391 {
392 VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME,
393 {
394 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements2KHR),
395 MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements2KHR),
396 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements2KHR),
397 } },
398 // VK_KHR_maintenance3
399 {
400 VK_KHR_MAINTENANCE3_EXTENSION_NAME,
401 {
402 MAKE_VULKAN_DEVICE_ENTRY(vkGetDescriptorSetLayoutSupportKHR),
403 } },
404 // VK_KHR_create_renderpass2
405 {
406 VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME,
407 {
408 MAKE_VULKAN_DEVICE_ENTRY(vkCreateRenderPass2KHR),
409 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginRenderPass2KHR),
410 MAKE_VULKAN_DEVICE_ENTRY(vkCmdNextSubpass2KHR),
411 MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndRenderPass2KHR),
412 } },
413 // VK_KHR_timeline_semaphore
414 {
415 VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME,
416 {
417 MAKE_VULKAN_DEVICE_ENTRY(vkGetSemaphoreCounterValueKHR),
418 MAKE_VULKAN_DEVICE_ENTRY(vkSignalSemaphoreKHR),
419 MAKE_VULKAN_DEVICE_ENTRY(vkWaitSemaphoresKHR),
420 } },
421 // VK_KHR_buffer_device_address
422 {
423 VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME,
424 {
425
426 MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferDeviceAddressKHR),
427 MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferOpaqueCaptureAddressKHR),
428 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceMemoryOpaqueCaptureAddressKHR),
429 } },
430 // VK_KHR_draw_indirect_count
431 {
432 VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME,
433 {
434
435 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndirectCountKHR),
436 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexedIndirectCountKHR),
437 } },
438 // VK_EXT_line_rasterization
439 {
440 VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME,
441 {
442 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetLineStippleEXT),
443 } },
444 // VK_EXT_host_query_reset
445 {
446 VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME,
447 {
448 MAKE_VULKAN_DEVICE_ENTRY(vkResetQueryPoolEXT),
449 } },
450 #ifndef __ANDROID__
451 // VK_KHR_swapchain
452 {
453 VK_KHR_SWAPCHAIN_EXTENSION_NAME,
454 {
455 MAKE_VULKAN_DEVICE_ENTRY(vkCreateSwapchainKHR),
456 MAKE_VULKAN_DEVICE_ENTRY(vkDestroySwapchainKHR),
457 MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainImagesKHR),
458 MAKE_VULKAN_DEVICE_ENTRY(vkAcquireNextImageKHR),
459 MAKE_VULKAN_DEVICE_ENTRY(vkAcquireNextImage2KHR),
460 MAKE_VULKAN_DEVICE_ENTRY(vkQueuePresentKHR),
461 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPresentCapabilitiesKHR),
462 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupSurfacePresentModesKHR),
463 } },
464 #endif
465
466 #if SWIFTSHADER_EXTERNAL_SEMAPHORE_OPAQUE_FD
467 // VK_KHR_external_semaphore_fd
468 {
469 VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME,
470 {
471 MAKE_VULKAN_DEVICE_ENTRY(vkGetSemaphoreFdKHR),
472 MAKE_VULKAN_DEVICE_ENTRY(vkImportSemaphoreFdKHR),
473 } },
474 #endif
475
476 #if VK_USE_PLATFORM_FUCHSIA
477 // VK_FUCHSIA_external_semaphore
478 {
479 VK_FUCHSIA_EXTERNAL_SEMAPHORE_EXTENSION_NAME,
480 {
481 MAKE_VULKAN_DEVICE_ENTRY(vkGetSemaphoreZirconHandleFUCHSIA),
482 MAKE_VULKAN_DEVICE_ENTRY(vkImportSemaphoreZirconHandleFUCHSIA),
483 } },
484 #endif
485
486 #if SWIFTSHADER_EXTERNAL_MEMORY_OPAQUE_FD
487 // VK_KHR_external_memory_fd
488 {
489 VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME,
490 {
491 MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryFdKHR),
492 MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryFdPropertiesKHR),
493 } },
494 #endif
495
496 // VK_EXT_external_memory_host
497 {
498 VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME,
499 {
500 MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryHostPointerPropertiesEXT),
501 } },
502
503 #if SWIFTSHADER_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER
504 // VK_ANDROID_external_memory_android_hardware_buffer
505 {
506 VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME,
507 {
508 MAKE_VULKAN_DEVICE_ENTRY(vkGetAndroidHardwareBufferPropertiesANDROID),
509 MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryAndroidHardwareBufferANDROID),
510 } },
511 #endif
512
513 #if VK_USE_PLATFORM_FUCHSIA
514 // VK_FUCHSIA_external_memory
515 {
516 VK_FUCHSIA_EXTERNAL_MEMORY_EXTENSION_NAME,
517 {
518 MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryZirconHandleFUCHSIA),
519 MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryZirconHandlePropertiesFUCHSIA),
520 } },
521 #endif
522 };
523
524 #undef MAKE_VULKAN_DEVICE_ENTRY
525
GetInstanceProcAddr(Instance * instance,const char * pName)526 PFN_vkVoidFunction GetInstanceProcAddr(Instance *instance, const char *pName)
527 {
528 auto globalFunction = globalFunctionPointers.find(std::string(pName));
529 if(globalFunction != globalFunctionPointers.end())
530 {
531 return globalFunction->second;
532 }
533
534 if(instance)
535 {
536 auto instanceFunction = instanceFunctionPointers.find(std::string(pName));
537 if(instanceFunction != instanceFunctionPointers.end())
538 {
539 return instanceFunction->second;
540 }
541
542 auto deviceFunction = deviceFunctionPointers.find(std::string(pName));
543 if(deviceFunction != deviceFunctionPointers.end())
544 {
545 return deviceFunction->second;
546 }
547
548 for(const auto &deviceExtensionFunctions : deviceExtensionFunctionPointers)
549 {
550 deviceFunction = deviceExtensionFunctions.second.find(std::string(pName));
551 if(deviceFunction != deviceExtensionFunctions.second.end())
552 {
553 return deviceFunction->second;
554 }
555 }
556 }
557
558 return nullptr;
559 }
560
GetDeviceProcAddr(Device * device,const char * pName)561 PFN_vkVoidFunction GetDeviceProcAddr(Device *device, const char *pName)
562 {
563 auto deviceFunction = deviceFunctionPointers.find(std::string(pName));
564 if(deviceFunction != deviceFunctionPointers.end())
565 {
566 return deviceFunction->second;
567 }
568
569 for(const auto &deviceExtensionFunctions : deviceExtensionFunctionPointers)
570 {
571 if(device->hasExtension(deviceExtensionFunctions.first))
572 {
573 deviceFunction = deviceExtensionFunctions.second.find(std::string(pName));
574 if(deviceFunction != deviceExtensionFunctions.second.end())
575 {
576 return deviceFunction->second;
577 }
578 }
579 }
580
581 return nullptr;
582 }
583
584 } // namespace vk
585
586 #ifdef __ANDROID__
587
588 extern "C" hwvulkan_module_t HAL_MODULE_INFO_SYM;
589
590 namespace {
591
CloseDevice(struct hw_device_t *)592 int CloseDevice(struct hw_device_t *)
593 {
594 return 0;
595 }
596
597 hwvulkan_device_t hal_device = {
598 .common = {
599 .tag = HARDWARE_DEVICE_TAG,
600 .version = HWVULKAN_DEVICE_API_VERSION_0_1,
601 .module = &HAL_MODULE_INFO_SYM.common,
602 .close = CloseDevice,
603 },
604 .EnumerateInstanceExtensionProperties = vkEnumerateInstanceExtensionProperties,
605 .CreateInstance = vkCreateInstance,
606 .GetInstanceProcAddr = vkGetInstanceProcAddr,
607 };
608
OpenDevice(const hw_module_t * module,const char * id,hw_device_t ** device)609 int OpenDevice(const hw_module_t *module, const char *id, hw_device_t **device)
610 {
611 if(strcmp(id, HWVULKAN_DEVICE_0) != 0) return -ENOENT;
612 *device = &hal_device.common;
613 return 0;
614 }
615
616 hw_module_methods_t module_methods = { .open = OpenDevice };
617
618 } // namespace
619
620 extern "C" hwvulkan_module_t HAL_MODULE_INFO_SYM = {
621 .common = {
622 .tag = HARDWARE_MODULE_TAG,
623 .module_api_version = HWVULKAN_MODULE_API_VERSION_0_1,
624 .hal_api_version = HARDWARE_HAL_API_VERSION,
625 .id = HWVULKAN_HARDWARE_MODULE_ID,
626 .name = "Swiftshader Pastel",
627 .author = "Google",
628 .methods = &module_methods,
629 }
630 };
631
632 #endif // __ANDROID__
633
634 #if VK_USE_PLATFORM_FUCHSIA
635 PFN_vkConnectToService vk::icdFuchsiaServiceConnectCallback = nullptr;
636 #endif
637