Module: Mesa Branch: main Commit: 228329f4da025db41a7144e7a2a7fc1bfd4c907a URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=228329f4da025db41a7144e7a2a7fc1bfd4c907a
Author: Jesse Natalie <jenat...@microsoft.com> Date: Wed Nov 1 13:52:32 2023 -0700 vulkan: Consolidate common ICD methods Reviewed-by: Faith Ekstrand <faith.ekstr...@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25998> --- docs/vulkan/base-objs.rst | 8 --- src/amd/vulkan/radv_instance.c | 55 --------------------- src/broadcom/vulkan/v3dv_device.c | 59 ---------------------- src/freedreno/vulkan/tu_device.cc | 60 ---------------------- src/gallium/frontends/lavapipe/lvp_device.c | 56 --------------------- src/imagination/vulkan/pvr_device.c | 52 ------------------- src/intel/vulkan/anv_device.c | 58 ---------------------- src/intel/vulkan_hasvk/anv_device.c | 59 ---------------------- src/microsoft/vulkan/dzn_device.c | 58 ---------------------- src/nouveau/vulkan/nvk_instance.c | 47 ------------------ src/nouveau/vulkan/nvk_physical_device.c | 7 --- src/panfrost/vulkan/panvk_device.c | 59 ---------------------- src/virtio/vulkan/vn_icd.c | 27 +--------- src/vulkan/runtime/vk_instance.c | 77 +++++++++++++++++++++++++++++ src/vulkan/runtime/vk_instance.h | 3 ++ 15 files changed, 81 insertions(+), 604 deletions(-) diff --git a/docs/vulkan/base-objs.rst b/docs/vulkan/base-objs.rst index cb923fb0d88..5af67b243c5 100644 --- a/docs/vulkan/base-objs.rst +++ b/docs/vulkan/base-objs.rst @@ -125,14 +125,6 @@ instance-level ``vkGet*ProcAddr()`` entrypoints is trivial: return drv_GetInstanceProcAddr(instance, pName); } - PUBLIC VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL - vk_icdGetPhysicalDeviceProcAddr(VkInstance _instance, - const char* pName) - { - VK_FROM_HANDLE(vk_instance, instance, _instance); - return vk_instance_get_physical_device_proc_addr(instance, pName); - } - .. c:autofunction:: vk_instance_get_proc_addr .. c:autofunction:: vk_instance_get_proc_addr_unchecked diff --git a/src/amd/vulkan/radv_instance.c b/src/amd/vulkan/radv_instance.c index 72a2eb35c46..4757fe89949 100644 --- a/src/amd/vulkan/radv_instance.c +++ b/src/amd/vulkan/radv_instance.c @@ -370,53 +370,6 @@ radv_GetInstanceProcAddr(VkInstance _instance, const char *pName) #define PUBLIC #endif -PUBLIC VKAPI_ATTR VkResult VKAPI_CALL -vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t *pSupportedVersion) -{ - /* For the full details on loader interface versioning, see - * <https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/master/loader/LoaderAndLayerInterface.md>. - * What follows is a condensed summary, to help you navigate the large and - * confusing official doc. - * - * - Loader interface v0 is incompatible with later versions. We don't - * support it. - * - * - In loader interface v1: - * - The first ICD entrypoint called by the loader is - * vk_icdGetInstanceProcAddr(). The ICD must statically expose this - * entrypoint. - * - The ICD must statically expose no other Vulkan symbol unless it is - * linked with -Bsymbolic. - * - Each dispatchable Vulkan handle created by the ICD must be - * a pointer to a struct whose first member is VK_LOADER_DATA. The - * ICD must initialize VK_LOADER_DATA.loadMagic to ICD_LOADER_MAGIC. - * - The loader implements vkCreate{PLATFORM}SurfaceKHR() and - * vkDestroySurfaceKHR(). The ICD must be capable of working with - * such loader-managed surfaces. - * - * - Loader interface v2 differs from v1 in: - * - The first ICD entrypoint called by the loader is - * vk_icdNegotiateLoaderICDInterfaceVersion(). The ICD must - * statically expose this entrypoint. - * - * - Loader interface v3 differs from v2 in: - * - The ICD must implement vkCreate{PLATFORM}SurfaceKHR(), - * vkDestroySurfaceKHR(), and other API which uses VKSurfaceKHR, - * because the loader no longer does so. - * - * - Loader interface v4 differs from v3 in: - * - The ICD must implement vk_icdGetPhysicalDeviceProcAddr(). - * - * - Loader interface v5 differs from v4 in: - * - The ICD must support Vulkan API version 1.1 and must not return - * VK_ERROR_INCOMPATIBLE_DRIVER from vkCreateInstance() unless a - * Vulkan Loader with interface v4 or smaller is being used and the - * application provides an API version that is greater than 1.0. - */ - *pSupportedVersion = MIN2(*pSupportedVersion, 5u); - return VK_SUCCESS; -} - /* The loader wants us to expose a second GetInstanceProcAddr function * to work around certain LD_PRELOAD issues seen in apps. */ @@ -426,11 +379,3 @@ vk_icdGetInstanceProcAddr(VkInstance instance, const char *pName) { return radv_GetInstanceProcAddr(instance, pName); } - -PUBLIC -VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL -vk_icdGetPhysicalDeviceProcAddr(VkInstance _instance, const char *pName) -{ - RADV_FROM_HANDLE(radv_instance, instance, _instance); - return vk_instance_get_physical_device_proc_addr(&instance->vk, pName); -} diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index a7d88ba73c4..48fcf40bbf5 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -1833,18 +1833,6 @@ vk_icdGetInstanceProcAddr(VkInstance instance, return v3dv_GetInstanceProcAddr(instance, pName); } -/* With version 4+ of the loader interface the ICD should expose - * vk_icdGetPhysicalDeviceProcAddr() - */ -PFN_vkVoidFunction -vk_icdGetPhysicalDeviceProcAddr(VkInstance _instance, - const char* pName) -{ - V3DV_FROM_HANDLE(v3dv_instance, instance, _instance); - - return vk_instance_get_physical_device_proc_addr(&instance->vk, pName); -} - VKAPI_ATTR VkResult VKAPI_CALL v3dv_EnumerateInstanceLayerProperties(uint32_t *pPropertyCount, VkLayerProperties *pProperties) @@ -3089,53 +3077,6 @@ v3dv_GetDeviceImageSparseMemoryRequirementsKHR( *pSparseMemoryRequirementCount = 0; } -PUBLIC VKAPI_ATTR VkResult VKAPI_CALL -vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t* pSupportedVersion) -{ - /* For the full details on loader interface versioning, see - * <https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/master/loader/LoaderAndLayerInterface.md>. - * What follows is a condensed summary, to help you navigate the large and - * confusing official doc. - * - * - Loader interface v0 is incompatible with later versions. We don't - * support it. - * - * - In loader interface v1: - * - The first ICD entrypoint called by the loader is - * vk_icdGetInstanceProcAddr(). The ICD must statically expose this - * entrypoint. - * - The ICD must statically expose no other Vulkan symbol unless it is - * linked with -Bsymbolic. - * - Each dispatchable Vulkan handle created by the ICD must be - * a pointer to a struct whose first member is VK_LOADER_DATA. The - * ICD must initialize VK_LOADER_DATA.loadMagic to ICD_LOADER_MAGIC. - * - The loader implements vkCreate{PLATFORM}SurfaceKHR() and - * vkDestroySurfaceKHR(). The ICD must be capable of working with - * such loader-managed surfaces. - * - * - Loader interface v2 differs from v1 in: - * - The first ICD entrypoint called by the loader is - * vk_icdNegotiateLoaderICDInterfaceVersion(). The ICD must - * statically expose this entrypoint. - * - * - Loader interface v3 differs from v2 in: - * - The ICD must implement vkCreate{PLATFORM}SurfaceKHR(), - * vkDestroySurfaceKHR(), and other API which uses VKSurfaceKHR, - * because the loader no longer does so. - * - * - Loader interface v4 differs from v3 in: - * - The ICD must implement vk_icdGetPhysicalDeviceProcAddr(). - * - * - Loader interface v5 differs from v4 in: - * - The ICD must support Vulkan API version 1.1 and must not return - * VK_ERROR_INCOMPATIBLE_DRIVER from vkCreateInstance() unless a - * Vulkan Loader with interface v4 or smaller is being used and the - * application provides an API version that is greater than 1.0. - */ - *pSupportedVersion = MIN2(*pSupportedVersion, 5u); - return VK_SUCCESS; -} - VkDeviceAddress v3dv_GetBufferDeviceAddress(VkDevice device, const VkBufferDeviceAddressInfoKHR *pInfo) diff --git a/src/freedreno/vulkan/tu_device.cc b/src/freedreno/vulkan/tu_device.cc index 03bc39edd76..9034b5c342f 100644 --- a/src/freedreno/vulkan/tu_device.cc +++ b/src/freedreno/vulkan/tu_device.cc @@ -2575,18 +2575,6 @@ vk_icdGetInstanceProcAddr(VkInstance instance, const char *pName) return tu_GetInstanceProcAddr(instance, pName); } -/* With version 4+ of the loader interface the ICD should expose - * vk_icdGetPhysicalDeviceProcAddr() - */ -PFN_vkVoidFunction -vk_icdGetPhysicalDeviceProcAddr(VkInstance _instance, - const char* pName) -{ - TU_FROM_HANDLE(tu_instance, instance, _instance); - - return vk_instance_get_physical_device_proc_addr(&instance->vk, pName); -} - VKAPI_ATTR VkResult VKAPI_CALL tu_AllocateMemory(VkDevice _device, const VkMemoryAllocateInfo *pAllocateInfo, @@ -3207,54 +3195,6 @@ tu_DestroySampler(VkDevice _device, vk_object_free(&device->vk, pAllocator, sampler); } -PUBLIC VKAPI_ATTR VkResult VKAPI_CALL -vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t *pSupportedVersion) -{ - /* For the full details on loader interface versioning, see - * <https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/master/loader/LoaderAndLayerInterface.md>. - * What follows is a condensed summary, to help you navigate the large and - * confusing official doc. - * - * - Loader interface v0 is incompatible with later versions. We don't - * support it. - * - * - In loader interface v1: - * - The first ICD entrypoint called by the loader is - * vk_icdGetInstanceProcAddr(). The ICD must statically expose this - * entrypoint. - * - The ICD must statically expose no other Vulkan symbol unless it - * is linked with -Bsymbolic. - * - Each dispatchable Vulkan handle created by the ICD must be - * a pointer to a struct whose first member is VK_LOADER_DATA. The - * ICD must initialize VK_LOADER_DATA.loadMagic to - * ICD_LOADER_MAGIC. - * - The loader implements vkCreate{PLATFORM}SurfaceKHR() and - * vkDestroySurfaceKHR(). The ICD must be capable of working with - * such loader-managed surfaces. - * - * - Loader interface v2 differs from v1 in: - * - The first ICD entrypoint called by the loader is - * vk_icdNegotiateLoaderICDInterfaceVersion(). The ICD must - * statically expose this entrypoint. - * - * - Loader interface v3 differs from v2 in: - * - The ICD must implement vkCreate{PLATFORM}SurfaceKHR(), - * vkDestroySurfaceKHR(), and other API which uses VKSurfaceKHR, - * because the loader no longer does so. - * - * - Loader interface v4 differs from v3 in: - * - The ICD must implement vk_icdGetPhysicalDeviceProcAddr(). - * - * - Loader interface v5 differs from v4 in: - * - The ICD must support Vulkan API version 1.1 and must not return - * VK_ERROR_INCOMPATIBLE_DRIVER from vkCreateInstance() unless a - * Vulkan Loader with interface v4 or smaller is being used and the - * application provides an API version that is greater than 1.0. - */ - *pSupportedVersion = MIN2(*pSupportedVersion, 5u); - return VK_SUCCESS; -} - VKAPI_ATTR VkResult VKAPI_CALL tu_GetMemoryFdKHR(VkDevice _device, const VkMemoryGetFdInfoKHR *pGetFdInfo, diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c index 82a804c6e5f..f84b7e5d06e 100644 --- a/src/gallium/frontends/lavapipe/lvp_device.c +++ b/src/gallium/frontends/lavapipe/lvp_device.c @@ -1376,15 +1376,6 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_icdGetInstanceProcAddr( return lvp_GetInstanceProcAddr(instance, pName); } -PUBLIC -VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_icdGetPhysicalDeviceProcAddr( - VkInstance _instance, - const char* pName) -{ - LVP_FROM_HANDLE(lvp_instance, instance, _instance); - return vk_instance_get_physical_device_proc_addr(&instance->vk, pName); -} - static void destroy_pipelines(struct lvp_queue *queue) { @@ -2286,53 +2277,6 @@ VKAPI_ATTR void VKAPI_CALL lvp_DestroySampler( vk_sampler_destroy(&device->vk, pAllocator, &sampler->vk); } -PUBLIC VKAPI_ATTR VkResult VKAPI_CALL -vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t* pSupportedVersion) -{ - /* For the full details on loader interface versioning, see - * <https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/master/loader/LoaderAndLayerInterface.md>. - * What follows is a condensed summary, to help you navigate the large and - * confusing official doc. - * - * - Loader interface v0 is incompatible with later versions. We don't - * support it. - * - * - In loader interface v1: - * - The first ICD entrypoint called by the loader is - * vk_icdGetInstanceProcAddr(). The ICD must statically expose this - * entrypoint. - * - The ICD must statically expose no other Vulkan symbol unless it is - * linked with -Bsymbolic. - * - Each dispatchable Vulkan handle created by the ICD must be - * a pointer to a struct whose first member is VK_LOADER_DATA. The - * ICD must initialize VK_LOADER_DATA.loadMagic to ICD_LOADER_MAGIC. - * - The loader implements vkCreate{PLATFORM}SurfaceKHR() and - * vkDestroySurfaceKHR(). The ICD must be capable of working with - * such loader-managed surfaces. - * - * - Loader interface v2 differs from v1 in: - * - The first ICD entrypoint called by the loader is - * vk_icdNegotiateLoaderICDInterfaceVersion(). The ICD must - * statically expose this entrypoint. - * - * - Loader interface v3 differs from v2 in: - * - The ICD must implement vkCreate{PLATFORM}SurfaceKHR(), - * vkDestroySurfaceKHR(), and other API which uses VKSurfaceKHR, - * because the loader no longer does so. - * - * - Loader interface v4 differs from v3 in: - * - The ICD must implement vk_icdGetPhysicalDeviceProcAddr(). - * - * - Loader interface v5 differs from v4 in: - * - The ICD must support Vulkan API version 1.1 and must not return - * VK_ERROR_INCOMPATIBLE_DRIVER from vkCreateInstance() unless a - * Vulkan Loader with interface v4 or smaller is being used and the - * application provides an API version that is greater than 1.0. - */ - *pSupportedVersion = MIN2(*pSupportedVersion, 5u); - return VK_SUCCESS; -} - VKAPI_ATTR VkResult VKAPI_CALL lvp_CreatePrivateDataSlotEXT( VkDevice _device, const VkPrivateDataSlotCreateInfo* pCreateInfo, diff --git a/src/imagination/vulkan/pvr_device.c b/src/imagination/vulkan/pvr_device.c index 5862590deee..4b94d20254d 100644 --- a/src/imagination/vulkan/pvr_device.c +++ b/src/imagination/vulkan/pvr_device.c @@ -1234,17 +1234,6 @@ vk_icdGetInstanceProcAddr(VkInstance instance, const char *pName) return pvr_GetInstanceProcAddr(instance, pName); } -/* With version 4+ of the loader interface the ICD should expose - * vk_icdGetPhysicalDeviceProcAddr(). - */ -PUBLIC -VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL -vk_icdGetPhysicalDeviceProcAddr(VkInstance _instance, const char *pName) -{ - PVR_FROM_HANDLE(pvr_instance, instance, _instance); - return vk_instance_get_physical_device_proc_addr(&instance->vk, pName); -} - VkResult pvr_pds_compute_shader_create_and_upload( struct pvr_device *device, struct pvr_pds_compute_shader_program *program, @@ -2976,47 +2965,6 @@ void pvr_DestroyFramebuffer(VkDevice _device, vk_free2(&device->vk.alloc, pAllocator, framebuffer); } -PUBLIC VKAPI_ATTR VkResult VKAPI_CALL -vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t *pSupportedVersion) -{ - /* For the full details on loader interface versioning, see - * <https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/master/loader/LoaderAndLayerInterface.md>. - * What follows is a condensed summary, to help you navigate the large and - * confusing official doc. - * - * - Loader interface v0 is incompatible with later versions. We don't - * support it. - * - * - In loader interface v1: - * - The first ICD entrypoint called by the loader is - * vk_icdGetInstanceProcAddr(). The ICD must statically expose this - * entrypoint. - * - The ICD must statically expose no other Vulkan symbol unless it - * is linked with -Bsymbolic. - * - Each dispatchable Vulkan handle created by the ICD must be - * a pointer to a struct whose first member is VK_LOADER_DATA. The - * ICD must initialize VK_LOADER_DATA.loadMagic to ICD_LOADER_MAGIC. - * - The loader implements vkCreate{PLATFORM}SurfaceKHR() and - * vkDestroySurfaceKHR(). The ICD must be capable of working with - * such loader-managed surfaces. - * - * - Loader interface v2 differs from v1 in: - * - The first ICD entrypoint called by the loader is - * vk_icdNegotiateLoaderICDInterfaceVersion(). The ICD must - * statically expose this entrypoint. - * - * - Loader interface v3 differs from v2 in: - * - The ICD must implement vkCreate{PLATFORM}SurfaceKHR(), - * vkDestroySurfaceKHR(), and other API which uses VKSurfaceKHR, - * because the loader no longer does so. - * - * - Loader interface v4 differs from v3 in: - * - The ICD must implement vk_icdGetPhysicalDeviceProcAddr(). - */ - *pSupportedVersion = MIN2(*pSupportedVersion, 4u); - return VK_SUCCESS; -} - static uint32_t pvr_sampler_get_hw_filter_from_vk(const struct pvr_device_info *dev_info, VkFilter filter) diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index ab3f760f42e..d317412c33a 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -2840,17 +2840,6 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_icdGetInstanceProcAddr( return anv_GetInstanceProcAddr(instance, pName); } -/* With version 4+ of the loader interface the ICD should expose - * vk_icdGetPhysicalDeviceProcAddr() - */ -PFN_vkVoidFunction vk_icdGetPhysicalDeviceProcAddr( - VkInstance _instance, - const char* pName) -{ - ANV_FROM_HANDLE(anv_instance, instance, _instance); - return vk_instance_get_physical_device_proc_addr(&instance->vk, pName); -} - static struct anv_state anv_state_pool_emit_data(struct anv_state_pool *pool, size_t size, size_t align, const void *p) { @@ -4877,53 +4866,6 @@ void anv_GetPhysicalDeviceMultisamplePropertiesEXT( anv_debug_ignored_stype(ext->sType); } -PUBLIC VKAPI_ATTR VkResult VKAPI_CALL -vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t* pSupportedVersion) -{ - /* For the full details on loader interface versioning, see - * <https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/master/loader/LoaderAndLayerInterface.md>. - * What follows is a condensed summary, to help you navigate the large and - * confusing official doc. - * - * - Loader interface v0 is incompatible with later versions. We don't - * support it. - * - * - In loader interface v1: - * - The first ICD entrypoint called by the loader is - * vk_icdGetInstanceProcAddr(). The ICD must statically expose this - * entrypoint. - * - The ICD must statically expose no other Vulkan symbol unless it is - * linked with -Bsymbolic. - * - Each dispatchable Vulkan handle created by the ICD must be - * a pointer to a struct whose first member is VK_LOADER_DATA. The - * ICD must initialize VK_LOADER_DATA.loadMagic to ICD_LOADER_MAGIC. - * - The loader implements vkCreate{PLATFORM}SurfaceKHR() and - * vkDestroySurfaceKHR(). The ICD must be capable of working with - * such loader-managed surfaces. - * - * - Loader interface v2 differs from v1 in: - * - The first ICD entrypoint called by the loader is - * vk_icdNegotiateLoaderICDInterfaceVersion(). The ICD must - * statically expose this entrypoint. - * - * - Loader interface v3 differs from v2 in: - * - The ICD must implement vkCreate{PLATFORM}SurfaceKHR(), - * vkDestroySurfaceKHR(), and other API which uses VKSurfaceKHR, - * because the loader no longer does so. - * - * - Loader interface v4 differs from v3 in: - * - The ICD must implement vk_icdGetPhysicalDeviceProcAddr(). - * - * - Loader interface v5 differs from v4 in: - * - The ICD must support Vulkan API version 1.1 and must not return - * VK_ERROR_INCOMPATIBLE_DRIVER from vkCreateInstance() unless a - * Vulkan Loader with interface v4 or smaller is being used and the - * application provides an API version that is greater than 1.0. - */ - *pSupportedVersion = MIN2(*pSupportedVersion, 5u); - return VK_SUCCESS; -} - VkResult anv_GetPhysicalDeviceFragmentShadingRatesKHR( VkPhysicalDevice physicalDevice, uint32_t* pFragmentShadingRateCount, diff --git a/src/intel/vulkan_hasvk/anv_device.c b/src/intel/vulkan_hasvk/anv_device.c index 9d523423e78..cb4c5b5b7b4 100644 --- a/src/intel/vulkan_hasvk/anv_device.c +++ b/src/intel/vulkan_hasvk/anv_device.c @@ -2249,18 +2249,6 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_icdGetInstanceProcAddr( { return anv_GetInstanceProcAddr(instance, pName); } - -/* With version 4+ of the loader interface the ICD should expose - * vk_icdGetPhysicalDeviceProcAddr() - */ -PFN_vkVoidFunction vk_icdGetPhysicalDeviceProcAddr( - VkInstance _instance, - const char* pName) -{ - ANV_FROM_HANDLE(anv_instance, instance, _instance); - return vk_instance_get_physical_device_proc_addr(&instance->vk, pName); -} - static struct anv_state anv_state_pool_emit_data(struct anv_state_pool *pool, size_t size, size_t align, const void *p) { @@ -4017,50 +4005,3 @@ void anv_GetPhysicalDeviceMultisamplePropertiesEXT( vk_foreach_struct(ext, pMultisampleProperties->pNext) anv_debug_ignored_stype(ext->sType); } - -PUBLIC VKAPI_ATTR VkResult VKAPI_CALL -vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t* pSupportedVersion) -{ - /* For the full details on loader interface versioning, see - * <https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/master/loader/LoaderAndLayerInterface.md>. - * What follows is a condensed summary, to help you navigate the large and - * confusing official doc. - * - * - Loader interface v0 is incompatible with later versions. We don't - * support it. - * - * - In loader interface v1: - * - The first ICD entrypoint called by the loader is - * vk_icdGetInstanceProcAddr(). The ICD must statically expose this - * entrypoint. - * - The ICD must statically expose no other Vulkan symbol unless it is - * linked with -Bsymbolic. - * - Each dispatchable Vulkan handle created by the ICD must be - * a pointer to a struct whose first member is VK_LOADER_DATA. The - * ICD must initialize VK_LOADER_DATA.loadMagic to ICD_LOADER_MAGIC. - * - The loader implements vkCreate{PLATFORM}SurfaceKHR() and - * vkDestroySurfaceKHR(). The ICD must be capable of working with - * such loader-managed surfaces. - * - * - Loader interface v2 differs from v1 in: - * - The first ICD entrypoint called by the loader is - * vk_icdNegotiateLoaderICDInterfaceVersion(). The ICD must - * statically expose this entrypoint. - * - * - Loader interface v3 differs from v2 in: - * - The ICD must implement vkCreate{PLATFORM}SurfaceKHR(), - * vkDestroySurfaceKHR(), and other API which uses VKSurfaceKHR, - * because the loader no longer does so. - * - * - Loader interface v4 differs from v3 in: - * - The ICD must implement vk_icdGetPhysicalDeviceProcAddr(). - * - * - Loader interface v5 differs from v4 in: - * - The ICD must support Vulkan API version 1.1 and must not return - * VK_ERROR_INCOMPATIBLE_DRIVER from vkCreateInstance() unless a - * Vulkan Loader with interface v4 or smaller is being used and the - * application provides an API version that is greater than 1.0. - */ - *pSupportedVersion = MIN2(*pSupportedVersion, 5u); - return VK_SUCCESS; -} diff --git a/src/microsoft/vulkan/dzn_device.c b/src/microsoft/vulkan/dzn_device.c index 8d36276bcfb..5b96987b004 100644 --- a/src/microsoft/vulkan/dzn_device.c +++ b/src/microsoft/vulkan/dzn_device.c @@ -1864,64 +1864,6 @@ vk_icdGetInstanceProcAddr(VkInstance instance, return dzn_GetInstanceProcAddr(instance, pName); } -/* With version 4+ of the loader interface the ICD should expose - * vk_icdGetPhysicalDeviceProcAddr() - */ -VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL -vk_icdGetPhysicalDeviceProcAddr(VkInstance _instance, - const char *pName) -{ - VK_FROM_HANDLE(dzn_instance, instance, _instance); - return vk_instance_get_physical_device_proc_addr(&instance->vk, pName); -} - -PUBLIC VKAPI_ATTR VkResult VKAPI_CALL -vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t *pSupportedVersion) -{ - /* For the full details on loader interface versioning, see - * <https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/master/loader/LoaderAndLayerInterface.md>. - * What follows is a condensed summary, to help you navigate the large and - * confusing official doc. - * - * - Loader interface v0 is incompatible with later versions. We don't - * support it. - * - * - In loader interface v1: - * - The first ICD entrypoint called by the loader is - * vk_icdGetInstanceProcAddr(). The ICD must statically expose this - * entrypoint. - * - The ICD must statically expose no other Vulkan symbol unless it is - * linked with -Bsymbolic. - * - Each dispatchable Vulkan handle created by the ICD must be - * a pointer to a struct whose first member is VK_LOADER_DATA. The - * ICD must initialize VK_LOADER_DATA.loadMagic to ICD_LOADER_MAGIC. - * - The loader implements vkCreate{PLATFORM}SurfaceKHR() and - * vkDestroySurfaceKHR(). The ICD must be capable of working with - * such loader-managed surfaces. - * - * - Loader interface v2 differs from v1 in: - * - The first ICD entrypoint called by the loader is - * vk_icdNegotiateLoaderICDInterfaceVersion(). The ICD must - * statically expose this entrypoint. - * - * - Loader interface v3 differs from v2 in: - * - The ICD must implement vkCreate{PLATFORM}SurfaceKHR(), - * vkDestroySurfaceKHR(), and other API which uses VKSurfaceKHR, - * because the loader no longer does so. - * - * - Loader interface v4 differs from v3 in: - * - The ICD must implement vk_icdGetPhysicalDeviceProcAddr(). - * - * - Loader interface v5 differs from v4 in: - * - The ICD must support Vulkan API version 1.1 and must not return - * VK_ERROR_INCOMPATIBLE_DRIVER from vkCreateInstance() unless a - * Vulkan Loader with interface v4 or smaller is being used and the - * application provides an API version that is greater than 1.0. - */ - *pSupportedVersion = MIN2(*pSupportedVersion, 5u); - return VK_SUCCESS; -} - VKAPI_ATTR void VKAPI_CALL dzn_GetPhysicalDeviceQueueFamilyProperties2(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, diff --git a/src/nouveau/vulkan/nvk_instance.c b/src/nouveau/vulkan/nvk_instance.c index 3f37d0abbf8..2201650c297 100644 --- a/src/nouveau/vulkan/nvk_instance.c +++ b/src/nouveau/vulkan/nvk_instance.c @@ -19,53 +19,6 @@ nvk_EnumerateInstanceVersion(uint32_t *pApiVersion) return VK_SUCCESS; } -PUBLIC VKAPI_ATTR VkResult VKAPI_CALL -vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t* pSupportedVersion) -{ - /* For the full details on loader interface versioning, see - * <https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/master/loader/LoaderAndLayerInterface.md>. - * What follows is a condensed summary, to help you navigate the large and - * confusing official doc. - * - * - Loader interface v0 is incompatible with later versions. We don't - * support it. - * - * - In loader interface v1: - * - The first ICD entrypoint called by the loader is - * vk_icdGetInstanceProcAddr(). The ICD must statically expose this - * entrypoint. - * - The ICD must statically expose no other Vulkan symbol unless it is - * linked with -Bsymbolic. - * - Each dispatchable Vulkan handle created by the ICD must be - * a pointer to a struct whose first member is VK_LOADER_DATA. The - * ICD must initialize VK_LOADER_DATA.loadMagic to ICD_LOADER_MAGIC. - * - The loader implements vkCreate{PLATFORM}SurfaceKHR() and - * vkDestroySurfaceKHR(). The ICD must be capable of working with - * such loader-managed surfaces. - * - * - Loader interface v2 differs from v1 in: - * - The first ICD entrypoint called by the loader is - * vk_icdNegotiateLoaderICDInterfaceVersion(). The ICD must - * statically expose this entrypoint. - * - * - Loader interface v3 differs from v2 in: - * - The ICD must implement vkCreate{PLATFORM}SurfaceKHR(), - * vkDestroySurfaceKHR(), and other API which uses VKSurfaceKHR, - * because the loader no longer does so. - * - * - Loader interface v4 differs from v3 in: - * - The ICD must implement vk_icdGetPhysicalDeviceProcAddr(). - * - * - Loader interface v5 differs from v4 in: - * - The ICD must support Vulkan API version 1.1 and must not return - * VK_ERROR_INCOMPATIBLE_DRIVER from vkCreateInstance() unless a - * Vulkan Loader with interface v4 or smaller is being used and the - * application provides an API version that is greater than 1.0. - */ - *pSupportedVersion = MIN2(*pSupportedVersion, 4u); - return VK_SUCCESS; -} - static const struct vk_instance_extension_table instance_extensions = { #ifdef NVK_USE_WSI_PLATFORM .KHR_get_surface_capabilities2 = true, diff --git a/src/nouveau/vulkan/nvk_physical_device.c b/src/nouveau/vulkan/nvk_physical_device.c index 004421ed1e3..257d3b9021f 100644 --- a/src/nouveau/vulkan/nvk_physical_device.c +++ b/src/nouveau/vulkan/nvk_physical_device.c @@ -40,13 +40,6 @@ #include "clc5c0.h" #include "clc997.h" -PUBLIC VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL -vk_icdGetPhysicalDeviceProcAddr(VkInstance _instance, const char *pName) -{ - VK_FROM_HANDLE(nvk_instance, instance, _instance); - return vk_instance_get_physical_device_proc_addr(&instance->vk, pName); -} - static void nvk_get_device_extensions(const struct nv_device_info *info, struct vk_device_extension_table *ext) diff --git a/src/panfrost/vulkan/panvk_device.c b/src/panfrost/vulkan/panvk_device.c index c4fd6dab4af..1db43d95b98 100644 --- a/src/panfrost/vulkan/panvk_device.c +++ b/src/panfrost/vulkan/panvk_device.c @@ -1019,17 +1019,6 @@ vk_icdGetInstanceProcAddr(VkInstance instance, const char *pName) return panvk_GetInstanceProcAddr(instance, pName); } -/* With version 4+ of the loader interface the ICD should expose - * vk_icdGetPhysicalDeviceProcAddr() - */ -PFN_vkVoidFunction -vk_icdGetPhysicalDeviceProcAddr(VkInstance _instance, const char *pName) -{ - VK_FROM_HANDLE(panvk_instance, instance, _instance); - - return vk_instance_get_physical_device_proc_addr(&instance->vk, pName); -} - VkResult panvk_AllocateMemory(VkDevice _device, const VkMemoryAllocateInfo *pAllocateInfo, @@ -1442,54 +1431,6 @@ panvk_DestroySampler(VkDevice _device, VkSampler _sampler, vk_object_free(&device->vk, pAllocator, sampler); } -PUBLIC VKAPI_ATTR VkResult VKAPI_CALL -vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t *pSupportedVersion) -{ - /* For the full details on loader interface versioning, see - * <https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/master/loader/LoaderAndLayerInterface.md>. - * What follows is a condensed summary, to help you navigate the large and - * confusing official doc. - * - * - Loader interface v0 is incompatible with later versions. We don't - * support it. - * - * - In loader interface v1: - * - The first ICD entrypoint called by the loader is - * vk_icdGetInstanceProcAddr(). The ICD must statically expose this - * entrypoint. - * - The ICD must statically expose no other Vulkan symbol unless it - * is linked with -Bsymbolic. - * - Each dispatchable Vulkan handle created by the ICD must be - * a pointer to a struct whose first member is VK_LOADER_DATA. The - * ICD must initialize VK_LOADER_DATA.loadMagic to - * ICD_LOADER_MAGIC. - * - The loader implements vkCreate{PLATFORM}SurfaceKHR() and - * vkDestroySurfaceKHR(). The ICD must be capable of working with - * such loader-managed surfaces. - * - * - Loader interface v2 differs from v1 in: - * - The first ICD entrypoint called by the loader is - * vk_icdNegotiateLoaderICDInterfaceVersion(). The ICD must - * statically expose this entrypoint. - * - * - Loader interface v3 differs from v2 in: - * - The ICD must implement vkCreate{PLATFORM}SurfaceKHR(), - * vkDestroySurfaceKHR(), and other API which uses VKSurfaceKHR, - * because the loader no longer does so. - * - * - Loader interface v4 differs from v3 in: - * - The ICD must implement vk_icdGetPhysicalDeviceProcAddr(). - * - * - Loader interface v5 differs from v4 in: - * - The ICD must support 1.1 and must not return - * VK_ERROR_INCOMPATIBLE_DRIVER from vkCreateInstance() unless a - * Vulkan Loader with interface v4 or smaller is being used and the - * application provides an API version that is greater than 1.0. - */ - *pSupportedVersion = MIN2(*pSupportedVersion, 5u); - return VK_SUCCESS; -} - VkResult panvk_GetMemoryFdKHR(VkDevice _device, const VkMemoryGetFdInfoKHR *pGetFdInfo, int *pFd) diff --git a/src/virtio/vulkan/vn_icd.c b/src/virtio/vulkan/vn_icd.c index 430663af234..4a5dabdb9bb 100644 --- a/src/virtio/vulkan/vn_icd.c +++ b/src/virtio/vulkan/vn_icd.c @@ -12,39 +12,14 @@ #include "vn_instance.h" -/* we support all versions from version 1 up to version 5 */ -static uint32_t vn_icd_version = 5; - -VkResult -vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t *pSupportedVersion) -{ - vn_env_init(); - vn_trace_init(); - - vn_icd_version = MIN2(vn_icd_version, *pSupportedVersion); - if (VN_DEBUG(INIT)) - vn_log(NULL, "using ICD interface version %d", vn_icd_version); - - *pSupportedVersion = vn_icd_version; - return VK_SUCCESS; -} - PFN_vkVoidFunction vk_icdGetInstanceProcAddr(VkInstance instance, const char *pName) { return vn_GetInstanceProcAddr(instance, pName); } -PFN_vkVoidFunction -vk_icdGetPhysicalDeviceProcAddr(VkInstance _instance, const char *pName) -{ - struct vn_instance *instance = vn_instance_from_handle(_instance); - return vk_instance_get_physical_device_proc_addr(&instance->base.base, - pName); -} - bool vn_icd_supports_api_version(uint32_t api_version) { - return vn_icd_version >= 5 || api_version < VK_API_VERSION_1_1; + return vk_get_negotiated_icd_version() >= 5 || api_version < VK_API_VERSION_1_1; } diff --git a/src/vulkan/runtime/vk_instance.c b/src/vulkan/runtime/vk_instance.c index d14b196b27b..0a0dd836eb6 100644 --- a/src/vulkan/runtime/vk_instance.c +++ b/src/vulkan/runtime/vk_instance.c @@ -490,3 +490,80 @@ vk_common_EnumeratePhysicalDeviceGroups(VkInstance _instance, uint32_t *pGroupCo return vk_outarray_status(&out); } + +/* For Windows, PUBLIC is default-defined to __declspec(dllexport) to automatically export the + * public entrypoints from a DLL. However, this declspec needs to match between declaration and + * definition, and this attribute is not present on the prototypes specified in vk_icd.h. Instead, + * we'll use a .def file to manually export these entrypoints on Windows. + */ +#ifdef _WIN32 +#undef PUBLIC +#define PUBLIC +#endif + +/* With version 4+ of the loader interface the ICD should expose + * vk_icdGetPhysicalDeviceProcAddr() + */ +PUBLIC VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL +vk_icdGetPhysicalDeviceProcAddr(VkInstance _instance, + const char *pName) +{ + VK_FROM_HANDLE(vk_instance, instance, _instance); + return vk_instance_get_physical_device_proc_addr(instance, pName); +} + +static uint32_t vk_icd_version = 5; + +uint32_t +vk_get_negotiated_icd_version(void) +{ + return vk_icd_version; +} + +PUBLIC VKAPI_ATTR VkResult VKAPI_CALL +vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t *pSupportedVersion) +{ + /* For the full details on loader interface versioning, see + * <https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/master/loader/LoaderAndLayerInterface.md>. + * What follows is a condensed summary, to help you navigate the large and + * confusing official doc. + * + * - Loader interface v0 is incompatible with later versions. We don't + * support it. + * + * - In loader interface v1: + * - The first ICD entrypoint called by the loader is + * vk_icdGetInstanceProcAddr(). The ICD must statically expose this + * entrypoint. + * - The ICD must statically expose no other Vulkan symbol unless it is + * linked with -Bsymbolic. + * - Each dispatchable Vulkan handle created by the ICD must be + * a pointer to a struct whose first member is VK_LOADER_DATA. The + * ICD must initialize VK_LOADER_DATA.loadMagic to ICD_LOADER_MAGIC. + * - The loader implements vkCreate{PLATFORM}SurfaceKHR() and + * vkDestroySurfaceKHR(). The ICD must be capable of working with + * such loader-managed surfaces. + * + * - Loader interface v2 differs from v1 in: + * - The first ICD entrypoint called by the loader is + * vk_icdNegotiateLoaderICDInterfaceVersion(). The ICD must + * statically expose this entrypoint. + * + * - Loader interface v3 differs from v2 in: + * - The ICD must implement vkCreate{PLATFORM}SurfaceKHR(), + * vkDestroySurfaceKHR(), and other API which uses VKSurfaceKHR, + * because the loader no longer does so. + * + * - Loader interface v4 differs from v3 in: + * - The ICD must implement vk_icdGetPhysicalDeviceProcAddr(). + * + * - Loader interface v5 differs from v4 in: + * - The ICD must support Vulkan API version 1.1 and must not return + * VK_ERROR_INCOMPATIBLE_DRIVER from vkCreateInstance() unless a + * Vulkan Loader with interface v4 or smaller is being used and the + * application provides an API version that is greater than 1.0. + */ + vk_icd_version = MIN2(vk_icd_version, *pSupportedVersion); + *pSupportedVersion = vk_icd_version; + return VK_SUCCESS; +} diff --git a/src/vulkan/runtime/vk_instance.h b/src/vulkan/runtime/vk_instance.h index 8dad53d8524..f0e6a3fdb99 100644 --- a/src/vulkan/runtime/vk_instance.h +++ b/src/vulkan/runtime/vk_instance.h @@ -243,6 +243,9 @@ void vk_instance_add_driver_trace_modes(struct vk_instance *instance, const struct debug_control *modes); +uint32_t +vk_get_negotiated_icd_version(void); + #ifdef __cplusplus } #endif