OSDN Git Service

Disable surface and swapchain support for Android
[android-x86/external-swiftshader.git] / src / Vulkan / VkGetProcAddress.cpp
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.h"
16
17 #include <unordered_map>
18 #include <string>
19
20 #include <vulkan/vulkan.h>
21
22 namespace vk
23 {
24
25 #define MAKE_VULKAN_GLOBAL_ENTRY(aFunction) { #aFunction, reinterpret_cast<PFN_vkVoidFunction>(aFunction) }
26 static const std::unordered_map<std::string, PFN_vkVoidFunction> globalFunctionPointers =
27 {
28         MAKE_VULKAN_GLOBAL_ENTRY(vkCreateInstance),
29         MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceExtensionProperties),
30         MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceLayerProperties),
31         MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceVersion),
32 };
33 #undef MAKE_VULKAN_GLOBAL_ENTRY
34
35 #define MAKE_VULKAN_INSTANCE_ENTRY(aFunction) { #aFunction, reinterpret_cast<PFN_vkVoidFunction>(aFunction) }
36 static const std::unordered_map<std::string, PFN_vkVoidFunction> instanceFunctionPointers =
37 {
38         MAKE_VULKAN_INSTANCE_ENTRY(vkDestroyInstance),
39         MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDevices),
40         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures),
41         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties),
42         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties),
43         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties),
44         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties),
45         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties),
46         MAKE_VULKAN_INSTANCE_ENTRY(vkCreateDevice),
47         MAKE_VULKAN_INSTANCE_ENTRY(vkEnumerateDeviceExtensionProperties),
48         MAKE_VULKAN_INSTANCE_ENTRY(vkEnumerateDeviceLayerProperties),
49         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties),
50         MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDeviceGroups),
51         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures2),
52         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties2),
53         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties2),
54         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties2),
55         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties2),
56         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties2),
57         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties2),
58         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalBufferProperties),
59         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalFenceProperties),
60         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalSemaphoreProperties),
61         // VK_KHR_device_group_creation
62         MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDeviceGroupsKHR),
63         // VK_KHR_external_fence_capabilities
64         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalFencePropertiesKHR),
65         // VK_KHR_external_memory_capabilities
66         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalBufferPropertiesKHR),
67         // VK_KHR_external_semaphore_capabilities
68         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalSemaphorePropertiesKHR),
69         // VK_KHR_get_physical_device_properties2
70         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures2KHR),
71         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties2KHR),
72         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties2KHR),
73         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties2KHR),
74         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties2KHR),
75         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties2KHR),
76         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties2KHR),
77 #ifndef __ANDROID__
78         // VK_KHR_surface
79         MAKE_VULKAN_INSTANCE_ENTRY(vkDestroySurfaceKHR),
80         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceSupportKHR),
81         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceCapabilitiesKHR),
82         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceFormatsKHR),
83         MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfacePresentModesKHR),
84 #endif
85 #ifdef VK_USE_PLATFORM_XLIB_KHR
86         // VK_KHR_xlib_surface
87         MAKE_VULKAN_INSTANCE_ENTRY(vkCreateXlibSurfaceKHR),
88 #endif
89 };
90 #undef MAKE_VULKAN_INSTANCE_ENTRY
91
92 #define MAKE_VULKAN_DEVICE_ENTRY(aFunction) { #aFunction, reinterpret_cast<PFN_vkVoidFunction>(aFunction) }
93 static const std::unordered_map<std::string, PFN_vkVoidFunction> deviceFunctionPointers =
94 {
95         MAKE_VULKAN_DEVICE_ENTRY(vkGetInstanceProcAddr),
96         MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceProcAddr),
97         MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDevice),
98         MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceQueue),
99         MAKE_VULKAN_DEVICE_ENTRY(vkQueueSubmit),
100         MAKE_VULKAN_DEVICE_ENTRY(vkQueueWaitIdle),
101         MAKE_VULKAN_DEVICE_ENTRY(vkDeviceWaitIdle),
102         MAKE_VULKAN_DEVICE_ENTRY(vkAllocateMemory),
103         MAKE_VULKAN_DEVICE_ENTRY(vkFreeMemory),
104         MAKE_VULKAN_DEVICE_ENTRY(vkMapMemory),
105         MAKE_VULKAN_DEVICE_ENTRY(vkUnmapMemory),
106         MAKE_VULKAN_DEVICE_ENTRY(vkFlushMappedMemoryRanges),
107         MAKE_VULKAN_DEVICE_ENTRY(vkInvalidateMappedMemoryRanges),
108         MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceMemoryCommitment),
109         MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory),
110         MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory),
111         MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements),
112         MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements),
113         MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements),
114         MAKE_VULKAN_DEVICE_ENTRY(vkQueueBindSparse),
115         MAKE_VULKAN_DEVICE_ENTRY(vkCreateFence),
116         MAKE_VULKAN_DEVICE_ENTRY(vkDestroyFence),
117         MAKE_VULKAN_DEVICE_ENTRY(vkResetFences),
118         MAKE_VULKAN_DEVICE_ENTRY(vkGetFenceStatus),
119         MAKE_VULKAN_DEVICE_ENTRY(vkWaitForFences),
120         MAKE_VULKAN_DEVICE_ENTRY(vkCreateSemaphore),
121         MAKE_VULKAN_DEVICE_ENTRY(vkDestroySemaphore),
122         MAKE_VULKAN_DEVICE_ENTRY(vkCreateEvent),
123         MAKE_VULKAN_DEVICE_ENTRY(vkDestroyEvent),
124         MAKE_VULKAN_DEVICE_ENTRY(vkGetEventStatus),
125         MAKE_VULKAN_DEVICE_ENTRY(vkSetEvent),
126         MAKE_VULKAN_DEVICE_ENTRY(vkResetEvent),
127         MAKE_VULKAN_DEVICE_ENTRY(vkCreateQueryPool),
128         MAKE_VULKAN_DEVICE_ENTRY(vkDestroyQueryPool),
129         MAKE_VULKAN_DEVICE_ENTRY(vkGetQueryPoolResults),
130         MAKE_VULKAN_DEVICE_ENTRY(vkCreateBuffer),
131         MAKE_VULKAN_DEVICE_ENTRY(vkDestroyBuffer),
132         MAKE_VULKAN_DEVICE_ENTRY(vkCreateBufferView),
133         MAKE_VULKAN_DEVICE_ENTRY(vkDestroyBufferView),
134         MAKE_VULKAN_DEVICE_ENTRY(vkCreateImage),
135         MAKE_VULKAN_DEVICE_ENTRY(vkDestroyImage),
136         MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSubresourceLayout),
137         MAKE_VULKAN_DEVICE_ENTRY(vkCreateImageView),
138         MAKE_VULKAN_DEVICE_ENTRY(vkDestroyImageView),
139         MAKE_VULKAN_DEVICE_ENTRY(vkCreateShaderModule),
140         MAKE_VULKAN_DEVICE_ENTRY(vkDestroyShaderModule),
141         MAKE_VULKAN_DEVICE_ENTRY(vkCreatePipelineCache),
142         MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipelineCache),
143         MAKE_VULKAN_DEVICE_ENTRY(vkGetPipelineCacheData),
144         MAKE_VULKAN_DEVICE_ENTRY(vkMergePipelineCaches),
145         MAKE_VULKAN_DEVICE_ENTRY(vkCreateGraphicsPipelines),
146         MAKE_VULKAN_DEVICE_ENTRY(vkCreateComputePipelines),
147         MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipeline),
148         MAKE_VULKAN_DEVICE_ENTRY(vkCreatePipelineLayout),
149         MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipelineLayout),
150         MAKE_VULKAN_DEVICE_ENTRY(vkCreateSampler),
151         MAKE_VULKAN_DEVICE_ENTRY(vkDestroySampler),
152         MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorSetLayout),
153         MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorSetLayout),
154         MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorPool),
155         MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorPool),
156         MAKE_VULKAN_DEVICE_ENTRY(vkResetDescriptorPool),
157         MAKE_VULKAN_DEVICE_ENTRY(vkAllocateDescriptorSets),
158         MAKE_VULKAN_DEVICE_ENTRY(vkFreeDescriptorSets),
159         MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSets),
160         MAKE_VULKAN_DEVICE_ENTRY(vkCreateFramebuffer),
161         MAKE_VULKAN_DEVICE_ENTRY(vkDestroyFramebuffer),
162         MAKE_VULKAN_DEVICE_ENTRY(vkCreateRenderPass),
163         MAKE_VULKAN_DEVICE_ENTRY(vkDestroyRenderPass),
164         MAKE_VULKAN_DEVICE_ENTRY(vkGetRenderAreaGranularity),
165         MAKE_VULKAN_DEVICE_ENTRY(vkCreateCommandPool),
166         MAKE_VULKAN_DEVICE_ENTRY(vkDestroyCommandPool),
167         MAKE_VULKAN_DEVICE_ENTRY(vkResetCommandPool),
168         MAKE_VULKAN_DEVICE_ENTRY(vkAllocateCommandBuffers),
169         MAKE_VULKAN_DEVICE_ENTRY(vkFreeCommandBuffers),
170         MAKE_VULKAN_DEVICE_ENTRY(vkBeginCommandBuffer),
171         MAKE_VULKAN_DEVICE_ENTRY(vkEndCommandBuffer),
172         MAKE_VULKAN_DEVICE_ENTRY(vkResetCommandBuffer),
173         MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindPipeline),
174         MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetViewport),
175         MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetScissor),
176         MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetLineWidth),
177         MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthBias),
178         MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetBlendConstants),
179         MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthBounds),
180         MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilCompareMask),
181         MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilWriteMask),
182         MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilReference),
183         MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindDescriptorSets),
184         MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindIndexBuffer),
185         MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindVertexBuffers),
186         MAKE_VULKAN_DEVICE_ENTRY(vkCmdDraw),
187         MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexed),
188         MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndirect),
189         MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexedIndirect),
190         MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatch),
191         MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchIndirect),
192         MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBuffer),
193         MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImage),
194         MAKE_VULKAN_DEVICE_ENTRY(vkCmdBlitImage),
195         MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBufferToImage),
196         MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImageToBuffer),
197         MAKE_VULKAN_DEVICE_ENTRY(vkCmdUpdateBuffer),
198         MAKE_VULKAN_DEVICE_ENTRY(vkCmdFillBuffer),
199         MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearColorImage),
200         MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearDepthStencilImage),
201         MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearAttachments),
202         MAKE_VULKAN_DEVICE_ENTRY(vkCmdResolveImage),
203         MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetEvent),
204         MAKE_VULKAN_DEVICE_ENTRY(vkCmdResetEvent),
205         MAKE_VULKAN_DEVICE_ENTRY(vkCmdWaitEvents),
206         MAKE_VULKAN_DEVICE_ENTRY(vkCmdPipelineBarrier),
207         MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginQuery),
208         MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndQuery),
209         MAKE_VULKAN_DEVICE_ENTRY(vkCmdResetQueryPool),
210         MAKE_VULKAN_DEVICE_ENTRY(vkCmdWriteTimestamp),
211         MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyQueryPoolResults),
212         MAKE_VULKAN_DEVICE_ENTRY(vkCmdPushConstants),
213         MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginRenderPass),
214         MAKE_VULKAN_DEVICE_ENTRY(vkCmdNextSubpass),
215         MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndRenderPass),
216         MAKE_VULKAN_DEVICE_ENTRY(vkCmdExecuteCommands),
217         MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory2),
218         MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory2),
219         MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPeerMemoryFeatures),
220         MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDeviceMask),
221         MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchBase),
222         MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements2),
223         MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements2),
224         MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements2),
225         MAKE_VULKAN_DEVICE_ENTRY(vkTrimCommandPool),
226         MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceQueue2),
227         MAKE_VULKAN_DEVICE_ENTRY(vkCreateSamplerYcbcrConversion),
228         MAKE_VULKAN_DEVICE_ENTRY(vkDestroySamplerYcbcrConversion),
229         MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorUpdateTemplate),
230         MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorUpdateTemplate),
231         MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSetWithTemplate),
232         MAKE_VULKAN_DEVICE_ENTRY(vkGetDescriptorSetLayoutSupport),
233         // VK_KHR_descriptor_update_template
234         MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorUpdateTemplateKHR),
235         MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorUpdateTemplateKHR),
236         MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSetWithTemplateKHR),
237         // VK_KHR_device_group
238         MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPeerMemoryFeaturesKHR),
239         MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDeviceMaskKHR),
240         MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchBaseKHR),
241         // VK_KHR_maintenance1
242         MAKE_VULKAN_DEVICE_ENTRY(vkTrimCommandPoolKHR),
243         // VK_KHR_sampler_ycbcr_conversion
244         MAKE_VULKAN_DEVICE_ENTRY(vkCreateSamplerYcbcrConversionKHR),
245         MAKE_VULKAN_DEVICE_ENTRY(vkDestroySamplerYcbcrConversionKHR),
246         // VK_KHR_bind_memory2
247         MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory2KHR),
248         MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory2KHR),
249         // VK_KHR_get_memory_requirements2
250         MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements2KHR),
251         MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements2KHR),
252         MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements2KHR),
253         // VK_KHR_maintenance3
254         MAKE_VULKAN_DEVICE_ENTRY(vkGetDescriptorSetLayoutSupportKHR),
255 #ifndef __ANDROID__
256         // VK_KHR_swapchain
257         MAKE_VULKAN_DEVICE_ENTRY(vkCreateSwapchainKHR),
258         MAKE_VULKAN_DEVICE_ENTRY(vkDestroySwapchainKHR),
259         MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainImagesKHR),
260         MAKE_VULKAN_DEVICE_ENTRY(vkAcquireNextImageKHR),
261         MAKE_VULKAN_DEVICE_ENTRY(vkQueuePresentKHR),
262 #endif
263 };
264 #undef MAKE_VULKAN_DEVICE_ENTRY
265
266 PFN_vkVoidFunction GetInstanceProcAddr(VkInstance instance, const char* pName)
267 {
268         auto globalFunction = globalFunctionPointers.find(std::string(pName));
269         if(globalFunction != globalFunctionPointers.end())
270         {
271                 return globalFunction->second;
272         }
273
274         if(instance != VK_NULL_HANDLE)
275         {
276                 auto instanceFunction = instanceFunctionPointers.find(std::string(pName));
277                 if(instanceFunction != instanceFunctionPointers.end())
278                 {
279                         return instanceFunction->second;
280                 }
281
282                 auto deviceFunction = deviceFunctionPointers.find(std::string(pName));
283                 if(deviceFunction != deviceFunctionPointers.end())
284                 {
285                         return deviceFunction->second;
286                 }
287         }
288
289         return nullptr;
290 }
291
292 PFN_vkVoidFunction GetDeviceProcAddr(VkDevice device, const char* pName)
293 {
294         auto deviceFunction = deviceFunctionPointers.find(std::string(pName));
295         if(deviceFunction != deviceFunctionPointers.end())
296         {
297                 return deviceFunction->second;
298         }
299
300         return nullptr;
301 }
302
303 }