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/protocols/vulkan/xml/cereal/common/vulkantypes.py b/protocols/vulkan/xml/cereal/common/vulkantypes.py
index 6e2c51a..9bff520 100644
--- a/protocols/vulkan/xml/cereal/common/vulkantypes.py
+++ b/protocols/vulkan/xml/cereal/common/vulkantypes.py
@@ -169,6 +169,7 @@
 
 NON_TRIVIAL_TRANSFORMED_TYPES = [
     "VkExternalMemoryProperties",
+    "VkImageCreateInfo",
 ]
 
 TRANSFORMED_TYPES = TRIVIAL_TRANSFORMED_TYPES + NON_TRIVIAL_TRANSFORMED_TYPES
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;
     }
 
diff --git a/stream-servers/vulkan/VkCommonOperations.h b/stream-servers/vulkan/VkCommonOperations.h
index d42eaa8..30a5cdf 100644
--- a/stream-servers/vulkan/VkCommonOperations.h
+++ b/stream-servers/vulkan/VkCommonOperations.h
@@ -366,6 +366,11 @@
 
 bool isColorBufferVulkanCompatible(uint32_t colorBufferHandle);
 
+std::unique_ptr<VkImageCreateInfo> generateColorBufferVkImageCreateInfo(VkFormat format,
+                                                                        uint32_t width,
+                                                                        uint32_t height,
+                                                                        VkImageTiling tiling);
+
 bool setupVkColorBuffer(uint32_t colorBufferHandle,
                         bool vulkanOnly = false,
                         uint32_t memoryProperty = 0,
diff --git a/stream-servers/vulkan/VkDecoder.cpp b/stream-servers/vulkan/VkDecoder.cpp
index 6b03965..c10778e 100644
--- a/stream-servers/vulkan/VkDecoder.cpp
+++ b/stream-servers/vulkan/VkDecoder.cpp
@@ -3258,6 +3258,7 @@
                 *(VkImage*)pImage = (VkImage)(VkImage)((VkImage)(*&cgen_var_2));
                 if (pCreateInfo)
                 {
+                    m_state->transformImpl_VkImageCreateInfo_tohost(pCreateInfo, 1);
                     transform_tohost_VkImageCreateInfo(m_state, (VkImageCreateInfo*)(pCreateInfo));
                 }
                 if (pAllocator)
@@ -23890,6 +23891,7 @@
                 reservedunmarshal_VkMemoryRequirements(vkReadStream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkMemoryRequirements*)(pMemoryRequirements), readStreamPtrPtr);
                 if (pCreateInfo)
                 {
+                    m_state->transformImpl_VkImageCreateInfo_tohost(pCreateInfo, 1);
                     transform_tohost_VkImageCreateInfo(m_state, (VkImageCreateInfo*)(pCreateInfo));
                 }
                 if (pAllocator)
diff --git a/stream-servers/vulkan/VkDecoderGlobalState.cpp b/stream-servers/vulkan/VkDecoderGlobalState.cpp
index 24139fc..fd07920 100644
--- a/stream-servers/vulkan/VkDecoderGlobalState.cpp
+++ b/stream-servers/vulkan/VkDecoderGlobalState.cpp
@@ -22,7 +22,6 @@
 
 #include "DecompressionShaders.h"
 #include "FrameBuffer.h"
-#include "compressedTextureFormats/etc.h"
 #include "VkAndroidNativeBuffer.h"
 #include "VkCommonOperations.h"
 #include "VkDecoderSnapshot.h"
@@ -30,24 +29,26 @@
 #include "VulkanDispatch.h"
 #include "VulkanStream.h"
 #include "base/ArraySize.h"
-#include "base/Optional.h"
+#include "base/ConditionVariable.h"
 #include "base/EntityManager.h"
 #include "base/HybridEntityManager.h"
-#include "base/Lookup.h"
-#include "base/Stream.h"
-#include "base/ConditionVariable.h"
 #include "base/Lock.h"
+#include "base/Lookup.h"
+#include "base/Optional.h"
+#include "base/Stream.h"
 #include "base/System.h"
 #include "base/Tracing.h"
-#include "common/goldfish_vk_marshaling.h"
-#include "common/goldfish_vk_reserved_marshaling.h"
 #include "common/goldfish_vk_deepcopy.h"
 #include "common/goldfish_vk_dispatch.h"
-#include "host-common/address_space_device_control_ops.h"
+#include "common/goldfish_vk_marshaling.h"
+#include "common/goldfish_vk_reserved_marshaling.h"
+#include "compressedTextureFormats/etc.h"
 #include "host-common/GfxstreamFatalError.h"
-#include "host-common/vm_operations.h"
+#include "host-common/address_space_device_control_ops.h"
 #include "host-common/feature_control.h"
+#include "host-common/vm_operations.h"
 #include "vk_util.h"
+#include "vulkan/vk_enum_string_helper.h"
 
 #ifndef _WIN32
 #include <unistd.h>
@@ -4794,6 +4795,76 @@
         }
     }
 
