radv: Support loader interface version 3.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Fri, 13 Jan 2017 07:55:59 +0000 (08:55 +0100)
committerBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Fri, 13 Jan 2017 18:11:17 +0000 (19:11 +0100)
Port of 1e41d7f7b0855934744fe578ba4eae9209ee69f7:
"anv: Support loader interface version 3 (patch v2)"

Signed-off-by: Bas Nieuwenhuizen <basni@google.com>
Cc: mesa-stable@lists.freedesktop.org
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
src/amd/vulkan/radv_device.c

index 05d8888..64fbce8 100644 (file)
@@ -2032,3 +2032,48 @@ void radv_DestroySampler(
                return;
        vk_free2(&device->alloc, pAllocator, sampler);
 }
+
+
+/* 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
+       * <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.
+       */
+       *pSupportedVersion = MIN2(*pSupportedVersion, 3u);
+       return VK_SUCCESS;
+}