| // Copyright 2018 The SwiftShader Authors. All Rights Reserved. | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| #include "VkGetProcAddress.h" | |
| #include <unordered_map> | |
| #include <string> | |
| namespace vk | |
| { | |
| #define MAKE_VULKAN_GLOBAL_ENTRY(aFunction) { #aFunction, reinterpret_cast<PFN_vkVoidFunction>(aFunction) } | |
| static const std::unordered_map<std::string, PFN_vkVoidFunction> globalFunctionPointers = | |
| { | |
| MAKE_VULKAN_GLOBAL_ENTRY(vkCreateInstance), | |
| MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceExtensionProperties), | |
| MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceLayerProperties), | |
| MAKE_VULKAN_GLOBAL_ENTRY(vkEnumerateInstanceVersion), | |
| }; | |
| #undef MAKE_VULKAN_GLOBAL_ENTRY | |
| #define MAKE_VULKAN_INSTANCE_ENTRY(aFunction) { #aFunction, reinterpret_cast<PFN_vkVoidFunction>(aFunction) } | |
| static const std::unordered_map<std::string, PFN_vkVoidFunction> instanceFunctionPointers = | |
| { | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkDestroyInstance), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDevices), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkCreateDevice), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkEnumerateDeviceExtensionProperties), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkEnumerateDeviceLayerProperties), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDeviceGroups), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures2), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties2), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties2), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties2), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties2), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties2), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties2), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalBufferProperties), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalFenceProperties), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalSemaphoreProperties), | |
| // VK_KHR_device_group_creation | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkEnumeratePhysicalDeviceGroupsKHR), | |
| // VK_KHR_external_fence_capabilities | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalFencePropertiesKHR), | |
| // VK_KHR_external_memory_capabilities | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalBufferPropertiesKHR), | |
| // VK_KHR_external_semaphore_capabilities | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceExternalSemaphorePropertiesKHR), | |
| // VK_KHR_get_physical_device_properties2 | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFeatures2KHR), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceProperties2KHR), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceFormatProperties2KHR), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceImageFormatProperties2KHR), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceQueueFamilyProperties2KHR), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceMemoryProperties2KHR), | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSparseImageFormatProperties2KHR), | |
| }; | |
| #undef MAKE_VULKAN_GLOBAL_ENTRY | |
| #define MAKE_VULKAN_DEVICE_ENTRY(aFunction) { #aFunction, reinterpret_cast<PFN_vkVoidFunction>(aFunction) } | |
| static const std::unordered_map<std::string, PFN_vkVoidFunction> deviceFunctionPointers = | |
| { | |
| MAKE_VULKAN_DEVICE_ENTRY(vkGetInstanceProcAddr), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceProcAddr), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDevice), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceQueue), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkQueueSubmit), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkQueueWaitIdle), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDeviceWaitIdle), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkAllocateMemory), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkFreeMemory), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkMapMemory), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkUnmapMemory), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkFlushMappedMemoryRanges), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkInvalidateMappedMemoryRanges), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceMemoryCommitment), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkQueueBindSparse), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCreateFence), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDestroyFence), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkResetFences), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkGetFenceStatus), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkWaitForFences), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCreateSemaphore), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDestroySemaphore), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCreateEvent), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDestroyEvent), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkGetEventStatus), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkSetEvent), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkResetEvent), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCreateQueryPool), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDestroyQueryPool), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkGetQueryPoolResults), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCreateBuffer), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDestroyBuffer), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCreateBufferView), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDestroyBufferView), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCreateImage), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDestroyImage), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSubresourceLayout), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCreateImageView), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDestroyImageView), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCreateShaderModule), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDestroyShaderModule), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCreatePipelineCache), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipelineCache), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkGetPipelineCacheData), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkMergePipelineCaches), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCreateGraphicsPipelines), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCreateComputePipelines), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipeline), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCreatePipelineLayout), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDestroyPipelineLayout), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCreateSampler), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDestroySampler), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorSetLayout), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorSetLayout), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorPool), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorPool), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkResetDescriptorPool), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkAllocateDescriptorSets), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkFreeDescriptorSets), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSets), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCreateFramebuffer), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDestroyFramebuffer), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCreateRenderPass), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDestroyRenderPass), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkGetRenderAreaGranularity), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCreateCommandPool), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDestroyCommandPool), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkResetCommandPool), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkAllocateCommandBuffers), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkFreeCommandBuffers), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkBeginCommandBuffer), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkEndCommandBuffer), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkResetCommandBuffer), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindPipeline), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetViewport), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetScissor), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetLineWidth), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthBias), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetBlendConstants), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDepthBounds), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilCompareMask), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilWriteMask), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetStencilReference), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindDescriptorSets), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindIndexBuffer), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdBindVertexBuffers), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdDraw), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexed), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndirect), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexedIndirect), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatch), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchIndirect), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBuffer), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImage), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdBlitImage), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBufferToImage), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImageToBuffer), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdUpdateBuffer), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdFillBuffer), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearColorImage), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearDepthStencilImage), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdClearAttachments), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdResolveImage), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetEvent), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdResetEvent), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdWaitEvents), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdPipelineBarrier), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginQuery), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndQuery), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdResetQueryPool), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdWriteTimestamp), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyQueryPoolResults), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdPushConstants), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginRenderPass), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdNextSubpass), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndRenderPass), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdExecuteCommands), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory2), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory2), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPeerMemoryFeatures), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDeviceMask), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchBase), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements2), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements2), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements2), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkTrimCommandPool), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceQueue2), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCreateSamplerYcbcrConversion), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDestroySamplerYcbcrConversion), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorUpdateTemplate), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorUpdateTemplate), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSetWithTemplate), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkGetDescriptorSetLayoutSupport), | |
| // VK_KHR_descriptor_update_template | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorUpdateTemplateKHR), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorUpdateTemplateKHR), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSetWithTemplateKHR), | |
| // VK_KHR_device_group | |
| MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPeerMemoryFeaturesKHR), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDeviceMaskKHR), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchBaseKHR), | |
| // VK_KHR_maintenance1 | |
| MAKE_VULKAN_DEVICE_ENTRY(vkTrimCommandPoolKHR), | |
| // VK_KHR_sampler_ycbcr_conversion | |
| MAKE_VULKAN_DEVICE_ENTRY(vkCreateSamplerYcbcrConversionKHR), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkDestroySamplerYcbcrConversionKHR), | |
| // VK_KHR_bind_memory2 | |
| MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory2KHR), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory2KHR), | |
| // VK_KHR_get_memory_requirements2 | |
| MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements2KHR), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements2KHR), | |
| MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements2KHR), | |
| // VK_KHR_maintenance3 | |
| MAKE_VULKAN_INSTANCE_ENTRY(vkGetDescriptorSetLayoutSupportKHR), | |
| }; | |
| #undef MAKE_VULKAN_DEVICE_ENTRY | |
| PFN_vkVoidFunction GetInstanceProcAddr(VkInstance instance, const char* pName) | |
| { | |
| auto globalFunction = globalFunctionPointers.find(std::string(pName)); | |
| if(globalFunction != globalFunctionPointers.end()) | |
| { | |
| return globalFunction->second; | |
| } | |
| if(instance != VK_NULL_HANDLE) | |
| { | |
| auto instanceFunction = instanceFunctionPointers.find(std::string(pName)); | |
| if(instanceFunction != instanceFunctionPointers.end()) | |
| { | |
| return instanceFunction->second; | |
| } | |
| auto deviceFunction = deviceFunctionPointers.find(std::string(pName)); | |
| if(deviceFunction != deviceFunctionPointers.end()) | |
| { | |
| return deviceFunction->second; | |
| } | |
| } | |
| return nullptr; | |
| } | |
| PFN_vkVoidFunction GetDeviceProcAddr(VkDevice device, const char* pName) | |
| { | |
| auto deviceFunction = deviceFunctionPointers.find(std::string(pName)); | |
| if(deviceFunction != deviceFunctionPointers.end()) | |
| { | |
| return deviceFunction->second; | |
| } | |
| return nullptr; | |
| } | |
| } |