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