// 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; } }