Revert "Revert "Fix VkImageCreateInfo mismatch for AHB sibling V..."

Revert "Revert "Fix VkImageCreateInfo mismatch for AHB sibling V..."

Revert "Revert "Fix VkImageCreateInfo mismatch for AHB sibling V..."

Revert submission 1913972-revert-1909696-aosp-image-ci-mismatch-NCXVEHFTRL

Reason for revert: Reland mismatch VkImageCreateInfo for AHB sibiling VkImage.
Reverted Changes:
I70044e66c:Revert "vulkan-cereal: Remove marshaling/decoding ...
Ifaca8d3e0:Revert "Reland "macOS: Remove Vulkan cereal marsha...
If0baa330b:Revert "Regenerate Vulkan sources"
I84a310fac:Revert "Fix VkImageCreateInfo mismatch for AHB sib...
Id8293bddc:Revert "Rerun codegen"
I0931036ca:Revert "Fix VkImageCreateInfo mismatch for AHB sib...
Ifae1da6bf:Revert "Remove trailing semicolon for DEFINE_ALIAS...
I9dfda4c0e:Revert "Fix VkImageCreateInfo mismatch for AHB sib...

Change-Id: If7c2d73afd1482db3964a57ed718859c7c321e67
diff --git a/stream-servers/vulkan/VkCommonOperations.cpp b/stream-servers/vulkan/VkCommonOperations.cpp
index 330324f..f6b83ea 100644
--- a/stream-servers/vulkan/VkCommonOperations.cpp
+++ b/stream-servers/vulkan/VkCommonOperations.cpp
@@ -1415,6 +1415,79 @@
     return 0;
 }
 
+// pNext, sharingMode, queueFamilyIndexCount, pQueueFamilyIndices, and initialLayout won't be
+// filled.
+static std::unique_ptr<VkImageCreateInfo> generateColorBufferVkImageCreateInfo_locked(
+    VkFormat format, uint32_t width, uint32_t height, VkImageTiling tiling) {
+    const VkFormatProperties* maybeFormatProperties = nullptr;
+    for (const auto& supportInfo : sVkEmulation->imageSupportInfo) {
+        if (supportInfo.format == format && supportInfo.supported) {
+            maybeFormatProperties = &supportInfo.formatProps2.formatProperties;
+            break;
+        }
+    }
+    if (!maybeFormatProperties) {
+        ERR("Format %s is not supported.", string_VkFormat(format));
+        return nullptr;
+    }
+    const VkFormatProperties& formatProperties = *maybeFormatProperties;
+
+    constexpr std::pair<VkFormatFeatureFlags, VkImageUsageFlags> formatUsagePairs[] = {
+        {VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT},
+        {VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT, VK_IMAGE_USAGE_SAMPLED_BIT},
+        {VK_FORMAT_FEATURE_TRANSFER_SRC_BIT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT},
+        {VK_FORMAT_FEATURE_TRANSFER_DST_BIT, VK_IMAGE_USAGE_TRANSFER_DST_BIT},
+        {VK_FORMAT_FEATURE_BLIT_SRC_BIT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT},
+    };
+    VkFormatFeatureFlags tilingFeatures = (tiling == VK_IMAGE_TILING_OPTIMAL)
+                                              ? formatProperties.optimalTilingFeatures
+                                              : formatProperties.linearTilingFeatures;
+
+    VkImageUsageFlags usage = 0;
+    for (const auto& formatUsage : formatUsagePairs) {
+        usage |= (tilingFeatures & formatUsage.first) ? formatUsage.second : 0u;
+    }
+
+    return std::make_unique<VkImageCreateInfo>(VkImageCreateInfo{
+        .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
+        // The caller is responsible to fill pNext.
+        .pNext = nullptr,
+        .flags = 0,
+        .imageType = VK_IMAGE_TYPE_2D,
+        .format = format,
+        .extent =
+            {
+                .width = width,
+                .height = height,
+                .depth = 1,
+            },
+        .mipLevels = 1,
+        .arrayLayers = 1,
+        .samples = VK_SAMPLE_COUNT_1_BIT,
+        .tiling = tiling,
+        .usage = usage,
+        // The caller is responsible to fill sharingMode.
+        .sharingMode = VK_SHARING_MODE_MAX_ENUM,
+        // The caller is responsible to fill queueFamilyIndexCount.
+        .queueFamilyIndexCount = 0,
+        // The caller is responsible to fill pQueueFamilyIndices.
+        .pQueueFamilyIndices = nullptr,
+        // The caller is responsible to fill initialLayout.
+        .initialLayout = VK_IMAGE_LAYOUT_MAX_ENUM,
+    });
+}
+
+std::unique_ptr<VkImageCreateInfo> generateColorBufferVkImageCreateInfo(VkFormat format,
+                                                                        uint32_t width,
+                                                                        uint32_t height,
+                                                                        VkImageTiling tiling) {
+    if (!sVkEmulation || !sVkEmulation->live) {
+        GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) << "Host Vulkan device lost";
+    }
+    AutoLock lock(sVkEmulationLock);
+    return generateColorBufferVkImageCreateInfo_locked(format, width, height, tiling);
+}
+
 // TODO(liyl): Currently we can only specify required memoryProperty
 // for a color buffer.
 //
