blob: 84d666ecef025f6d766d3fbdda4982ad66b43861 [file] [log] [blame]
// 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.hpp"
#include "VkDevice.hpp"
#include <string>
#include <unordered_map>
#include <vector>
#ifdef __ANDROID__
# include <hardware/hwvulkan.h>
# include <vulkan/vk_android_native_buffer.h>
# include <cerrno>
#endif
namespace vk {
// Functions that can be obtained through GetInstanceProcAddr without an instance
#define MAKE_VULKAN_GLOBAL_ENTRY(aFunction) \
{ \
# aFunction, reinterpret_cast < PFN_vkVoidFunction>(aFunction) \
}
// TODO(b/208256248): Avoid exit-time destructor.
static const std::unordered_map<std::string, PFN_vkVoidFunction> globalFunctionPointers = {
MAKE_VULKAN_GLOBAL_ENTRY(vkGetInstanceProcAddr),
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
// Functions that can be obtained through GetInstanceProcAddr with an instance object
#define MAKE_VULKAN_INSTANCE_ENTRY(aFunction) \
{ \
# aFunction, reinterpret_cast < PFN_vkVoidFunction>(aFunction) \
}
// TODO(b/208256248): Avoid exit-time destructor.
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),
// VK_EXT_debug_utils
MAKE_VULKAN_INSTANCE_ENTRY(vkCmdBeginDebugUtilsLabelEXT),
MAKE_VULKAN_INSTANCE_ENTRY(vkCmdEndDebugUtilsLabelEXT),
MAKE_VULKAN_INSTANCE_ENTRY(vkCmdInsertDebugUtilsLabelEXT),
MAKE_VULKAN_INSTANCE_ENTRY(vkCreateDebugUtilsMessengerEXT),
MAKE_VULKAN_INSTANCE_ENTRY(vkDestroyDebugUtilsMessengerEXT),
MAKE_VULKAN_INSTANCE_ENTRY(vkQueueBeginDebugUtilsLabelEXT),
MAKE_VULKAN_INSTANCE_ENTRY(vkQueueEndDebugUtilsLabelEXT),
MAKE_VULKAN_INSTANCE_ENTRY(vkQueueInsertDebugUtilsLabelEXT),
MAKE_VULKAN_INSTANCE_ENTRY(vkSetDebugUtilsObjectNameEXT),
MAKE_VULKAN_INSTANCE_ENTRY(vkSetDebugUtilsObjectTagEXT),
MAKE_VULKAN_INSTANCE_ENTRY(vkSubmitDebugUtilsMessageEXT),
#ifndef __ANDROID__
// VK_KHR_surface
MAKE_VULKAN_INSTANCE_ENTRY(vkDestroySurfaceKHR),
MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceSupportKHR),
MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceCapabilitiesKHR),
MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfaceFormatsKHR),
MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceSurfacePresentModesKHR),
MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDevicePresentRectanglesKHR),
#endif
#ifdef VK_USE_PLATFORM_XCB_KHR
// VK_KHR_Xcb_surface
MAKE_VULKAN_INSTANCE_ENTRY(vkCreateXcbSurfaceKHR),
MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceXcbPresentationSupportKHR),
#endif
#ifdef VK_USE_PLATFORM_WAYLAND_KHR
// VK_KHR_wayland_surface
MAKE_VULKAN_INSTANCE_ENTRY(vkCreateWaylandSurfaceKHR),
MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceWaylandPresentationSupportKHR),
#endif
#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
// VK_EXT_directfb_surface
MAKE_VULKAN_INSTANCE_ENTRY(vkCreateDirectFBSurfaceEXT),
MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceDirectFBPresentationSupportEXT),
#endif
#ifdef VK_USE_PLATFORM_DISPLAY_KHR
// VK_KHR_display
MAKE_VULKAN_INSTANCE_ENTRY(vkCreateDisplayModeKHR),
MAKE_VULKAN_INSTANCE_ENTRY(vkCreateDisplayPlaneSurfaceKHR),
MAKE_VULKAN_INSTANCE_ENTRY(vkGetDisplayModePropertiesKHR),
MAKE_VULKAN_INSTANCE_ENTRY(vkGetDisplayPlaneCapabilitiesKHR),
MAKE_VULKAN_INSTANCE_ENTRY(vkGetDisplayPlaneSupportedDisplaysKHR),
MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceDisplayPlanePropertiesKHR),
MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceDisplayPropertiesKHR),
#endif
#ifdef VK_USE_PLATFORM_MACOS_MVK
// VK_MVK_macos_surface
MAKE_VULKAN_INSTANCE_ENTRY(vkCreateMacOSSurfaceMVK),
#endif
#ifdef VK_USE_PLATFORM_METAL_EXT
// VK_EXT_metal_surface
MAKE_VULKAN_INSTANCE_ENTRY(vkCreateMetalSurfaceEXT),
#endif
#ifdef VK_USE_PLATFORM_WIN32_KHR
// VK_KHR_win32_surface
MAKE_VULKAN_INSTANCE_ENTRY(vkCreateWin32SurfaceKHR),
MAKE_VULKAN_INSTANCE_ENTRY(vkGetPhysicalDeviceWin32PresentationSupportKHR),
#endif
MAKE_VULKAN_INSTANCE_ENTRY(vkCreateHeadlessSurfaceEXT),
};
#undef MAKE_VULKAN_INSTANCE_ENTRY
// Functions that can be obtained through GetDeviceProcAddr with a device object
#define MAKE_VULKAN_DEVICE_ENTRY(aFunction) \
{ \
# aFunction, reinterpret_cast < PFN_vkVoidFunction>(aFunction) \
}
// TODO(b/208256248): Avoid exit-time destructor.
static const std::unordered_map<std::string, PFN_vkVoidFunction> deviceFunctionPointers = {
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),
// Device level VK_EXT_debug_utils functions
MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginDebugUtilsLabelEXT),
MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndDebugUtilsLabelEXT),
MAKE_VULKAN_DEVICE_ENTRY(vkCmdInsertDebugUtilsLabelEXT),
MAKE_VULKAN_DEVICE_ENTRY(vkQueueBeginDebugUtilsLabelEXT),
MAKE_VULKAN_DEVICE_ENTRY(vkQueueEndDebugUtilsLabelEXT),
MAKE_VULKAN_DEVICE_ENTRY(vkQueueInsertDebugUtilsLabelEXT),
MAKE_VULKAN_DEVICE_ENTRY(vkSetDebugUtilsObjectNameEXT),
MAKE_VULKAN_DEVICE_ENTRY(vkSetDebugUtilsObjectTagEXT),
#ifdef __ANDROID__
MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainGrallocUsageANDROID),
MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainGrallocUsage2ANDROID),
MAKE_VULKAN_DEVICE_ENTRY(vkAcquireImageANDROID),
MAKE_VULKAN_DEVICE_ENTRY(vkQueueSignalReleaseImageANDROID),
#endif
// Vulkan 1.2 Entry point functions
MAKE_VULKAN_DEVICE_ENTRY(vkCreateRenderPass2),
MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginRenderPass2),
MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndRenderPass2),
MAKE_VULKAN_DEVICE_ENTRY(vkCmdNextSubpass2),
MAKE_VULKAN_DEVICE_ENTRY(vkResetQueryPool),
// VK_KHR_timeline_semaphore
MAKE_VULKAN_DEVICE_ENTRY(vkGetSemaphoreCounterValue),
MAKE_VULKAN_DEVICE_ENTRY(vkSignalSemaphore),
MAKE_VULKAN_DEVICE_ENTRY(vkWaitSemaphores),
// VK_KHR_buffer_device_address
MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferDeviceAddress),
MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferOpaqueCaptureAddress),
MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceMemoryOpaqueCaptureAddress),
// VK_KHR_draw_indirect_count
MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndirectCount),
MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexedIndirectCount),
};
// TODO(b/208256248): Avoid exit-time destructor.
static const std::vector<std::pair<const char *, std::unordered_map<std::string, PFN_vkVoidFunction>>> deviceExtensionFunctionPointers = {
// VK_KHR_descriptor_update_template
{
VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorUpdateTemplateKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorUpdateTemplateKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSetWithTemplateKHR),
} },
// VK_KHR_device_group
{
VK_KHR_DEVICE_GROUP_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPeerMemoryFeaturesKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDeviceMaskKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchBaseKHR),
} },
// VK_KHR_maintenance1
{
VK_KHR_MAINTENANCE1_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkTrimCommandPoolKHR),
} },
// VK_KHR_sampler_ycbcr_conversion
{
VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkCreateSamplerYcbcrConversionKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkDestroySamplerYcbcrConversionKHR),
} },
// VK_KHR_bind_memory2
{
VK_KHR_BIND_MEMORY_2_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory2KHR),
MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory2KHR),
} },
// VK_KHR_copy_commands2
{
VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkCmdBlitImage2KHR),
MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBuffer2KHR),
MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyBufferToImage2KHR),
MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImage2KHR),
MAKE_VULKAN_DEVICE_ENTRY(vkCmdCopyImageToBuffer2KHR),
MAKE_VULKAN_DEVICE_ENTRY(vkCmdResolveImage2KHR),
} },
// VK_KHR_get_memory_requirements2
{
VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements2KHR),
MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements2KHR),
MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements2KHR),
} },
// VK_KHR_maintenance3
{
VK_KHR_MAINTENANCE3_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkGetDescriptorSetLayoutSupportKHR),
} },
// VK_KHR_create_renderpass2
{
VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkCreateRenderPass2KHR),
MAKE_VULKAN_DEVICE_ENTRY(vkCmdBeginRenderPass2KHR),
MAKE_VULKAN_DEVICE_ENTRY(vkCmdNextSubpass2KHR),
MAKE_VULKAN_DEVICE_ENTRY(vkCmdEndRenderPass2KHR),
} },
// VK_KHR_timeline_semaphore
{
VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkGetSemaphoreCounterValueKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkSignalSemaphoreKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkWaitSemaphoresKHR),
} },
// VK_KHR_buffer_device_address
{
VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferDeviceAddressKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferOpaqueCaptureAddressKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceMemoryOpaqueCaptureAddressKHR),
} },
// VK_KHR_draw_indirect_count
{
VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndirectCountKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexedIndirectCountKHR),
} },
// VK_EXT_line_rasterization
{
VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetLineStippleEXT),
} },
// VK_EXT_host_query_reset
{
VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkResetQueryPoolEXT),
} },
#ifndef __ANDROID__
// VK_KHR_swapchain
{
VK_KHR_SWAPCHAIN_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkCreateSwapchainKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkDestroySwapchainKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainImagesKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkAcquireNextImageKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkAcquireNextImage2KHR),
MAKE_VULKAN_DEVICE_ENTRY(vkQueuePresentKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPresentCapabilitiesKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupSurfacePresentModesKHR),
} },
#endif
#if SWIFTSHADER_EXTERNAL_SEMAPHORE_OPAQUE_FD
// VK_KHR_external_semaphore_fd
{
VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkGetSemaphoreFdKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkImportSemaphoreFdKHR),
} },
#endif
#if VK_USE_PLATFORM_FUCHSIA
// VK_FUCHSIA_external_semaphore
{
VK_FUCHSIA_EXTERNAL_SEMAPHORE_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkGetSemaphoreZirconHandleFUCHSIA),
MAKE_VULKAN_DEVICE_ENTRY(vkImportSemaphoreZirconHandleFUCHSIA),
} },
#endif
#if SWIFTSHADER_EXTERNAL_MEMORY_OPAQUE_FD
// VK_KHR_external_memory_fd
{
VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryFdKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryFdPropertiesKHR),
} },
#endif
// VK_EXT_external_memory_host
{
VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryHostPointerPropertiesEXT),
} },
#if SWIFTSHADER_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER
// VK_ANDROID_external_memory_android_hardware_buffer
{
VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkGetAndroidHardwareBufferPropertiesANDROID),
MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryAndroidHardwareBufferANDROID),
} },
#endif
#if VK_USE_PLATFORM_FUCHSIA
// VK_FUCHSIA_external_memory
{
VK_FUCHSIA_EXTERNAL_MEMORY_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryZirconHandleFUCHSIA),
MAKE_VULKAN_DEVICE_ENTRY(vkGetMemoryZirconHandlePropertiesFUCHSIA),
} },
#endif
};
#undef MAKE_VULKAN_DEVICE_ENTRY
PFN_vkVoidFunction GetInstanceProcAddr(Instance *instance, const char *pName)
{
auto globalFunction = globalFunctionPointers.find(std::string(pName));
if(globalFunction != globalFunctionPointers.end())
{
return globalFunction->second;
}
if(instance)
{
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;
}
for(const auto &deviceExtensionFunctions : deviceExtensionFunctionPointers)
{
deviceFunction = deviceExtensionFunctions.second.find(std::string(pName));
if(deviceFunction != deviceExtensionFunctions.second.end())
{
return deviceFunction->second;
}
}
}
return nullptr;
}
PFN_vkVoidFunction GetDeviceProcAddr(Device *device, const char *pName)
{
auto deviceFunction = deviceFunctionPointers.find(std::string(pName));
if(deviceFunction != deviceFunctionPointers.end())
{
return deviceFunction->second;
}
for(const auto &deviceExtensionFunctions : deviceExtensionFunctionPointers)
{
if(device->hasExtension(deviceExtensionFunctions.first))
{
deviceFunction = deviceExtensionFunctions.second.find(std::string(pName));
if(deviceFunction != deviceExtensionFunctions.second.end())
{
return deviceFunction->second;
}
}
}
return nullptr;
}
} // namespace vk
#ifdef __ANDROID__
extern "C" hwvulkan_module_t HAL_MODULE_INFO_SYM;
namespace {
int CloseDevice(struct hw_device_t *)
{
return 0;
}
hwvulkan_device_t hal_device = {
.common = {
.tag = HARDWARE_DEVICE_TAG,
.version = HWVULKAN_DEVICE_API_VERSION_0_1,
.module = &HAL_MODULE_INFO_SYM.common,
.close = CloseDevice,
},
.EnumerateInstanceExtensionProperties = vkEnumerateInstanceExtensionProperties,
.CreateInstance = vkCreateInstance,
.GetInstanceProcAddr = vkGetInstanceProcAddr,
};
int OpenDevice(const hw_module_t *module, const char *id, hw_device_t **device)
{
if(strcmp(id, HWVULKAN_DEVICE_0) != 0) return -ENOENT;
*device = &hal_device.common;
return 0;
}
hw_module_methods_t module_methods = { .open = OpenDevice };
} // namespace
extern "C" hwvulkan_module_t HAL_MODULE_INFO_SYM = {
.common = {
.tag = HARDWARE_MODULE_TAG,
.module_api_version = HWVULKAN_MODULE_API_VERSION_0_1,
.hal_api_version = HARDWARE_HAL_API_VERSION,
.id = HWVULKAN_HARDWARE_MODULE_ID,
.name = "Swiftshader Pastel",
.author = "Google",
.methods = &module_methods,
}
};
#endif // __ANDROID__
#if VK_USE_PLATFORM_FUCHSIA
PFN_vkConnectToService vk::icdFuchsiaServiceConnectCallback = nullptr;
#endif