+    void transformImpl_VkImageCreateInfo_tohost(const VkImageCreateInfo* pImageCreateInfos,
+                                                uint32_t count) {
+        for (uint32_t i = 0; i < count; i++) {
+            VkImageCreateInfo& imageCreateInfo =
+                const_cast<VkImageCreateInfo&>(pImageCreateInfos[i]);
+            const VkExternalMemoryImageCreateInfo* pExternalMemoryImageCi =
+                vk_find_struct<VkExternalMemoryImageCreateInfo>(&imageCreateInfo);
+
+            if (pExternalMemoryImageCi &&
+                (pExternalMemoryImageCi->handleTypes &
+                 VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)) {
+                std::unique_ptr<VkImageCreateInfo> colorBufferVkImageCi =
+                    goldfish_vk::generateColorBufferVkImageCreateInfo(
+                        imageCreateInfo.format, imageCreateInfo.extent.width,
+                        imageCreateInfo.extent.height, imageCreateInfo.tiling);
+                if (imageCreateInfo.flags & (~colorBufferVkImageCi->flags)) {
+                    ERR("The VkImageCreateInfo to import AHardwareBuffer contains unsupported "
+                        "VkImageCreateFlags. All supported VkImageCreateFlags are %s, the input "
+                        "VkImageCreateInfo requires support for %s.",
+                        string_VkImageCreateFlags(colorBufferVkImageCi->flags).c_str(),
+                        string_VkImageCreateFlags(imageCreateInfo.flags).c_str());
+                }
+                imageCreateInfo.flags |= colorBufferVkImageCi->flags;
+                if (imageCreateInfo.imageType != colorBufferVkImageCi->imageType) {
+                    ERR("The VkImageCreateInfo to import AHardwareBuffer has an unexpected "
+                        "VkImageType: %s, %s expected.",
+                        string_VkImageType(imageCreateInfo.imageType),
+                        string_VkImageType(colorBufferVkImageCi->imageType));
+                }
+                // VkImageCreateInfo::extent::{width, height} are guaranteed to match.
+                if (imageCreateInfo.extent.depth != colorBufferVkImageCi->extent.depth) {
+                    ERR("The VkImageCreateInfo to import AHardwareBuffer has an unexpected "
+                        "VkExtent::depth: %" PRIu32 ", %" PRIu32 " expected.",
+                        imageCreateInfo.extent.depth, colorBufferVkImageCi->extent.depth);
+                }
+                if (imageCreateInfo.mipLevels != colorBufferVkImageCi->mipLevels) {
+                    ERR("The VkImageCreateInfo to import AHardwareBuffer has an unexpected "
+                        "mipLevels: %" PRIu32 ", %" PRIu32 " expected.",
+                        imageCreateInfo.mipLevels, colorBufferVkImageCi->mipLevels);
+                }
+                if (imageCreateInfo.arrayLayers != colorBufferVkImageCi->arrayLayers) {
+                    ERR("The VkImageCreateInfo to import AHardwareBuffer has an unexpected "
+                        "arrayLayers: %" PRIu32 ", %" PRIu32 " expected.",
+                        imageCreateInfo.arrayLayers, colorBufferVkImageCi->arrayLayers);
+                }
+                if (imageCreateInfo.samples != colorBufferVkImageCi->samples) {
+                    ERR("The VkImageCreateInfo to import AHardwareBuffer has an unexpected "
+                        "VkSampleCountFlagBits: %s, %s expected.",
+                        string_VkSampleCountFlagBits(imageCreateInfo.samples),
+                        string_VkSampleCountFlagBits(colorBufferVkImageCi->samples));
+                }
+                // VkImageCreateInfo::tiling is guaranteed to match.
+                if (imageCreateInfo.usage & (~colorBufferVkImageCi->usage)) {
+                    ERR("The VkImageCreateInfo to import AHardwareBuffer contains unsupported "
+                        "VkImageUsageFlags. All supported VkImageUsageFlags are %s, the input "
+                        "VkImageCreateInfo requires support for %s.",
+                        string_VkImageUsageFlags(imageCreateInfo.usage).c_str(),
+                        string_VkImageUsageFlags(colorBufferVkImageCi->usage).c_str());
+                }
+                imageCreateInfo.usage |= colorBufferVkImageCi->usage;
+                // VkImageCreateInfo::{sharingMode, queueFamilyIndexCount, pQueueFamilyIndices,
+                // initialLayout} aren't filled in generateColorBufferVkImageCreateInfo.
+            }
+        }
+    }
+
+    void transformImpl_VkImageCreateInfo_fromhost(const VkImageCreateInfo*, uint32_t) {
+        GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) << "Not yet implemented.";
+    }
+
 #define DEFINE_EXTERNAL_HANDLE_TYPE_TRANSFORM(type, field) \
     void transformImpl_##type##_tohost(const type* props, uint32_t count) { \
         type* mut = (type*)props; \
diff --git a/stream-servers/vulkan/cereal/common/goldfish_vk_transform.h b/stream-servers/vulkan/cereal/common/goldfish_vk_transform.h
index 5963685..c52cb4c 100644
--- a/stream-servers/vulkan/cereal/common/goldfish_vk_transform.h
+++ b/stream-servers/vulkan/cereal/common/goldfish_vk_transform.h
@@ -45,6 +45,7 @@
 
 #define LIST_NON_TRIVIAL_TRANSFORMED_TYPES(f) \
 f(VkExternalMemoryProperties) \
+f(VkImageCreateInfo) \
 
 #define LIST_TRANSFORMED_TYPES(f) \
 LIST_TRIVIAL_TRANSFORMED_TYPES(f) \