Cherry-pick: anv: Support loader interface version 3 (patch v2)

Cherry-pick f33d1100b4d2954ac79558e8651bf6573a8b66c1 from upstream
Mesa by Chad Versace <chadversary@chromium.org>.

This is needed for MA-230 and MA-214.

This fixes an interaction between Mesa and
vulkan_loader_and_validation_layers.  Without this, when a Vulkan app
calls vkCreateMagmaSurfaceKHR() and goes through
vulkan_loader_and_validation_layers, the real implementation of
vkCreateMagmaSurfaceKHR() doesn't actually get called.

> anv: Support loader interface version 3 (patch v2)
>
> This patch implements vk_icdNegotiateLoaderICDInterfaceVersion(), which
> brings us to loader interface v3.
>
> v2:
>   - Drop the pragmas. [emil]
>   - Advertise v3 instead of v2. Anvil supported more than I
>     thought.  [jason]
>   - s/Surface/SurfaceKHR/ in comments. [emil]
>
> Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
> Cc: mesa-stable@lists.freedesktop.org
> Cc: Jason Ekstrand <jason@jlekstrand.net>
> (cherry picked from commit 1e41d7f7b0855934744fe578ba4eae9209ee69f7)

Change-Id: I1a85176a952eac998457981c74d77e11fed78e3c
diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
index 742bc42..bb96c76 100644
--- a/src/intel/vulkan/anv_device.c
+++ b/src/intel/vulkan/anv_device.c
@@ -2073,3 +2073,47 @@
 
    vk_free2(&device->alloc, pAllocator, fb);
 }
+
+/* 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;
+}