Snap for 12404440 from d3d18b9594802628415f7065aa06691374b20a7b to 24Q4-release

Change-Id: I43cb8553eb93240f0aa8c1566f66b8fc75474ca9
diff --git a/.gitignore b/.gitignore
index d01643a..7035b25 100644
--- a/.gitignore
+++ b/.gitignore
@@ -294,3 +294,22 @@
 .cache/
 compile_commands.json
 .gdb_history
+
+# Guest autogenerated files during builds
+guest/vulkan_enc/func_table.cpp
+guest/vulkan_enc/goldfish_vk_counting_guest.cpp
+guest/vulkan_enc/goldfish_vk_counting_guest.h
+guest/vulkan_enc/goldfish_vk_deepcopy_guest.cpp
+guest/vulkan_enc/goldfish_vk_deepcopy_guest.h
+guest/vulkan_enc/goldfish_vk_extension_structs_guest.cpp
+guest/vulkan_enc/goldfish_vk_extension_structs_guest.h
+guest/vulkan_enc/goldfish_vk_marshaling_guest.cpp
+guest/vulkan_enc/goldfish_vk_marshaling_guest.h
+guest/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp
+guest/vulkan_enc/goldfish_vk_reserved_marshaling_guest.h
+guest/vulkan_enc/goldfish_vk_transform_guest.cpp
+guest/vulkan_enc/goldfish_vk_transform_guest.h
+guest/vulkan_enc/VkEncoder.cpp
+guest/vulkan_enc/VkEncoder.h
+guest/vulkan_enc/vulkan_gfxstream_structure_type.h
+guest/vulkan_enc/vulkan_gfxstream.h
diff --git a/codegen/vulkan/vulkan-docs-next/scripts/cereal/common/vulkantypes.py b/codegen/vulkan/vulkan-docs-next/scripts/cereal/common/vulkantypes.py
index 79d7dad..70eacf9 100644
--- a/codegen/vulkan/vulkan-docs-next/scripts/cereal/common/vulkantypes.py
+++ b/codegen/vulkan/vulkan-docs-next/scripts/cereal/common/vulkantypes.py
@@ -69,6 +69,7 @@
     "VkAccelerationStructureNV",
     "VkIndirectCommandsLayoutNV",
     "VkAccelerationStructureKHR",
