gfxstream guest: Add vkGetLinearImageLayout2GOOGLE

See host change (aosp/1997493) for details.

Bug: fxbug.dev/94188

Change-Id: I1a6798a387032c09c06871d5bbe6198559495a22
diff --git a/system/vulkan_enc/VkEncoder.cpp b/system/vulkan_enc/VkEncoder.cpp
index c5104da..2fbeb75 100644
--- a/system/vulkan_enc/VkEncoder.cpp
+++ b/system/vulkan_enc/VkEncoder.cpp
@@ -4341,7 +4341,6 @@
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
-        sResourceTracker->transformImpl_VkImageCreateInfo_tohost(local_pCreateInfo, 1);
         transform_tohost_VkImageCreateInfo(sResourceTracker, (VkImageCreateInfo*)(local_pCreateInfo));
     }
     if (local_pAllocator)
@@ -37686,7 +37685,6 @@
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
-        sResourceTracker->transformImpl_VkImageCreateInfo_tohost(local_pCreateInfo, 1);
         transform_tohost_VkImageCreateInfo(sResourceTracker, (VkImageCreateInfo*)(local_pCreateInfo));
     }
     if (local_pAllocator)
@@ -38380,6 +38378,68 @@
     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
 }
 
+void VkEncoder::vkGetLinearImageLayout2GOOGLE(
+    VkDevice device,
+    const VkImageCreateInfo* pCreateInfo,
+    VkDeviceSize* pOffset,
+    VkDeviceSize* pRowPitchAlignment,
+    uint32_t doLock)
+{
+    (void)doLock;
+    bool queueSubmitWithCommandsEnabled = sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
+    if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
+    auto stream = mImpl->stream();
+    auto pool = mImpl->pool();
+    VkDevice local_device;
+    VkImageCreateInfo* local_pCreateInfo;
+    local_device = device;
+    local_pCreateInfo = nullptr;
+    if (pCreateInfo)
+    {
+        local_pCreateInfo = (VkImageCreateInfo*)pool->alloc(sizeof(const VkImageCreateInfo));
+        deepcopy_VkImageCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo, (VkImageCreateInfo*)(local_pCreateInfo));
+    }
+    if (local_pCreateInfo)
+    {
+        transform_tohost_VkImageCreateInfo(sResourceTracker, (VkImageCreateInfo*)(local_pCreateInfo));
+    }
+    size_t count = 0;
+    size_t* countPtr = &count;
+    {
+        uint64_t cgen_var_0;
+        *countPtr += 1 * 8;
+        count_VkImageCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageCreateInfo*)(local_pCreateInfo), countPtr);
+        *countPtr += sizeof(VkDeviceSize);
+        *countPtr += sizeof(VkDeviceSize);
+    }
+    uint32_t packetSize_vkGetLinearImageLayout2GOOGLE = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetLinearImageLayout2GOOGLE);
+    uint8_t** streamPtrPtr = &streamPtr;
+    uint32_t opcode_vkGetLinearImageLayout2GOOGLE = OP_vkGetLinearImageLayout2GOOGLE;
+    uint32_t seqno; if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
+    memcpy(streamPtr, &opcode_vkGetLinearImageLayout2GOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetLinearImageLayout2GOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    if (queueSubmitWithCommandsEnabled) { memcpy(streamPtr, &seqno, sizeof(uint32_t)); streamPtr += sizeof(uint32_t); }
+    uint64_t cgen_var_0;
+    *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkImageCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (VkDeviceSize*)pOffset, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    memcpy(*streamPtrPtr, (VkDeviceSize*)pRowPitchAlignment, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    stream->read((VkDeviceSize*)pOffset, sizeof(VkDeviceSize));
+    stream->read((VkDeviceSize*)pRowPitchAlignment, sizeof(VkDeviceSize));
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
+}
+
 void VkEncoder::vkQueueFlushCommandsGOOGLE(
     VkQueue queue,
     VkCommandBuffer commandBuffer,
diff --git a/system/vulkan_enc/VkEncoder.h b/system/vulkan_enc/VkEncoder.h
index 06dcbfb..b0e7d8e 100644
--- a/system/vulkan_enc/VkEncoder.h
+++ b/system/vulkan_enc/VkEncoder.h
@@ -3343,6 +3343,12 @@
         VkDeviceSize* pOffset,
         VkDeviceSize* pRowPitchAlignment,
         uint32_t doLock);
+    void vkGetLinearImageLayout2GOOGLE(
+    VkDevice device,
+        const VkImageCreateInfo* pCreateInfo,
+        VkDeviceSize* pOffset,
+        VkDeviceSize* pRowPitchAlignment,
+        uint32_t doLock);
     void vkQueueFlushCommandsGOOGLE(
     VkQueue queue,
         VkCommandBuffer commandBuffer,
diff --git a/system/vulkan_enc/func_table.cpp b/system/vulkan_enc/func_table.cpp
index 8664cec..a267ffb 100644
--- a/system/vulkan_enc/func_table.cpp
+++ b/system/vulkan_enc/func_table.cpp
@@ -8479,6 +8479,31 @@
     auto vkEnc = ResourceTracker::getThreadLocalEncoder();
     vkEnc->vkGetLinearImageLayoutGOOGLE(device, format, pOffset, pRowPitchAlignment, true /* do lock */);
 }
+static void entry_vkGetLinearImageLayout2GOOGLE(
+    VkDevice device,
+    const VkImageCreateInfo* pCreateInfo,
+    VkDeviceSize* pOffset,
+    VkDeviceSize* pRowPitchAlignment)
+{
+    AEMU_SCOPED_TRACE("vkGetLinearImageLayout2GOOGLE");
+    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
+    vkEnc->vkGetLinearImageLayout2GOOGLE(device, pCreateInfo, pOffset, pRowPitchAlignment, true /* do lock */);
+}
+static void dynCheck_entry_vkGetLinearImageLayout2GOOGLE(
+    VkDevice device,
+    const VkImageCreateInfo* pCreateInfo,
+    VkDeviceSize* pOffset,
+    VkDeviceSize* pRowPitchAlignment)
+{
+    auto resources = ResourceTracker::get();
+    if (!resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream"))
+    {
+        sOnInvalidDynamicallyCheckedCall("vkGetLinearImageLayout2GOOGLE", "VK_GOOGLE_gfxstream");
+    }
+    AEMU_SCOPED_TRACE("vkGetLinearImageLayout2GOOGLE");
+    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
+    vkEnc->vkGetLinearImageLayout2GOOGLE(device, pCreateInfo, pOffset, pRowPitchAlignment, true /* do lock */);
+}
 static void entry_vkQueueFlushCommandsGOOGLE(
     VkQueue queue,
     VkCommandBuffer commandBuffer,
@@ -11331,6 +11356,10 @@
     {
         return nullptr;
     }
+    if (!strcmp(name, "vkGetLinearImageLayout2GOOGLE"))
+    {
+        return nullptr;
+    }
     if (!strcmp(name, "vkQueueFlushCommandsGOOGLE"))
     {
         return nullptr;
@@ -13917,6 +13946,10 @@
     {
         return (void*)dynCheck_entry_vkGetLinearImageLayoutGOOGLE;
     }
+    if (!strcmp(name, "vkGetLinearImageLayout2GOOGLE"))
+    {
+        return (void*)dynCheck_entry_vkGetLinearImageLayout2GOOGLE;
+    }
     if (!strcmp(name, "vkQueueFlushCommandsGOOGLE"))
     {
         bool hasExt = resources->hasInstanceExtension(instance, "VK_GOOGLE_gfxstream");
@@ -16664,6 +16697,11 @@
         bool hasExt = resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream");
         return hasExt ? (void*)entry_vkGetLinearImageLayoutGOOGLE : nullptr;
     }
+    if (!strcmp(name, "vkGetLinearImageLayout2GOOGLE"))
+    {
+        bool hasExt = resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream");
+        return hasExt ? (void*)entry_vkGetLinearImageLayout2GOOGLE : nullptr;
+    }
     if (!strcmp(name, "vkQueueFlushCommandsGOOGLE"))
     {
         bool hasExt = resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream");
diff --git a/system/vulkan_enc/goldfish_vk_counting_guest.cpp b/system/vulkan_enc/goldfish_vk_counting_guest.cpp
index d1e0efe..8b070f6 100644
--- a/system/vulkan_enc/goldfish_vk_counting_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_counting_guest.cpp
@@ -30,6 +30,7 @@
 
 #include <cstring>
 
+
 namespace goldfish_vk {
 
 void count_extension_struct(
diff --git a/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp b/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp
index 1d42aad..f0fb307 100644
--- a/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp
@@ -28,6 +28,8 @@
 #include "goldfish_vk_extension_structs_guest.h"
 #include "goldfish_vk_private_defs.h"
 
+#include <cstring>
+
 #include "vk_util.h"
 
 
diff --git a/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp b/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp
index 95ca034..a98bf32 100644
--- a/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp
@@ -28,6 +28,8 @@
 #include "goldfish_vk_extension_structs_guest.h"
 #include "goldfish_vk_private_defs.h"
 
+#include <cstring>
+
 
 namespace goldfish_vk {
 
diff --git a/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp b/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
index 967b5bc..607fc0a 100644
--- a/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
@@ -28,6 +28,8 @@
 #include "goldfish_vk_extension_structs_guest.h"
 #include "goldfish_vk_private_defs.h"
 
+#include <cstring>
+
 
 namespace goldfish_vk {
 
@@ -35993,6 +35995,12 @@
             return "OP_vkGetPhysicalDeviceToolPropertiesEXT";
         }
 #endif
+#ifdef VK_GOOGLE_gfxstream
+        case OP_vkGetLinearImageLayout2GOOGLE:
+        {
+            return "OP_vkGetLinearImageLayout2GOOGLE";
+        }
+#endif
 #ifdef VK_EXT_acquire_drm_display
         case OP_vkGetDrmDisplayEXT:
         {
diff --git a/system/vulkan_enc/goldfish_vk_marshaling_guest.h b/system/vulkan_enc/goldfish_vk_marshaling_guest.h
index 28058c4..21901f6 100644
--- a/system/vulkan_enc/goldfish_vk_marshaling_guest.h
+++ b/system/vulkan_enc/goldfish_vk_marshaling_guest.h
@@ -8565,6 +8565,7 @@
 #define OP_vkQueueWaitIdleAsyncGOOGLE 20331
 #define OP_vkQueueBindSparseAsyncGOOGLE 20332
 #define OP_vkGetLinearImageLayoutGOOGLE 20333
+#define OP_vkGetLinearImageLayout2GOOGLE 282325414
 #define OP_vkQueueFlushCommandsGOOGLE 20340
 #define OP_vkQueueCommitDescriptorSetUpdatesGOOGLE 267932433
 #define OP_vkCollectDescriptorPoolIdsGOOGLE 213659202
diff --git a/system/vulkan_enc/goldfish_vk_private_defs.h b/system/vulkan_enc/goldfish_vk_private_defs.h
index 8266158..e591608 100644
--- a/system/vulkan_enc/goldfish_vk_private_defs.h
+++ b/system/vulkan_enc/goldfish_vk_private_defs.h
@@ -413,6 +413,7 @@
     VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo* pBindInfo, VkFence fence);
 
 typedef VkResult (VKAPI_PTR *PFN_vkGetLinearImageLayoutGOOGLE)(VkDevice device, VkFormat format, VkDeviceSize* pOffset, VkDeviceSize* pRowPitchAlignment);
+typedef VkResult (VKAPI_PTR *PFN_vkGetLinearImageLayout2GOOGLE)(VkDevice device, const VkImageCreateInfo* pCreateInfo, VkDeviceSize* pOffset, VkDeviceSize* pRowPitchAlignment);
 
 typedef void (VKAPI_PTR *PFN_vkQueueFlushCommandsGOOGLE)(VkQueue queue, VkDeviceSize dataSize, const void* pData);
 typedef void (VKAPI_PTR *PFN_vkQueueCommitDescriptorSetUpdatesGOOGLE)(VkQueue queue, uint32_t descriptorPoolCount, const VkDescriptorPool* pDescriptorPools, uint32_t descriptorSetCount, const VkDescriptorSetLayout* pDescriptorSetLayouts, const uint64_t* pDescriptorSetPoolIds, const uint32_t* pDescriptorSetWhichPool, const uint32_t* pDescriptorSetPendingAllocation, const uint32_t* pDescriptorWriteStartingIndices, uint32_t pendingDescriptorWriteCount, const VkWriteDescriptorSet* pPendingDescriptorWrites);
diff --git a/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp b/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp
index 3627a05..c25ff93 100644
--- a/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp
@@ -28,6 +28,8 @@
 #include "goldfish_vk_extension_structs_guest.h"
 #include "goldfish_vk_private_defs.h"
 
+#include <cstring>
+
 #include "Resources.h"
 
 
diff --git a/system/vulkan_enc/goldfish_vk_transform_guest.cpp b/system/vulkan_enc/goldfish_vk_transform_guest.cpp
index b86ee88..d10fba1 100644
--- a/system/vulkan_enc/goldfish_vk_transform_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_transform_guest.cpp
@@ -28,6 +28,8 @@
 #include "goldfish_vk_extension_structs_guest.h"
 #include "goldfish_vk_private_defs.h"
 
+#include <cstring>
+
 #include "ResourceTracker.h"
 
 
@@ -10156,7 +10158,6 @@
     }
     if (toTransform->pCreateInfo)
     {
-        resourceTracker->transformImpl_VkImageCreateInfo_tohost(toTransform->pCreateInfo, 1);
         transform_tohost_VkImageCreateInfo(resourceTracker, (VkImageCreateInfo*)(toTransform->pCreateInfo));
     }
 }
@@ -10173,7 +10174,6 @@
     }
     if (toTransform->pCreateInfo)
     {
-        resourceTracker->transformImpl_VkImageCreateInfo_fromhost(toTransform->pCreateInfo, 1);
         transform_fromhost_VkImageCreateInfo(resourceTracker, (VkImageCreateInfo*)(toTransform->pCreateInfo));
     }
 }
@@ -18686,7 +18686,6 @@
     {
         transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    resourceTracker->transformImpl_VkImageCreateInfo_tohost(&toTransform->imageCreateInfo, 1);
     transform_tohost_VkImageCreateInfo(resourceTracker, (VkImageCreateInfo*)(&toTransform->imageCreateInfo));
     if (toTransform->pColorSpaces)
     {
@@ -18704,7 +18703,6 @@
     {
         transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
     }
-    resourceTracker->transformImpl_VkImageCreateInfo_fromhost(&toTransform->imageCreateInfo, 1);
     transform_fromhost_VkImageCreateInfo(resourceTracker, (VkImageCreateInfo*)(&toTransform->imageCreateInfo));
     if (toTransform->pColorSpaces)
     {
diff --git a/system/vulkan_enc/goldfish_vk_transform_guest.h b/system/vulkan_enc/goldfish_vk_transform_guest.h
index cba6f67..61030d8 100644
--- a/system/vulkan_enc/goldfish_vk_transform_guest.h
+++ b/system/vulkan_enc/goldfish_vk_transform_guest.h
@@ -46,7 +46,6 @@
 
 #define LIST_NON_TRIVIAL_TRANSFORMED_TYPES(f) \
 f(VkExternalMemoryProperties) \
-f(VkImageCreateInfo) \
 
 #define LIST_TRANSFORMED_TYPES(f) \
 LIST_TRIVIAL_TRANSFORMED_TYPES(f) \