Vulkan: Fix DRM format support verification

Include VkImageFormatListCreateInfo structure in pNext chains to both
support verification and creation functions.

Bug: angleproject:7027
Change-Id: I04ba396252c159f4d28dde002b7e07b7194623ab
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3464856
Auto-Submit: Antonio Caggiano <antonio.caggiano@collabora.com>
Reviewed-by: Craig Stout <cstout@google.com>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/linux/DmaBufImageSiblingVkLinux.cpp b/src/libANGLE/renderer/vulkan/linux/DmaBufImageSiblingVkLinux.cpp
index 886fa27..43d7b3b 100644
--- a/src/libANGLE/renderer/vulkan/linux/DmaBufImageSiblingVkLinux.cpp
+++ b/src/libANGLE/renderer/vulkan/linux/DmaBufImageSiblingVkLinux.cpp
@@ -190,15 +190,16 @@
                        uint64_t drmModifier,
                        VkImageUsageFlags usageFlags,
                        VkImageCreateFlags createFlags,
+                       VkImageFormatListCreateInfoKHR imageFormatListInfo,
                        VkImageFormatProperties2 *imageFormatPropertiesOut)
 {
-    VkExternalMemoryImageCreateInfo externalMemoryImageCreateInfo = {};
-    externalMemoryImageCreateInfo.sType       = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO;
-    externalMemoryImageCreateInfo.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;
+    VkPhysicalDeviceExternalImageFormatInfo externalImageFormatInfo = {};
+    externalImageFormatInfo.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO;
+    externalImageFormatInfo.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;
 
     VkPhysicalDeviceImageFormatInfo2 imageFormatInfo = {};
     imageFormatInfo.sType  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2;
-    imageFormatInfo.pNext  = &externalMemoryImageCreateInfo;
+    imageFormatInfo.pNext  = &externalImageFormatInfo;
     imageFormatInfo.format = vkFormat;
     imageFormatInfo.type   = VK_IMAGE_TYPE_2D;
     imageFormatInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
@@ -208,13 +209,14 @@
     VkPhysicalDeviceImageDrmFormatModifierInfoEXT drmFormatModifierInfo = {};
     drmFormatModifierInfo.sType =
         VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT;
-    drmFormatModifierInfo.pNext             = &externalMemoryImageCreateInfo;
     drmFormatModifierInfo.drmFormatModifier = drmModifier;
     drmFormatModifierInfo.sharingMode       = VK_SHARING_MODE_EXCLUSIVE;
     if (drmModifier != 0)
     {
-        imageFormatInfo.pNext  = &drmFormatModifierInfo;
-        imageFormatInfo.tiling = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT;
+        externalImageFormatInfo.pNext = &drmFormatModifierInfo;
+        imageFormatListInfo.pNext     = &externalImageFormatInfo;
+        imageFormatInfo.pNext         = &imageFormatListInfo;
+        imageFormatInfo.tiling        = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT;
     }
 
     return vkGetPhysicalDeviceImageFormatProperties2(renderer->getPhysicalDevice(),
@@ -398,19 +400,44 @@
     imageFormatProperties.sType                    = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2;
     imageFormatProperties.pNext                    = &externalFormatProperties;
 
+    std::vector<VkSubresourceLayout> planes(planeCount, VkSubresourceLayout{});
+    for (uint32_t plane = 0; plane < planeCount; ++plane)
+    {
+        planes[plane].offset   = mAttribs.getAsInt(kOffsets[plane]);
+        planes[plane].rowPitch = mAttribs.getAsInt(kPitches[plane]);
+    }
+
+    VkImageDrmFormatModifierExplicitCreateInfoEXT imageDrmModifierCreateInfo = {};
+    imageDrmModifierCreateInfo.sType =
+        VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT;
+    imageDrmModifierCreateInfo.drmFormatModifier           = plane0Modifier;
+    imageDrmModifierCreateInfo.drmFormatModifierPlaneCount = planeCount;
+    imageDrmModifierCreateInfo.pPlaneLayouts               = planes.data();
+
+    VkExternalMemoryImageCreateInfo externalMemoryImageCreateInfo = {};
+    externalMemoryImageCreateInfo.sType       = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO;
+    externalMemoryImageCreateInfo.pNext       = &imageDrmModifierCreateInfo;
+    externalMemoryImageCreateInfo.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;
+
+    VkImageFormatListCreateInfoKHR imageFormatListCreateInfo;
+    vk::ImageHelper::ImageListFormats imageListFormatsStorage;
+    const void *imageCreateInfoPNext = vk::ImageHelper::DeriveCreateInfoPNext(
+        displayVk, actualImageFormatID, &externalMemoryImageCreateInfo, &imageFormatListCreateInfo,
+        &imageListFormatsStorage, &createFlags);
+
     if (!IsFormatSupported(renderer, vulkanFormat, plane0Modifier, usageFlags, createFlags,
-                           &imageFormatProperties))
+                           imageFormatListCreateInfo, &imageFormatProperties))
     {
         mRenderable = false;
         usageFlags &= ~kRenderUsage;
         if (!IsFormatSupported(renderer, vulkanFormat, plane0Modifier, usageFlags, createFlags,
-                               &imageFormatProperties))
+                               imageFormatListCreateInfo, &imageFormatProperties))
         {
             mTextureable = false;
             usageFlags &= ~kTextureUsage;
 
             if (!IsFormatSupported(renderer, vulkanFormat, plane0Modifier, usageFlags, createFlags,
-                                   &imageFormatProperties))
+                                   imageFormatListCreateInfo, &imageFormatProperties))
             {
                 // The image is completely unusable.
                 ANGLE_VK_CHECK(displayVk, false, VK_ERROR_FORMAT_NOT_SUPPORTED);
@@ -432,31 +459,6 @@
                    isWidthValid && isHeightValid && isSampleCountValid && isMemoryImportable,
                    VK_ERROR_INCOMPATIBLE_DRIVER);
 
-    std::vector<VkSubresourceLayout> planes(planeCount, VkSubresourceLayout{});
-    for (uint32_t plane = 0; plane < planeCount; ++plane)
-    {
-        planes[plane].offset   = mAttribs.getAsInt(kOffsets[plane]);
-        planes[plane].rowPitch = mAttribs.getAsInt(kPitches[plane]);
-    }
-
-    VkImageDrmFormatModifierExplicitCreateInfoEXT imageDrmModifierCreateInfo = {};
-    imageDrmModifierCreateInfo.sType =
-        VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT;
-    imageDrmModifierCreateInfo.drmFormatModifier           = plane0Modifier;
-    imageDrmModifierCreateInfo.drmFormatModifierPlaneCount = planeCount;
-    imageDrmModifierCreateInfo.pPlaneLayouts               = planes.data();
-
-    VkExternalMemoryImageCreateInfo externalMemoryImageCreateInfo = {};
-    externalMemoryImageCreateInfo.sType       = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO;
-    externalMemoryImageCreateInfo.pNext       = &imageDrmModifierCreateInfo;
-    externalMemoryImageCreateInfo.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;
-
-    VkImageFormatListCreateInfoKHR imageFormatListInfoStorage;
-    vk::ImageHelper::ImageListFormats imageListFormatsStorage;
-    const void *imageCreateInfoPNext = vk::ImageHelper::DeriveCreateInfoPNext(
-        displayVk, actualImageFormatID, &externalMemoryImageCreateInfo, &imageFormatListInfoStorage,
-        &imageListFormatsStorage, &createFlags);
-
     // Create the image
     mImage = new vk::ImageHelper();