blob: 9e5d8f44f72a00040adf1762aea58ade0e021ffa [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
15#include "VkGetProcAddress.h"
Alexis Hetu352791e2019-05-17 16:42:34 -040016#include "VkDevice.hpp"
Alexis Hetud73b8712018-09-21 15:14:43 -040017
18#include <unordered_map>
Merck Hung4241ad72018-09-27 09:14:11 +090019#include <string>
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__
23#include <cerrno>
24#include <hardware/hwvulkan.h>
Hernan Liatis8a91a352019-04-29 17:14:06 -070025#include <vulkan/vk_android_native_buffer.h>
Chris Forbesb3596a62019-04-05 12:24:30 -070026#endif
27
Alexis Hetud73b8712018-09-21 15:14:43 -040028namespace vk
29{
Alexis Hetud73b8712018-09-21 15:14:43 -040030
Nicolas Capensdc853642018-11-19 15:50:18 -050031#define MAKE_VULKAN_GLOBAL_ENTRY(aFunction) { #aFunction, reinterpret_cast<PFN_vkVoidFunction>(aFunction) }
32static const std::unordered_map<std::string, PFN_vkVoidFunction> globalFunctionPointers =
33{
34 MAKE_VULKAN_GLOBAL_ENTRY(vkCreateInstance),
35 MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceExtensionProperties),
36 MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceLayerProperties),
37 MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceVersion),
38};
39#undef MAKE_VULKAN_GLOBAL_ENTRY
40
41#define MAKE_VULKAN_INSTANCE_ENTRY(aFunction) { #aFunction, reinterpret_cast<PFN_vkVoidFunction>(aFunction) }
42static const std::unordered_map<std::string, PFN_vkVoidFunction> instanceFunctionPointers =
43{
44 MAKE_VULKAN_INSTANCE_ENTRY(vkDestroyInstance),
45 MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDevices),
46 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures),
47 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties),
48 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties),
49 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties),
50 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties),
51 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties),
52 MAKE_VULKAN_INSTANCE_ENTRY(vkCreateDevice),
53 MAKE_VULKAN_INSTANCE_ENTRY(vkEnumerateDeviceExtensionProperties),
54 MAKE_VULKAN_INSTANCE_ENTRY(vkEnumerateDeviceLayerProperties),
55 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties),
56 MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDeviceGroups),
57 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures2),
58 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties2),
59 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties2),
60 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties2),
61 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties2),
62 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties2),
63 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties2),
64 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalBufferProperties),
65 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalFenceProperties),
66 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalSemaphoreProperties),
67 // VK_KHR_device_group_creation
68 MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDeviceGroupsKHR),
69 // VK_KHR_external_fence_capabilities
70 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalFencePropertiesKHR),
71 // VK_KHR_external_memory_capabilities
72 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalBufferPropertiesKHR),
73 // VK_KHR_external_semaphore_capabilities
74 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalSemaphorePropertiesKHR),
75 // VK_KHR_get_physical_device_properties2
76 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures2KHR),
77 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties2KHR),
78 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties2KHR),
79 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties2KHR),
80 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties2KHR),
81 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties2KHR),
82 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties2KHR),
Chris Forbes1d667d62019-04-05 08:25:18 -070083#ifndef __ANDROID__
84 // VK_KHR_surface
Hernan Liatisc6eb41b2019-02-22 11:12:59 -080085 MAKE_VULKAN_INSTANCE_ENTRY(vkDestroySurfaceKHR),
Hernan Liatisc6eb41b2019-02-22 11:12:59 -080086 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceSupportKHR),
87 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceCapabilitiesKHR),
88 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceFormatsKHR),
89 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfacePresentModesKHR),
Chris Forbesb52384b2019-08-28 12:01:29 -070090 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDevicePresentRectanglesKHR),
Chris Forbes1d667d62019-04-05 08:25:18 -070091#endif
Ben Claytona9af8832019-08-14 13:09:43 +010092#ifdef VK_USE_PLATFORM_XCB_KHR
93 // VK_KHR_Xcb_surface
94 MAKE_VULKAN_INSTANCE_ENTRY(vkCreateXcbSurfaceKHR),
95 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceXcbPresentationSupportKHR),
96#endif
Chris Forbes1d667d62019-04-05 08:25:18 -070097#ifdef VK_USE_PLATFORM_XLIB_KHR
98 // VK_KHR_xlib_surface
99 MAKE_VULKAN_INSTANCE_ENTRY(vkCreateXlibSurfaceKHR),
Hernan Liatisbd18d582019-05-29 15:38:58 -0700100 MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceXlibPresentationSupportKHR),
Chris Forbes1d667d62019-04-05 08:25:18 -0700101#endif
Alexis Hetu0662a4a2019-07-08 15:06:40 -0400102#ifdef VK_USE_PLATFORM_MACOS_MVK
103 // VK_MVK_macos_surface
104 MAKE_VULKAN_INSTANCE_ENTRY(vkCreateMacOSSurfaceMVK),
105#endif
Nicolas Capensd3545372019-08-09 13:59:18 -0400106#ifdef VK_USE_PLATFORM_WIN32_KHR
107 // VK_KHR_win32_surface
108 MAKE_VULKAN_INSTANCE_ENTRY(vkCreateWin32SurfaceKHR),
109#endif
Nicolas Capensdc853642018-11-19 15:50:18 -0500110};
Hernan Liatis53c89572019-02-25 15:50:26 -0800111#undef MAKE_VULKAN_INSTANCE_ENTRY
Nicolas Capensdc853642018-11-19 15:50:18 -0500112
113#define MAKE_VULKAN_DEVICE_ENTRY(aFunction) { #aFunction, reinterpret_cast<PFN_vkVoidFunction>(aFunction) }
114static const std::unordered_map<std::string, PFN_vkVoidFunction> deviceFunctionPointers =
115{
116 MAKE_VULKAN_DEVICE_ENTRY(vkGetInstanceProcAddr),
117 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceProcAddr),
118 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDevice),
119 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceQueue),
120 MAKE_VULKAN_DEVICE_ENTRY(vkQueueSubmit),
121 MAKE_VULKAN_DEVICE_ENTRY(vkQueueWaitIdle),
122 MAKE_VULKAN_DEVICE_ENTRY(vkDeviceWaitIdle),
123 MAKE_VULKAN_DEVICE_ENTRY(vkAllocateMemory),
124 MAKE_VULKAN_DEVICE_ENTRY(vkFreeMemory),
125 MAKE_VULKAN_DEVICE_ENTRY(vkMapMemory),
126 MAKE_VULKAN_DEVICE_ENTRY(vkUnmapMemory),
127 MAKE_VULKAN_DEVICE_ENTRY(vkFlushMappedMemoryRanges),
128 MAKE_VULKAN_DEVICE_ENTRY(vkInvalidateMappedMemoryRanges),
129 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceMemoryCommitment),
130 MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory),
131 MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory),
132 MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements),
133 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements),
134 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements),
135 MAKE_VULKAN_DEVICE_ENTRY(vkQueueBindSparse),
136 MAKE_VULKAN_DEVICE_ENTRY(vkCreateFence),
137 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyFence),
138 MAKE_VULKAN_DEVICE_ENTRY(vkResetFences),
139 MAKE_VULKAN_DEVICE_ENTRY(vkGetFenceStatus),
140 MAKE_VULKAN_DEVICE_ENTRY(vkWaitForFences),
141 MAKE_VULKAN_DEVICE_ENTRY(vkCreateSemaphore),
142 MAKE_VULKAN_DEVICE_ENTRY(vkDestroySemaphore),
143 MAKE_VULKAN_DEVICE_ENTRY(vkCreateEvent),
144 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyEvent),
145 MAKE_VULKAN_DEVICE_ENTRY(vkGetEventStatus),
146 MAKE_VULKAN_DEVICE_ENTRY(vkSetEvent),
147 MAKE_VULKAN_DEVICE_ENTRY(vkResetEvent),
148 MAKE_VULKAN_DEVICE_ENTRY(vkCreateQueryPool),
149 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyQueryPool),
150 MAKE_VULKAN_DEVICE_ENTRY(vkGetQueryPoolResults),
151 MAKE_VULKAN_DEVICE_ENTRY(vkCreateBuffer),
152 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyBuffer),
153 MAKE_VULKAN_DEVICE_ENTRY(vkCreateBufferView),
154 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyBufferView),
155 MAKE_VULKAN_DEVICE_ENTRY(vkCreateImage),
156 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyImage),
157 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSubresourceLayout),
158 MAKE_VULKAN_DEVICE_ENTRY(vkCreateImageView),
159 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyImageView),
160 MAKE_VULKAN_DEVICE_ENTRY(vkCreateShaderModule),
161 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyShaderModule),
162 MAKE_VULKAN_DEVICE_ENTRY(vkCreatePipelineCache),
163 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipelineCache),
164 MAKE_VULKAN_DEVICE_ENTRY(vkGetPipelineCacheData),
165 MAKE_VULKAN_DEVICE_ENTRY(vkMergePipelineCaches),
166 MAKE_VULKAN_DEVICE_ENTRY(vkCreateGraphicsPipelines),
167 MAKE_VULKAN_DEVICE_ENTRY(vkCreateComputePipelines),
168 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipeline),
169 MAKE_VULKAN_DEVICE_ENTRY(vkCreatePipelineLayout),
170 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipelineLayout),
171 MAKE_VULKAN_DEVICE_ENTRY(vkCreateSampler),
172 MAKE_VULKAN_DEVICE_ENTRY(vkDestroySampler),
173 MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorSetLayout),
174 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorSetLayout),
175 MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorPool),
176 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorPool),
177 MAKE_VULKAN_DEVICE_ENTRY(vkResetDescriptorPool),
178 MAKE_VULKAN_DEVICE_ENTRY(vkAllocateDescriptorSets),
179 MAKE_VULKAN_DEVICE_ENTRY(vkFreeDescriptorSets),
180 MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSets),
181 MAKE_VULKAN_DEVICE_ENTRY(vkCreateFramebuffer),
182 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyFramebuffer),
183 MAKE_VULKAN_DEVICE_ENTRY(vkCreateRenderPass),
184 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyRenderPass),
185 MAKE_VULKAN_DEVICE_ENTRY(vkGetRenderAreaGranularity),
186 MAKE_VULKAN_DEVICE_ENTRY(vkCreateCommandPool),
187 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyCommandPool),
188 MAKE_VULKAN_DEVICE_ENTRY(vkResetCommandPool),
189 MAKE_VULKAN_DEVICE_ENTRY(vkAllocateCommandBuffers),
190 MAKE_VULKAN_DEVICE_ENTRY(vkFreeCommandBuffers),
191 MAKE_VULKAN_DEVICE_ENTRY(vkBeginCommandBuffer),
192 MAKE_VULKAN_DEVICE_ENTRY(vkEndCommandBuffer),
193 MAKE_VULKAN_DEVICE_ENTRY(vkResetCommandBuffer),
194 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindPipeline),
195 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetViewport),
196 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetScissor),
197 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetLineWidth),
198 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthBias),
199 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetBlendConstants),
200 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthBounds),
201 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilCompareMask),
202 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilWriteMask),
203 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilReference),
204 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindDescriptorSets),
205 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindIndexBuffer),
206 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindVertexBuffers),
207 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDraw),
208 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexed),
209 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndirect),
210 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexedIndirect),
211 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatch),
212 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchIndirect),
213 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBuffer),
214 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImage),
215 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBlitImage),
216 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBufferToImage),
217 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImageToBuffer),
218 MAKE_VULKAN_DEVICE_ENTRY(vkCmdUpdateBuffer),
219 MAKE_VULKAN_DEVICE_ENTRY(vkCmdFillBuffer),
220 MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearColorImage),
221 MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearDepthStencilImage),
222 MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearAttachments),
223 MAKE_VULKAN_DEVICE_ENTRY(vkCmdResolveImage),
224 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetEvent),
225 MAKE_VULKAN_DEVICE_ENTRY(vkCmdResetEvent),
226 MAKE_VULKAN_DEVICE_ENTRY(vkCmdWaitEvents),
227 MAKE_VULKAN_DEVICE_ENTRY(vkCmdPipelineBarrier),
228 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginQuery),
229 MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndQuery),
230 MAKE_VULKAN_DEVICE_ENTRY(vkCmdResetQueryPool),
231 MAKE_VULKAN_DEVICE_ENTRY(vkCmdWriteTimestamp),
232 MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyQueryPoolResults),
233 MAKE_VULKAN_DEVICE_ENTRY(vkCmdPushConstants),
234 MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginRenderPass),
235 MAKE_VULKAN_DEVICE_ENTRY(vkCmdNextSubpass),
236 MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndRenderPass),
237 MAKE_VULKAN_DEVICE_ENTRY(vkCmdExecuteCommands),
238 MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory2),
239 MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory2),
240 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPeerMemoryFeatures),
241 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDeviceMask),
242 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchBase),
243 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements2),
244 MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements2),
245 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements2),
246 MAKE_VULKAN_DEVICE_ENTRY(vkTrimCommandPool),
247 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceQueue2),
248 MAKE_VULKAN_DEVICE_ENTRY(vkCreateSamplerYcbcrConversion),
249 MAKE_VULKAN_DEVICE_ENTRY(vkDestroySamplerYcbcrConversion),
250 MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorUpdateTemplate),
251 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorUpdateTemplate),
252 MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSetWithTemplate),
253 MAKE_VULKAN_DEVICE_ENTRY(vkGetDescriptorSetLayoutSupport),
Alexis Hetu352791e2019-05-17 16:42:34 -0400254#ifdef __ANDROID__
Hernan Liatis8a91a352019-04-29 17:14:06 -0700255 MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainGrallocUsageANDROID),
256 MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainGrallocUsage2ANDROID),
257 MAKE_VULKAN_DEVICE_ENTRY(vkAcquireImageANDROID),
258 MAKE_VULKAN_DEVICE_ENTRY(vkQueueSignalReleaseImageANDROID),
Chris Forbes1d667d62019-04-05 08:25:18 -0700259#endif
Nicolas Capensdc853642018-11-19 15:50:18 -0500260};
Alexis Hetu352791e2019-05-17 16:42:34 -0400261
262static const std::vector<std::pair<const char*, std::unordered_map<std::string, PFN_vkVoidFunction>>> deviceExtensionFunctionPointers =
263{
264 // VK_KHR_descriptor_update_template
265 {
266 VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME,
267 {
268 MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorUpdateTemplateKHR),
269 MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorUpdateTemplateKHR),
270 MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSetWithTemplateKHR),
271 }
272 },
273 // VK_KHR_device_group
274 {
275 VK_KHR_DEVICE_GROUP_EXTENSION_NAME,
276 {
277 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPeerMemoryFeaturesKHR),
278 MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDeviceMaskKHR),
279 MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchBaseKHR),
280 }
281 },
282 // VK_KHR_maintenance1
283 {
284 VK_KHR_MAINTENANCE1_EXTENSION_NAME,
285 {
286 MAKE_VULKAN_DEVICE_ENTRY(vkTrimCommandPoolKHR),
287 }
288 },
289 // VK_KHR_sampler_ycbcr_conversion
290 {
291 VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME,
292 {
293 MAKE_VULKAN_DEVICE_ENTRY(vkCreateSamplerYcbcrConversionKHR),
294 MAKE_VULKAN_DEVICE_ENTRY(vkDestroySamplerYcbcrConversionKHR),
295 }
296 },
297 // VK_KHR_bind_memory2
298 {
299 VK_KHR_BIND_MEMORY_2_EXTENSION_NAME,
300 {
301 MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory2KHR),
302 MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory2KHR),
303 }
304 },
305 // VK_KHR_get_memory_requirements2
306 {
307 VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME,
308 {
309 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements2KHR),
310 MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements2KHR),
311 MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements2KHR),
312 }
313 },
314 // VK_KHR_maintenance3
315 {
316 VK_KHR_MAINTENANCE3_EXTENSION_NAME,
317 {
318 MAKE_VULKAN_DEVICE_ENTRY(vkGetDescriptorSetLayoutSupportKHR),
319 }
320 },
321#ifndef __ANDROID__
322 // VK_KHR_swapchain
323 {
324 VK_KHR_SWAPCHAIN_EXTENSION_NAME,
325 {
326 MAKE_VULKAN_DEVICE_ENTRY(vkCreateSwapchainKHR),
327 MAKE_VULKAN_DEVICE_ENTRY(vkDestroySwapchainKHR),
328 MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainImagesKHR),
329 MAKE_VULKAN_DEVICE_ENTRY(vkAcquireNextImageKHR),
Chris Forbes25c8e082019-09-02 16:20:09 +0100330 MAKE_VULKAN_DEVICE_ENTRY(vkAcquireNextImage2KHR),
Alexis Hetu352791e2019-05-17 16:42:34 -0400331 MAKE_VULKAN_DEVICE_ENTRY(vkQueuePresentKHR),
332 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPresentCapabilitiesKHR),
333 MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupSurfacePresentModesKHR),
334 }
335 },
336#endif
337};
338
Nicolas Capensdc853642018-11-19 15:50:18 -0500339#undef MAKE_VULKAN_DEVICE_ENTRY
340
Alexis Hetu7d96f512019-06-13 18:23:56 -0400341PFN_vkVoidFunction GetInstanceProcAddr(Instance* instance, const char* pName)
Nicolas Capensdc853642018-11-19 15:50:18 -0500342{
343 auto globalFunction = globalFunctionPointers.find(std::string(pName));
344 if(globalFunction != globalFunctionPointers.end())
Alexis Hetud73b8712018-09-21 15:14:43 -0400345 {
Nicolas Capensdc853642018-11-19 15:50:18 -0500346 return globalFunction->second;
Alexis Hetud73b8712018-09-21 15:14:43 -0400347 }
Nicolas Capensdc853642018-11-19 15:50:18 -0500348
Alexis Hetu2d77aea2019-06-17 13:43:50 -0400349 if(instance)
Nicolas Capensdc853642018-11-19 15:50:18 -0500350 {
351 auto instanceFunction = instanceFunctionPointers.find(std::string(pName));
352 if(instanceFunction != instanceFunctionPointers.end())
353 {
354 return instanceFunction->second;
355 }
356
357 auto deviceFunction = deviceFunctionPointers.find(std::string(pName));
358 if(deviceFunction != deviceFunctionPointers.end())
359 {
360 return deviceFunction->second;
361 }
Chris Forbes9a4dab82019-05-17 17:15:47 -0700362
363 for(const auto& deviceExtensionFunctions : deviceExtensionFunctionPointers)
364 {
365 deviceFunction = deviceExtensionFunctions.second.find(std::string(pName));
366 if(deviceFunction != deviceExtensionFunctions.second.end())
367 {
368 return deviceFunction->second;
369 }
370 }
Nicolas Capensdc853642018-11-19 15:50:18 -0500371 }
372
373 return nullptr;
374}
375
Alexis Hetu7d96f512019-06-13 18:23:56 -0400376PFN_vkVoidFunction GetDeviceProcAddr(Device* device, const char* pName)
Nicolas Capensdc853642018-11-19 15:50:18 -0500377{
378 auto deviceFunction = deviceFunctionPointers.find(std::string(pName));
379 if(deviceFunction != deviceFunctionPointers.end())
380 {
381 return deviceFunction->second;
382 }
383
Alexis Hetu352791e2019-05-17 16:42:34 -0400384 for(const auto& deviceExtensionFunctions : deviceExtensionFunctionPointers)
385 {
Alexis Hetu7d96f512019-06-13 18:23:56 -0400386 if(device->hasExtension(deviceExtensionFunctions.first))
Alexis Hetu352791e2019-05-17 16:42:34 -0400387 {
388 deviceFunction = deviceExtensionFunctions.second.find(std::string(pName));
389 if(deviceFunction != deviceExtensionFunctions.second.end())
390 {
391 return deviceFunction->second;
392 }
393 }
394 }
395
Nicolas Capensdc853642018-11-19 15:50:18 -0500396 return nullptr;
397}
398
Alexis Hetud73b8712018-09-21 15:14:43 -0400399}
Chris Forbesb3596a62019-04-05 12:24:30 -0700400
401#ifdef __ANDROID__
402
403extern "C" hwvulkan_module_t HAL_MODULE_INFO_SYM;
404
405namespace {
406
407 int CloseDevice(struct hw_device_t *) { return 0; }
408
409 hwvulkan_device_t hal_device = {
410 .common = {
411 .tag = HARDWARE_DEVICE_TAG,
412 .version = HWVULKAN_DEVICE_API_VERSION_0_1,
413 .module = &HAL_MODULE_INFO_SYM.common,
414 .close = CloseDevice,
415 },
416 .EnumerateInstanceExtensionProperties = vkEnumerateInstanceExtensionProperties,
417 .CreateInstance = vkCreateInstance,
Chris Forbes37bc82a2019-05-29 14:50:33 -0700418 .GetInstanceProcAddr = vkGetInstanceProcAddr,
Chris Forbesb3596a62019-04-05 12:24:30 -0700419 };
420
421 int OpenDevice(const hw_module_t *module, const char *id, hw_device_t **device)
422 {
423 if (strcmp(id, HWVULKAN_DEVICE_0) != 0) return -ENOENT;
424 *device = &hal_device.common;
425 return 0;
426 }
427
428 hw_module_methods_t module_methods = { .open = OpenDevice };
429
430}
431
432extern "C" hwvulkan_module_t HAL_MODULE_INFO_SYM =
433{
434 .common =
435 {
436 .tag = HARDWARE_MODULE_TAG,
437 .module_api_version = HWVULKAN_MODULE_API_VERSION_0_1,
438 .hal_api_version = HARDWARE_HAL_API_VERSION,
439 .id = HWVULKAN_HARDWARE_MODULE_ID,
440 .name = "Swiftshader Pastel",
441 .author = "Google",
442 .methods = &module_methods,
443 }
444};
445
Alexis Hetu5e3c9d52019-05-15 10:42:23 -0400446#endif