From bb003b75a15593aedcb4d51d20ec5a5bf05d4bdb Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 27 Mar 2023 11:29:36 -0500 Subject: [PATCH] nvk: Advertise ICD/loader interface version 4 We can't advertise v5 yet because we don't support Vulkan 1.1 yet. Part-of: --- src/nouveau/vulkan/nvk_instance.c | 53 +++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/src/nouveau/vulkan/nvk_instance.c b/src/nouveau/vulkan/nvk_instance.c index 45e261f7bb9..26d6bfb9fa6 100644 --- a/src/nouveau/vulkan/nvk_instance.c +++ b/src/nouveau/vulkan/nvk_instance.c @@ -9,6 +9,59 @@ nvk_EnumerateInstanceVersion(uint32_t *pApiVersion) return VK_SUCCESS; } +/* vk_icd.h does not declare this function, so we declare it here to + * suppress Wmissing-prototypes. + */ +PUBLIC VKAPI_ATTR VkResult VKAPI_CALL +vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t* pSupportedVersion); + +PUBLIC VKAPI_ATTR VkResult VKAPI_CALL +vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t* pSupportedVersion) +{ + /* For the full details on loader interface versioning, see + * . + * 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,