+    "VkPrivateDataSlot",
 ]
 
 CUSTOM_HANDLE_CREATE_TYPES = [
diff --git a/guest/vulkan_enc/VulkanHandles.h b/guest/vulkan_enc/VulkanHandles.h
index b026ce5..1400b9c 100644
--- a/guest/vulkan_enc/VulkanHandles.h
+++ b/guest/vulkan_enc/VulkanHandles.h
@@ -104,6 +104,7 @@
     f(VkValidationCacheEXT)                                                           \
     f(VkDebugReportCallbackEXT)                                                       \
     f(VkDebugUtilsMessengerEXT)                                                       \
+    f(VkPrivateDataSlot)                                                              \
     f(VkMicromapEXT)                                                                  \
     __GOLDFISH_VK_LIST_NON_DISPATCHABLE_HANDLE_TYPES_NVX_BINARY_IMPORT(f)             \
     __GOLDFISH_VK_LIST_NON_DISPATCHABLE_HANDLE_TYPES_NVX_DEVICE_GENERATED_COMMANDS(f) \
diff --git a/host/vulkan/VkDecoder.cpp b/host/vulkan/VkDecoder.cpp
index aa5036f..5b99c8d 100644
--- a/host/vulkan/VkDecoder.cpp
+++ b/host/vulkan/VkDecoder.cpp
@@ -11446,9 +11446,11 @@
                 // Begin manual dispatchable handle unboxing for pPrivateDataSlot;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pPrivateDataSlot, sizeof(VkPrivateDataSlot));
-                memcpy((VkPrivateDataSlot*)&(*pPrivateDataSlot), (*readStreamPtrPtr), 8);
-                android::base::Stream::fromBe64((uint8_t*)&(*pPrivateDataSlot));
+                uint64_t cgen_var_2;
+                memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
+                *(VkPrivateDataSlot*)pPrivateDataSlot =
+                    (VkPrivateDataSlot)(VkPrivateDataSlot)((VkPrivateDataSlot)(*&cgen_var_2));
                 if (pCreateInfo) {
                     transform_tohost_VkPrivateDataSlotCreateInfo(
                         m_state, (VkPrivateDataSlotCreateInfo*)(pCreateInfo));
@@ -11472,8 +11474,17 @@
                 m_state->on_CheckOutOfMemory(vkCreatePrivateDataSlot_VkResult_return, opcode,
                                              context);
                 vkStream->unsetHandleMapping();
-                uint64_t cgen_var_3 = (uint64_t)(*pPrivateDataSlot);
-                vkStream->putBe64(cgen_var_3);
+                // Begin auto non dispatchable handle create for pPrivateDataSlot;
+                if (vkCreatePrivateDataSlot_VkResult_return == VK_SUCCESS)
+                    vkStream->setHandleMapping(&m_boxedHandleCreateMapping);
+                uint64_t cgen_var_3;
+                static_assert(8 == sizeof(VkPrivateDataSlot),
+                              "handle map overwrite requires VkPrivateDataSlot to be 8 bytes long");
+                vkStream->handleMapping()->mapHandles_VkPrivateDataSlot(
+                    (VkPrivateDataSlot*)pPrivateDataSlot, 1);
+                vkStream->write((VkPrivateDataSlot*)pPrivateDataSlot, 8 * 1);
+                // Begin auto non dispatchable handle create for pPrivateDataSlot;
+                vkStream->setHandleMapping(&m_boxedHandleUnwrapMapping);
                 vkStream->write(&vkCreatePrivateDataSlot_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
                 vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
@@ -11504,9 +11515,15 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                memcpy((VkPrivateDataSlot*)&privateDataSlot, (*readStreamPtrPtr), 8);
-                android::base::Stream::fromBe64((uint8_t*)&privateDataSlot);
-                *readStreamPtrPtr += 8;
+                // Begin manual non dispatchable handle destroy unboxing for privateDataSlot;
+                VkPrivateDataSlot boxed_privateDataSlot_preserve;
+                uint64_t cgen_var_1;
+                memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
+                *readStreamPtrPtr += 1 * 8;
+                *(VkPrivateDataSlot*)&privateDataSlot =
+                    (VkPrivateDataSlot)(VkPrivateDataSlot)((VkPrivateDataSlot)(*&cgen_var_1));
+                boxed_privateDataSlot_preserve = privateDataSlot;
+                privateDataSlot = unbox_VkPrivateDataSlot(privateDataSlot);
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
@@ -11534,9 +11551,10 @@
                 size_t snapshotTraceBytes = vkReadStream->endTrace();
                 if (m_state->snapshotsEnabled()) {
                     m_state->snapshot()->vkDestroyPrivateDataSlot(
-                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device, privateDataSlot,
-                        pAllocator);
+                        snapshotTraceBegin, snapshotTraceBytes, &m_pool, device,
+                        boxed_privateDataSlot_preserve, pAllocator);
                 }
+                delete_VkPrivateDataSlot(boxed_privateDataSlot_preserve);
                 vkReadStream->clearPool();
                 if (m_queueSubmitWithCommandsEnabled)
                     seqnoPtr->fetch_add(1, std::memory_order_seq_cst);
@@ -11562,9 +11580,11 @@
                 *readStreamPtrPtr += sizeof(VkObjectType);
                 memcpy((uint64_t*)&objectHandle, *readStreamPtrPtr, sizeof(uint64_t));
                 *readStreamPtrPtr += sizeof(uint64_t);
-                memcpy((VkPrivateDataSlot*)&privateDataSlot, (*readStreamPtrPtr), 8);
-                android::base::Stream::fromBe64((uint8_t*)&privateDataSlot);
-                *readStreamPtrPtr += 8;
+                uint64_t cgen_var_1;
+                memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
+                *readStreamPtrPtr += 1 * 8;
+                *(VkPrivateDataSlot*)&privateDataSlot =
+                    (VkPrivateDataSlot)unbox_VkPrivateDataSlot((VkPrivateDataSlot)(*&cgen_var_1));
                 memcpy((uint64_t*)&data, *readStreamPtrPtr, sizeof(uint64_t));
                 *readStreamPtrPtr += sizeof(uint64_t);
                 if (m_logCalls) {
@@ -11618,9 +11638,11 @@
                 *readStreamPtrPtr += sizeof(VkObjectType);
                 memcpy((uint64_t*)&objectHandle, *readStreamPtrPtr, sizeof(uint64_t));
                 *readStreamPtrPtr += sizeof(uint64_t);
-                memcpy((VkPrivateDataSlot*)&privateDataSlot, (*readStreamPtrPtr), 8);
-                android::base::Stream::fromBe64((uint8_t*)&privateDataSlot);
-                *readStreamPtrPtr += 8;
+                uint64_t cgen_var_1;
+                memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
+                *readStreamPtrPtr += 1 * 8;
+                *(VkPrivateDataSlot*)&privateDataSlot =
+                    (VkPrivateDataSlot)unbox_VkPrivateDataSlot((VkPrivateDataSlot)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pData;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pData, sizeof(uint64_t));
@@ -20148,9 +20170,11 @@
                 // Begin manual dispatchable handle unboxing for pPrivateDataSlot;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pPrivateDataSlot, sizeof(VkPrivateDataSlot));
-                memcpy((VkPrivateDataSlot*)&(*pPrivateDataSlot), (*readStreamPtrPtr), 8);
-                android::base::Stream::fromBe64((uint8_t*)&(*pPrivateDataSlot));
+                uint64_t cgen_var_2;
+                memcpy((uint64_t*)&cgen_var_2, *readStreamPtrPtr, 8);
                 *readStreamPtrPtr += 8;
+                *(VkPrivateDataSlot*)pPrivateDataSlot =
+                    (VkPrivateDataSlot)(VkPrivateDataSlot)((VkPrivateDataSlot)(*&cgen_var_2));
                 if (pCreateInfo) {
                     transform_tohost_VkPrivateDataSlotCreateInfo(
                         m_state, (VkPrivateDataSlotCreateInfo*)(pCreateInfo));
@@ -20174,8 +20198,10 @@
                 m_state->on_CheckOutOfMemory(vkCreatePrivateDataSlotEXT_VkResult_return, opcode,
                                              context);
                 vkStream->unsetHandleMapping();
-                uint64_t cgen_var_3 = (uint64_t)(*pPrivateDataSlot);
-                vkStream->putBe64(cgen_var_3);
+                uint64_t cgen_var_3;
+                vkStream->handleMapping()->mapHandles_VkPrivateDataSlot_u64(pPrivateDataSlot,
+                                                                            &cgen_var_3, 1);
+                vkStream->write((uint64_t*)&cgen_var_3, 8);
                 vkStream->write(&vkCreatePrivateDataSlotEXT_VkResult_return, sizeof(VkResult));
                 vkStream->commitWrite();
                 vkReadStream->setReadPos((uintptr_t)(*readStreamPtrPtr) -
@@ -20206,9 +20232,11 @@
                 auto unboxed_device = unbox_VkDevice(device);
                 auto vk = dispatch_VkDevice(device);
                 // End manual dispatchable handle unboxing for device;
-                memcpy((VkPrivateDataSlot*)&privateDataSlot, (*readStreamPtrPtr), 8);
-                android::base::Stream::fromBe64((uint8_t*)&privateDataSlot);
-                *readStreamPtrPtr += 8;
+                uint64_t cgen_var_1;
+                memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
+                *readStreamPtrPtr += 1 * 8;
+                *(VkPrivateDataSlot*)&privateDataSlot =
+                    (VkPrivateDataSlot)unbox_VkPrivateDataSlot((VkPrivateDataSlot)(*&cgen_var_1));
                 // WARNING PTR CHECK
                 memcpy((VkAllocationCallbacks**)&pAllocator, (*readStreamPtrPtr), 8);
                 android::base::Stream::fromBe64((uint8_t*)&pAllocator);
@@ -20264,9 +20292,11 @@
                 *readStreamPtrPtr += sizeof(VkObjectType);
                 memcpy((uint64_t*)&objectHandle, *readStreamPtrPtr, sizeof(uint64_t));
                 *readStreamPtrPtr += sizeof(uint64_t);
-                memcpy((VkPrivateDataSlot*)&privateDataSlot, (*readStreamPtrPtr), 8);
-                android::base::Stream::fromBe64((uint8_t*)&privateDataSlot);
-                *readStreamPtrPtr += 8;
+                uint64_t cgen_var_1;
+                memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
+                *readStreamPtrPtr += 1 * 8;
+                *(VkPrivateDataSlot*)&privateDataSlot =
+                    (VkPrivateDataSlot)unbox_VkPrivateDataSlot((VkPrivateDataSlot)(*&cgen_var_1));
                 memcpy((uint64_t*)&data, *readStreamPtrPtr, sizeof(uint64_t));
                 *readStreamPtrPtr += sizeof(uint64_t);
                 if (m_logCalls) {
@@ -20320,9 +20350,11 @@
                 *readStreamPtrPtr += sizeof(VkObjectType);
                 memcpy((uint64_t*)&objectHandle, *readStreamPtrPtr, sizeof(uint64_t));
                 *readStreamPtrPtr += sizeof(uint64_t);
-                memcpy((VkPrivateDataSlot*)&privateDataSlot, (*readStreamPtrPtr), 8);
-                android::base::Stream::fromBe64((uint8_t*)&privateDataSlot);
-                *readStreamPtrPtr += 8;
+                uint64_t cgen_var_1;
+                memcpy((uint64_t*)&cgen_var_1, *readStreamPtrPtr, 1 * 8);
+                *readStreamPtrPtr += 1 * 8;
+                *(VkPrivateDataSlot*)&privateDataSlot =
+                    (VkPrivateDataSlot)unbox_VkPrivateDataSlot((VkPrivateDataSlot)(*&cgen_var_1));
                 // Begin manual dispatchable handle unboxing for pData;
                 vkReadStream->unsetHandleMapping();
                 vkReadStream->alloc((void**)&pData, sizeof(uint64_t));
diff --git a/host/vulkan/VkDecoderSnapshot.cpp b/host/vulkan/VkDecoderSnapshot.cpp
index 18effb2..494c2fe 100644
--- a/host/vulkan/VkDecoderSnapshot.cpp
+++ b/host/vulkan/VkDecoderSnapshot.cpp
@@ -1959,11 +1959,29 @@
                                  android::base::BumpPool* pool, VkResult input_result,
                                  VkDevice device, const VkPrivateDataSlotCreateInfo* pCreateInfo,
                                  const VkAllocationCallbacks* pAllocator,
-                                 VkPrivateDataSlot* pPrivateDataSlot) {}
+                                 VkPrivateDataSlot* pPrivateDataSlot) {
+        if (!pPrivateDataSlot) return;
+        android::base::AutoLock lock(mLock);
+        // pPrivateDataSlot create
+        mReconstruction.addHandles((const uint64_t*)pPrivateDataSlot, 1);
+        mReconstruction.addHandleDependency((const uint64_t*)pPrivateDataSlot, 1,
+                                            (uint64_t)(uintptr_t)device);
+        auto apiHandle = mReconstruction.createApiInfo();
+        auto apiInfo = mReconstruction.getApiInfo(apiHandle);
+        mReconstruction.setApiTrace(apiInfo, OP_vkCreatePrivateDataSlot, snapshotTraceBegin,
+                                    snapshotTraceBytes);
+        mReconstruction.forEachHandleAddApi((const uint64_t*)pPrivateDataSlot, 1, apiHandle,
+                                            VkReconstruction::CREATED);
+        mReconstruction.setCreatedHandlesForApi(apiHandle, (const uint64_t*)pPrivateDataSlot, 1);
+    }
     void vkDestroyPrivateDataSlot(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
                                   android::base::BumpPool* pool, VkDevice device,
                                   VkPrivateDataSlot privateDataSlot,
-                                  const VkAllocationCallbacks* pAllocator) {}
+                                  const VkAllocationCallbacks* pAllocator) {
+        android::base::AutoLock lock(mLock);
+        // privateDataSlot destroy
+        mReconstruction.removeHandles((const uint64_t*)(&privateDataSlot), 1, true);
+    }
     void vkSetPrivateData(const uint8_t* snapshotTraceBegin, size_t snapshotTraceBytes,
                           android::base::BumpPool* pool, VkResult input_result, VkDevice device,
                           VkObjectType objectType, uint64_t objectHandle,
diff --git a/host/vulkan/VulkanHandles.h b/host/vulkan/VulkanHandles.h
index 29d40ae..a6d0963 100644
--- a/host/vulkan/VulkanHandles.h
+++ b/host/vulkan/VulkanHandles.h
@@ -57,6 +57,7 @@
     f(VkAccelerationStructureKHR)                                 \
     f(VkCuModuleNVX)                                              \
     f(VkCuFunctionNVX)                                            \
+    f(VkPrivateDataSlot)                                          \
     f(VkMicromapEXT)
 
 #define GOLDFISH_VK_LIST_NON_DISPATCHABLE_HANDLE_TYPES(f) \
@@ -108,4 +109,5 @@
     f(VkAccelerationStructureKHR)                 \
     f(VkCuModuleNVX)                              \
     f(VkCuFunctionNVX)                            \
+    f(VkPrivateDataSlot)                          \
     f(VkMicromapEXT)
diff --git a/host/vulkan/meson.build b/host/vulkan/meson.build
index 7d33f1f..c119570 100644
--- a/host/vulkan/meson.build
+++ b/host/vulkan/meson.build
@@ -63,7 +63,7 @@
                         inc_cereal, inc_cereal_common, inc_stream_servers,
                         inc_vulkan_server, inc_renderdoc_external,
                         inc_gl_host_common, inc_vulkan_headers, inc_glm, inc_host_backend,
-                        inc_host_features, inc_host_tracing],
+                        inc_host_features, inc_host_tracing, inc_common_utils],
   link_with: [lib_vulkan_cereal, lib_emulated_textures, lib_host_backend, lib_host_features,
               lib_host_tracing],
   dependencies: [aemu_base_dep, aemu_common_dep, aemu_snapshot_dep]
diff --git a/include/render-utils/render_api_types.h b/include/render-utils/render_api_types.h
index 71792fc..e7fcd99 100644
--- a/include/render-utils/render_api_types.h
+++ b/include/render-utils/render_api_types.h
@@ -23,5 +23,13 @@
 // Feature control
 typedef bool (*emugl_feature_is_enabled_t)(android::featurecontrol::Feature feature);
 
+typedef void (*gfxstream_logger_internal_t)(char severity, const char* file, unsigned int line,
+              int64_t timestamp_us, const char* message);
+
+#ifdef CONFIG_AEMU
 using emugl_logger_t = gfxstream_logger_t;
 using emugl_logger_struct = gfxstream_logger_t;
+#else
+using emugl_logger_t = gfxstream_logger_internal_t;
+using emugl_logger_struct = gfxstream_logger_internal_t;
+#endif