@@ -1502,46 +1575,24 @@
     res.frameworkFormat = frameworkFormat;
     res.frameworkStride = 0;
 
-    res.extent = { (uint32_t)width, (uint32_t)height, 1 };
-    res.format = vkFormat;
-    res.type = VK_IMAGE_TYPE_2D;
+    VkImageTiling tiling = (memoryProperty & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)
+                               ? VK_IMAGE_TILING_LINEAR
+                               : VK_IMAGE_TILING_OPTIMAL;
+    std::unique_ptr<VkImageCreateInfo> imageCi =
+        generateColorBufferVkImageCreateInfo_locked(vkFormat, width, height, tiling);
+    // pNext will be filled later.
+    imageCi->sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+    imageCi->queueFamilyIndexCount = 0;
+    imageCi->pQueueFamilyIndices = nullptr;
+    imageCi->initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
 
-    res.tiling = (memoryProperty & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)
-                         ? VK_IMAGE_TILING_LINEAR
-                         : VK_IMAGE_TILING_OPTIMAL;
-
-    VkFormatProperties formatProperties = {};
-    for (const auto& supportInfo : sVkEmulation->imageSupportInfo) {
-        if (supportInfo.format == vkFormat && supportInfo.supported) {
-            formatProperties = supportInfo.formatProps2.formatProperties;
-            break;
-        }
-    }
-
-    constexpr std::pair<VkFormatFeatureFlags, VkImageUsageFlags>
-            formatUsagePairs[] = {
-                    {VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT,
-                     VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT},
-                    {VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT,
-                     VK_IMAGE_USAGE_SAMPLED_BIT},
-                    {VK_FORMAT_FEATURE_TRANSFER_SRC_BIT,
-                     VK_IMAGE_USAGE_TRANSFER_SRC_BIT},
-                    {VK_FORMAT_FEATURE_TRANSFER_DST_BIT,
-                     VK_IMAGE_USAGE_TRANSFER_DST_BIT},
-                    {VK_FORMAT_FEATURE_BLIT_SRC_BIT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT},
-            };
-    VkFormatFeatureFlags tilingFeatures =
-            (res.tiling == VK_IMAGE_TILING_OPTIMAL)
-                    ? formatProperties.optimalTilingFeatures
-                    : formatProperties.linearTilingFeatures;
-    res.usageFlags = 0u;
-    for (const auto& formatUsage : formatUsagePairs) {
-        res.usageFlags |=
-                (tilingFeatures & formatUsage.first) ? formatUsage.second : 0u;
-    }
-    res.createFlags = 0;
-
-    res.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+    res.extent = imageCi->extent;
+    res.format = imageCi->format;
+    res.type = imageCi->imageType;
+    res.tiling = imageCi->tiling;
+    res.usageFlags = imageCi->usage;
+    res.createFlags = imageCi->flags;
+    res.sharingMode = imageCi->sharingMode;
 
     // Create the image. If external memory is supported, make it external.
     VkExternalMemoryImageCreateInfo extImageCi = {
@@ -1555,22 +1606,10 @@
         extImageCiPtr = &extImageCi;
     }
 
-    VkImageCreateInfo imageCi = {
-         VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, extImageCiPtr,
-         res.createFlags,
-         res.type,
-         res.format,
-         res.extent,
-         1, 1,
-         VK_SAMPLE_COUNT_1_BIT,
-         res.tiling,
-         res.usageFlags,
-         VK_SHARING_MODE_EXCLUSIVE, 0, nullptr,
-         VK_IMAGE_LAYOUT_UNDEFINED,
-    };
+    imageCi->pNext = extImageCiPtr;
 
-    VkResult createRes = vk->vkCreateImage(sVkEmulation->device, &imageCi,
-                                           nullptr, &res.image);
+    VkResult createRes =
+        vk->vkCreateImage(sVkEmulation->device, imageCi.get(), nullptr, &res.image);
     if (createRes != VK_SUCCESS) {
         // LOG(VERBOSE) << "Failed to create Vulkan image for ColorBuffer "
         //              << colorBufferHandle;
@@ -1646,7 +1685,7 @@
         glCompatible &&
         FrameBuffer::getFB()->importMemoryToColorBuffer(
             dupExternalMemory(res.memory.exportedHandle), res.memory.size, false /* dedicated */,
-            vulkanOnly, colorBufferHandle, res.image, imageCi)) {
+            vulkanOnly, colorBufferHandle, res.image, *imageCi)) {
         res.glExported = true;
     }