blob: 81da95a72cc4bb0cbb84ca40602fce2ad9bd9135 [file] [log] [blame]
Alexis Hetud73b8712018-09-21 15:14:43 -04001// 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
Antonio Maiorano42fd1592020-04-27 11:30:40 -040015#include "VkGetProcAddress.hpp"
Alexis Hetu352791e2019-05-17 16:42:34 -040016#include "VkDevice.hpp"
Alexis Hetud73b8712018-09-21 15:14:43 -040017
Merck Hung4241ad72018-09-27 09:14:11 +090018#include <string>
Ben Clayton2ed93ab2019-12-17 20:38:03 +000019#include <unordered_map>
Alexis Hetu352791e2019-05-17 16:42:34 -040020#include <vector>
Alexis Hetud73b8712018-09-21 15:14:43 -040021
Chris Forbesb3596a62019-04-05 12:24:30 -070022#ifdef __ANDROID__
Ben Clayton2ed93ab2019-12-17 20:38:03 +000023# include <hardware/hwvulkan.h>
24# include <vulkan/vk_android_native_buffer.h>
25# include <cerrno>
Chris Forbesb3596a62019-04-05 12:24:30 -070026#endif
27
Nicolas Capens157ba262019-12-10 17:49:14 -050028namespace vk {
Alexis Hetud73b8712018-09-21 15:14:43 -040029
Ben Clayton2ed93ab2019-12-17 20:38:03 +000030#define MAKE_VULKAN_GLOBAL_ENTRY(aFunction) \
31 { \
32# aFunction, reinterpret_cast < PFN_vkVoidFunction>(aFunction) \
33 }
34static const std::unordered_map<std::string, PFN_vkVoidFunction> globalFunctionPointers = {
Nicolas Capensdc853642018-11-19 15:50:18 -050035 MAKE_VULKAN_GLOBAL_ENTRY(vkCreateInstance),
36 MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceExtensionProperties),
37 MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceLayerProperties),
38 MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceVersion),
39};
40#undef MAKE_VULKAN_GLOBAL_ENTRY
41
Ben Clayton2ed93ab2019-12-17 20:38:03 +000042#define MAKE_VULKAN_INSTANCE_ENTRY(aFunction) \
43 { \
44# aFunction, reinterpret_cast < PFN_vkVoidFunction>(aFunction) \
45 }
46static const std::unordered_map<std::string, PFN_vkVoidFunction> instanceFunctionPointers = {
Nicolas Capensdc853642018-11-19 15:50:18 -050047 MAKE_VULKAN_INSTANCE_ENTRY(vkDestroyInstance),
48 MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDevices),
49 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures),
50 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties),
51 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties),
52 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties),
53 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties),
54 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties),
55 MAKE_VULKAN_INSTANCE_ENTRY(vkCreateDevice),
56 MAKE_VULKAN_INSTANCE_ENTRY(vkEnumerateDeviceExtensionProperties),
57 MAKE_VULKAN_INSTANCE_ENTRY(vkEnumerateDeviceLayerProperties),
58 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties),
59 MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDeviceGroups),
60 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures2),
61 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties2),
62 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties2),
63 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties2),
64 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties2),
65 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties2),
66 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties2),
67 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalBufferProperties),
68 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalFenceProperties),
69 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalSemaphoreProperties),
70 // VK_KHR_device_group_creation
71 MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDeviceGroupsKHR),
72 // VK_KHR_external_fence_capabilities
73 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalFencePropertiesKHR),
74 // VK_KHR_external_memory_capabilities
75 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalBufferPropertiesKHR),
76 // VK_KHR_external_semaphore_capabilities
77 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalSemaphorePropertiesKHR),
78 // VK_KHR_get_physical_device_properties2
79 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures2KHR),
80 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties2KHR),
81 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties2KHR),
82 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties2KHR),
83 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties2KHR),
84 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties2KHR),
85 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties2KHR),
Chris Forbes1d667d62019-04-05 08:25:18 -070086#ifndef __ANDROID__
87 // VK_KHR_surface
Hernan Liatisc6eb41b2019-02-22 11:12:59 -080088 MAKE_VULKAN_INSTANCE_ENTRY(vkDestroySurfaceKHR),
Hernan Liatisc6eb41b2019-02-22 11:12:59 -080089 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceSupportKHR),
90 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceCapabilitiesKHR),
91 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceFormatsKHR),
92 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfacePresentModesKHR),
Chris Forbesb52384b2019-08-28 12:01:29 -070093 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDevicePresentRectanglesKHR),
Chris Forbes1d667d62019-04-05 08:25:18 -070094#endif
Ben Claytona9af8832019-08-14 13:09:43 +010095#ifdef VK_USE_PLATFORM_XCB_KHR
96 // VK_KHR_Xcb_surface
97 MAKE_VULKAN_INSTANCE_ENTRY(vkCreateXcbSurfaceKHR),
98 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceXcbPresentationSupportKHR),
99#endif
Chris Forbes1d667d62019-04-05 08:25:18 -0700100#ifdef VK_USE_PLATFORM_XLIB_KHR
101 // VK_KHR_xlib_surface
102 MAKE_VULKAN_INSTANCE_ENTRY(vkCreateXlibSurfaceKHR),
Hernan Liatisbd18d582019-05-29 15:38:58 -0700103 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceXlibPresentationSupportKHR),
Chris Forbes1d667d62019-04-05 08:25:18 -0700104#endif
Alexis Hetu0662a4a2019-07-08 15:06:40 -0400105#ifdef VK_USE_PLATFORM_MACOS_MVK
Ben Clayton2ed93ab2019-12-17 20:38:03 +0000106 // VK_MVK_macos_surface
107 MAKE_VULKAN_INSTANCE_ENTRY(vkCreateMacOSSurfaceMVK),
Alexis Hetu0662a4a2019-07-08 15:06:40 -0400108#endif
Jonah Ryan-Davis215bc792019-10-31 17:23:49 -0400109#ifdef VK_USE_PLATFORM_METAL_EXT
Ben Clayton2ed93ab2019-12-17 20:38:03 +0000110 // VK_EXT_metal_surface
111 MAKE_VULKAN_INSTANCE_ENTRY(vkCreateMetalSurfaceEXT),
Jonah Ryan-Davis215bc792019-10-31 17:23:49 -0400112#endif
Nicolas Capensd3545372019-08-09 13:59:18 -0400113#ifdef VK_USE_PLATFORM_WIN32_KHR
114 // VK_KHR_win32_surface
115 MAKE_VULKAN_INSTANCE_ENTRY(vkCreateWin32SurfaceKHR),
Sascha Willems883e8172019-10-22 20:08:12 +0200116 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceWin32PresentationSupportKHR),
Nicolas Capensd3545372019-08-09 13:59:18 -0400117#endif
Nicolas Capensdc853642018-11-19 15:50:18 -0500118};
Hernan Liatis53c89572019-02-25 15:50:26 -0800119#undef MAKE_VULKAN_INSTANCE_ENTRY
Nicolas Capensdc853642018-11-19 15:50:18 -0500120
Ben Clayton2ed93ab2019-12-17 20:38:03 +0000121#define MAKE_VULKAN_DEVICE_ENTRY(aFunction) \
122 { \
123# aFunction, reinterpret_cast < PFN_vkVoidFunction>(aFunction) \
124 }
125static const std::unordered_map<std::string, PFN_vkVoidFunction> deviceFunctionPointers = {
Nicolas Capensdc853642018-11-19 15:50:18 -0500126 MAKE_VULKAN_DEVICE_ENTRY(vkGetInstanceProcAddr),
127 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceProcAddr),
128 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDevice),
129 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceQueue),
130 MAKE_VULKAN_DEVICE_ENTRY(vkQueueSubmit),
131 MAKE_VULKAN_DEVICE_ENTRY(vkQueueWaitIdle),
132 MAKE_VULKAN_DEVICE_ENTRY(vkDeviceWaitIdle),
133 MAKE_VULKAN_DEVICE_ENTRY(vkAllocateMemory),
134 MAKE_VULKAN_DEVICE_ENTRY(vkFreeMemory),
135 MAKE_VULKAN_DEVICE_ENTRY(vkMapMemory),
136 MAKE_VULKAN_DEVICE_ENTRY(vkUnmapMemory),
137 MAKE_VULKAN_DEVICE_ENTRY(vkFlushMappedMemoryRanges),
138 MAKE_VULKAN_DEVICE_ENTRY(vkInvalidateMappedMemoryRanges),
139 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceMemoryCommitment),
140 MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory),
141 MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory),
142 MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements),
143 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements),
144 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements),
145 MAKE_VULKAN_DEVICE_ENTRY(vkQueueBindSparse),
146 MAKE_VULKAN_DEVICE_ENTRY(vkCreateFence),
147 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyFence),
148 MAKE_VULKAN_DEVICE_ENTRY(vkResetFences),
149 MAKE_VULKAN_DEVICE_ENTRY(vkGetFenceStatus),
150 MAKE_VULKAN_DEVICE_ENTRY(vkWaitForFences),
151 MAKE_VULKAN_DEVICE_ENTRY(vkCreateSemaphore),
152 MAKE_VULKAN_DEVICE_ENTRY(vkDestroySemaphore),
153 MAKE_VULKAN_DEVICE_ENTRY(vkCreateEvent),
154 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyEvent),
155 MAKE_VULKAN_DEVICE_ENTRY(vkGetEventStatus),
156 MAKE_VULKAN_DEVICE_ENTRY(vkSetEvent),
157 MAKE_VULKAN_DEVICE_ENTRY(vkResetEvent),
158 MAKE_VULKAN_DEVICE_ENTRY(vkCreateQueryPool),
159 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyQueryPool),
160 MAKE_VULKAN_DEVICE_ENTRY(vkGetQueryPoolResults),
161 MAKE_VULKAN_DEVICE_ENTRY(vkCreateBuffer),
162 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyBuffer),
163 MAKE_VULKAN_DEVICE_ENTRY(vkCreateBufferView),
164 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyBufferView),
165 MAKE_VULKAN_DEVICE_ENTRY(vkCreateImage),
166 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyImage),
167 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSubresourceLayout),
168 MAKE_VULKAN_DEVICE_ENTRY(vkCreateImageView),
169 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyImageView),
170 MAKE_VULKAN_DEVICE_ENTRY(vkCreateShaderModule),
171 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyShaderModule),
172 MAKE_VULKAN_DEVICE_ENTRY(vkCreatePipelineCache),
173 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipelineCache),
174 MAKE_VULKAN_DEVICE_ENTRY(vkGetPipelineCacheData),
175 MAKE_VULKAN_DEVICE_ENTRY(vkMergePipelineCaches),
176 MAKE_VULKAN_DEVICE_ENTRY(vkCreateGraphicsPipelines),
177 MAKE_VULKAN_DEVICE_ENTRY(vkCreateComputePipelines),
178 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipeline),
179 MAKE_VULKAN_DEVICE_ENTRY(vkCreatePipelineLayout),
180 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipelineLayout),
181 MAKE_VULKAN_DEVICE_ENTRY(vkCreateSampler),
182 MAKE_VULKAN_DEVICE_ENTRY(vkDestroySampler),
183 MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorSetLayout),
184 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorSetLayout),
185 MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorPool),
186 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorPool),
187 MAKE_VULKAN_DEVICE_ENTRY(vkResetDescriptorPool),
188 MAKE_VULKAN_DEVICE_ENTRY(vkAllocateDescriptorSets),
189 MAKE_VULKAN_DEVICE_ENTRY(vkFreeDescriptorSets),
190 MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSets),
191 MAKE_VULKAN_DEVICE_ENTRY(vkCreateFramebuffer),
192 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyFramebuffer),
193 MAKE_VULKAN_DEVICE_ENTRY(vkCreateRenderPass),
194 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyRenderPass),
195 MAKE_VULKAN_DEVICE_ENTRY(vkGetRenderAreaGranularity),
196 MAKE_VULKAN_DEVICE_ENTRY(vkCreateCommandPool),
197 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyCommandPool),
198 MAKE_VULKAN_DEVICE_ENTRY(vkResetCommandPool),
199 MAKE_VULKAN_DEVICE_ENTRY(vkAllocateCommandBuffers),
200 MAKE_VULKAN_DEVICE_ENTRY(vkFreeCommandBuffers),
201 MAKE_VULKAN_DEVICE_ENTRY(vkBeginCommandBuffer),
202 MAKE_VULKAN_DEVICE_ENTRY(vkEndCommandBuffer),
203 MAKE_VULKAN_DEVICE_ENTRY(vkResetCommandBuffer),
204 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindPipeline),
205 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetViewport),
206 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetScissor),
207 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetLineWidth),
208 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthBias),
209 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetBlendConstants),
210 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthBounds),
211 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilCompareMask),
212 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilWriteMask),
213 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilReference),
214 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindDescriptorSets),
215 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindIndexBuffer),
216 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindVertexBuffers),
217 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDraw),
218 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexed),
219 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndirect),
220 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexedIndirect),
221 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatch),
222 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchIndirect),
223 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBuffer),
224 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImage),
225 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBlitImage),
226 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBufferToImage),
227 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImageToBuffer),
228 MAKE_VULKAN_DEVICE_ENTRY(vkCmdUpdateBuffer),
229 MAKE_VULKAN_DEVICE_ENTRY(vkCmdFillBuffer),
230 MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearColorImage),
231 MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearDepthStencilImage),
232 MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearAttachments),
233 MAKE_VULKAN_DEVICE_ENTRY(vkCmdResolveImage),
234 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetEvent),
235 MAKE_VULKAN_DEVICE_ENTRY(vkCmdResetEvent),
236 MAKE_VULKAN_DEVICE_ENTRY(vkCmdWaitEvents),
237 MAKE_VULKAN_DEVICE_ENTRY(vkCmdPipelineBarrier),
238 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginQuery),
239 MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndQuery),
240 MAKE_VULKAN_DEVICE_ENTRY(vkCmdResetQueryPool),
241 MAKE_VULKAN_DEVICE_ENTRY(vkCmdWriteTimestamp),
242 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyQueryPoolResults),
243 MAKE_VULKAN_DEVICE_ENTRY(vkCmdPushConstants),
244 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginRenderPass),
245 MAKE_VULKAN_DEVICE_ENTRY(vkCmdNextSubpass),
246 MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndRenderPass),
247 MAKE_VULKAN_DEVICE_ENTRY(vkCmdExecuteCommands),
248 MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory2),
249 MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory2),
250 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPeerMemoryFeatures),
251 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDeviceMask),
252 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchBase),
253 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements2),
254 MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements2),
255 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements2),
256 MAKE_VULKAN_DEVICE_ENTRY(vkTrimCommandPool),
257 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceQueue2),
258 MAKE_VULKAN_DEVICE_ENTRY(vkCreateSamplerYcbcrConversion),
259 MAKE_VULKAN_DEVICE_ENTRY(vkDestroySamplerYcbcrConversion),
260 MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorUpdateTemplate),
261 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorUpdateTemplate),
262 MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSetWithTemplate),
263 MAKE_VULKAN_DEVICE_ENTRY(vkGetDescriptorSetLayoutSupport),
Alexis Hetu352791e2019-05-17 16:42:34 -0400264#ifdef __ANDROID__
Hernan Liatis8a91a352019-04-29 17:14:06 -0700265 MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainGrallocUsageANDROID),
266 MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainGrallocUsage2ANDROID),
267 MAKE_VULKAN_DEVICE_ENTRY(vkAcquireImageANDROID),
268 MAKE_VULKAN_DEVICE_ENTRY(vkQueueSignalReleaseImageANDROID),
Chris Forbes1d667d62019-04-05 08:25:18 -0700269#endif
Nicolas Capensdc853642018-11-19 15:50:18 -0500270};
Alexis Hetu352791e2019-05-17 16:42:34 -0400271
Ben Clayton2ed93ab2019-12-17 20:38:03 +0000272static const std::vector<std::pair<const char *, std::unordered_map<std::string, PFN_vkVoidFunction>>> deviceExtensionFunctionPointers = {
Alexis Hetu352791e2019-05-17 16:42:34 -0400273 // VK_KHR_descriptor_update_template
274 {
Ben Clayton2ed93ab2019-12-17 20:38:03 +0000275 VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME,
276 {
277 MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorUpdateTemplateKHR),
278 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorUpdateTemplateKHR),
279 MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSetWithTemplateKHR),
280 } },
Alexis Hetu352791e2019-05-17 16:42:34 -0400281 // VK_KHR_device_group
282 {
Ben Clayton2ed93ab2019-12-17 20:38:03 +0000283 VK_KHR_DEVICE_GROUP_EXTENSION_NAME,
284 {
285 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPeerMemoryFeaturesKHR),
286 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDeviceMaskKHR),
287 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchBaseKHR),
288 } },
Alexis Hetu352791e2019-05-17 16:42:34 -0400289 // VK_KHR_maintenance1
290 {
Ben Clayton2ed93ab2019-12-17 20:38:03 +0000291 VK_KHR_MAINTENANCE1_EXTENSION_NAME,
292 {
293 MAKE_VULKAN_DEVICE_ENTRY(vkTrimCommandPoolKHR),
294 } },
Alexis Hetu352791e2019-05-17 16:42:34 -0400295 // VK_KHR_sampler_ycbcr_conversion
296 {
Ben Clayton2ed93ab2019-12-17 20:38:03 +0000297 VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME,
298 {
299 MAKE_VULKAN_DEVICE_ENTRY(vkCreateSamplerYcbcrConversionKHR),
300 MAKE_VULKAN_DEVICE_ENTRY(vkDestroySamplerYcbcrConversionKHR),
301 } },
Alexis Hetu352791e2019-05-17 16:42:34 -0400302 // VK_KHR_bind_memory2
303 {
Ben Clayton2ed93ab2019-12-17 20:38:03 +0000304 VK_KHR_BIND_MEMORY_2_EXTENSION_NAME,
305 {
306 MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory2KHR),
307 MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory2KHR),
308 } },
Alexis Hetu352791e2019-05-17 16:42:34 -0400309 // VK_KHR_get_memory_requirements2
310 {
Ben Clayton2ed93ab2019-12-17 20:38:03 +0000311 VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME,
312 {
313 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements2KHR),
314 MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements2KHR),
315 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements2KHR),
316 } },
Alexis Hetu352791e2019-05-17 16:42:34 -0400317 // VK_KHR_maintenance3
318 {
Ben Clayton2ed93ab2019-12-17 20:38:03 +0000319 VK_KHR_MAINTENANCE3_EXTENSION_NAME,
320 {
321 MAKE_VULKAN_DEVICE_ENTRY(vkGetDescriptorSetLayoutSupportKHR),
322 } },
Alexis Hetu9f8337e2020-02-07 11:07:43 -0500323 // VK_KHR_create_renderpass2
324 {
325 VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME,
326 {
327 MAKE_VULKAN_DEVICE_ENTRY(vkCreateRenderPass2KHR),
328 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginRenderPass2KHR),
329 MAKE_VULKAN_DEVICE_ENTRY(vkCmdNextSubpass2KHR),
330 MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndRenderPass2KHR),
331 } },
Chris Forbesdeac5362019-11-25 08:18:34 -0800332 // VK_EXT_line_rasterization
333 {
Ben Clayton2ed93ab2019-12-17 20:38:03 +0000334 VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME,
335 {
336 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetLineStippleEXT),
337 } },
Alexis Hetu352791e2019-05-17 16:42:34 -0400338#ifndef __ANDROID__
339 // VK_KHR_swapchain
340 {
Ben Clayton2ed93ab2019-12-17 20:38:03 +0000341 VK_KHR_SWAPCHAIN_EXTENSION_NAME,
342 {
343 MAKE_VULKAN_DEVICE_ENTRY(vkCreateSwapchainKHR),
344 MAKE_VULKAN_DEVICE_ENTRY(vkDestroySwapchainKHR),
345 MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainImagesKHR),
346 MAKE_VULKAN_DEVICE_ENTRY(vkAcquireNextImageKHR),
347 MAKE_VULKAN_DEVICE_ENTRY(vkAcquireNextImage2KHR),
348 MAKE_VULKAN_DEVICE_ENTRY(vkQueuePresentKHR),
349 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPresentCapabilitiesKHR),
350 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupSurfacePresentModesKHR),
351 } },
Alexis Hetu352791e2019-05-17 16:42:34 -0400352#endif
David 'Digit' Turner7c4d0a02019-09-03 17:00:02 +0200353
David 'Digit' Turner3a7101b2019-11-22 11:55:53 +0100354#if SWIFTSHADER_EXTERNAL_SEMAPHORE_OPAQUE_FD
David 'Digit' Turner7c4d0a02019-09-03 17:00:02 +0200355 // VK_KHR_external_semaphore_fd
356 {
Ben Clayton2ed93ab2019-12-17 20:38:03 +0000357 VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME,
358 {
359 MAKE_VULKAN_DEVICE_ENTRY(vkGetSemaphoreFdKHR),
360 MAKE_VULKAN_DEVICE_ENTRY(vkImportSemaphoreFdKHR),
361 } },
David 'Digit' Turner7c4d0a02019-09-03 17:00:02 +0200362#endif
David 'Digit' Turnerfda994c2019-09-04 16:36:36 +0200363
David 'Digit' Turner3a7101b2019-11-22 11:55:53 +0100364#if VK_USE_PLATFORM_FUCHSIA
David 'Digit' Turnerfda994c2019-09-04 16:36:36 +0200365 // VK_FUCHSIA_external_semaphore
366 {
Ben Clayton2ed93ab2019-12-17 20:38:03 +0000367 VK_FUCHSIA_EXTERNAL_SEMAPHORE_EXTENSION_NAME,
368 {
369 MAKE_VULKAN_DEVICE_ENTRY(vkGetSemaphoreZirconHandleFUCHSIA),
370 MAKE_VULKAN_DEVICE_ENTRY(vkImportSemaphoreZirconHandleFUCHSIA),
371 } },
David 'Digit' Turnerfda994c2019-09-04 16:36:36 +0200372#endif
David 'Digit' Turner359bc802019-08-14 17:46:07 +0200373
David 'Digit' Turner3a7101b2019-11-22 11:55:53 +0100374#if SWIFTSHADER_EXTERNAL_MEMORY_OPAQUE_FD
David 'Digit' Turner359bc802019-08-14 17:46:07 +0200375 // VK_KHR_external_memory_fd
376 {
Ben Clayton2ed93ab2019-12-17 20:38:03 +0000377 VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME,
378 {
379 MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryFdKHR),
380 MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryFdPropertiesKHR),
381 } },
David 'Digit' Turner359bc802019-08-14 17:46:07 +0200382#endif
Chris Forbes9f1e03b2020-01-09 11:45:28 -0800383
Jonah Ryan-Davisf9f999f2020-01-08 14:41:28 -0500384 // VK_EXT_external_memory_host
385 {
386 VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME,
387 {
388 MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryHostPointerPropertiesEXT),
389 } },
390
Chris Forbes9f1e03b2020-01-09 11:45:28 -0800391#if SWIFTSHADER_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER
392 // VK_ANDROID_external_memory_android_hardware_buffer
393 {
394 VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME,
395 {
396 MAKE_VULKAN_DEVICE_ENTRY(vkGetAndroidHardwareBufferPropertiesANDROID),
397 MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryAndroidHardwareBufferANDROID),
398 } },
399#endif
David 'Digit' Turnere52e2db2019-09-09 17:58:46 +0200400
401#if VK_USE_PLATFORM_FUCHSIA
402 // VK_FUCHSIA_external_memory
403 {
404 VK_FUCHSIA_EXTERNAL_MEMORY_EXTENSION_NAME,
405 {
406 MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryZirconHandleFUCHSIA),
407 MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryZirconHandlePropertiesFUCHSIA),
408 } },
409#endif
Alexis Hetu352791e2019-05-17 16:42:34 -0400410};
411
Nicolas Capensdc853642018-11-19 15:50:18 -0500412#undef MAKE_VULKAN_DEVICE_ENTRY
413
Ben Clayton2ed93ab2019-12-17 20:38:03 +0000414PFN_vkVoidFunction GetInstanceProcAddr(Instance *instance, const char *pName)
Nicolas Capensdc853642018-11-19 15:50:18 -0500415{
416 auto globalFunction = globalFunctionPointers.find(std::string(pName));
417 if(globalFunction != globalFunctionPointers.end())
Alexis Hetud73b8712018-09-21 15:14:43 -0400418 {
Nicolas Capensdc853642018-11-19 15:50:18 -0500419 return globalFunction->second;
Alexis Hetud73b8712018-09-21 15:14:43 -0400420 }
Nicolas Capensdc853642018-11-19 15:50:18 -0500421
Alexis Hetu2d77aea2019-06-17 13:43:50 -0400422 if(instance)
Nicolas Capensdc853642018-11-19 15:50:18 -0500423 {
424 auto instanceFunction = instanceFunctionPointers.find(std::string(pName));
425 if(instanceFunction != instanceFunctionPointers.end())
426 {
427 return instanceFunction->second;
428 }
429
430 auto deviceFunction = deviceFunctionPointers.find(std::string(pName));
431 if(deviceFunction != deviceFunctionPointers.end())
432 {
433 return deviceFunction->second;
434 }
Chris Forbes9a4dab82019-05-17 17:15:47 -0700435
Ben Clayton2ed93ab2019-12-17 20:38:03 +0000436 for(const auto &deviceExtensionFunctions : deviceExtensionFunctionPointers)
Chris Forbes9a4dab82019-05-17 17:15:47 -0700437 {
438 deviceFunction = deviceExtensionFunctions.second.find(std::string(pName));
439 if(deviceFunction != deviceExtensionFunctions.second.end())
440 {
441 return deviceFunction->second;
442 }
443 }
Nicolas Capensdc853642018-11-19 15:50:18 -0500444 }
445
446 return nullptr;
447}
448
Ben Clayton2ed93ab2019-12-17 20:38:03 +0000449PFN_vkVoidFunction GetDeviceProcAddr(Device *device, const char *pName)
Nicolas Capensdc853642018-11-19 15:50:18 -0500450{
451 auto deviceFunction = deviceFunctionPointers.find(std::string(pName));
452 if(deviceFunction != deviceFunctionPointers.end())
453 {
454 return deviceFunction->second;
455 }
456
Ben Clayton2ed93ab2019-12-17 20:38:03 +0000457 for(const auto &deviceExtensionFunctions : deviceExtensionFunctionPointers)
Alexis Hetu352791e2019-05-17 16:42:34 -0400458 {
Alexis Hetu7d96f512019-06-13 18:23:56 -0400459 if(device->hasExtension(deviceExtensionFunctions.first))
Alexis Hetu352791e2019-05-17 16:42:34 -0400460 {
461 deviceFunction = deviceExtensionFunctions.second.find(std::string(pName));
462 if(deviceFunction != deviceExtensionFunctions.second.end())
463 {
464 return deviceFunction->second;
465 }
466 }
467 }
468
Nicolas Capensdc853642018-11-19 15:50:18 -0500469 return nullptr;
470}
471
Nicolas Capens157ba262019-12-10 17:49:14 -0500472} // namespace vk
Chris Forbesb3596a62019-04-05 12:24:30 -0700473
474#ifdef __ANDROID__
475
476extern "C" hwvulkan_module_t HAL_MODULE_INFO_SYM;
477
478namespace {
479
Ben Clayton2ed93ab2019-12-17 20:38:03 +0000480int CloseDevice(struct hw_device_t *)
481{
482 return 0;
Chris Forbesb3596a62019-04-05 12:24:30 -0700483}
484
Ben Clayton2ed93ab2019-12-17 20:38:03 +0000485hwvulkan_device_t hal_device = {
486 .common = {
487 .tag = HARDWARE_DEVICE_TAG,
488 .version = HWVULKAN_DEVICE_API_VERSION_0_1,
489 .module = &HAL_MODULE_INFO_SYM.common,
490 .close = CloseDevice,
491 },
492 .EnumerateInstanceExtensionProperties = vkEnumerateInstanceExtensionProperties,
493 .CreateInstance = vkCreateInstance,
494 .GetInstanceProcAddr = vkGetInstanceProcAddr,
495};
496
497int OpenDevice(const hw_module_t *module, const char *id, hw_device_t **device)
Chris Forbesb3596a62019-04-05 12:24:30 -0700498{
Ben Clayton2ed93ab2019-12-17 20:38:03 +0000499 if(strcmp(id, HWVULKAN_DEVICE_0) != 0) return -ENOENT;
500 *device = &hal_device.common;
501 return 0;
502}
503
504hw_module_methods_t module_methods = { .open = OpenDevice };
505
506} // namespace
507
508extern "C" hwvulkan_module_t HAL_MODULE_INFO_SYM = {
509 .common = {
510 .tag = HARDWARE_MODULE_TAG,
511 .module_api_version = HWVULKAN_MODULE_API_VERSION_0_1,
512 .hal_api_version = HARDWARE_HAL_API_VERSION,
513 .id = HWVULKAN_HARDWARE_MODULE_ID,
514 .name = "Swiftshader Pastel",
515 .author = "Google",
516 .methods = &module_methods,
Chris Forbesb3596a62019-04-05 12:24:30 -0700517 }
518};
519
David 'Digit' Turner6e445042020-04-17 16:27:56 +0200520#endif // __ANDROID__
521
522#if VK_USE_PLATFORM_FUCHSIA
523PFN_vkConnectToService vk::icdFuchsiaServiceConnectCallback = nullptr;
David 'Digit' Turner7c4d0a02019-09-03 17:00:02 +0200524#endif