vulkan: take vkQueueSignalReleaseImageANDROIDAsyncGOOGLE encoder codegen

Bug: 193809913
Change-Id: I00b2cdb099797be87297f62311fd247c27fd0c61
diff --git a/system/vulkan_enc/VkEncoder.cpp b/system/vulkan_enc/VkEncoder.cpp
index 5660460..b0d2bd1 100644
--- a/system/vulkan_enc/VkEncoder.cpp
+++ b/system/vulkan_enc/VkEncoder.cpp
@@ -1629,8 +1629,7 @@
     stream->read((uint64_t*)&cgen_var_2, 8);
     stream->handleMapping()->mapHandles_u64_VkQueue(&cgen_var_2, (VkQueue*)pQueue, 1);
     stream->unsetHandleMapping();
-    sResourceTracker->on_vkGetDeviceQueue(this, device, queueFamilyIndex,
-                                          queueIndex, pQueue);
+    sResourceTracker->on_vkGetDeviceQueue(this, device, queueFamilyIndex, queueIndex, pQueue);
     ++encodeCount;;
     if (0 == encodeCount % POOL_CLEAR_INTERVAL)
     {
@@ -34514,6 +34513,91 @@
     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
 }
 
+void VkEncoder::vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(
+    VkQueue queue,
+    uint32_t waitSemaphoreCount,
+    const VkSemaphore* pWaitSemaphores,
+    VkImage image,
+    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();
+    VkQueue local_queue;
+    uint32_t local_waitSemaphoreCount;
+    VkSemaphore* local_pWaitSemaphores;
+    VkImage local_image;
+    local_queue = queue;
+    local_waitSemaphoreCount = waitSemaphoreCount;
+    // Avoiding deepcopy for pWaitSemaphores
+    local_pWaitSemaphores = (VkSemaphore*)pWaitSemaphores;
+    local_image = image;
+    size_t count = 0;
+    size_t* countPtr = &count;
+    {
+        uint64_t cgen_var_0;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        // WARNING PTR CHECK
+        *countPtr += 8;
+        if (local_pWaitSemaphores)
+        {
+            if (((waitSemaphoreCount)))
+            {
+                *countPtr += ((waitSemaphoreCount)) * 8;
+            }
+        }
+        uint64_t cgen_var_1;
+        *countPtr += 1 * 8;
+    }
+    uint32_t packetSize_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE);
+    uint8_t** streamPtrPtr = &streamPtr;
+    uint32_t opcode_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE = OP_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE;
+    uint32_t seqno; if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
+    memcpy(streamPtr, &opcode_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE, 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_VkQueue((*&local_queue));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_waitSemaphoreCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pWaitSemaphores;
+    memcpy((*streamPtrPtr), &cgen_var_1, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
+    if (local_pWaitSemaphores)
+    {
+        if (((waitSemaphoreCount)))
+        {
+            uint8_t* cgen_var_1_0_ptr = (uint8_t*)(*streamPtrPtr);
+            for (uint32_t k = 0; k < ((waitSemaphoreCount)); ++k)
+            {
+                uint64_t tmpval = get_host_u64_VkSemaphore(local_pWaitSemaphores[k]);
+                memcpy(cgen_var_1_0_ptr + k * 8, &tmpval, sizeof(uint64_t));
+            }
+            *streamPtrPtr += 8 * ((waitSemaphoreCount));
+        }
+    }
+    uint64_t cgen_var_2;
+    *&cgen_var_2 = get_host_u64_VkImage((*&local_image));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    stream->flush();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
+}
+
 #endif
 #ifdef VK_KHR_acceleration_structure
 VkResult VkEncoder::vkCreateAccelerationStructureKHR(
diff --git a/system/vulkan_enc/VkEncoder.h b/system/vulkan_enc/VkEncoder.h
index 160632a..91554c2 100644
--- a/system/vulkan_enc/VkEncoder.h
+++ b/system/vulkan_enc/VkEncoder.h
@@ -2994,6 +2994,12 @@
         uint32_t* pPoolIdCount,
         uint64_t* pPoolIds,
         uint32_t doLock);
+    void vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(
+    VkQueue queue,
+        uint32_t waitSemaphoreCount,
+        const VkSemaphore* pWaitSemaphores,
+        VkImage image,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_acceleration_structure
     VkResult vkCreateAccelerationStructureKHR(
diff --git a/system/vulkan_enc/func_table.cpp b/system/vulkan_enc/func_table.cpp
index dc3f66d..bf63470 100644
--- a/system/vulkan_enc/func_table.cpp
+++ b/system/vulkan_enc/func_table.cpp
@@ -7456,6 +7456,16 @@
     auto vkEnc = ResourceTracker::getThreadLocalEncoder();
     vkEnc->vkCollectDescriptorPoolIdsGOOGLE(device, descriptorPool, pPoolIdCount, pPoolIds, true /* do lock */);
 }
+static void entry_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(
+    VkQueue queue,
+    uint32_t waitSemaphoreCount,
+    const VkSemaphore* pWaitSemaphores,
+    VkImage image)
+{
+    AEMU_SCOPED_TRACE("vkQueueSignalReleaseImageANDROIDAsyncGOOGLE");
+    auto vkEnc = ResourceTracker::getQueueEncoder(queue);
+    vkEnc->vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(queue, waitSemaphoreCount, pWaitSemaphores, image, true /* do lock */);
+}
 #endif
 #ifdef VK_KHR_acceleration_structure
 static VkResult entry_vkCreateAccelerationStructureKHR(
@@ -9924,6 +9934,10 @@
     {
         return nullptr;
     }
+    if (!strcmp(name, "vkQueueSignalReleaseImageANDROIDAsyncGOOGLE"))
+    {
+        return nullptr;
+    }
 #endif
 #ifdef VK_KHR_acceleration_structure
     if (!strcmp(name, "vkCreateAccelerationStructureKHR"))
@@ -12183,6 +12197,11 @@
     {
         return (void*)dynCheck_entry_vkCollectDescriptorPoolIdsGOOGLE;
     }
+    if (!strcmp(name, "vkQueueSignalReleaseImageANDROIDAsyncGOOGLE"))
+    {
+        bool hasExt = resources->hasInstanceExtension(instance, "VK_GOOGLE_gfxstream");
+        return hasExt ? (void*)entry_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE : nullptr;
+    }
 #endif
 #ifdef VK_KHR_acceleration_structure
     if (!strcmp(name, "vkCreateAccelerationStructureKHR"))
@@ -14573,6 +14592,11 @@
         bool hasExt = resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream");
         return hasExt ? (void*)entry_vkCollectDescriptorPoolIdsGOOGLE : nullptr;
     }
+    if (!strcmp(name, "vkQueueSignalReleaseImageANDROIDAsyncGOOGLE"))
+    {
+        bool hasExt = resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream");
+        return hasExt ? (void*)entry_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE : nullptr;
+    }
 #endif
 #ifdef VK_KHR_acceleration_structure
     if (!strcmp(name, "vkCreateAccelerationStructureKHR"))
diff --git a/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp b/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
index 5b1e964..5b5f3a3 100644
--- a/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
@@ -28291,6 +28291,12 @@
             return "OP_vkCmdBindVertexBuffers2EXT";
         }
 #endif
+#ifdef VK_GOOGLE_gfxstream
+        case OP_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE:
+        {
+            return "OP_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE";
+        }
+#endif
 #ifdef VK_VERSION_1_2
         case OP_vkCmdNextSubpass2:
         {
diff --git a/system/vulkan_enc/goldfish_vk_marshaling_guest.h b/system/vulkan_enc/goldfish_vk_marshaling_guest.h
index 86c6b4e..540749c 100644
--- a/system/vulkan_enc/goldfish_vk_marshaling_guest.h
+++ b/system/vulkan_enc/goldfish_vk_marshaling_guest.h
@@ -7007,6 +7007,7 @@
 #define OP_vkQueueFlushCommandsGOOGLE 20340
 #define OP_vkQueueCommitDescriptorSetUpdatesGOOGLE 267932433
 #define OP_vkCollectDescriptorPoolIdsGOOGLE 213659202
+#define OP_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE 243985229
 #endif
 #ifdef VK_KHR_acceleration_structure
 void marshal_VkDeviceOrHostAddressKHR(
diff --git a/system/vulkan_enc/goldfish_vk_private_defs.h b/system/vulkan_enc/goldfish_vk_private_defs.h
index dfeb3c5..b48151d 100644
--- a/system/vulkan_enc/goldfish_vk_private_defs.h
+++ b/system/vulkan_enc/goldfish_vk_private_defs.h
@@ -809,6 +809,8 @@
 
 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);
+typedef void (VKAPI_PTR *PFN_vkCollectDescriptorPoolIdsGOOGLE)(VkDevice device, VkDescriptorPool descriptorPool, uint32_t* pPoolIdCount, uint64_t* pPoolIds);
+typedef void (VKAPI_PTR *PFN_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE)(VkQueue queue, uint32_t waitSemaphoreCount, const VkSemaphore* pWaitSemaphores, VkImage image);
 
 #ifdef __cplusplus
 } // extern "C"