Faster streaming code (guest side)

Bug: 177241396

Change-Id: Ia2bf7b9c5fddda8b5e60cba842a31f147acaa79e
diff --git a/android-emu/android/base/files/Stream.cpp b/android-emu/android/base/files/Stream.cpp
index db34ed3..85730d0 100644
--- a/android-emu/android/base/files/Stream.cpp
+++ b/android-emu/android/base/files/Stream.cpp
@@ -183,5 +183,79 @@
     return sign ? -int64_t(num >> 1) : (num >> 1);
 }
 
+// Static big-endian conversions
+
+// the |v| pointer is unlikely to be aligned---use memcpy throughout
+
+void Stream::toByte(uint8_t*) { } // no conversion
+
+void Stream::toBe16(uint8_t* v) {
+    uint16_t value;
+    memcpy(&value, v, sizeof(uint16_t));
+    uint8_t b[2] = { (uint8_t)(value >> 8), (uint8_t)value };
+    memcpy(v, b, sizeof(uint16_t));
+}
+
+void Stream::toBe32(uint8_t* v) {
+    uint32_t value;
+    memcpy(&value, v, sizeof(uint32_t));
+    uint8_t b[4] = {
+            (uint8_t)(value >> 24),
+            (uint8_t)(value >> 16),
+            (uint8_t)(value >> 8),
+            (uint8_t)value };
+    memcpy(v, b, sizeof(uint32_t));
+}
+
+void Stream::toBe64(uint8_t* v) {
+    uint64_t value;
+    memcpy(&value, v, sizeof(uint64_t));
+    uint8_t b[8] = {
+            (uint8_t)(value >> 56),
+            (uint8_t)(value >> 48),
+            (uint8_t)(value >> 40),
+            (uint8_t)(value >> 32),
+            (uint8_t)(value >> 24),
+            (uint8_t)(value >> 16),
+            (uint8_t)(value >> 8),
+            (uint8_t)value };
+    memcpy(v, b, sizeof(uint64_t));
+}
+
+void Stream::fromByte(uint8_t*) { } // no conversion
+
+void Stream::fromBe16(uint8_t* v) {
+    uint8_t b[2];
+    memcpy(b, v, sizeof(uint16_t));
+    uint16_t value = ((uint16_t)b[0] << 8) | (uint16_t)b[1];
+    memcpy(v, &value, sizeof(uint16_t));
+}
+
+void Stream::fromBe32(uint8_t* v) {
+    uint8_t b[4];
+    memcpy(b, v, sizeof(uint32_t));
+    uint32_t value =
+        ((uint32_t)b[0] << 24) |
+        ((uint32_t)b[1] << 16) |
+        ((uint32_t)b[2] << 8) |
+        (uint32_t)b[3];
+    memcpy(v, &value, sizeof(uint32_t));
+}
+
+void Stream::fromBe64(uint8_t* v) {
+    uint8_t b[8];
+    memcpy(b, v, sizeof(uint64_t));
+    uint64_t value =
+        ((uint64_t)b[0] << 56) |
+        ((uint64_t)b[1] << 48) |
+        ((uint64_t)b[2] << 40) |
+        ((uint64_t)b[3] << 32) |
+        ((uint64_t)b[4] << 24) |
+        ((uint64_t)b[5] << 16) |
+        ((uint64_t)b[6] << 8) |
+        (uint64_t)b[7];
+    memcpy(v, &value, sizeof(uint64_t));
+}
+
 }  // namespace base
 }  // namespace android
diff --git a/android-emu/android/base/files/Stream.h b/android-emu/android/base/files/Stream.h
index 3a5632e..fa175f3 100644
--- a/android-emu/android/base/files/Stream.h
+++ b/android-emu/android/base/files/Stream.h
@@ -106,6 +106,16 @@
     // bit + packed unsigned representation)
     void putPackedSignedNum(int64_t num);
     int64_t getPackedSignedNum();
+
+    // Static big-endian conversions
+    static void toByte(uint8_t*);
+    static void toBe16(uint8_t*);
+    static void toBe32(uint8_t*);
+    static void toBe64(uint8_t*);
+    static void fromByte(uint8_t*);
+    static void fromBe16(uint8_t*);
+    static void fromBe32(uint8_t*);
+    static void fromBe64(uint8_t*);
 };
 
 }  // namespace base
diff --git a/system/vulkan/func_table.cpp b/system/vulkan/func_table.cpp
index b5b1174..b1c8f39 100644
--- a/system/vulkan/func_table.cpp
+++ b/system/vulkan/func_table.cpp
@@ -56,7 +56,7 @@
     AEMU_SCOPED_TRACE("vkCreateInstance");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateInstance_VkResult_return = (VkResult)0;
-    vkCreateInstance_VkResult_return = vkEnc->vkCreateInstance(pCreateInfo, pAllocator, pInstance);
+    vkCreateInstance_VkResult_return = vkEnc->vkCreateInstance(pCreateInfo, pAllocator, pInstance, true /* do lock */);
     return vkCreateInstance_VkResult_return;
 }
 static void entry_vkDestroyInstance(
@@ -65,7 +65,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroyInstance");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyInstance(instance, pAllocator);
+    vkEnc->vkDestroyInstance(instance, pAllocator, true /* do lock */);
 }
 static VkResult entry_vkEnumeratePhysicalDevices(
     VkInstance instance,
@@ -85,7 +85,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceFeatures");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceFeatures(physicalDevice, pFeatures);
+    vkEnc->vkGetPhysicalDeviceFeatures(physicalDevice, pFeatures, true /* do lock */);
 }
 static void entry_vkGetPhysicalDeviceFormatProperties(
     VkPhysicalDevice physicalDevice,
@@ -94,7 +94,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceFormatProperties");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties);
+    vkEnc->vkGetPhysicalDeviceFormatProperties(physicalDevice, format, pFormatProperties, true /* do lock */);
 }
 static VkResult entry_vkGetPhysicalDeviceImageFormatProperties(
     VkPhysicalDevice physicalDevice,
@@ -108,7 +108,7 @@
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceImageFormatProperties");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetPhysicalDeviceImageFormatProperties_VkResult_return = (VkResult)0;
-    vkGetPhysicalDeviceImageFormatProperties_VkResult_return = vkEnc->vkGetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties);
+    vkGetPhysicalDeviceImageFormatProperties_VkResult_return = vkEnc->vkGetPhysicalDeviceImageFormatProperties(physicalDevice, format, type, tiling, usage, flags, pImageFormatProperties, true /* do lock */);
     return vkGetPhysicalDeviceImageFormatProperties_VkResult_return;
 }
 static void entry_vkGetPhysicalDeviceProperties(
@@ -117,7 +117,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceProperties");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceProperties(physicalDevice, pProperties);
+    vkEnc->vkGetPhysicalDeviceProperties(physicalDevice, pProperties, true /* do lock */);
 }
 static void entry_vkGetPhysicalDeviceQueueFamilyProperties(
     VkPhysicalDevice physicalDevice,
@@ -126,7 +126,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceQueueFamilyProperties");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
+    vkEnc->vkGetPhysicalDeviceQueueFamilyProperties(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties, true /* do lock */);
 }
 static void entry_vkGetPhysicalDeviceMemoryProperties(
     VkPhysicalDevice physicalDevice,
@@ -134,7 +134,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceMemoryProperties");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties);
+    vkEnc->vkGetPhysicalDeviceMemoryProperties(physicalDevice, pMemoryProperties, true /* do lock */);
 }
 static PFN_vkVoidFunction entry_vkGetInstanceProcAddr(
     VkInstance instance,
@@ -143,7 +143,7 @@
     AEMU_SCOPED_TRACE("vkGetInstanceProcAddr");
     auto vkEnc = HostConnection::get()->vkEncoder();
     PFN_vkVoidFunction vkGetInstanceProcAddr_PFN_vkVoidFunction_return = (PFN_vkVoidFunction)0;
-    vkGetInstanceProcAddr_PFN_vkVoidFunction_return = vkEnc->vkGetInstanceProcAddr(instance, pName);
+    vkGetInstanceProcAddr_PFN_vkVoidFunction_return = vkEnc->vkGetInstanceProcAddr(instance, pName, true /* do lock */);
     return vkGetInstanceProcAddr_PFN_vkVoidFunction_return;
 }
 static PFN_vkVoidFunction entry_vkGetDeviceProcAddr(
@@ -153,7 +153,7 @@
     AEMU_SCOPED_TRACE("vkGetDeviceProcAddr");
     auto vkEnc = HostConnection::get()->vkEncoder();
     PFN_vkVoidFunction vkGetDeviceProcAddr_PFN_vkVoidFunction_return = (PFN_vkVoidFunction)0;
-    vkGetDeviceProcAddr_PFN_vkVoidFunction_return = vkEnc->vkGetDeviceProcAddr(device, pName);
+    vkGetDeviceProcAddr_PFN_vkVoidFunction_return = vkEnc->vkGetDeviceProcAddr(device, pName, true /* do lock */);
     return vkGetDeviceProcAddr_PFN_vkVoidFunction_return;
 }
 static VkResult entry_vkCreateDevice(
@@ -165,7 +165,7 @@
     AEMU_SCOPED_TRACE("vkCreateDevice");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateDevice_VkResult_return = (VkResult)0;
-    vkCreateDevice_VkResult_return = vkEnc->vkCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
+    vkCreateDevice_VkResult_return = vkEnc->vkCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice, true /* do lock */);
     return vkCreateDevice_VkResult_return;
 }
 static void entry_vkDestroyDevice(
@@ -174,7 +174,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroyDevice");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyDevice(device, pAllocator);
+    vkEnc->vkDestroyDevice(device, pAllocator, true /* do lock */);
 }
 static VkResult entry_vkEnumerateInstanceExtensionProperties(
     const char* pLayerName,
@@ -208,7 +208,7 @@
     AEMU_SCOPED_TRACE("vkEnumerateInstanceLayerProperties");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkEnumerateInstanceLayerProperties_VkResult_return = (VkResult)0;
-    vkEnumerateInstanceLayerProperties_VkResult_return = vkEnc->vkEnumerateInstanceLayerProperties(pPropertyCount, pProperties);
+    vkEnumerateInstanceLayerProperties_VkResult_return = vkEnc->vkEnumerateInstanceLayerProperties(pPropertyCount, pProperties, true /* do lock */);
     return vkEnumerateInstanceLayerProperties_VkResult_return;
 }
 static VkResult entry_vkEnumerateDeviceLayerProperties(
@@ -219,7 +219,7 @@
     AEMU_SCOPED_TRACE("vkEnumerateDeviceLayerProperties");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkEnumerateDeviceLayerProperties_VkResult_return = (VkResult)0;
-    vkEnumerateDeviceLayerProperties_VkResult_return = vkEnc->vkEnumerateDeviceLayerProperties(physicalDevice, pPropertyCount, pProperties);
+    vkEnumerateDeviceLayerProperties_VkResult_return = vkEnc->vkEnumerateDeviceLayerProperties(physicalDevice, pPropertyCount, pProperties, true /* do lock */);
     return vkEnumerateDeviceLayerProperties_VkResult_return;
 }
 static void entry_vkGetDeviceQueue(
@@ -230,7 +230,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetDeviceQueue");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue);
+    vkEnc->vkGetDeviceQueue(device, queueFamilyIndex, queueIndex, pQueue, true /* do lock */);
 }
 static VkResult entry_vkQueueSubmit(
     VkQueue queue,
@@ -263,7 +263,7 @@
     AEMU_SCOPED_TRACE("vkDeviceWaitIdle");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkDeviceWaitIdle_VkResult_return = (VkResult)0;
-    vkDeviceWaitIdle_VkResult_return = vkEnc->vkDeviceWaitIdle(device);
+    vkDeviceWaitIdle_VkResult_return = vkEnc->vkDeviceWaitIdle(device, true /* do lock */);
     return vkDeviceWaitIdle_VkResult_return;
 }
 static VkResult entry_vkAllocateMemory(
@@ -300,7 +300,7 @@
     AEMU_SCOPED_TRACE("vkMapMemory");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkMapMemory_VkResult_return = (VkResult)0;
-    vkMapMemory_VkResult_return = vkEnc->vkMapMemory(device, memory, offset, size, flags, ppData);
+    vkMapMemory_VkResult_return = vkEnc->vkMapMemory(device, memory, offset, size, flags, ppData, true /* do lock */);
     return vkMapMemory_VkResult_return;
 }
 static void entry_vkUnmapMemory(
@@ -309,7 +309,7 @@
 {
     AEMU_SCOPED_TRACE("vkUnmapMemory");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkUnmapMemory(device, memory);
+    vkEnc->vkUnmapMemory(device, memory, true /* do lock */);
 }
 static VkResult entry_vkFlushMappedMemoryRanges(
     VkDevice device,
@@ -319,7 +319,7 @@
     AEMU_SCOPED_TRACE("vkFlushMappedMemoryRanges");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkFlushMappedMemoryRanges_VkResult_return = (VkResult)0;
-    vkFlushMappedMemoryRanges_VkResult_return = vkEnc->vkFlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
+    vkFlushMappedMemoryRanges_VkResult_return = vkEnc->vkFlushMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges, true /* do lock */);
     return vkFlushMappedMemoryRanges_VkResult_return;
 }
 static VkResult entry_vkInvalidateMappedMemoryRanges(
@@ -330,7 +330,7 @@
     AEMU_SCOPED_TRACE("vkInvalidateMappedMemoryRanges");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkInvalidateMappedMemoryRanges_VkResult_return = (VkResult)0;
-    vkInvalidateMappedMemoryRanges_VkResult_return = vkEnc->vkInvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges);
+    vkInvalidateMappedMemoryRanges_VkResult_return = vkEnc->vkInvalidateMappedMemoryRanges(device, memoryRangeCount, pMemoryRanges, true /* do lock */);
     return vkInvalidateMappedMemoryRanges_VkResult_return;
 }
 static void entry_vkGetDeviceMemoryCommitment(
@@ -340,7 +340,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetDeviceMemoryCommitment");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes);
+    vkEnc->vkGetDeviceMemoryCommitment(device, memory, pCommittedMemoryInBytes, true /* do lock */);
 }
 static VkResult entry_vkBindBufferMemory(
     VkDevice device,
@@ -396,7 +396,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetImageSparseMemoryRequirements");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
+    vkEnc->vkGetImageSparseMemoryRequirements(device, image, pSparseMemoryRequirementCount, pSparseMemoryRequirements, true /* do lock */);
 }
 static void entry_vkGetPhysicalDeviceSparseImageFormatProperties(
     VkPhysicalDevice physicalDevice,
@@ -410,7 +410,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceSparseImageFormatProperties");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount, pProperties);
+    vkEnc->vkGetPhysicalDeviceSparseImageFormatProperties(physicalDevice, format, type, samples, usage, tiling, pPropertyCount, pProperties, true /* do lock */);
 }
 static VkResult entry_vkQueueBindSparse(
     VkQueue queue,
@@ -422,7 +422,7 @@
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
     VkResult vkQueueBindSparse_VkResult_return = (VkResult)0;
-    vkQueueBindSparse_VkResult_return = vkEnc->vkQueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
+    vkQueueBindSparse_VkResult_return = vkEnc->vkQueueBindSparse(queue, bindInfoCount, pBindInfo, fence, true /* do lock */);
     return vkQueueBindSparse_VkResult_return;
 }
 static VkResult entry_vkCreateFence(
@@ -445,7 +445,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroyFence");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyFence(device, fence, pAllocator);
+    vkEnc->vkDestroyFence(device, fence, pAllocator, true /* do lock */);
 }
 static VkResult entry_vkResetFences(
     VkDevice device,
@@ -466,7 +466,7 @@
     AEMU_SCOPED_TRACE("vkGetFenceStatus");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetFenceStatus_VkResult_return = (VkResult)0;
-    vkGetFenceStatus_VkResult_return = vkEnc->vkGetFenceStatus(device, fence);
+    vkGetFenceStatus_VkResult_return = vkEnc->vkGetFenceStatus(device, fence, true /* do lock */);
     return vkGetFenceStatus_VkResult_return;
 }
 static VkResult entry_vkWaitForFences(
@@ -515,7 +515,7 @@
     AEMU_SCOPED_TRACE("vkCreateEvent");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateEvent_VkResult_return = (VkResult)0;
-    vkCreateEvent_VkResult_return = vkEnc->vkCreateEvent(device, pCreateInfo, pAllocator, pEvent);
+    vkCreateEvent_VkResult_return = vkEnc->vkCreateEvent(device, pCreateInfo, pAllocator, pEvent, true /* do lock */);
     return vkCreateEvent_VkResult_return;
 }
 static void entry_vkDestroyEvent(
@@ -525,7 +525,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroyEvent");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyEvent(device, event, pAllocator);
+    vkEnc->vkDestroyEvent(device, event, pAllocator, true /* do lock */);
 }
 static VkResult entry_vkGetEventStatus(
     VkDevice device,
@@ -534,7 +534,7 @@
     AEMU_SCOPED_TRACE("vkGetEventStatus");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetEventStatus_VkResult_return = (VkResult)0;
-    vkGetEventStatus_VkResult_return = vkEnc->vkGetEventStatus(device, event);
+    vkGetEventStatus_VkResult_return = vkEnc->vkGetEventStatus(device, event, true /* do lock */);
     return vkGetEventStatus_VkResult_return;
 }
 static VkResult entry_vkSetEvent(
@@ -544,7 +544,7 @@
     AEMU_SCOPED_TRACE("vkSetEvent");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkSetEvent_VkResult_return = (VkResult)0;
-    vkSetEvent_VkResult_return = vkEnc->vkSetEvent(device, event);
+    vkSetEvent_VkResult_return = vkEnc->vkSetEvent(device, event, true /* do lock */);
     return vkSetEvent_VkResult_return;
 }
 static VkResult entry_vkResetEvent(
@@ -554,7 +554,7 @@
     AEMU_SCOPED_TRACE("vkResetEvent");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkResetEvent_VkResult_return = (VkResult)0;
-    vkResetEvent_VkResult_return = vkEnc->vkResetEvent(device, event);
+    vkResetEvent_VkResult_return = vkEnc->vkResetEvent(device, event, true /* do lock */);
     return vkResetEvent_VkResult_return;
 }
 static VkResult entry_vkCreateQueryPool(
@@ -566,7 +566,7 @@
     AEMU_SCOPED_TRACE("vkCreateQueryPool");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateQueryPool_VkResult_return = (VkResult)0;
-    vkCreateQueryPool_VkResult_return = vkEnc->vkCreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool);
+    vkCreateQueryPool_VkResult_return = vkEnc->vkCreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool, true /* do lock */);
     return vkCreateQueryPool_VkResult_return;
 }
 static void entry_vkDestroyQueryPool(
@@ -576,7 +576,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroyQueryPool");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyQueryPool(device, queryPool, pAllocator);
+    vkEnc->vkDestroyQueryPool(device, queryPool, pAllocator, true /* do lock */);
 }
 static VkResult entry_vkGetQueryPoolResults(
     VkDevice device,
@@ -591,7 +591,7 @@
     AEMU_SCOPED_TRACE("vkGetQueryPoolResults");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetQueryPoolResults_VkResult_return = (VkResult)0;
-    vkGetQueryPoolResults_VkResult_return = vkEnc->vkGetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags);
+    vkGetQueryPoolResults_VkResult_return = vkEnc->vkGetQueryPoolResults(device, queryPool, firstQuery, queryCount, dataSize, pData, stride, flags, true /* do lock */);
     return vkGetQueryPoolResults_VkResult_return;
 }
 static VkResult entry_vkCreateBuffer(
@@ -626,7 +626,7 @@
     AEMU_SCOPED_TRACE("vkCreateBufferView");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateBufferView_VkResult_return = (VkResult)0;
-    vkCreateBufferView_VkResult_return = vkEnc->vkCreateBufferView(device, pCreateInfo, pAllocator, pView);
+    vkCreateBufferView_VkResult_return = vkEnc->vkCreateBufferView(device, pCreateInfo, pAllocator, pView, true /* do lock */);
     return vkCreateBufferView_VkResult_return;
 }
 static void entry_vkDestroyBufferView(
@@ -636,7 +636,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroyBufferView");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyBufferView(device, bufferView, pAllocator);
+    vkEnc->vkDestroyBufferView(device, bufferView, pAllocator, true /* do lock */);
 }
 static VkResult entry_vkCreateImage(
     VkDevice device,
@@ -669,7 +669,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetImageSubresourceLayout");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetImageSubresourceLayout(device, image, pSubresource, pLayout);
+    vkEnc->vkGetImageSubresourceLayout(device, image, pSubresource, pLayout, true /* do lock */);
 }
 static VkResult entry_vkCreateImageView(
     VkDevice device,
@@ -691,7 +691,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroyImageView");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyImageView(device, imageView, pAllocator);
+    vkEnc->vkDestroyImageView(device, imageView, pAllocator, true /* do lock */);
 }
 static VkResult entry_vkCreateShaderModule(
     VkDevice device,
@@ -702,7 +702,7 @@
     AEMU_SCOPED_TRACE("vkCreateShaderModule");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateShaderModule_VkResult_return = (VkResult)0;
-    vkCreateShaderModule_VkResult_return = vkEnc->vkCreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule);
+    vkCreateShaderModule_VkResult_return = vkEnc->vkCreateShaderModule(device, pCreateInfo, pAllocator, pShaderModule, true /* do lock */);
     return vkCreateShaderModule_VkResult_return;
 }
 static void entry_vkDestroyShaderModule(
@@ -712,7 +712,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroyShaderModule");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyShaderModule(device, shaderModule, pAllocator);
+    vkEnc->vkDestroyShaderModule(device, shaderModule, pAllocator, true /* do lock */);
 }
 static VkResult entry_vkCreatePipelineCache(
     VkDevice device,
@@ -723,7 +723,7 @@
     AEMU_SCOPED_TRACE("vkCreatePipelineCache");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreatePipelineCache_VkResult_return = (VkResult)0;
-    vkCreatePipelineCache_VkResult_return = vkEnc->vkCreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache);
+    vkCreatePipelineCache_VkResult_return = vkEnc->vkCreatePipelineCache(device, pCreateInfo, pAllocator, pPipelineCache, true /* do lock */);
     return vkCreatePipelineCache_VkResult_return;
 }
 static void entry_vkDestroyPipelineCache(
@@ -733,7 +733,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroyPipelineCache");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyPipelineCache(device, pipelineCache, pAllocator);
+    vkEnc->vkDestroyPipelineCache(device, pipelineCache, pAllocator, true /* do lock */);
 }
 static VkResult entry_vkGetPipelineCacheData(
     VkDevice device,
@@ -744,7 +744,7 @@
     AEMU_SCOPED_TRACE("vkGetPipelineCacheData");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetPipelineCacheData_VkResult_return = (VkResult)0;
-    vkGetPipelineCacheData_VkResult_return = vkEnc->vkGetPipelineCacheData(device, pipelineCache, pDataSize, pData);
+    vkGetPipelineCacheData_VkResult_return = vkEnc->vkGetPipelineCacheData(device, pipelineCache, pDataSize, pData, true /* do lock */);
     return vkGetPipelineCacheData_VkResult_return;
 }
 static VkResult entry_vkMergePipelineCaches(
@@ -756,7 +756,7 @@
     AEMU_SCOPED_TRACE("vkMergePipelineCaches");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkMergePipelineCaches_VkResult_return = (VkResult)0;
-    vkMergePipelineCaches_VkResult_return = vkEnc->vkMergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches);
+    vkMergePipelineCaches_VkResult_return = vkEnc->vkMergePipelineCaches(device, dstCache, srcCacheCount, pSrcCaches, true /* do lock */);
     return vkMergePipelineCaches_VkResult_return;
 }
 static VkResult entry_vkCreateGraphicsPipelines(
@@ -770,7 +770,7 @@
     AEMU_SCOPED_TRACE("vkCreateGraphicsPipelines");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateGraphicsPipelines_VkResult_return = (VkResult)0;
-    vkCreateGraphicsPipelines_VkResult_return = vkEnc->vkCreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
+    vkCreateGraphicsPipelines_VkResult_return = vkEnc->vkCreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines, true /* do lock */);
     return vkCreateGraphicsPipelines_VkResult_return;
 }
 static VkResult entry_vkCreateComputePipelines(
@@ -784,7 +784,7 @@
     AEMU_SCOPED_TRACE("vkCreateComputePipelines");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateComputePipelines_VkResult_return = (VkResult)0;
-    vkCreateComputePipelines_VkResult_return = vkEnc->vkCreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines);
+    vkCreateComputePipelines_VkResult_return = vkEnc->vkCreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines, true /* do lock */);
     return vkCreateComputePipelines_VkResult_return;
 }
 static void entry_vkDestroyPipeline(
@@ -794,7 +794,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroyPipeline");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyPipeline(device, pipeline, pAllocator);
+    vkEnc->vkDestroyPipeline(device, pipeline, pAllocator, true /* do lock */);
 }
 static VkResult entry_vkCreatePipelineLayout(
     VkDevice device,
@@ -805,7 +805,7 @@
     AEMU_SCOPED_TRACE("vkCreatePipelineLayout");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreatePipelineLayout_VkResult_return = (VkResult)0;
-    vkCreatePipelineLayout_VkResult_return = vkEnc->vkCreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout);
+    vkCreatePipelineLayout_VkResult_return = vkEnc->vkCreatePipelineLayout(device, pCreateInfo, pAllocator, pPipelineLayout, true /* do lock */);
     return vkCreatePipelineLayout_VkResult_return;
 }
 static void entry_vkDestroyPipelineLayout(
@@ -815,7 +815,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroyPipelineLayout");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyPipelineLayout(device, pipelineLayout, pAllocator);
+    vkEnc->vkDestroyPipelineLayout(device, pipelineLayout, pAllocator, true /* do lock */);
 }
 static VkResult entry_vkCreateSampler(
     VkDevice device,
@@ -837,7 +837,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroySampler");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroySampler(device, sampler, pAllocator);
+    vkEnc->vkDestroySampler(device, sampler, pAllocator, true /* do lock */);
 }
 static VkResult entry_vkCreateDescriptorSetLayout(
     VkDevice device,
@@ -859,7 +859,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroyDescriptorSetLayout");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator);
+    vkEnc->vkDestroyDescriptorSetLayout(device, descriptorSetLayout, pAllocator, true /* do lock */);
 }
 static VkResult entry_vkCreateDescriptorPool(
     VkDevice device,
@@ -942,7 +942,7 @@
     AEMU_SCOPED_TRACE("vkCreateFramebuffer");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateFramebuffer_VkResult_return = (VkResult)0;
-    vkCreateFramebuffer_VkResult_return = vkEnc->vkCreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer);
+    vkCreateFramebuffer_VkResult_return = vkEnc->vkCreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer, true /* do lock */);
     return vkCreateFramebuffer_VkResult_return;
 }
 static void entry_vkDestroyFramebuffer(
@@ -952,7 +952,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroyFramebuffer");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyFramebuffer(device, framebuffer, pAllocator);
+    vkEnc->vkDestroyFramebuffer(device, framebuffer, pAllocator, true /* do lock */);
 }
 static VkResult entry_vkCreateRenderPass(
     VkDevice device,
@@ -963,7 +963,7 @@
     AEMU_SCOPED_TRACE("vkCreateRenderPass");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateRenderPass_VkResult_return = (VkResult)0;
-    vkCreateRenderPass_VkResult_return = vkEnc->vkCreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass);
+    vkCreateRenderPass_VkResult_return = vkEnc->vkCreateRenderPass(device, pCreateInfo, pAllocator, pRenderPass, true /* do lock */);
     return vkCreateRenderPass_VkResult_return;
 }
 static void entry_vkDestroyRenderPass(
@@ -973,7 +973,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroyRenderPass");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyRenderPass(device, renderPass, pAllocator);
+    vkEnc->vkDestroyRenderPass(device, renderPass, pAllocator, true /* do lock */);
 }
 static void entry_vkGetRenderAreaGranularity(
     VkDevice device,
@@ -982,7 +982,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetRenderAreaGranularity");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetRenderAreaGranularity(device, renderPass, pGranularity);
+    vkEnc->vkGetRenderAreaGranularity(device, renderPass, pGranularity, true /* do lock */);
 }
 static VkResult entry_vkCreateCommandPool(
     VkDevice device,
@@ -993,7 +993,7 @@
     AEMU_SCOPED_TRACE("vkCreateCommandPool");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateCommandPool_VkResult_return = (VkResult)0;
-    vkCreateCommandPool_VkResult_return = vkEnc->vkCreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool);
+    vkCreateCommandPool_VkResult_return = vkEnc->vkCreateCommandPool(device, pCreateInfo, pAllocator, pCommandPool, true /* do lock */);
     return vkCreateCommandPool_VkResult_return;
 }
 static void entry_vkDestroyCommandPool(
@@ -1003,7 +1003,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroyCommandPool");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyCommandPool(device, commandPool, pAllocator);
+    vkEnc->vkDestroyCommandPool(device, commandPool, pAllocator, true /* do lock */);
 }
 static VkResult entry_vkResetCommandPool(
     VkDevice device,
@@ -1013,7 +1013,7 @@
     AEMU_SCOPED_TRACE("vkResetCommandPool");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkResetCommandPool_VkResult_return = (VkResult)0;
-    vkResetCommandPool_VkResult_return = vkEnc->vkResetCommandPool(device, commandPool, flags);
+    vkResetCommandPool_VkResult_return = vkEnc->vkResetCommandPool(device, commandPool, flags, true /* do lock */);
     return vkResetCommandPool_VkResult_return;
 }
 static VkResult entry_vkAllocateCommandBuffers(
@@ -1024,7 +1024,7 @@
     AEMU_SCOPED_TRACE("vkAllocateCommandBuffers");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkAllocateCommandBuffers_VkResult_return = (VkResult)0;
-    vkAllocateCommandBuffers_VkResult_return = vkEnc->vkAllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers);
+    vkAllocateCommandBuffers_VkResult_return = vkEnc->vkAllocateCommandBuffers(device, pAllocateInfo, pCommandBuffers, true /* do lock */);
     return vkAllocateCommandBuffers_VkResult_return;
 }
 static void entry_vkFreeCommandBuffers(
@@ -1035,7 +1035,7 @@
 {
     AEMU_SCOPED_TRACE("vkFreeCommandBuffers");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkFreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers);
+    vkEnc->vkFreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers, true /* do lock */);
 }
 static VkResult entry_vkBeginCommandBuffer(
     VkCommandBuffer commandBuffer,
@@ -1080,7 +1080,7 @@
     AEMU_SCOPED_TRACE("vkCmdBindPipeline");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
+    vkEnc->vkCmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline, true /* do lock */);
 }
 static void entry_vkCmdSetViewport(
     VkCommandBuffer commandBuffer,
@@ -1091,7 +1091,7 @@
     AEMU_SCOPED_TRACE("vkCmdSetViewport");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports);
+    vkEnc->vkCmdSetViewport(commandBuffer, firstViewport, viewportCount, pViewports, true /* do lock */);
 }
 static void entry_vkCmdSetScissor(
     VkCommandBuffer commandBuffer,
@@ -1102,7 +1102,7 @@
     AEMU_SCOPED_TRACE("vkCmdSetScissor");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors);
+    vkEnc->vkCmdSetScissor(commandBuffer, firstScissor, scissorCount, pScissors, true /* do lock */);
 }
 static void entry_vkCmdSetLineWidth(
     VkCommandBuffer commandBuffer,
@@ -1111,7 +1111,7 @@
     AEMU_SCOPED_TRACE("vkCmdSetLineWidth");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdSetLineWidth(commandBuffer, lineWidth);
+    vkEnc->vkCmdSetLineWidth(commandBuffer, lineWidth, true /* do lock */);
 }
 static void entry_vkCmdSetDepthBias(
     VkCommandBuffer commandBuffer,
@@ -1122,7 +1122,7 @@
     AEMU_SCOPED_TRACE("vkCmdSetDepthBias");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor);
+    vkEnc->vkCmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor, true /* do lock */);
 }
 static void entry_vkCmdSetBlendConstants(
     VkCommandBuffer commandBuffer,
@@ -1131,7 +1131,7 @@
     AEMU_SCOPED_TRACE("vkCmdSetBlendConstants");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdSetBlendConstants(commandBuffer, blendConstants);
+    vkEnc->vkCmdSetBlendConstants(commandBuffer, blendConstants, true /* do lock */);
 }
 static void entry_vkCmdSetDepthBounds(
     VkCommandBuffer commandBuffer,
@@ -1141,7 +1141,7 @@
     AEMU_SCOPED_TRACE("vkCmdSetDepthBounds");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds);
+    vkEnc->vkCmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds, true /* do lock */);
 }
 static void entry_vkCmdSetStencilCompareMask(
     VkCommandBuffer commandBuffer,
@@ -1151,7 +1151,7 @@
     AEMU_SCOPED_TRACE("vkCmdSetStencilCompareMask");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdSetStencilCompareMask(commandBuffer, faceMask, compareMask);
+    vkEnc->vkCmdSetStencilCompareMask(commandBuffer, faceMask, compareMask, true /* do lock */);
 }
 static void entry_vkCmdSetStencilWriteMask(
     VkCommandBuffer commandBuffer,
@@ -1161,7 +1161,7 @@
     AEMU_SCOPED_TRACE("vkCmdSetStencilWriteMask");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdSetStencilWriteMask(commandBuffer, faceMask, writeMask);
+    vkEnc->vkCmdSetStencilWriteMask(commandBuffer, faceMask, writeMask, true /* do lock */);
 }
 static void entry_vkCmdSetStencilReference(
     VkCommandBuffer commandBuffer,
@@ -1171,7 +1171,7 @@
     AEMU_SCOPED_TRACE("vkCmdSetStencilReference");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdSetStencilReference(commandBuffer, faceMask, reference);
+    vkEnc->vkCmdSetStencilReference(commandBuffer, faceMask, reference, true /* do lock */);
 }
 static void entry_vkCmdBindDescriptorSets(
     VkCommandBuffer commandBuffer,
@@ -1186,7 +1186,7 @@
     AEMU_SCOPED_TRACE("vkCmdBindDescriptorSets");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets);
+    vkEnc->vkCmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet, descriptorSetCount, pDescriptorSets, dynamicOffsetCount, pDynamicOffsets, true /* do lock */);
 }
 static void entry_vkCmdBindIndexBuffer(
     VkCommandBuffer commandBuffer,
@@ -1197,7 +1197,7 @@
     AEMU_SCOPED_TRACE("vkCmdBindIndexBuffer");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdBindIndexBuffer(commandBuffer, buffer, offset, indexType);
+    vkEnc->vkCmdBindIndexBuffer(commandBuffer, buffer, offset, indexType, true /* do lock */);
 }
 static void entry_vkCmdBindVertexBuffers(
     VkCommandBuffer commandBuffer,
@@ -1209,7 +1209,7 @@
     AEMU_SCOPED_TRACE("vkCmdBindVertexBuffers");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
+    vkEnc->vkCmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, true /* do lock */);
 }
 static void entry_vkCmdDraw(
     VkCommandBuffer commandBuffer,
@@ -1221,7 +1221,7 @@
     AEMU_SCOPED_TRACE("vkCmdDraw");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
+    vkEnc->vkCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance, true /* do lock */);
 }
 static void entry_vkCmdDrawIndexed(
     VkCommandBuffer commandBuffer,
@@ -1234,7 +1234,7 @@
     AEMU_SCOPED_TRACE("vkCmdDrawIndexed");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
+    vkEnc->vkCmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance, true /* do lock */);
 }
 static void entry_vkCmdDrawIndirect(
     VkCommandBuffer commandBuffer,
@@ -1246,7 +1246,7 @@
     AEMU_SCOPED_TRACE("vkCmdDrawIndirect");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdDrawIndirect(commandBuffer, buffer, offset, drawCount, stride);
+    vkEnc->vkCmdDrawIndirect(commandBuffer, buffer, offset, drawCount, stride, true /* do lock */);
 }
 static void entry_vkCmdDrawIndexedIndirect(
     VkCommandBuffer commandBuffer,
@@ -1258,7 +1258,7 @@
     AEMU_SCOPED_TRACE("vkCmdDrawIndexedIndirect");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdDrawIndexedIndirect(commandBuffer, buffer, offset, drawCount, stride);
+    vkEnc->vkCmdDrawIndexedIndirect(commandBuffer, buffer, offset, drawCount, stride, true /* do lock */);
 }
 static void entry_vkCmdDispatch(
     VkCommandBuffer commandBuffer,
@@ -1269,7 +1269,7 @@
     AEMU_SCOPED_TRACE("vkCmdDispatch");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdDispatch(commandBuffer, groupCountX, groupCountY, groupCountZ);
+    vkEnc->vkCmdDispatch(commandBuffer, groupCountX, groupCountY, groupCountZ, true /* do lock */);
 }
 static void entry_vkCmdDispatchIndirect(
     VkCommandBuffer commandBuffer,
@@ -1279,7 +1279,7 @@
     AEMU_SCOPED_TRACE("vkCmdDispatchIndirect");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdDispatchIndirect(commandBuffer, buffer, offset);
+    vkEnc->vkCmdDispatchIndirect(commandBuffer, buffer, offset, true /* do lock */);
 }
 static void entry_vkCmdCopyBuffer(
     VkCommandBuffer commandBuffer,
@@ -1291,7 +1291,7 @@
     AEMU_SCOPED_TRACE("vkCmdCopyBuffer");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions);
+    vkEnc->vkCmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, regionCount, pRegions, true /* do lock */);
 }
 static void entry_vkCmdCopyImage(
     VkCommandBuffer commandBuffer,
@@ -1305,7 +1305,7 @@
     AEMU_SCOPED_TRACE("vkCmdCopyImage");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
+    vkEnc->vkCmdCopyImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, true /* do lock */);
 }
 static void entry_vkCmdBlitImage(
     VkCommandBuffer commandBuffer,
@@ -1320,7 +1320,7 @@
     AEMU_SCOPED_TRACE("vkCmdBlitImage");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter);
+    vkEnc->vkCmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, filter, true /* do lock */);
 }
 static void entry_vkCmdCopyBufferToImage(
     VkCommandBuffer commandBuffer,
@@ -1333,7 +1333,7 @@
     AEMU_SCOPED_TRACE("vkCmdCopyBufferToImage");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
+    vkEnc->vkCmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions, true /* do lock */);
 }
 static void entry_vkCmdCopyImageToBuffer(
     VkCommandBuffer commandBuffer,
@@ -1346,7 +1346,7 @@
     AEMU_SCOPED_TRACE("vkCmdCopyImageToBuffer");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
+    vkEnc->vkCmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions, true /* do lock */);
 }
 static void entry_vkCmdUpdateBuffer(
     VkCommandBuffer commandBuffer,
@@ -1358,7 +1358,7 @@
     AEMU_SCOPED_TRACE("vkCmdUpdateBuffer");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
+    vkEnc->vkCmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData, true /* do lock */);
 }
 static void entry_vkCmdFillBuffer(
     VkCommandBuffer commandBuffer,
@@ -1370,7 +1370,7 @@
     AEMU_SCOPED_TRACE("vkCmdFillBuffer");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
+    vkEnc->vkCmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data, true /* do lock */);
 }
 static void entry_vkCmdClearColorImage(
     VkCommandBuffer commandBuffer,
@@ -1383,7 +1383,7 @@
     AEMU_SCOPED_TRACE("vkCmdClearColorImage");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
+    vkEnc->vkCmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges, true /* do lock */);
 }
 static void entry_vkCmdClearDepthStencilImage(
     VkCommandBuffer commandBuffer,
@@ -1396,7 +1396,7 @@
     AEMU_SCOPED_TRACE("vkCmdClearDepthStencilImage");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
+    vkEnc->vkCmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges, true /* do lock */);
 }
 static void entry_vkCmdClearAttachments(
     VkCommandBuffer commandBuffer,
@@ -1408,7 +1408,7 @@
     AEMU_SCOPED_TRACE("vkCmdClearAttachments");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects);
+    vkEnc->vkCmdClearAttachments(commandBuffer, attachmentCount, pAttachments, rectCount, pRects, true /* do lock */);
 }
 static void entry_vkCmdResolveImage(
     VkCommandBuffer commandBuffer,
@@ -1422,7 +1422,7 @@
     AEMU_SCOPED_TRACE("vkCmdResolveImage");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions);
+    vkEnc->vkCmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount, pRegions, true /* do lock */);
 }
 static void entry_vkCmdSetEvent(
     VkCommandBuffer commandBuffer,
@@ -1432,7 +1432,7 @@
     AEMU_SCOPED_TRACE("vkCmdSetEvent");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdSetEvent(commandBuffer, event, stageMask);
+    vkEnc->vkCmdSetEvent(commandBuffer, event, stageMask, true /* do lock */);
 }
 static void entry_vkCmdResetEvent(
     VkCommandBuffer commandBuffer,
@@ -1442,7 +1442,7 @@
     AEMU_SCOPED_TRACE("vkCmdResetEvent");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdResetEvent(commandBuffer, event, stageMask);
+    vkEnc->vkCmdResetEvent(commandBuffer, event, stageMask, true /* do lock */);
 }
 static void entry_vkCmdWaitEvents(
     VkCommandBuffer commandBuffer,
@@ -1460,7 +1460,7 @@
     AEMU_SCOPED_TRACE("vkCmdWaitEvents");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
+    vkEnc->vkCmdWaitEvents(commandBuffer, eventCount, pEvents, srcStageMask, dstStageMask, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers, true /* do lock */);
 }
 static void entry_vkCmdPipelineBarrier(
     VkCommandBuffer commandBuffer,
@@ -1477,7 +1477,7 @@
     AEMU_SCOPED_TRACE("vkCmdPipelineBarrier");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
+    vkEnc->vkCmdPipelineBarrier(commandBuffer, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers, true /* do lock */);
 }
 static void entry_vkCmdBeginQuery(
     VkCommandBuffer commandBuffer,
@@ -1488,7 +1488,7 @@
     AEMU_SCOPED_TRACE("vkCmdBeginQuery");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdBeginQuery(commandBuffer, queryPool, query, flags);
+    vkEnc->vkCmdBeginQuery(commandBuffer, queryPool, query, flags, true /* do lock */);
 }
 static void entry_vkCmdEndQuery(
     VkCommandBuffer commandBuffer,
@@ -1498,7 +1498,7 @@
     AEMU_SCOPED_TRACE("vkCmdEndQuery");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdEndQuery(commandBuffer, queryPool, query);
+    vkEnc->vkCmdEndQuery(commandBuffer, queryPool, query, true /* do lock */);
 }
 static void entry_vkCmdResetQueryPool(
     VkCommandBuffer commandBuffer,
@@ -1509,7 +1509,7 @@
     AEMU_SCOPED_TRACE("vkCmdResetQueryPool");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount);
+    vkEnc->vkCmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount, true /* do lock */);
 }
 static void entry_vkCmdWriteTimestamp(
     VkCommandBuffer commandBuffer,
@@ -1520,7 +1520,7 @@
     AEMU_SCOPED_TRACE("vkCmdWriteTimestamp");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query);
+    vkEnc->vkCmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, query, true /* do lock */);
 }
 static void entry_vkCmdCopyQueryPoolResults(
     VkCommandBuffer commandBuffer,
@@ -1535,7 +1535,7 @@
     AEMU_SCOPED_TRACE("vkCmdCopyQueryPoolResults");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
+    vkEnc->vkCmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags, true /* do lock */);
 }
 static void entry_vkCmdPushConstants(
     VkCommandBuffer commandBuffer,
@@ -1548,7 +1548,7 @@
     AEMU_SCOPED_TRACE("vkCmdPushConstants");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues);
+    vkEnc->vkCmdPushConstants(commandBuffer, layout, stageFlags, offset, size, pValues, true /* do lock */);
 }
 static void entry_vkCmdBeginRenderPass(
     VkCommandBuffer commandBuffer,
@@ -1558,7 +1558,7 @@
     AEMU_SCOPED_TRACE("vkCmdBeginRenderPass");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
+    vkEnc->vkCmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents, true /* do lock */);
 }
 static void entry_vkCmdNextSubpass(
     VkCommandBuffer commandBuffer,
@@ -1567,7 +1567,7 @@
     AEMU_SCOPED_TRACE("vkCmdNextSubpass");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdNextSubpass(commandBuffer, contents);
+    vkEnc->vkCmdNextSubpass(commandBuffer, contents, true /* do lock */);
 }
 static void entry_vkCmdEndRenderPass(
     VkCommandBuffer commandBuffer)
@@ -1575,7 +1575,7 @@
     AEMU_SCOPED_TRACE("vkCmdEndRenderPass");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdEndRenderPass(commandBuffer);
+    vkEnc->vkCmdEndRenderPass(commandBuffer, true /* do lock */);
 }
 static void entry_vkCmdExecuteCommands(
     VkCommandBuffer commandBuffer,
@@ -1585,7 +1585,7 @@
     AEMU_SCOPED_TRACE("vkCmdExecuteCommands");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers);
+    vkEnc->vkCmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers, true /* do lock */);
 }
 #endif
 #ifdef VK_VERSION_1_1
@@ -1595,7 +1595,7 @@
     AEMU_SCOPED_TRACE("vkEnumerateInstanceVersion");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkEnumerateInstanceVersion_VkResult_return = (VkResult)0;
-    vkEnumerateInstanceVersion_VkResult_return = vkEnc->vkEnumerateInstanceVersion(pApiVersion);
+    vkEnumerateInstanceVersion_VkResult_return = vkEnc->vkEnumerateInstanceVersion(pApiVersion, true /* do lock */);
     return vkEnumerateInstanceVersion_VkResult_return;
 }
 static VkResult entry_vkBindBufferMemory2(
@@ -1663,7 +1663,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetDeviceGroupPeerMemoryFeatures");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetDeviceGroupPeerMemoryFeatures(device, heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures);
+    vkEnc->vkGetDeviceGroupPeerMemoryFeatures(device, heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures, true /* do lock */);
 }
 static void dynCheck_entry_vkGetDeviceGroupPeerMemoryFeatures(
     VkDevice device,
@@ -1679,7 +1679,7 @@
     }
     AEMU_SCOPED_TRACE("vkGetDeviceGroupPeerMemoryFeatures");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetDeviceGroupPeerMemoryFeatures(device, heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures);
+    vkEnc->vkGetDeviceGroupPeerMemoryFeatures(device, heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures, true /* do lock */);
 }
 static void entry_vkCmdSetDeviceMask(
     VkCommandBuffer commandBuffer,
@@ -1688,7 +1688,7 @@
     AEMU_SCOPED_TRACE("vkCmdSetDeviceMask");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdSetDeviceMask(commandBuffer, deviceMask);
+    vkEnc->vkCmdSetDeviceMask(commandBuffer, deviceMask, true /* do lock */);
 }
 static void entry_vkCmdDispatchBase(
     VkCommandBuffer commandBuffer,
@@ -1702,7 +1702,7 @@
     AEMU_SCOPED_TRACE("vkCmdDispatchBase");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdDispatchBase(commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
+    vkEnc->vkCmdDispatchBase(commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ, true /* do lock */);
 }
 static VkResult entry_vkEnumeratePhysicalDeviceGroups(
     VkInstance instance,
@@ -1712,7 +1712,7 @@
     AEMU_SCOPED_TRACE("vkEnumeratePhysicalDeviceGroups");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkEnumeratePhysicalDeviceGroups_VkResult_return = (VkResult)0;
-    vkEnumeratePhysicalDeviceGroups_VkResult_return = vkEnc->vkEnumeratePhysicalDeviceGroups(instance, pPhysicalDeviceGroupCount, pPhysicalDeviceGroupProperties);
+    vkEnumeratePhysicalDeviceGroups_VkResult_return = vkEnc->vkEnumeratePhysicalDeviceGroups(instance, pPhysicalDeviceGroupCount, pPhysicalDeviceGroupProperties, true /* do lock */);
     return vkEnumeratePhysicalDeviceGroups_VkResult_return;
 }
 static void entry_vkGetImageMemoryRequirements2(
@@ -1771,7 +1771,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetImageSparseMemoryRequirements2");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetImageSparseMemoryRequirements2(device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
+    vkEnc->vkGetImageSparseMemoryRequirements2(device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements, true /* do lock */);
 }
 static void dynCheck_entry_vkGetImageSparseMemoryRequirements2(
     VkDevice device,
@@ -1786,7 +1786,7 @@
     }
     AEMU_SCOPED_TRACE("vkGetImageSparseMemoryRequirements2");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetImageSparseMemoryRequirements2(device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
+    vkEnc->vkGetImageSparseMemoryRequirements2(device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements, true /* do lock */);
 }
 static void entry_vkGetPhysicalDeviceFeatures2(
     VkPhysicalDevice physicalDevice,
@@ -1794,7 +1794,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceFeatures2");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceFeatures2(physicalDevice, pFeatures);
+    vkEnc->vkGetPhysicalDeviceFeatures2(physicalDevice, pFeatures, true /* do lock */);
 }
 static void entry_vkGetPhysicalDeviceProperties2(
     VkPhysicalDevice physicalDevice,
@@ -1802,7 +1802,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceProperties2");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceProperties2(physicalDevice, pProperties);
+    vkEnc->vkGetPhysicalDeviceProperties2(physicalDevice, pProperties, true /* do lock */);
 }
 static void entry_vkGetPhysicalDeviceFormatProperties2(
     VkPhysicalDevice physicalDevice,
@@ -1811,7 +1811,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceFormatProperties2");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceFormatProperties2(physicalDevice, format, pFormatProperties);
+    vkEnc->vkGetPhysicalDeviceFormatProperties2(physicalDevice, format, pFormatProperties, true /* do lock */);
 }
 static VkResult entry_vkGetPhysicalDeviceImageFormatProperties2(
     VkPhysicalDevice physicalDevice,
@@ -1832,7 +1832,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceQueueFamilyProperties2");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceQueueFamilyProperties2(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
+    vkEnc->vkGetPhysicalDeviceQueueFamilyProperties2(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties, true /* do lock */);
 }
 static void entry_vkGetPhysicalDeviceMemoryProperties2(
     VkPhysicalDevice physicalDevice,
@@ -1840,7 +1840,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceMemoryProperties2");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceMemoryProperties2(physicalDevice, pMemoryProperties);
+    vkEnc->vkGetPhysicalDeviceMemoryProperties2(physicalDevice, pMemoryProperties, true /* do lock */);
 }
 static void entry_vkGetPhysicalDeviceSparseImageFormatProperties2(
     VkPhysicalDevice physicalDevice,
@@ -1850,7 +1850,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceSparseImageFormatProperties2");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceSparseImageFormatProperties2(physicalDevice, pFormatInfo, pPropertyCount, pProperties);
+    vkEnc->vkGetPhysicalDeviceSparseImageFormatProperties2(physicalDevice, pFormatInfo, pPropertyCount, pProperties, true /* do lock */);
 }
 static void entry_vkTrimCommandPool(
     VkDevice device,
@@ -1859,7 +1859,7 @@
 {
     AEMU_SCOPED_TRACE("vkTrimCommandPool");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkTrimCommandPool(device, commandPool, flags);
+    vkEnc->vkTrimCommandPool(device, commandPool, flags, true /* do lock */);
 }
 static void dynCheck_entry_vkTrimCommandPool(
     VkDevice device,
@@ -1873,7 +1873,7 @@
     }
     AEMU_SCOPED_TRACE("vkTrimCommandPool");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkTrimCommandPool(device, commandPool, flags);
+    vkEnc->vkTrimCommandPool(device, commandPool, flags, true /* do lock */);
 }
 static void entry_vkGetDeviceQueue2(
     VkDevice device,
@@ -1882,7 +1882,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetDeviceQueue2");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetDeviceQueue2(device, pQueueInfo, pQueue);
+    vkEnc->vkGetDeviceQueue2(device, pQueueInfo, pQueue, true /* do lock */);
 }
 static void dynCheck_entry_vkGetDeviceQueue2(
     VkDevice device,
@@ -1896,7 +1896,7 @@
     }
     AEMU_SCOPED_TRACE("vkGetDeviceQueue2");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetDeviceQueue2(device, pQueueInfo, pQueue);
+    vkEnc->vkGetDeviceQueue2(device, pQueueInfo, pQueue, true /* do lock */);
 }
 static VkResult entry_vkCreateSamplerYcbcrConversion(
     VkDevice device,
@@ -1961,7 +1961,7 @@
     AEMU_SCOPED_TRACE("vkCreateDescriptorUpdateTemplate");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateDescriptorUpdateTemplate_VkResult_return = (VkResult)0;
-    vkCreateDescriptorUpdateTemplate_VkResult_return = vkEnc->vkCreateDescriptorUpdateTemplate(device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate);
+    vkCreateDescriptorUpdateTemplate_VkResult_return = vkEnc->vkCreateDescriptorUpdateTemplate(device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate, true /* do lock */);
     return vkCreateDescriptorUpdateTemplate_VkResult_return;
 }
 static VkResult dynCheck_entry_vkCreateDescriptorUpdateTemplate(
@@ -1978,7 +1978,7 @@
     AEMU_SCOPED_TRACE("vkCreateDescriptorUpdateTemplate");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateDescriptorUpdateTemplate_VkResult_return = (VkResult)0;
-    vkCreateDescriptorUpdateTemplate_VkResult_return = vkEnc->vkCreateDescriptorUpdateTemplate(device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate);
+    vkCreateDescriptorUpdateTemplate_VkResult_return = vkEnc->vkCreateDescriptorUpdateTemplate(device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate, true /* do lock */);
     return vkCreateDescriptorUpdateTemplate_VkResult_return;
 }
 static void entry_vkDestroyDescriptorUpdateTemplate(
@@ -1988,7 +1988,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroyDescriptorUpdateTemplate");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyDescriptorUpdateTemplate(device, descriptorUpdateTemplate, pAllocator);
+    vkEnc->vkDestroyDescriptorUpdateTemplate(device, descriptorUpdateTemplate, pAllocator, true /* do lock */);
 }
 static void dynCheck_entry_vkDestroyDescriptorUpdateTemplate(
     VkDevice device,
@@ -2002,7 +2002,7 @@
     }
     AEMU_SCOPED_TRACE("vkDestroyDescriptorUpdateTemplate");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyDescriptorUpdateTemplate(device, descriptorUpdateTemplate, pAllocator);
+    vkEnc->vkDestroyDescriptorUpdateTemplate(device, descriptorUpdateTemplate, pAllocator, true /* do lock */);
 }
 static void entry_vkUpdateDescriptorSetWithTemplate(
     VkDevice device,
@@ -2037,7 +2037,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceExternalBufferProperties");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceExternalBufferProperties(physicalDevice, pExternalBufferInfo, pExternalBufferProperties);
+    vkEnc->vkGetPhysicalDeviceExternalBufferProperties(physicalDevice, pExternalBufferInfo, pExternalBufferProperties, true /* do lock */);
 }
 static void entry_vkGetPhysicalDeviceExternalFenceProperties(
     VkPhysicalDevice physicalDevice,
@@ -2056,7 +2056,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceExternalSemaphoreProperties");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceExternalSemaphoreProperties(physicalDevice, pExternalSemaphoreInfo, pExternalSemaphoreProperties);
+    vkEnc->vkGetPhysicalDeviceExternalSemaphoreProperties(physicalDevice, pExternalSemaphoreInfo, pExternalSemaphoreProperties, true /* do lock */);
 }
 static void entry_vkGetDescriptorSetLayoutSupport(
     VkDevice device,
@@ -2065,7 +2065,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetDescriptorSetLayoutSupport");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetDescriptorSetLayoutSupport(device, pCreateInfo, pSupport);
+    vkEnc->vkGetDescriptorSetLayoutSupport(device, pCreateInfo, pSupport, true /* do lock */);
 }
 static void dynCheck_entry_vkGetDescriptorSetLayoutSupport(
     VkDevice device,
@@ -2079,7 +2079,7 @@
     }
     AEMU_SCOPED_TRACE("vkGetDescriptorSetLayoutSupport");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetDescriptorSetLayoutSupport(device, pCreateInfo, pSupport);
+    vkEnc->vkGetDescriptorSetLayoutSupport(device, pCreateInfo, pSupport, true /* do lock */);
 }
 #endif
 #ifdef VK_KHR_surface
@@ -2090,7 +2090,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroySurfaceKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroySurfaceKHR(instance, surface, pAllocator);
+    vkEnc->vkDestroySurfaceKHR(instance, surface, pAllocator, true /* do lock */);
 }
 static VkResult entry_vkGetPhysicalDeviceSurfaceSupportKHR(
     VkPhysicalDevice physicalDevice,
@@ -2101,7 +2101,7 @@
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceSurfaceSupportKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetPhysicalDeviceSurfaceSupportKHR_VkResult_return = (VkResult)0;
-    vkGetPhysicalDeviceSurfaceSupportKHR_VkResult_return = vkEnc->vkGetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported);
+    vkGetPhysicalDeviceSurfaceSupportKHR_VkResult_return = vkEnc->vkGetPhysicalDeviceSurfaceSupportKHR(physicalDevice, queueFamilyIndex, surface, pSupported, true /* do lock */);
     return vkGetPhysicalDeviceSurfaceSupportKHR_VkResult_return;
 }
 static VkResult entry_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
@@ -2112,7 +2112,7 @@
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceSurfaceCapabilitiesKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetPhysicalDeviceSurfaceCapabilitiesKHR_VkResult_return = (VkResult)0;
-    vkGetPhysicalDeviceSurfaceCapabilitiesKHR_VkResult_return = vkEnc->vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities);
+    vkGetPhysicalDeviceSurfaceCapabilitiesKHR_VkResult_return = vkEnc->vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, pSurfaceCapabilities, true /* do lock */);
     return vkGetPhysicalDeviceSurfaceCapabilitiesKHR_VkResult_return;
 }
 static VkResult entry_vkGetPhysicalDeviceSurfaceFormatsKHR(
@@ -2124,7 +2124,7 @@
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceSurfaceFormatsKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetPhysicalDeviceSurfaceFormatsKHR_VkResult_return = (VkResult)0;
-    vkGetPhysicalDeviceSurfaceFormatsKHR_VkResult_return = vkEnc->vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats);
+    vkGetPhysicalDeviceSurfaceFormatsKHR_VkResult_return = vkEnc->vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, pSurfaceFormatCount, pSurfaceFormats, true /* do lock */);
     return vkGetPhysicalDeviceSurfaceFormatsKHR_VkResult_return;
 }
 static VkResult entry_vkGetPhysicalDeviceSurfacePresentModesKHR(
@@ -2136,7 +2136,7 @@
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceSurfacePresentModesKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetPhysicalDeviceSurfacePresentModesKHR_VkResult_return = (VkResult)0;
-    vkGetPhysicalDeviceSurfacePresentModesKHR_VkResult_return = vkEnc->vkGetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes);
+    vkGetPhysicalDeviceSurfacePresentModesKHR_VkResult_return = vkEnc->vkGetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, pPresentModeCount, pPresentModes, true /* do lock */);
     return vkGetPhysicalDeviceSurfacePresentModesKHR_VkResult_return;
 }
 #endif
@@ -2150,7 +2150,7 @@
     AEMU_SCOPED_TRACE("vkCreateSwapchainKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateSwapchainKHR_VkResult_return = (VkResult)0;
-    vkCreateSwapchainKHR_VkResult_return = vkEnc->vkCreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
+    vkCreateSwapchainKHR_VkResult_return = vkEnc->vkCreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain, true /* do lock */);
     return vkCreateSwapchainKHR_VkResult_return;
 }
 static VkResult dynCheck_entry_vkCreateSwapchainKHR(
@@ -2167,7 +2167,7 @@
     AEMU_SCOPED_TRACE("vkCreateSwapchainKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateSwapchainKHR_VkResult_return = (VkResult)0;
-    vkCreateSwapchainKHR_VkResult_return = vkEnc->vkCreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain);
+    vkCreateSwapchainKHR_VkResult_return = vkEnc->vkCreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain, true /* do lock */);
     return vkCreateSwapchainKHR_VkResult_return;
 }
 static void entry_vkDestroySwapchainKHR(
@@ -2177,7 +2177,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroySwapchainKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroySwapchainKHR(device, swapchain, pAllocator);
+    vkEnc->vkDestroySwapchainKHR(device, swapchain, pAllocator, true /* do lock */);
 }
 static void dynCheck_entry_vkDestroySwapchainKHR(
     VkDevice device,
@@ -2191,7 +2191,7 @@
     }
     AEMU_SCOPED_TRACE("vkDestroySwapchainKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroySwapchainKHR(device, swapchain, pAllocator);
+    vkEnc->vkDestroySwapchainKHR(device, swapchain, pAllocator, true /* do lock */);
 }
 static VkResult entry_vkGetSwapchainImagesKHR(
     VkDevice device,
@@ -2202,7 +2202,7 @@
     AEMU_SCOPED_TRACE("vkGetSwapchainImagesKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetSwapchainImagesKHR_VkResult_return = (VkResult)0;
-    vkGetSwapchainImagesKHR_VkResult_return = vkEnc->vkGetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
+    vkGetSwapchainImagesKHR_VkResult_return = vkEnc->vkGetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages, true /* do lock */);
     return vkGetSwapchainImagesKHR_VkResult_return;
 }
 static VkResult dynCheck_entry_vkGetSwapchainImagesKHR(
@@ -2219,7 +2219,7 @@
     AEMU_SCOPED_TRACE("vkGetSwapchainImagesKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetSwapchainImagesKHR_VkResult_return = (VkResult)0;
-    vkGetSwapchainImagesKHR_VkResult_return = vkEnc->vkGetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages);
+    vkGetSwapchainImagesKHR_VkResult_return = vkEnc->vkGetSwapchainImagesKHR(device, swapchain, pSwapchainImageCount, pSwapchainImages, true /* do lock */);
     return vkGetSwapchainImagesKHR_VkResult_return;
 }
 static VkResult entry_vkAcquireNextImageKHR(
@@ -2233,7 +2233,7 @@
     AEMU_SCOPED_TRACE("vkAcquireNextImageKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkAcquireNextImageKHR_VkResult_return = (VkResult)0;
-    vkAcquireNextImageKHR_VkResult_return = vkEnc->vkAcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
+    vkAcquireNextImageKHR_VkResult_return = vkEnc->vkAcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex, true /* do lock */);
     return vkAcquireNextImageKHR_VkResult_return;
 }
 static VkResult dynCheck_entry_vkAcquireNextImageKHR(
@@ -2252,7 +2252,7 @@
     AEMU_SCOPED_TRACE("vkAcquireNextImageKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkAcquireNextImageKHR_VkResult_return = (VkResult)0;
-    vkAcquireNextImageKHR_VkResult_return = vkEnc->vkAcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex);
+    vkAcquireNextImageKHR_VkResult_return = vkEnc->vkAcquireNextImageKHR(device, swapchain, timeout, semaphore, fence, pImageIndex, true /* do lock */);
     return vkAcquireNextImageKHR_VkResult_return;
 }
 static VkResult entry_vkQueuePresentKHR(
@@ -2263,7 +2263,7 @@
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
     VkResult vkQueuePresentKHR_VkResult_return = (VkResult)0;
-    vkQueuePresentKHR_VkResult_return = vkEnc->vkQueuePresentKHR(queue, pPresentInfo);
+    vkQueuePresentKHR_VkResult_return = vkEnc->vkQueuePresentKHR(queue, pPresentInfo, true /* do lock */);
     return vkQueuePresentKHR_VkResult_return;
 }
 static VkResult entry_vkGetDeviceGroupPresentCapabilitiesKHR(
@@ -2273,7 +2273,7 @@
     AEMU_SCOPED_TRACE("vkGetDeviceGroupPresentCapabilitiesKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return = (VkResult)0;
-    vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return = vkEnc->vkGetDeviceGroupPresentCapabilitiesKHR(device, pDeviceGroupPresentCapabilities);
+    vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return = vkEnc->vkGetDeviceGroupPresentCapabilitiesKHR(device, pDeviceGroupPresentCapabilities, true /* do lock */);
     return vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return;
 }
 static VkResult dynCheck_entry_vkGetDeviceGroupPresentCapabilitiesKHR(
@@ -2288,7 +2288,7 @@
     AEMU_SCOPED_TRACE("vkGetDeviceGroupPresentCapabilitiesKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return = (VkResult)0;
-    vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return = vkEnc->vkGetDeviceGroupPresentCapabilitiesKHR(device, pDeviceGroupPresentCapabilities);
+    vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return = vkEnc->vkGetDeviceGroupPresentCapabilitiesKHR(device, pDeviceGroupPresentCapabilities, true /* do lock */);
     return vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return;
 }
 static VkResult entry_vkGetDeviceGroupSurfacePresentModesKHR(
@@ -2299,7 +2299,7 @@
     AEMU_SCOPED_TRACE("vkGetDeviceGroupSurfacePresentModesKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return = (VkResult)0;
-    vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return = vkEnc->vkGetDeviceGroupSurfacePresentModesKHR(device, surface, pModes);
+    vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return = vkEnc->vkGetDeviceGroupSurfacePresentModesKHR(device, surface, pModes, true /* do lock */);
     return vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return;
 }
 static VkResult dynCheck_entry_vkGetDeviceGroupSurfacePresentModesKHR(
@@ -2315,7 +2315,7 @@
     AEMU_SCOPED_TRACE("vkGetDeviceGroupSurfacePresentModesKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return = (VkResult)0;
-    vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return = vkEnc->vkGetDeviceGroupSurfacePresentModesKHR(device, surface, pModes);
+    vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return = vkEnc->vkGetDeviceGroupSurfacePresentModesKHR(device, surface, pModes, true /* do lock */);
     return vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return;
 }
 static VkResult entry_vkGetPhysicalDevicePresentRectanglesKHR(
@@ -2327,7 +2327,7 @@
     AEMU_SCOPED_TRACE("vkGetPhysicalDevicePresentRectanglesKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return = (VkResult)0;
-    vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return = vkEnc->vkGetPhysicalDevicePresentRectanglesKHR(physicalDevice, surface, pRectCount, pRects);
+    vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return = vkEnc->vkGetPhysicalDevicePresentRectanglesKHR(physicalDevice, surface, pRectCount, pRects, true /* do lock */);
     return vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return;
 }
 static VkResult entry_vkAcquireNextImage2KHR(
@@ -2338,7 +2338,7 @@
     AEMU_SCOPED_TRACE("vkAcquireNextImage2KHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkAcquireNextImage2KHR_VkResult_return = (VkResult)0;
-    vkAcquireNextImage2KHR_VkResult_return = vkEnc->vkAcquireNextImage2KHR(device, pAcquireInfo, pImageIndex);
+    vkAcquireNextImage2KHR_VkResult_return = vkEnc->vkAcquireNextImage2KHR(device, pAcquireInfo, pImageIndex, true /* do lock */);
     return vkAcquireNextImage2KHR_VkResult_return;
 }
 static VkResult dynCheck_entry_vkAcquireNextImage2KHR(
@@ -2354,7 +2354,7 @@
     AEMU_SCOPED_TRACE("vkAcquireNextImage2KHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkAcquireNextImage2KHR_VkResult_return = (VkResult)0;
-    vkAcquireNextImage2KHR_VkResult_return = vkEnc->vkAcquireNextImage2KHR(device, pAcquireInfo, pImageIndex);
+    vkAcquireNextImage2KHR_VkResult_return = vkEnc->vkAcquireNextImage2KHR(device, pAcquireInfo, pImageIndex, true /* do lock */);
     return vkAcquireNextImage2KHR_VkResult_return;
 }
 #endif
@@ -2367,7 +2367,7 @@
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceDisplayPropertiesKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetPhysicalDeviceDisplayPropertiesKHR_VkResult_return = (VkResult)0;
-    vkGetPhysicalDeviceDisplayPropertiesKHR_VkResult_return = vkEnc->vkGetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, pProperties);
+    vkGetPhysicalDeviceDisplayPropertiesKHR_VkResult_return = vkEnc->vkGetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, pPropertyCount, pProperties, true /* do lock */);
     return vkGetPhysicalDeviceDisplayPropertiesKHR_VkResult_return;
 }
 static VkResult entry_vkGetPhysicalDeviceDisplayPlanePropertiesKHR(
@@ -2378,7 +2378,7 @@
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceDisplayPlanePropertiesKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetPhysicalDeviceDisplayPlanePropertiesKHR_VkResult_return = (VkResult)0;
-    vkGetPhysicalDeviceDisplayPlanePropertiesKHR_VkResult_return = vkEnc->vkGetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, pPropertyCount, pProperties);
+    vkGetPhysicalDeviceDisplayPlanePropertiesKHR_VkResult_return = vkEnc->vkGetPhysicalDeviceDisplayPlanePropertiesKHR(physicalDevice, pPropertyCount, pProperties, true /* do lock */);
     return vkGetPhysicalDeviceDisplayPlanePropertiesKHR_VkResult_return;
 }
 static VkResult entry_vkGetDisplayPlaneSupportedDisplaysKHR(
@@ -2390,7 +2390,7 @@
     AEMU_SCOPED_TRACE("vkGetDisplayPlaneSupportedDisplaysKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetDisplayPlaneSupportedDisplaysKHR_VkResult_return = (VkResult)0;
-    vkGetDisplayPlaneSupportedDisplaysKHR_VkResult_return = vkEnc->vkGetDisplayPlaneSupportedDisplaysKHR(physicalDevice, planeIndex, pDisplayCount, pDisplays);
+    vkGetDisplayPlaneSupportedDisplaysKHR_VkResult_return = vkEnc->vkGetDisplayPlaneSupportedDisplaysKHR(physicalDevice, planeIndex, pDisplayCount, pDisplays, true /* do lock */);
     return vkGetDisplayPlaneSupportedDisplaysKHR_VkResult_return;
 }
 static VkResult entry_vkGetDisplayModePropertiesKHR(
@@ -2402,7 +2402,7 @@
     AEMU_SCOPED_TRACE("vkGetDisplayModePropertiesKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetDisplayModePropertiesKHR_VkResult_return = (VkResult)0;
-    vkGetDisplayModePropertiesKHR_VkResult_return = vkEnc->vkGetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, pProperties);
+    vkGetDisplayModePropertiesKHR_VkResult_return = vkEnc->vkGetDisplayModePropertiesKHR(physicalDevice, display, pPropertyCount, pProperties, true /* do lock */);
     return vkGetDisplayModePropertiesKHR_VkResult_return;
 }
 static VkResult entry_vkCreateDisplayModeKHR(
@@ -2415,7 +2415,7 @@
     AEMU_SCOPED_TRACE("vkCreateDisplayModeKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateDisplayModeKHR_VkResult_return = (VkResult)0;
-    vkCreateDisplayModeKHR_VkResult_return = vkEnc->vkCreateDisplayModeKHR(physicalDevice, display, pCreateInfo, pAllocator, pMode);
+    vkCreateDisplayModeKHR_VkResult_return = vkEnc->vkCreateDisplayModeKHR(physicalDevice, display, pCreateInfo, pAllocator, pMode, true /* do lock */);
     return vkCreateDisplayModeKHR_VkResult_return;
 }
 static VkResult entry_vkGetDisplayPlaneCapabilitiesKHR(
@@ -2427,7 +2427,7 @@
     AEMU_SCOPED_TRACE("vkGetDisplayPlaneCapabilitiesKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetDisplayPlaneCapabilitiesKHR_VkResult_return = (VkResult)0;
-    vkGetDisplayPlaneCapabilitiesKHR_VkResult_return = vkEnc->vkGetDisplayPlaneCapabilitiesKHR(physicalDevice, mode, planeIndex, pCapabilities);
+    vkGetDisplayPlaneCapabilitiesKHR_VkResult_return = vkEnc->vkGetDisplayPlaneCapabilitiesKHR(physicalDevice, mode, planeIndex, pCapabilities, true /* do lock */);
     return vkGetDisplayPlaneCapabilitiesKHR_VkResult_return;
 }
 static VkResult entry_vkCreateDisplayPlaneSurfaceKHR(
@@ -2439,7 +2439,7 @@
     AEMU_SCOPED_TRACE("vkCreateDisplayPlaneSurfaceKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateDisplayPlaneSurfaceKHR_VkResult_return = (VkResult)0;
-    vkCreateDisplayPlaneSurfaceKHR_VkResult_return = vkEnc->vkCreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
+    vkCreateDisplayPlaneSurfaceKHR_VkResult_return = vkEnc->vkCreateDisplayPlaneSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface, true /* do lock */);
     return vkCreateDisplayPlaneSurfaceKHR_VkResult_return;
 }
 #endif
@@ -2454,7 +2454,7 @@
     AEMU_SCOPED_TRACE("vkCreateSharedSwapchainsKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateSharedSwapchainsKHR_VkResult_return = (VkResult)0;
-    vkCreateSharedSwapchainsKHR_VkResult_return = vkEnc->vkCreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
+    vkCreateSharedSwapchainsKHR_VkResult_return = vkEnc->vkCreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains, true /* do lock */);
     return vkCreateSharedSwapchainsKHR_VkResult_return;
 }
 static VkResult dynCheck_entry_vkCreateSharedSwapchainsKHR(
@@ -2472,7 +2472,7 @@
     AEMU_SCOPED_TRACE("vkCreateSharedSwapchainsKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateSharedSwapchainsKHR_VkResult_return = (VkResult)0;
-    vkCreateSharedSwapchainsKHR_VkResult_return = vkEnc->vkCreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains);
+    vkCreateSharedSwapchainsKHR_VkResult_return = vkEnc->vkCreateSharedSwapchainsKHR(device, swapchainCount, pCreateInfos, pAllocator, pSwapchains, true /* do lock */);
     return vkCreateSharedSwapchainsKHR_VkResult_return;
 }
 #endif
@@ -2486,7 +2486,7 @@
     AEMU_SCOPED_TRACE("vkCreateXlibSurfaceKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateXlibSurfaceKHR_VkResult_return = (VkResult)0;
-    vkCreateXlibSurfaceKHR_VkResult_return = vkEnc->vkCreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
+    vkCreateXlibSurfaceKHR_VkResult_return = vkEnc->vkCreateXlibSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface, true /* do lock */);
     return vkCreateXlibSurfaceKHR_VkResult_return;
 }
 static VkBool32 entry_vkGetPhysicalDeviceXlibPresentationSupportKHR(
@@ -2498,7 +2498,7 @@
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceXlibPresentationSupportKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkBool32 vkGetPhysicalDeviceXlibPresentationSupportKHR_VkBool32_return = (VkBool32)0;
-    vkGetPhysicalDeviceXlibPresentationSupportKHR_VkBool32_return = vkEnc->vkGetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID);
+    vkGetPhysicalDeviceXlibPresentationSupportKHR_VkBool32_return = vkEnc->vkGetPhysicalDeviceXlibPresentationSupportKHR(physicalDevice, queueFamilyIndex, dpy, visualID, true /* do lock */);
     return vkGetPhysicalDeviceXlibPresentationSupportKHR_VkBool32_return;
 }
 #endif
@@ -2512,7 +2512,7 @@
     AEMU_SCOPED_TRACE("vkCreateXcbSurfaceKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateXcbSurfaceKHR_VkResult_return = (VkResult)0;
-    vkCreateXcbSurfaceKHR_VkResult_return = vkEnc->vkCreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
+    vkCreateXcbSurfaceKHR_VkResult_return = vkEnc->vkCreateXcbSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface, true /* do lock */);
     return vkCreateXcbSurfaceKHR_VkResult_return;
 }
 static VkBool32 entry_vkGetPhysicalDeviceXcbPresentationSupportKHR(
@@ -2524,7 +2524,7 @@
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceXcbPresentationSupportKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkBool32 vkGetPhysicalDeviceXcbPresentationSupportKHR_VkBool32_return = (VkBool32)0;
-    vkGetPhysicalDeviceXcbPresentationSupportKHR_VkBool32_return = vkEnc->vkGetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id);
+    vkGetPhysicalDeviceXcbPresentationSupportKHR_VkBool32_return = vkEnc->vkGetPhysicalDeviceXcbPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, visual_id, true /* do lock */);
     return vkGetPhysicalDeviceXcbPresentationSupportKHR_VkBool32_return;
 }
 #endif
@@ -2538,7 +2538,7 @@
     AEMU_SCOPED_TRACE("vkCreateWaylandSurfaceKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateWaylandSurfaceKHR_VkResult_return = (VkResult)0;
-    vkCreateWaylandSurfaceKHR_VkResult_return = vkEnc->vkCreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
+    vkCreateWaylandSurfaceKHR_VkResult_return = vkEnc->vkCreateWaylandSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface, true /* do lock */);
     return vkCreateWaylandSurfaceKHR_VkResult_return;
 }
 static VkBool32 entry_vkGetPhysicalDeviceWaylandPresentationSupportKHR(
@@ -2549,7 +2549,7 @@
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceWaylandPresentationSupportKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkBool32 vkGetPhysicalDeviceWaylandPresentationSupportKHR_VkBool32_return = (VkBool32)0;
-    vkGetPhysicalDeviceWaylandPresentationSupportKHR_VkBool32_return = vkEnc->vkGetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display);
+    vkGetPhysicalDeviceWaylandPresentationSupportKHR_VkBool32_return = vkEnc->vkGetPhysicalDeviceWaylandPresentationSupportKHR(physicalDevice, queueFamilyIndex, display, true /* do lock */);
     return vkGetPhysicalDeviceWaylandPresentationSupportKHR_VkBool32_return;
 }
 #endif
@@ -2563,7 +2563,7 @@
     AEMU_SCOPED_TRACE("vkCreateMirSurfaceKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateMirSurfaceKHR_VkResult_return = (VkResult)0;
-    vkCreateMirSurfaceKHR_VkResult_return = vkEnc->vkCreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
+    vkCreateMirSurfaceKHR_VkResult_return = vkEnc->vkCreateMirSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface, true /* do lock */);
     return vkCreateMirSurfaceKHR_VkResult_return;
 }
 static VkBool32 entry_vkGetPhysicalDeviceMirPresentationSupportKHR(
@@ -2574,7 +2574,7 @@
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceMirPresentationSupportKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkBool32 vkGetPhysicalDeviceMirPresentationSupportKHR_VkBool32_return = (VkBool32)0;
-    vkGetPhysicalDeviceMirPresentationSupportKHR_VkBool32_return = vkEnc->vkGetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection);
+    vkGetPhysicalDeviceMirPresentationSupportKHR_VkBool32_return = vkEnc->vkGetPhysicalDeviceMirPresentationSupportKHR(physicalDevice, queueFamilyIndex, connection, true /* do lock */);
     return vkGetPhysicalDeviceMirPresentationSupportKHR_VkBool32_return;
 }
 #endif
@@ -2588,7 +2588,7 @@
     AEMU_SCOPED_TRACE("vkCreateAndroidSurfaceKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateAndroidSurfaceKHR_VkResult_return = (VkResult)0;
-    vkCreateAndroidSurfaceKHR_VkResult_return = vkEnc->vkCreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
+    vkCreateAndroidSurfaceKHR_VkResult_return = vkEnc->vkCreateAndroidSurfaceKHR(instance, pCreateInfo, pAllocator, pSurface, true /* do lock */);
     return vkCreateAndroidSurfaceKHR_VkResult_return;
 }
 #endif
@@ -2602,7 +2602,7 @@
     AEMU_SCOPED_TRACE("vkCreateWin32SurfaceKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateWin32SurfaceKHR_VkResult_return = (VkResult)0;
-    vkCreateWin32SurfaceKHR_VkResult_return = vkEnc->vkCreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface);
+    vkCreateWin32SurfaceKHR_VkResult_return = vkEnc->vkCreateWin32SurfaceKHR(instance, pCreateInfo, pAllocator, pSurface, true /* do lock */);
     return vkCreateWin32SurfaceKHR_VkResult_return;
 }
 static VkBool32 entry_vkGetPhysicalDeviceWin32PresentationSupportKHR(
@@ -2612,7 +2612,7 @@
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceWin32PresentationSupportKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkBool32 vkGetPhysicalDeviceWin32PresentationSupportKHR_VkBool32_return = (VkBool32)0;
-    vkGetPhysicalDeviceWin32PresentationSupportKHR_VkBool32_return = vkEnc->vkGetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex);
+    vkGetPhysicalDeviceWin32PresentationSupportKHR_VkBool32_return = vkEnc->vkGetPhysicalDeviceWin32PresentationSupportKHR(physicalDevice, queueFamilyIndex, true /* do lock */);
     return vkGetPhysicalDeviceWin32PresentationSupportKHR_VkBool32_return;
 }
 #endif
@@ -2627,7 +2627,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceFeatures2KHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceFeatures2KHR(physicalDevice, pFeatures);
+    vkEnc->vkGetPhysicalDeviceFeatures2KHR(physicalDevice, pFeatures, true /* do lock */);
 }
 static void entry_vkGetPhysicalDeviceProperties2KHR(
     VkPhysicalDevice physicalDevice,
@@ -2635,7 +2635,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceProperties2KHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceProperties2KHR(physicalDevice, pProperties);
+    vkEnc->vkGetPhysicalDeviceProperties2KHR(physicalDevice, pProperties, true /* do lock */);
 }
 static void entry_vkGetPhysicalDeviceFormatProperties2KHR(
     VkPhysicalDevice physicalDevice,
@@ -2644,7 +2644,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceFormatProperties2KHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceFormatProperties2KHR(physicalDevice, format, pFormatProperties);
+    vkEnc->vkGetPhysicalDeviceFormatProperties2KHR(physicalDevice, format, pFormatProperties, true /* do lock */);
 }
 static VkResult entry_vkGetPhysicalDeviceImageFormatProperties2KHR(
     VkPhysicalDevice physicalDevice,
@@ -2665,7 +2665,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceQueueFamilyProperties2KHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceQueueFamilyProperties2KHR(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties);
+    vkEnc->vkGetPhysicalDeviceQueueFamilyProperties2KHR(physicalDevice, pQueueFamilyPropertyCount, pQueueFamilyProperties, true /* do lock */);
 }
 static void entry_vkGetPhysicalDeviceMemoryProperties2KHR(
     VkPhysicalDevice physicalDevice,
@@ -2673,7 +2673,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceMemoryProperties2KHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceMemoryProperties2KHR(physicalDevice, pMemoryProperties);
+    vkEnc->vkGetPhysicalDeviceMemoryProperties2KHR(physicalDevice, pMemoryProperties, true /* do lock */);
 }
 static void entry_vkGetPhysicalDeviceSparseImageFormatProperties2KHR(
     VkPhysicalDevice physicalDevice,
@@ -2683,7 +2683,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceSparseImageFormatProperties2KHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceSparseImageFormatProperties2KHR(physicalDevice, pFormatInfo, pPropertyCount, pProperties);
+    vkEnc->vkGetPhysicalDeviceSparseImageFormatProperties2KHR(physicalDevice, pFormatInfo, pPropertyCount, pProperties, true /* do lock */);
 }
 #endif
 #ifdef VK_KHR_device_group
@@ -2696,7 +2696,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetDeviceGroupPeerMemoryFeaturesKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetDeviceGroupPeerMemoryFeaturesKHR(device, heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures);
+    vkEnc->vkGetDeviceGroupPeerMemoryFeaturesKHR(device, heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures, true /* do lock */);
 }
 static void dynCheck_entry_vkGetDeviceGroupPeerMemoryFeaturesKHR(
     VkDevice device,
@@ -2712,7 +2712,7 @@
     }
     AEMU_SCOPED_TRACE("vkGetDeviceGroupPeerMemoryFeaturesKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetDeviceGroupPeerMemoryFeaturesKHR(device, heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures);
+    vkEnc->vkGetDeviceGroupPeerMemoryFeaturesKHR(device, heapIndex, localDeviceIndex, remoteDeviceIndex, pPeerMemoryFeatures, true /* do lock */);
 }
 static void entry_vkCmdSetDeviceMaskKHR(
     VkCommandBuffer commandBuffer,
@@ -2721,7 +2721,7 @@
     AEMU_SCOPED_TRACE("vkCmdSetDeviceMaskKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdSetDeviceMaskKHR(commandBuffer, deviceMask);
+    vkEnc->vkCmdSetDeviceMaskKHR(commandBuffer, deviceMask, true /* do lock */);
 }
 static void entry_vkCmdDispatchBaseKHR(
     VkCommandBuffer commandBuffer,
@@ -2735,7 +2735,7 @@
     AEMU_SCOPED_TRACE("vkCmdDispatchBaseKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdDispatchBaseKHR(commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ);
+    vkEnc->vkCmdDispatchBaseKHR(commandBuffer, baseGroupX, baseGroupY, baseGroupZ, groupCountX, groupCountY, groupCountZ, true /* do lock */);
 }
 #endif
 #ifdef VK_KHR_shader_draw_parameters
@@ -2748,7 +2748,7 @@
 {
     AEMU_SCOPED_TRACE("vkTrimCommandPoolKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkTrimCommandPoolKHR(device, commandPool, flags);
+    vkEnc->vkTrimCommandPoolKHR(device, commandPool, flags, true /* do lock */);
 }
 static void dynCheck_entry_vkTrimCommandPoolKHR(
     VkDevice device,
@@ -2762,7 +2762,7 @@
     }
     AEMU_SCOPED_TRACE("vkTrimCommandPoolKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkTrimCommandPoolKHR(device, commandPool, flags);
+    vkEnc->vkTrimCommandPoolKHR(device, commandPool, flags, true /* do lock */);
 }
 #endif
 #ifdef VK_KHR_device_group_creation
@@ -2774,7 +2774,7 @@
     AEMU_SCOPED_TRACE("vkEnumeratePhysicalDeviceGroupsKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkEnumeratePhysicalDeviceGroupsKHR_VkResult_return = (VkResult)0;
-    vkEnumeratePhysicalDeviceGroupsKHR_VkResult_return = vkEnc->vkEnumeratePhysicalDeviceGroupsKHR(instance, pPhysicalDeviceGroupCount, pPhysicalDeviceGroupProperties);
+    vkEnumeratePhysicalDeviceGroupsKHR_VkResult_return = vkEnc->vkEnumeratePhysicalDeviceGroupsKHR(instance, pPhysicalDeviceGroupCount, pPhysicalDeviceGroupProperties, true /* do lock */);
     return vkEnumeratePhysicalDeviceGroupsKHR_VkResult_return;
 }
 #endif
@@ -2786,7 +2786,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceExternalBufferPropertiesKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceExternalBufferPropertiesKHR(physicalDevice, pExternalBufferInfo, pExternalBufferProperties);
+    vkEnc->vkGetPhysicalDeviceExternalBufferPropertiesKHR(physicalDevice, pExternalBufferInfo, pExternalBufferProperties, true /* do lock */);
 }
 #endif
 #ifdef VK_KHR_external_memory
@@ -2800,7 +2800,7 @@
     AEMU_SCOPED_TRACE("vkGetMemoryWin32HandleKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetMemoryWin32HandleKHR_VkResult_return = (VkResult)0;
-    vkGetMemoryWin32HandleKHR_VkResult_return = vkEnc->vkGetMemoryWin32HandleKHR(device, pGetWin32HandleInfo, pHandle);
+    vkGetMemoryWin32HandleKHR_VkResult_return = vkEnc->vkGetMemoryWin32HandleKHR(device, pGetWin32HandleInfo, pHandle, true /* do lock */);
     return vkGetMemoryWin32HandleKHR_VkResult_return;
 }
 static VkResult dynCheck_entry_vkGetMemoryWin32HandleKHR(
@@ -2816,7 +2816,7 @@
     AEMU_SCOPED_TRACE("vkGetMemoryWin32HandleKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetMemoryWin32HandleKHR_VkResult_return = (VkResult)0;
-    vkGetMemoryWin32HandleKHR_VkResult_return = vkEnc->vkGetMemoryWin32HandleKHR(device, pGetWin32HandleInfo, pHandle);
+    vkGetMemoryWin32HandleKHR_VkResult_return = vkEnc->vkGetMemoryWin32HandleKHR(device, pGetWin32HandleInfo, pHandle, true /* do lock */);
     return vkGetMemoryWin32HandleKHR_VkResult_return;
 }
 static VkResult entry_vkGetMemoryWin32HandlePropertiesKHR(
@@ -2828,7 +2828,7 @@
     AEMU_SCOPED_TRACE("vkGetMemoryWin32HandlePropertiesKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetMemoryWin32HandlePropertiesKHR_VkResult_return = (VkResult)0;
-    vkGetMemoryWin32HandlePropertiesKHR_VkResult_return = vkEnc->vkGetMemoryWin32HandlePropertiesKHR(device, handleType, handle, pMemoryWin32HandleProperties);
+    vkGetMemoryWin32HandlePropertiesKHR_VkResult_return = vkEnc->vkGetMemoryWin32HandlePropertiesKHR(device, handleType, handle, pMemoryWin32HandleProperties, true /* do lock */);
     return vkGetMemoryWin32HandlePropertiesKHR_VkResult_return;
 }
 static VkResult dynCheck_entry_vkGetMemoryWin32HandlePropertiesKHR(
@@ -2845,7 +2845,7 @@
     AEMU_SCOPED_TRACE("vkGetMemoryWin32HandlePropertiesKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetMemoryWin32HandlePropertiesKHR_VkResult_return = (VkResult)0;
-    vkGetMemoryWin32HandlePropertiesKHR_VkResult_return = vkEnc->vkGetMemoryWin32HandlePropertiesKHR(device, handleType, handle, pMemoryWin32HandleProperties);
+    vkGetMemoryWin32HandlePropertiesKHR_VkResult_return = vkEnc->vkGetMemoryWin32HandlePropertiesKHR(device, handleType, handle, pMemoryWin32HandleProperties, true /* do lock */);
     return vkGetMemoryWin32HandlePropertiesKHR_VkResult_return;
 }
 #endif
@@ -2858,7 +2858,7 @@
     AEMU_SCOPED_TRACE("vkGetMemoryFdKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetMemoryFdKHR_VkResult_return = (VkResult)0;
-    vkGetMemoryFdKHR_VkResult_return = vkEnc->vkGetMemoryFdKHR(device, pGetFdInfo, pFd);
+    vkGetMemoryFdKHR_VkResult_return = vkEnc->vkGetMemoryFdKHR(device, pGetFdInfo, pFd, true /* do lock */);
     return vkGetMemoryFdKHR_VkResult_return;
 }
 static VkResult dynCheck_entry_vkGetMemoryFdKHR(
@@ -2874,7 +2874,7 @@
     AEMU_SCOPED_TRACE("vkGetMemoryFdKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetMemoryFdKHR_VkResult_return = (VkResult)0;
-    vkGetMemoryFdKHR_VkResult_return = vkEnc->vkGetMemoryFdKHR(device, pGetFdInfo, pFd);
+    vkGetMemoryFdKHR_VkResult_return = vkEnc->vkGetMemoryFdKHR(device, pGetFdInfo, pFd, true /* do lock */);
     return vkGetMemoryFdKHR_VkResult_return;
 }
 static VkResult entry_vkGetMemoryFdPropertiesKHR(
@@ -2886,7 +2886,7 @@
     AEMU_SCOPED_TRACE("vkGetMemoryFdPropertiesKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetMemoryFdPropertiesKHR_VkResult_return = (VkResult)0;
-    vkGetMemoryFdPropertiesKHR_VkResult_return = vkEnc->vkGetMemoryFdPropertiesKHR(device, handleType, fd, pMemoryFdProperties);
+    vkGetMemoryFdPropertiesKHR_VkResult_return = vkEnc->vkGetMemoryFdPropertiesKHR(device, handleType, fd, pMemoryFdProperties, true /* do lock */);
     return vkGetMemoryFdPropertiesKHR_VkResult_return;
 }
 static VkResult dynCheck_entry_vkGetMemoryFdPropertiesKHR(
@@ -2903,7 +2903,7 @@
     AEMU_SCOPED_TRACE("vkGetMemoryFdPropertiesKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetMemoryFdPropertiesKHR_VkResult_return = (VkResult)0;
-    vkGetMemoryFdPropertiesKHR_VkResult_return = vkEnc->vkGetMemoryFdPropertiesKHR(device, handleType, fd, pMemoryFdProperties);
+    vkGetMemoryFdPropertiesKHR_VkResult_return = vkEnc->vkGetMemoryFdPropertiesKHR(device, handleType, fd, pMemoryFdProperties, true /* do lock */);
     return vkGetMemoryFdPropertiesKHR_VkResult_return;
 }
 #endif
@@ -2917,7 +2917,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceExternalSemaphorePropertiesKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(physicalDevice, pExternalSemaphoreInfo, pExternalSemaphoreProperties);
+    vkEnc->vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(physicalDevice, pExternalSemaphoreInfo, pExternalSemaphoreProperties, true /* do lock */);
 }
 #endif
 #ifdef VK_KHR_external_semaphore
@@ -2930,7 +2930,7 @@
     AEMU_SCOPED_TRACE("vkImportSemaphoreWin32HandleKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkImportSemaphoreWin32HandleKHR_VkResult_return = (VkResult)0;
-    vkImportSemaphoreWin32HandleKHR_VkResult_return = vkEnc->vkImportSemaphoreWin32HandleKHR(device, pImportSemaphoreWin32HandleInfo);
+    vkImportSemaphoreWin32HandleKHR_VkResult_return = vkEnc->vkImportSemaphoreWin32HandleKHR(device, pImportSemaphoreWin32HandleInfo, true /* do lock */);
     return vkImportSemaphoreWin32HandleKHR_VkResult_return;
 }
 static VkResult dynCheck_entry_vkImportSemaphoreWin32HandleKHR(
@@ -2945,7 +2945,7 @@
     AEMU_SCOPED_TRACE("vkImportSemaphoreWin32HandleKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkImportSemaphoreWin32HandleKHR_VkResult_return = (VkResult)0;
-    vkImportSemaphoreWin32HandleKHR_VkResult_return = vkEnc->vkImportSemaphoreWin32HandleKHR(device, pImportSemaphoreWin32HandleInfo);
+    vkImportSemaphoreWin32HandleKHR_VkResult_return = vkEnc->vkImportSemaphoreWin32HandleKHR(device, pImportSemaphoreWin32HandleInfo, true /* do lock */);
     return vkImportSemaphoreWin32HandleKHR_VkResult_return;
 }
 static VkResult entry_vkGetSemaphoreWin32HandleKHR(
@@ -2956,7 +2956,7 @@
     AEMU_SCOPED_TRACE("vkGetSemaphoreWin32HandleKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetSemaphoreWin32HandleKHR_VkResult_return = (VkResult)0;
-    vkGetSemaphoreWin32HandleKHR_VkResult_return = vkEnc->vkGetSemaphoreWin32HandleKHR(device, pGetWin32HandleInfo, pHandle);
+    vkGetSemaphoreWin32HandleKHR_VkResult_return = vkEnc->vkGetSemaphoreWin32HandleKHR(device, pGetWin32HandleInfo, pHandle, true /* do lock */);
     return vkGetSemaphoreWin32HandleKHR_VkResult_return;
 }
 static VkResult dynCheck_entry_vkGetSemaphoreWin32HandleKHR(
@@ -2972,7 +2972,7 @@
     AEMU_SCOPED_TRACE("vkGetSemaphoreWin32HandleKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetSemaphoreWin32HandleKHR_VkResult_return = (VkResult)0;
-    vkGetSemaphoreWin32HandleKHR_VkResult_return = vkEnc->vkGetSemaphoreWin32HandleKHR(device, pGetWin32HandleInfo, pHandle);
+    vkGetSemaphoreWin32HandleKHR_VkResult_return = vkEnc->vkGetSemaphoreWin32HandleKHR(device, pGetWin32HandleInfo, pHandle, true /* do lock */);
     return vkGetSemaphoreWin32HandleKHR_VkResult_return;
 }
 #endif
@@ -3044,7 +3044,7 @@
     AEMU_SCOPED_TRACE("vkCmdPushDescriptorSetKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdPushDescriptorSetKHR(commandBuffer, pipelineBindPoint, layout, set, descriptorWriteCount, pDescriptorWrites);
+    vkEnc->vkCmdPushDescriptorSetKHR(commandBuffer, pipelineBindPoint, layout, set, descriptorWriteCount, pDescriptorWrites, true /* do lock */);
 }
 static void entry_vkCmdPushDescriptorSetWithTemplateKHR(
     VkCommandBuffer commandBuffer,
@@ -3056,7 +3056,7 @@
     AEMU_SCOPED_TRACE("vkCmdPushDescriptorSetWithTemplateKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdPushDescriptorSetWithTemplateKHR(commandBuffer, descriptorUpdateTemplate, layout, set, pData);
+    vkEnc->vkCmdPushDescriptorSetWithTemplateKHR(commandBuffer, descriptorUpdateTemplate, layout, set, pData, true /* do lock */);
 }
 #endif
 #ifdef VK_KHR_16bit_storage
@@ -3073,7 +3073,7 @@
     AEMU_SCOPED_TRACE("vkCreateDescriptorUpdateTemplateKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateDescriptorUpdateTemplateKHR_VkResult_return = (VkResult)0;
-    vkCreateDescriptorUpdateTemplateKHR_VkResult_return = vkEnc->vkCreateDescriptorUpdateTemplateKHR(device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate);
+    vkCreateDescriptorUpdateTemplateKHR_VkResult_return = vkEnc->vkCreateDescriptorUpdateTemplateKHR(device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate, true /* do lock */);
     return vkCreateDescriptorUpdateTemplateKHR_VkResult_return;
 }
 static VkResult dynCheck_entry_vkCreateDescriptorUpdateTemplateKHR(
@@ -3090,7 +3090,7 @@
     AEMU_SCOPED_TRACE("vkCreateDescriptorUpdateTemplateKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateDescriptorUpdateTemplateKHR_VkResult_return = (VkResult)0;
-    vkCreateDescriptorUpdateTemplateKHR_VkResult_return = vkEnc->vkCreateDescriptorUpdateTemplateKHR(device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate);
+    vkCreateDescriptorUpdateTemplateKHR_VkResult_return = vkEnc->vkCreateDescriptorUpdateTemplateKHR(device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate, true /* do lock */);
     return vkCreateDescriptorUpdateTemplateKHR_VkResult_return;
 }
 static void entry_vkDestroyDescriptorUpdateTemplateKHR(
@@ -3100,7 +3100,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroyDescriptorUpdateTemplateKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyDescriptorUpdateTemplateKHR(device, descriptorUpdateTemplate, pAllocator);
+    vkEnc->vkDestroyDescriptorUpdateTemplateKHR(device, descriptorUpdateTemplate, pAllocator, true /* do lock */);
 }
 static void dynCheck_entry_vkDestroyDescriptorUpdateTemplateKHR(
     VkDevice device,
@@ -3114,7 +3114,7 @@
     }
     AEMU_SCOPED_TRACE("vkDestroyDescriptorUpdateTemplateKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyDescriptorUpdateTemplateKHR(device, descriptorUpdateTemplate, pAllocator);
+    vkEnc->vkDestroyDescriptorUpdateTemplateKHR(device, descriptorUpdateTemplate, pAllocator, true /* do lock */);
 }
 static void entry_vkUpdateDescriptorSetWithTemplateKHR(
     VkDevice device,
@@ -3124,7 +3124,7 @@
 {
     AEMU_SCOPED_TRACE("vkUpdateDescriptorSetWithTemplateKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkUpdateDescriptorSetWithTemplateKHR(device, descriptorSet, descriptorUpdateTemplate, pData);
+    vkEnc->vkUpdateDescriptorSetWithTemplateKHR(device, descriptorSet, descriptorUpdateTemplate, pData, true /* do lock */);
 }
 static void dynCheck_entry_vkUpdateDescriptorSetWithTemplateKHR(
     VkDevice device,
@@ -3139,7 +3139,7 @@
     }
     AEMU_SCOPED_TRACE("vkUpdateDescriptorSetWithTemplateKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkUpdateDescriptorSetWithTemplateKHR(device, descriptorSet, descriptorUpdateTemplate, pData);
+    vkEnc->vkUpdateDescriptorSetWithTemplateKHR(device, descriptorSet, descriptorUpdateTemplate, pData, true /* do lock */);
 }
 #endif
 #ifdef VK_KHR_create_renderpass2
@@ -3152,7 +3152,7 @@
     AEMU_SCOPED_TRACE("vkCreateRenderPass2KHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateRenderPass2KHR_VkResult_return = (VkResult)0;
-    vkCreateRenderPass2KHR_VkResult_return = vkEnc->vkCreateRenderPass2KHR(device, pCreateInfo, pAllocator, pRenderPass);
+    vkCreateRenderPass2KHR_VkResult_return = vkEnc->vkCreateRenderPass2KHR(device, pCreateInfo, pAllocator, pRenderPass, true /* do lock */);
     return vkCreateRenderPass2KHR_VkResult_return;
 }
 static VkResult dynCheck_entry_vkCreateRenderPass2KHR(
@@ -3169,7 +3169,7 @@
     AEMU_SCOPED_TRACE("vkCreateRenderPass2KHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateRenderPass2KHR_VkResult_return = (VkResult)0;
-    vkCreateRenderPass2KHR_VkResult_return = vkEnc->vkCreateRenderPass2KHR(device, pCreateInfo, pAllocator, pRenderPass);
+    vkCreateRenderPass2KHR_VkResult_return = vkEnc->vkCreateRenderPass2KHR(device, pCreateInfo, pAllocator, pRenderPass, true /* do lock */);
     return vkCreateRenderPass2KHR_VkResult_return;
 }
 static void entry_vkCmdBeginRenderPass2KHR(
@@ -3180,7 +3180,7 @@
     AEMU_SCOPED_TRACE("vkCmdBeginRenderPass2KHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdBeginRenderPass2KHR(commandBuffer, pRenderPassBegin, pSubpassBeginInfo);
+    vkEnc->vkCmdBeginRenderPass2KHR(commandBuffer, pRenderPassBegin, pSubpassBeginInfo, true /* do lock */);
 }
 static void entry_vkCmdNextSubpass2KHR(
     VkCommandBuffer commandBuffer,
@@ -3190,7 +3190,7 @@
     AEMU_SCOPED_TRACE("vkCmdNextSubpass2KHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdNextSubpass2KHR(commandBuffer, pSubpassBeginInfo, pSubpassEndInfo);
+    vkEnc->vkCmdNextSubpass2KHR(commandBuffer, pSubpassBeginInfo, pSubpassEndInfo, true /* do lock */);
 }
 static void entry_vkCmdEndRenderPass2KHR(
     VkCommandBuffer commandBuffer,
@@ -3199,7 +3199,7 @@
     AEMU_SCOPED_TRACE("vkCmdEndRenderPass2KHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdEndRenderPass2KHR(commandBuffer, pSubpassEndInfo);
+    vkEnc->vkCmdEndRenderPass2KHR(commandBuffer, pSubpassEndInfo, true /* do lock */);
 }
 #endif
 #ifdef VK_KHR_shared_presentable_image
@@ -3210,7 +3210,7 @@
     AEMU_SCOPED_TRACE("vkGetSwapchainStatusKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetSwapchainStatusKHR_VkResult_return = (VkResult)0;
-    vkGetSwapchainStatusKHR_VkResult_return = vkEnc->vkGetSwapchainStatusKHR(device, swapchain);
+    vkGetSwapchainStatusKHR_VkResult_return = vkEnc->vkGetSwapchainStatusKHR(device, swapchain, true /* do lock */);
     return vkGetSwapchainStatusKHR_VkResult_return;
 }
 static VkResult dynCheck_entry_vkGetSwapchainStatusKHR(
@@ -3225,7 +3225,7 @@
     AEMU_SCOPED_TRACE("vkGetSwapchainStatusKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetSwapchainStatusKHR_VkResult_return = (VkResult)0;
-    vkGetSwapchainStatusKHR_VkResult_return = vkEnc->vkGetSwapchainStatusKHR(device, swapchain);
+    vkGetSwapchainStatusKHR_VkResult_return = vkEnc->vkGetSwapchainStatusKHR(device, swapchain, true /* do lock */);
     return vkGetSwapchainStatusKHR_VkResult_return;
 }
 #endif
@@ -3251,7 +3251,7 @@
     AEMU_SCOPED_TRACE("vkImportFenceWin32HandleKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkImportFenceWin32HandleKHR_VkResult_return = (VkResult)0;
-    vkImportFenceWin32HandleKHR_VkResult_return = vkEnc->vkImportFenceWin32HandleKHR(device, pImportFenceWin32HandleInfo);
+    vkImportFenceWin32HandleKHR_VkResult_return = vkEnc->vkImportFenceWin32HandleKHR(device, pImportFenceWin32HandleInfo, true /* do lock */);
     return vkImportFenceWin32HandleKHR_VkResult_return;
 }
 static VkResult dynCheck_entry_vkImportFenceWin32HandleKHR(
@@ -3266,7 +3266,7 @@
     AEMU_SCOPED_TRACE("vkImportFenceWin32HandleKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkImportFenceWin32HandleKHR_VkResult_return = (VkResult)0;
-    vkImportFenceWin32HandleKHR_VkResult_return = vkEnc->vkImportFenceWin32HandleKHR(device, pImportFenceWin32HandleInfo);
+    vkImportFenceWin32HandleKHR_VkResult_return = vkEnc->vkImportFenceWin32HandleKHR(device, pImportFenceWin32HandleInfo, true /* do lock */);
     return vkImportFenceWin32HandleKHR_VkResult_return;
 }
 static VkResult entry_vkGetFenceWin32HandleKHR(
@@ -3277,7 +3277,7 @@
     AEMU_SCOPED_TRACE("vkGetFenceWin32HandleKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetFenceWin32HandleKHR_VkResult_return = (VkResult)0;
-    vkGetFenceWin32HandleKHR_VkResult_return = vkEnc->vkGetFenceWin32HandleKHR(device, pGetWin32HandleInfo, pHandle);
+    vkGetFenceWin32HandleKHR_VkResult_return = vkEnc->vkGetFenceWin32HandleKHR(device, pGetWin32HandleInfo, pHandle, true /* do lock */);
     return vkGetFenceWin32HandleKHR_VkResult_return;
 }
 static VkResult dynCheck_entry_vkGetFenceWin32HandleKHR(
@@ -3293,7 +3293,7 @@
     AEMU_SCOPED_TRACE("vkGetFenceWin32HandleKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetFenceWin32HandleKHR_VkResult_return = (VkResult)0;
-    vkGetFenceWin32HandleKHR_VkResult_return = vkEnc->vkGetFenceWin32HandleKHR(device, pGetWin32HandleInfo, pHandle);
+    vkGetFenceWin32HandleKHR_VkResult_return = vkEnc->vkGetFenceWin32HandleKHR(device, pGetWin32HandleInfo, pHandle, true /* do lock */);
     return vkGetFenceWin32HandleKHR_VkResult_return;
 }
 #endif
@@ -3364,7 +3364,7 @@
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceSurfaceCapabilities2KHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetPhysicalDeviceSurfaceCapabilities2KHR_VkResult_return = (VkResult)0;
-    vkGetPhysicalDeviceSurfaceCapabilities2KHR_VkResult_return = vkEnc->vkGetPhysicalDeviceSurfaceCapabilities2KHR(physicalDevice, pSurfaceInfo, pSurfaceCapabilities);
+    vkGetPhysicalDeviceSurfaceCapabilities2KHR_VkResult_return = vkEnc->vkGetPhysicalDeviceSurfaceCapabilities2KHR(physicalDevice, pSurfaceInfo, pSurfaceCapabilities, true /* do lock */);
     return vkGetPhysicalDeviceSurfaceCapabilities2KHR_VkResult_return;
 }
 static VkResult entry_vkGetPhysicalDeviceSurfaceFormats2KHR(
@@ -3376,7 +3376,7 @@
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceSurfaceFormats2KHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetPhysicalDeviceSurfaceFormats2KHR_VkResult_return = (VkResult)0;
-    vkGetPhysicalDeviceSurfaceFormats2KHR_VkResult_return = vkEnc->vkGetPhysicalDeviceSurfaceFormats2KHR(physicalDevice, pSurfaceInfo, pSurfaceFormatCount, pSurfaceFormats);
+    vkGetPhysicalDeviceSurfaceFormats2KHR_VkResult_return = vkEnc->vkGetPhysicalDeviceSurfaceFormats2KHR(physicalDevice, pSurfaceInfo, pSurfaceFormatCount, pSurfaceFormats, true /* do lock */);
     return vkGetPhysicalDeviceSurfaceFormats2KHR_VkResult_return;
 }
 #endif
@@ -3391,7 +3391,7 @@
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceDisplayProperties2KHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetPhysicalDeviceDisplayProperties2KHR_VkResult_return = (VkResult)0;
-    vkGetPhysicalDeviceDisplayProperties2KHR_VkResult_return = vkEnc->vkGetPhysicalDeviceDisplayProperties2KHR(physicalDevice, pPropertyCount, pProperties);
+    vkGetPhysicalDeviceDisplayProperties2KHR_VkResult_return = vkEnc->vkGetPhysicalDeviceDisplayProperties2KHR(physicalDevice, pPropertyCount, pProperties, true /* do lock */);
     return vkGetPhysicalDeviceDisplayProperties2KHR_VkResult_return;
 }
 static VkResult entry_vkGetPhysicalDeviceDisplayPlaneProperties2KHR(
@@ -3402,7 +3402,7 @@
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceDisplayPlaneProperties2KHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetPhysicalDeviceDisplayPlaneProperties2KHR_VkResult_return = (VkResult)0;
-    vkGetPhysicalDeviceDisplayPlaneProperties2KHR_VkResult_return = vkEnc->vkGetPhysicalDeviceDisplayPlaneProperties2KHR(physicalDevice, pPropertyCount, pProperties);
+    vkGetPhysicalDeviceDisplayPlaneProperties2KHR_VkResult_return = vkEnc->vkGetPhysicalDeviceDisplayPlaneProperties2KHR(physicalDevice, pPropertyCount, pProperties, true /* do lock */);
     return vkGetPhysicalDeviceDisplayPlaneProperties2KHR_VkResult_return;
 }
 static VkResult entry_vkGetDisplayModeProperties2KHR(
@@ -3414,7 +3414,7 @@
     AEMU_SCOPED_TRACE("vkGetDisplayModeProperties2KHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetDisplayModeProperties2KHR_VkResult_return = (VkResult)0;
-    vkGetDisplayModeProperties2KHR_VkResult_return = vkEnc->vkGetDisplayModeProperties2KHR(physicalDevice, display, pPropertyCount, pProperties);
+    vkGetDisplayModeProperties2KHR_VkResult_return = vkEnc->vkGetDisplayModeProperties2KHR(physicalDevice, display, pPropertyCount, pProperties, true /* do lock */);
     return vkGetDisplayModeProperties2KHR_VkResult_return;
 }
 static VkResult entry_vkGetDisplayPlaneCapabilities2KHR(
@@ -3425,7 +3425,7 @@
     AEMU_SCOPED_TRACE("vkGetDisplayPlaneCapabilities2KHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetDisplayPlaneCapabilities2KHR_VkResult_return = (VkResult)0;
-    vkGetDisplayPlaneCapabilities2KHR_VkResult_return = vkEnc->vkGetDisplayPlaneCapabilities2KHR(physicalDevice, pDisplayPlaneInfo, pCapabilities);
+    vkGetDisplayPlaneCapabilities2KHR_VkResult_return = vkEnc->vkGetDisplayPlaneCapabilities2KHR(physicalDevice, pDisplayPlaneInfo, pCapabilities, true /* do lock */);
     return vkGetDisplayPlaneCapabilities2KHR_VkResult_return;
 }
 #endif
@@ -3492,7 +3492,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetImageSparseMemoryRequirements2KHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetImageSparseMemoryRequirements2KHR(device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
+    vkEnc->vkGetImageSparseMemoryRequirements2KHR(device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements, true /* do lock */);
 }
 static void dynCheck_entry_vkGetImageSparseMemoryRequirements2KHR(
     VkDevice device,
@@ -3507,7 +3507,7 @@
     }
     AEMU_SCOPED_TRACE("vkGetImageSparseMemoryRequirements2KHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetImageSparseMemoryRequirements2KHR(device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements);
+    vkEnc->vkGetImageSparseMemoryRequirements2KHR(device, pInfo, pSparseMemoryRequirementCount, pSparseMemoryRequirements, true /* do lock */);
 }
 #endif
 #ifdef VK_KHR_image_format_list
@@ -3634,7 +3634,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetDescriptorSetLayoutSupportKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetDescriptorSetLayoutSupportKHR(device, pCreateInfo, pSupport);
+    vkEnc->vkGetDescriptorSetLayoutSupportKHR(device, pCreateInfo, pSupport, true /* do lock */);
 }
 static void dynCheck_entry_vkGetDescriptorSetLayoutSupportKHR(
     VkDevice device,
@@ -3648,7 +3648,7 @@
     }
     AEMU_SCOPED_TRACE("vkGetDescriptorSetLayoutSupportKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetDescriptorSetLayoutSupportKHR(device, pCreateInfo, pSupport);
+    vkEnc->vkGetDescriptorSetLayoutSupportKHR(device, pCreateInfo, pSupport, true /* do lock */);
 }
 #endif
 #ifdef VK_KHR_draw_indirect_count
@@ -3664,7 +3664,7 @@
     AEMU_SCOPED_TRACE("vkCmdDrawIndirectCountKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdDrawIndirectCountKHR(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+    vkEnc->vkCmdDrawIndirectCountKHR(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride, true /* do lock */);
 }
 static void entry_vkCmdDrawIndexedIndirectCountKHR(
     VkCommandBuffer commandBuffer,
@@ -3678,7 +3678,7 @@
     AEMU_SCOPED_TRACE("vkCmdDrawIndexedIndirectCountKHR");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdDrawIndexedIndirectCountKHR(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+    vkEnc->vkCmdDrawIndexedIndirectCountKHR(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride, true /* do lock */);
 }
 #endif
 #ifdef VK_KHR_8bit_storage
@@ -3695,7 +3695,7 @@
     AEMU_SCOPED_TRACE("vkGetSwapchainGrallocUsageANDROID");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetSwapchainGrallocUsageANDROID_VkResult_return = (VkResult)0;
-    vkGetSwapchainGrallocUsageANDROID_VkResult_return = vkEnc->vkGetSwapchainGrallocUsageANDROID(device, format, imageUsage, grallocUsage);
+    vkGetSwapchainGrallocUsageANDROID_VkResult_return = vkEnc->vkGetSwapchainGrallocUsageANDROID(device, format, imageUsage, grallocUsage, true /* do lock */);
     return vkGetSwapchainGrallocUsageANDROID_VkResult_return;
 }
 static VkResult dynCheck_entry_vkGetSwapchainGrallocUsageANDROID(
@@ -3712,7 +3712,7 @@
     AEMU_SCOPED_TRACE("vkGetSwapchainGrallocUsageANDROID");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetSwapchainGrallocUsageANDROID_VkResult_return = (VkResult)0;
-    vkGetSwapchainGrallocUsageANDROID_VkResult_return = vkEnc->vkGetSwapchainGrallocUsageANDROID(device, format, imageUsage, grallocUsage);
+    vkGetSwapchainGrallocUsageANDROID_VkResult_return = vkEnc->vkGetSwapchainGrallocUsageANDROID(device, format, imageUsage, grallocUsage, true /* do lock */);
     return vkGetSwapchainGrallocUsageANDROID_VkResult_return;
 }
 static VkResult entry_vkAcquireImageANDROID(
@@ -3725,7 +3725,7 @@
     AEMU_SCOPED_TRACE("vkAcquireImageANDROID");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkAcquireImageANDROID_VkResult_return = (VkResult)0;
-    vkAcquireImageANDROID_VkResult_return = vkEnc->vkAcquireImageANDROID(device, image, nativeFenceFd, semaphore, fence);
+    vkAcquireImageANDROID_VkResult_return = vkEnc->vkAcquireImageANDROID(device, image, nativeFenceFd, semaphore, fence, true /* do lock */);
     return vkAcquireImageANDROID_VkResult_return;
 }
 static VkResult dynCheck_entry_vkAcquireImageANDROID(
@@ -3743,7 +3743,7 @@
     AEMU_SCOPED_TRACE("vkAcquireImageANDROID");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkAcquireImageANDROID_VkResult_return = (VkResult)0;
-    vkAcquireImageANDROID_VkResult_return = vkEnc->vkAcquireImageANDROID(device, image, nativeFenceFd, semaphore, fence);
+    vkAcquireImageANDROID_VkResult_return = vkEnc->vkAcquireImageANDROID(device, image, nativeFenceFd, semaphore, fence, true /* do lock */);
     return vkAcquireImageANDROID_VkResult_return;
 }
 static VkResult entry_vkQueueSignalReleaseImageANDROID(
@@ -3757,7 +3757,7 @@
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
     VkResult vkQueueSignalReleaseImageANDROID_VkResult_return = (VkResult)0;
-    vkQueueSignalReleaseImageANDROID_VkResult_return = vkEnc->vkQueueSignalReleaseImageANDROID(queue, waitSemaphoreCount, pWaitSemaphores, image, pNativeFenceFd);
+    vkQueueSignalReleaseImageANDROID_VkResult_return = vkEnc->vkQueueSignalReleaseImageANDROID(queue, waitSemaphoreCount, pWaitSemaphores, image, pNativeFenceFd, true /* do lock */);
     return vkQueueSignalReleaseImageANDROID_VkResult_return;
 }
 #endif
@@ -3771,7 +3771,7 @@
     AEMU_SCOPED_TRACE("vkCreateDebugReportCallbackEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateDebugReportCallbackEXT_VkResult_return = (VkResult)0;
-    vkCreateDebugReportCallbackEXT_VkResult_return = vkEnc->vkCreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pCallback);
+    vkCreateDebugReportCallbackEXT_VkResult_return = vkEnc->vkCreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pCallback, true /* do lock */);
     return vkCreateDebugReportCallbackEXT_VkResult_return;
 }
 static void entry_vkDestroyDebugReportCallbackEXT(
@@ -3781,7 +3781,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroyDebugReportCallbackEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyDebugReportCallbackEXT(instance, callback, pAllocator);
+    vkEnc->vkDestroyDebugReportCallbackEXT(instance, callback, pAllocator, true /* do lock */);
 }
 static void entry_vkDebugReportMessageEXT(
     VkInstance instance,
@@ -3795,7 +3795,7 @@
 {
     AEMU_SCOPED_TRACE("vkDebugReportMessageEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDebugReportMessageEXT(instance, flags, objectType, object, location, messageCode, pLayerPrefix, pMessage);
+    vkEnc->vkDebugReportMessageEXT(instance, flags, objectType, object, location, messageCode, pLayerPrefix, pMessage, true /* do lock */);
 }
 #endif
 #ifdef VK_NV_glsl_shader
@@ -3818,7 +3818,7 @@
     AEMU_SCOPED_TRACE("vkDebugMarkerSetObjectTagEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkDebugMarkerSetObjectTagEXT_VkResult_return = (VkResult)0;
-    vkDebugMarkerSetObjectTagEXT_VkResult_return = vkEnc->vkDebugMarkerSetObjectTagEXT(device, pTagInfo);
+    vkDebugMarkerSetObjectTagEXT_VkResult_return = vkEnc->vkDebugMarkerSetObjectTagEXT(device, pTagInfo, true /* do lock */);
     return vkDebugMarkerSetObjectTagEXT_VkResult_return;
 }
 static VkResult dynCheck_entry_vkDebugMarkerSetObjectTagEXT(
@@ -3833,7 +3833,7 @@
     AEMU_SCOPED_TRACE("vkDebugMarkerSetObjectTagEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkDebugMarkerSetObjectTagEXT_VkResult_return = (VkResult)0;
-    vkDebugMarkerSetObjectTagEXT_VkResult_return = vkEnc->vkDebugMarkerSetObjectTagEXT(device, pTagInfo);
+    vkDebugMarkerSetObjectTagEXT_VkResult_return = vkEnc->vkDebugMarkerSetObjectTagEXT(device, pTagInfo, true /* do lock */);
     return vkDebugMarkerSetObjectTagEXT_VkResult_return;
 }
 static VkResult entry_vkDebugMarkerSetObjectNameEXT(
@@ -3843,7 +3843,7 @@
     AEMU_SCOPED_TRACE("vkDebugMarkerSetObjectNameEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkDebugMarkerSetObjectNameEXT_VkResult_return = (VkResult)0;
-    vkDebugMarkerSetObjectNameEXT_VkResult_return = vkEnc->vkDebugMarkerSetObjectNameEXT(device, pNameInfo);
+    vkDebugMarkerSetObjectNameEXT_VkResult_return = vkEnc->vkDebugMarkerSetObjectNameEXT(device, pNameInfo, true /* do lock */);
     return vkDebugMarkerSetObjectNameEXT_VkResult_return;
 }
 static VkResult dynCheck_entry_vkDebugMarkerSetObjectNameEXT(
@@ -3858,7 +3858,7 @@
     AEMU_SCOPED_TRACE("vkDebugMarkerSetObjectNameEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkDebugMarkerSetObjectNameEXT_VkResult_return = (VkResult)0;
-    vkDebugMarkerSetObjectNameEXT_VkResult_return = vkEnc->vkDebugMarkerSetObjectNameEXT(device, pNameInfo);
+    vkDebugMarkerSetObjectNameEXT_VkResult_return = vkEnc->vkDebugMarkerSetObjectNameEXT(device, pNameInfo, true /* do lock */);
     return vkDebugMarkerSetObjectNameEXT_VkResult_return;
 }
 static void entry_vkCmdDebugMarkerBeginEXT(
@@ -3868,7 +3868,7 @@
     AEMU_SCOPED_TRACE("vkCmdDebugMarkerBeginEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo);
+    vkEnc->vkCmdDebugMarkerBeginEXT(commandBuffer, pMarkerInfo, true /* do lock */);
 }
 static void entry_vkCmdDebugMarkerEndEXT(
     VkCommandBuffer commandBuffer)
@@ -3876,7 +3876,7 @@
     AEMU_SCOPED_TRACE("vkCmdDebugMarkerEndEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdDebugMarkerEndEXT(commandBuffer);
+    vkEnc->vkCmdDebugMarkerEndEXT(commandBuffer, true /* do lock */);
 }
 static void entry_vkCmdDebugMarkerInsertEXT(
     VkCommandBuffer commandBuffer,
@@ -3885,7 +3885,7 @@
     AEMU_SCOPED_TRACE("vkCmdDebugMarkerInsertEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo);
+    vkEnc->vkCmdDebugMarkerInsertEXT(commandBuffer, pMarkerInfo, true /* do lock */);
 }
 #endif
 #ifdef VK_AMD_gcn_shader
@@ -3905,7 +3905,7 @@
     AEMU_SCOPED_TRACE("vkCmdDrawIndirectCountAMD");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdDrawIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+    vkEnc->vkCmdDrawIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride, true /* do lock */);
 }
 static void entry_vkCmdDrawIndexedIndirectCountAMD(
     VkCommandBuffer commandBuffer,
@@ -3919,7 +3919,7 @@
     AEMU_SCOPED_TRACE("vkCmdDrawIndexedIndirectCountAMD");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdDrawIndexedIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+    vkEnc->vkCmdDrawIndexedIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride, true /* do lock */);
 }
 #endif
 #ifdef VK_AMD_negative_viewport_height
@@ -3942,7 +3942,7 @@
     AEMU_SCOPED_TRACE("vkGetShaderInfoAMD");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetShaderInfoAMD_VkResult_return = (VkResult)0;
-    vkGetShaderInfoAMD_VkResult_return = vkEnc->vkGetShaderInfoAMD(device, pipeline, shaderStage, infoType, pInfoSize, pInfo);
+    vkGetShaderInfoAMD_VkResult_return = vkEnc->vkGetShaderInfoAMD(device, pipeline, shaderStage, infoType, pInfoSize, pInfo, true /* do lock */);
     return vkGetShaderInfoAMD_VkResult_return;
 }
 static VkResult dynCheck_entry_vkGetShaderInfoAMD(
@@ -3961,7 +3961,7 @@
     AEMU_SCOPED_TRACE("vkGetShaderInfoAMD");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetShaderInfoAMD_VkResult_return = (VkResult)0;
-    vkGetShaderInfoAMD_VkResult_return = vkEnc->vkGetShaderInfoAMD(device, pipeline, shaderStage, infoType, pInfoSize, pInfo);
+    vkGetShaderInfoAMD_VkResult_return = vkEnc->vkGetShaderInfoAMD(device, pipeline, shaderStage, infoType, pInfoSize, pInfo, true /* do lock */);
     return vkGetShaderInfoAMD_VkResult_return;
 }
 #endif
@@ -3983,7 +3983,7 @@
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceExternalImageFormatPropertiesNV");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetPhysicalDeviceExternalImageFormatPropertiesNV_VkResult_return = (VkResult)0;
-    vkGetPhysicalDeviceExternalImageFormatPropertiesNV_VkResult_return = vkEnc->vkGetPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties);
+    vkGetPhysicalDeviceExternalImageFormatPropertiesNV_VkResult_return = vkEnc->vkGetPhysicalDeviceExternalImageFormatPropertiesNV(physicalDevice, format, type, tiling, usage, flags, externalHandleType, pExternalImageFormatProperties, true /* do lock */);
     return vkGetPhysicalDeviceExternalImageFormatPropertiesNV_VkResult_return;
 }
 #endif
@@ -3999,7 +3999,7 @@
     AEMU_SCOPED_TRACE("vkGetMemoryWin32HandleNV");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetMemoryWin32HandleNV_VkResult_return = (VkResult)0;
-    vkGetMemoryWin32HandleNV_VkResult_return = vkEnc->vkGetMemoryWin32HandleNV(device, memory, handleType, pHandle);
+    vkGetMemoryWin32HandleNV_VkResult_return = vkEnc->vkGetMemoryWin32HandleNV(device, memory, handleType, pHandle, true /* do lock */);
     return vkGetMemoryWin32HandleNV_VkResult_return;
 }
 static VkResult dynCheck_entry_vkGetMemoryWin32HandleNV(
@@ -4016,7 +4016,7 @@
     AEMU_SCOPED_TRACE("vkGetMemoryWin32HandleNV");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetMemoryWin32HandleNV_VkResult_return = (VkResult)0;
-    vkGetMemoryWin32HandleNV_VkResult_return = vkEnc->vkGetMemoryWin32HandleNV(device, memory, handleType, pHandle);
+    vkGetMemoryWin32HandleNV_VkResult_return = vkEnc->vkGetMemoryWin32HandleNV(device, memory, handleType, pHandle, true /* do lock */);
     return vkGetMemoryWin32HandleNV_VkResult_return;
 }
 #endif
@@ -4034,7 +4034,7 @@
     AEMU_SCOPED_TRACE("vkCreateViSurfaceNN");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateViSurfaceNN_VkResult_return = (VkResult)0;
-    vkCreateViSurfaceNN_VkResult_return = vkEnc->vkCreateViSurfaceNN(instance, pCreateInfo, pAllocator, pSurface);
+    vkCreateViSurfaceNN_VkResult_return = vkEnc->vkCreateViSurfaceNN(instance, pCreateInfo, pAllocator, pSurface, true /* do lock */);
     return vkCreateViSurfaceNN_VkResult_return;
 }
 #endif
@@ -4050,7 +4050,7 @@
     AEMU_SCOPED_TRACE("vkCmdBeginConditionalRenderingEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdBeginConditionalRenderingEXT(commandBuffer, pConditionalRenderingBegin);
+    vkEnc->vkCmdBeginConditionalRenderingEXT(commandBuffer, pConditionalRenderingBegin, true /* do lock */);
 }
 static void entry_vkCmdEndConditionalRenderingEXT(
     VkCommandBuffer commandBuffer)
@@ -4058,7 +4058,7 @@
     AEMU_SCOPED_TRACE("vkCmdEndConditionalRenderingEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdEndConditionalRenderingEXT(commandBuffer);
+    vkEnc->vkCmdEndConditionalRenderingEXT(commandBuffer, true /* do lock */);
 }
 #endif
 #ifdef VK_NVX_device_generated_commands
@@ -4069,7 +4069,7 @@
     AEMU_SCOPED_TRACE("vkCmdProcessCommandsNVX");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdProcessCommandsNVX(commandBuffer, pProcessCommandsInfo);
+    vkEnc->vkCmdProcessCommandsNVX(commandBuffer, pProcessCommandsInfo, true /* do lock */);
 }
 static void entry_vkCmdReserveSpaceForCommandsNVX(
     VkCommandBuffer commandBuffer,
@@ -4078,7 +4078,7 @@
     AEMU_SCOPED_TRACE("vkCmdReserveSpaceForCommandsNVX");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdReserveSpaceForCommandsNVX(commandBuffer, pReserveSpaceInfo);
+    vkEnc->vkCmdReserveSpaceForCommandsNVX(commandBuffer, pReserveSpaceInfo, true /* do lock */);
 }
 static VkResult entry_vkCreateIndirectCommandsLayoutNVX(
     VkDevice device,
@@ -4089,7 +4089,7 @@
     AEMU_SCOPED_TRACE("vkCreateIndirectCommandsLayoutNVX");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateIndirectCommandsLayoutNVX_VkResult_return = (VkResult)0;
-    vkCreateIndirectCommandsLayoutNVX_VkResult_return = vkEnc->vkCreateIndirectCommandsLayoutNVX(device, pCreateInfo, pAllocator, pIndirectCommandsLayout);
+    vkCreateIndirectCommandsLayoutNVX_VkResult_return = vkEnc->vkCreateIndirectCommandsLayoutNVX(device, pCreateInfo, pAllocator, pIndirectCommandsLayout, true /* do lock */);
     return vkCreateIndirectCommandsLayoutNVX_VkResult_return;
 }
 static VkResult dynCheck_entry_vkCreateIndirectCommandsLayoutNVX(
@@ -4106,7 +4106,7 @@
     AEMU_SCOPED_TRACE("vkCreateIndirectCommandsLayoutNVX");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateIndirectCommandsLayoutNVX_VkResult_return = (VkResult)0;
-    vkCreateIndirectCommandsLayoutNVX_VkResult_return = vkEnc->vkCreateIndirectCommandsLayoutNVX(device, pCreateInfo, pAllocator, pIndirectCommandsLayout);
+    vkCreateIndirectCommandsLayoutNVX_VkResult_return = vkEnc->vkCreateIndirectCommandsLayoutNVX(device, pCreateInfo, pAllocator, pIndirectCommandsLayout, true /* do lock */);
     return vkCreateIndirectCommandsLayoutNVX_VkResult_return;
 }
 static void entry_vkDestroyIndirectCommandsLayoutNVX(
@@ -4116,7 +4116,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroyIndirectCommandsLayoutNVX");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyIndirectCommandsLayoutNVX(device, indirectCommandsLayout, pAllocator);
+    vkEnc->vkDestroyIndirectCommandsLayoutNVX(device, indirectCommandsLayout, pAllocator, true /* do lock */);
 }
 static void dynCheck_entry_vkDestroyIndirectCommandsLayoutNVX(
     VkDevice device,
@@ -4130,7 +4130,7 @@
     }
     AEMU_SCOPED_TRACE("vkDestroyIndirectCommandsLayoutNVX");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyIndirectCommandsLayoutNVX(device, indirectCommandsLayout, pAllocator);
+    vkEnc->vkDestroyIndirectCommandsLayoutNVX(device, indirectCommandsLayout, pAllocator, true /* do lock */);
 }
 static VkResult entry_vkCreateObjectTableNVX(
     VkDevice device,
@@ -4141,7 +4141,7 @@
     AEMU_SCOPED_TRACE("vkCreateObjectTableNVX");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateObjectTableNVX_VkResult_return = (VkResult)0;
-    vkCreateObjectTableNVX_VkResult_return = vkEnc->vkCreateObjectTableNVX(device, pCreateInfo, pAllocator, pObjectTable);
+    vkCreateObjectTableNVX_VkResult_return = vkEnc->vkCreateObjectTableNVX(device, pCreateInfo, pAllocator, pObjectTable, true /* do lock */);
     return vkCreateObjectTableNVX_VkResult_return;
 }
 static VkResult dynCheck_entry_vkCreateObjectTableNVX(
@@ -4158,7 +4158,7 @@
     AEMU_SCOPED_TRACE("vkCreateObjectTableNVX");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateObjectTableNVX_VkResult_return = (VkResult)0;
-    vkCreateObjectTableNVX_VkResult_return = vkEnc->vkCreateObjectTableNVX(device, pCreateInfo, pAllocator, pObjectTable);
+    vkCreateObjectTableNVX_VkResult_return = vkEnc->vkCreateObjectTableNVX(device, pCreateInfo, pAllocator, pObjectTable, true /* do lock */);
     return vkCreateObjectTableNVX_VkResult_return;
 }
 static void entry_vkDestroyObjectTableNVX(
@@ -4168,7 +4168,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroyObjectTableNVX");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyObjectTableNVX(device, objectTable, pAllocator);
+    vkEnc->vkDestroyObjectTableNVX(device, objectTable, pAllocator, true /* do lock */);
 }
 static void dynCheck_entry_vkDestroyObjectTableNVX(
     VkDevice device,
@@ -4182,7 +4182,7 @@
     }
     AEMU_SCOPED_TRACE("vkDestroyObjectTableNVX");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyObjectTableNVX(device, objectTable, pAllocator);
+    vkEnc->vkDestroyObjectTableNVX(device, objectTable, pAllocator, true /* do lock */);
 }
 static VkResult entry_vkRegisterObjectsNVX(
     VkDevice device,
@@ -4194,7 +4194,7 @@
     AEMU_SCOPED_TRACE("vkRegisterObjectsNVX");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkRegisterObjectsNVX_VkResult_return = (VkResult)0;
-    vkRegisterObjectsNVX_VkResult_return = vkEnc->vkRegisterObjectsNVX(device, objectTable, objectCount, ppObjectTableEntries, pObjectIndices);
+    vkRegisterObjectsNVX_VkResult_return = vkEnc->vkRegisterObjectsNVX(device, objectTable, objectCount, ppObjectTableEntries, pObjectIndices, true /* do lock */);
     return vkRegisterObjectsNVX_VkResult_return;
 }
 static VkResult dynCheck_entry_vkRegisterObjectsNVX(
@@ -4212,7 +4212,7 @@
     AEMU_SCOPED_TRACE("vkRegisterObjectsNVX");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkRegisterObjectsNVX_VkResult_return = (VkResult)0;
-    vkRegisterObjectsNVX_VkResult_return = vkEnc->vkRegisterObjectsNVX(device, objectTable, objectCount, ppObjectTableEntries, pObjectIndices);
+    vkRegisterObjectsNVX_VkResult_return = vkEnc->vkRegisterObjectsNVX(device, objectTable, objectCount, ppObjectTableEntries, pObjectIndices, true /* do lock */);
     return vkRegisterObjectsNVX_VkResult_return;
 }
 static VkResult entry_vkUnregisterObjectsNVX(
@@ -4225,7 +4225,7 @@
     AEMU_SCOPED_TRACE("vkUnregisterObjectsNVX");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkUnregisterObjectsNVX_VkResult_return = (VkResult)0;
-    vkUnregisterObjectsNVX_VkResult_return = vkEnc->vkUnregisterObjectsNVX(device, objectTable, objectCount, pObjectEntryTypes, pObjectIndices);
+    vkUnregisterObjectsNVX_VkResult_return = vkEnc->vkUnregisterObjectsNVX(device, objectTable, objectCount, pObjectEntryTypes, pObjectIndices, true /* do lock */);
     return vkUnregisterObjectsNVX_VkResult_return;
 }
 static VkResult dynCheck_entry_vkUnregisterObjectsNVX(
@@ -4243,7 +4243,7 @@
     AEMU_SCOPED_TRACE("vkUnregisterObjectsNVX");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkUnregisterObjectsNVX_VkResult_return = (VkResult)0;
-    vkUnregisterObjectsNVX_VkResult_return = vkEnc->vkUnregisterObjectsNVX(device, objectTable, objectCount, pObjectEntryTypes, pObjectIndices);
+    vkUnregisterObjectsNVX_VkResult_return = vkEnc->vkUnregisterObjectsNVX(device, objectTable, objectCount, pObjectEntryTypes, pObjectIndices, true /* do lock */);
     return vkUnregisterObjectsNVX_VkResult_return;
 }
 static void entry_vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX(
@@ -4253,7 +4253,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX(physicalDevice, pFeatures, pLimits);
+    vkEnc->vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX(physicalDevice, pFeatures, pLimits, true /* do lock */);
 }
 #endif
 #ifdef VK_NV_clip_space_w_scaling
@@ -4266,7 +4266,7 @@
     AEMU_SCOPED_TRACE("vkCmdSetViewportWScalingNV");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdSetViewportWScalingNV(commandBuffer, firstViewport, viewportCount, pViewportWScalings);
+    vkEnc->vkCmdSetViewportWScalingNV(commandBuffer, firstViewport, viewportCount, pViewportWScalings, true /* do lock */);
 }
 #endif
 #ifdef VK_EXT_direct_mode_display
@@ -4277,7 +4277,7 @@
     AEMU_SCOPED_TRACE("vkReleaseDisplayEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkReleaseDisplayEXT_VkResult_return = (VkResult)0;
-    vkReleaseDisplayEXT_VkResult_return = vkEnc->vkReleaseDisplayEXT(physicalDevice, display);
+    vkReleaseDisplayEXT_VkResult_return = vkEnc->vkReleaseDisplayEXT(physicalDevice, display, true /* do lock */);
     return vkReleaseDisplayEXT_VkResult_return;
 }
 #endif
@@ -4290,7 +4290,7 @@
     AEMU_SCOPED_TRACE("vkAcquireXlibDisplayEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkAcquireXlibDisplayEXT_VkResult_return = (VkResult)0;
-    vkAcquireXlibDisplayEXT_VkResult_return = vkEnc->vkAcquireXlibDisplayEXT(physicalDevice, dpy, display);
+    vkAcquireXlibDisplayEXT_VkResult_return = vkEnc->vkAcquireXlibDisplayEXT(physicalDevice, dpy, display, true /* do lock */);
     return vkAcquireXlibDisplayEXT_VkResult_return;
 }
 static VkResult entry_vkGetRandROutputDisplayEXT(
@@ -4302,7 +4302,7 @@
     AEMU_SCOPED_TRACE("vkGetRandROutputDisplayEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetRandROutputDisplayEXT_VkResult_return = (VkResult)0;
-    vkGetRandROutputDisplayEXT_VkResult_return = vkEnc->vkGetRandROutputDisplayEXT(physicalDevice, dpy, rrOutput, pDisplay);
+    vkGetRandROutputDisplayEXT_VkResult_return = vkEnc->vkGetRandROutputDisplayEXT(physicalDevice, dpy, rrOutput, pDisplay, true /* do lock */);
     return vkGetRandROutputDisplayEXT_VkResult_return;
 }
 #endif
@@ -4315,7 +4315,7 @@
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceSurfaceCapabilities2EXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetPhysicalDeviceSurfaceCapabilities2EXT_VkResult_return = (VkResult)0;
-    vkGetPhysicalDeviceSurfaceCapabilities2EXT_VkResult_return = vkEnc->vkGetPhysicalDeviceSurfaceCapabilities2EXT(physicalDevice, surface, pSurfaceCapabilities);
+    vkGetPhysicalDeviceSurfaceCapabilities2EXT_VkResult_return = vkEnc->vkGetPhysicalDeviceSurfaceCapabilities2EXT(physicalDevice, surface, pSurfaceCapabilities, true /* do lock */);
     return vkGetPhysicalDeviceSurfaceCapabilities2EXT_VkResult_return;
 }
 #endif
@@ -4328,7 +4328,7 @@
     AEMU_SCOPED_TRACE("vkDisplayPowerControlEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkDisplayPowerControlEXT_VkResult_return = (VkResult)0;
-    vkDisplayPowerControlEXT_VkResult_return = vkEnc->vkDisplayPowerControlEXT(device, display, pDisplayPowerInfo);
+    vkDisplayPowerControlEXT_VkResult_return = vkEnc->vkDisplayPowerControlEXT(device, display, pDisplayPowerInfo, true /* do lock */);
     return vkDisplayPowerControlEXT_VkResult_return;
 }
 static VkResult dynCheck_entry_vkDisplayPowerControlEXT(
@@ -4344,7 +4344,7 @@
     AEMU_SCOPED_TRACE("vkDisplayPowerControlEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkDisplayPowerControlEXT_VkResult_return = (VkResult)0;
-    vkDisplayPowerControlEXT_VkResult_return = vkEnc->vkDisplayPowerControlEXT(device, display, pDisplayPowerInfo);
+    vkDisplayPowerControlEXT_VkResult_return = vkEnc->vkDisplayPowerControlEXT(device, display, pDisplayPowerInfo, true /* do lock */);
     return vkDisplayPowerControlEXT_VkResult_return;
 }
 static VkResult entry_vkRegisterDeviceEventEXT(
@@ -4356,7 +4356,7 @@
     AEMU_SCOPED_TRACE("vkRegisterDeviceEventEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkRegisterDeviceEventEXT_VkResult_return = (VkResult)0;
-    vkRegisterDeviceEventEXT_VkResult_return = vkEnc->vkRegisterDeviceEventEXT(device, pDeviceEventInfo, pAllocator, pFence);
+    vkRegisterDeviceEventEXT_VkResult_return = vkEnc->vkRegisterDeviceEventEXT(device, pDeviceEventInfo, pAllocator, pFence, true /* do lock */);
     return vkRegisterDeviceEventEXT_VkResult_return;
 }
 static VkResult dynCheck_entry_vkRegisterDeviceEventEXT(
@@ -4373,7 +4373,7 @@
     AEMU_SCOPED_TRACE("vkRegisterDeviceEventEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkRegisterDeviceEventEXT_VkResult_return = (VkResult)0;
-    vkRegisterDeviceEventEXT_VkResult_return = vkEnc->vkRegisterDeviceEventEXT(device, pDeviceEventInfo, pAllocator, pFence);
+    vkRegisterDeviceEventEXT_VkResult_return = vkEnc->vkRegisterDeviceEventEXT(device, pDeviceEventInfo, pAllocator, pFence, true /* do lock */);
     return vkRegisterDeviceEventEXT_VkResult_return;
 }
 static VkResult entry_vkRegisterDisplayEventEXT(
@@ -4386,7 +4386,7 @@
     AEMU_SCOPED_TRACE("vkRegisterDisplayEventEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkRegisterDisplayEventEXT_VkResult_return = (VkResult)0;
-    vkRegisterDisplayEventEXT_VkResult_return = vkEnc->vkRegisterDisplayEventEXT(device, display, pDisplayEventInfo, pAllocator, pFence);
+    vkRegisterDisplayEventEXT_VkResult_return = vkEnc->vkRegisterDisplayEventEXT(device, display, pDisplayEventInfo, pAllocator, pFence, true /* do lock */);
     return vkRegisterDisplayEventEXT_VkResult_return;
 }
 static VkResult dynCheck_entry_vkRegisterDisplayEventEXT(
@@ -4404,7 +4404,7 @@
     AEMU_SCOPED_TRACE("vkRegisterDisplayEventEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkRegisterDisplayEventEXT_VkResult_return = (VkResult)0;
-    vkRegisterDisplayEventEXT_VkResult_return = vkEnc->vkRegisterDisplayEventEXT(device, display, pDisplayEventInfo, pAllocator, pFence);
+    vkRegisterDisplayEventEXT_VkResult_return = vkEnc->vkRegisterDisplayEventEXT(device, display, pDisplayEventInfo, pAllocator, pFence, true /* do lock */);
     return vkRegisterDisplayEventEXT_VkResult_return;
 }
 static VkResult entry_vkGetSwapchainCounterEXT(
@@ -4416,7 +4416,7 @@
     AEMU_SCOPED_TRACE("vkGetSwapchainCounterEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetSwapchainCounterEXT_VkResult_return = (VkResult)0;
-    vkGetSwapchainCounterEXT_VkResult_return = vkEnc->vkGetSwapchainCounterEXT(device, swapchain, counter, pCounterValue);
+    vkGetSwapchainCounterEXT_VkResult_return = vkEnc->vkGetSwapchainCounterEXT(device, swapchain, counter, pCounterValue, true /* do lock */);
     return vkGetSwapchainCounterEXT_VkResult_return;
 }
 static VkResult dynCheck_entry_vkGetSwapchainCounterEXT(
@@ -4433,7 +4433,7 @@
     AEMU_SCOPED_TRACE("vkGetSwapchainCounterEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetSwapchainCounterEXT_VkResult_return = (VkResult)0;
-    vkGetSwapchainCounterEXT_VkResult_return = vkEnc->vkGetSwapchainCounterEXT(device, swapchain, counter, pCounterValue);
+    vkGetSwapchainCounterEXT_VkResult_return = vkEnc->vkGetSwapchainCounterEXT(device, swapchain, counter, pCounterValue, true /* do lock */);
     return vkGetSwapchainCounterEXT_VkResult_return;
 }
 #endif
@@ -4446,7 +4446,7 @@
     AEMU_SCOPED_TRACE("vkGetRefreshCycleDurationGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetRefreshCycleDurationGOOGLE_VkResult_return = (VkResult)0;
-    vkGetRefreshCycleDurationGOOGLE_VkResult_return = vkEnc->vkGetRefreshCycleDurationGOOGLE(device, swapchain, pDisplayTimingProperties);
+    vkGetRefreshCycleDurationGOOGLE_VkResult_return = vkEnc->vkGetRefreshCycleDurationGOOGLE(device, swapchain, pDisplayTimingProperties, true /* do lock */);
     return vkGetRefreshCycleDurationGOOGLE_VkResult_return;
 }
 static VkResult dynCheck_entry_vkGetRefreshCycleDurationGOOGLE(
@@ -4462,7 +4462,7 @@
     AEMU_SCOPED_TRACE("vkGetRefreshCycleDurationGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetRefreshCycleDurationGOOGLE_VkResult_return = (VkResult)0;
-    vkGetRefreshCycleDurationGOOGLE_VkResult_return = vkEnc->vkGetRefreshCycleDurationGOOGLE(device, swapchain, pDisplayTimingProperties);
+    vkGetRefreshCycleDurationGOOGLE_VkResult_return = vkEnc->vkGetRefreshCycleDurationGOOGLE(device, swapchain, pDisplayTimingProperties, true /* do lock */);
     return vkGetRefreshCycleDurationGOOGLE_VkResult_return;
 }
 static VkResult entry_vkGetPastPresentationTimingGOOGLE(
@@ -4474,7 +4474,7 @@
     AEMU_SCOPED_TRACE("vkGetPastPresentationTimingGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetPastPresentationTimingGOOGLE_VkResult_return = (VkResult)0;
-    vkGetPastPresentationTimingGOOGLE_VkResult_return = vkEnc->vkGetPastPresentationTimingGOOGLE(device, swapchain, pPresentationTimingCount, pPresentationTimings);
+    vkGetPastPresentationTimingGOOGLE_VkResult_return = vkEnc->vkGetPastPresentationTimingGOOGLE(device, swapchain, pPresentationTimingCount, pPresentationTimings, true /* do lock */);
     return vkGetPastPresentationTimingGOOGLE_VkResult_return;
 }
 static VkResult dynCheck_entry_vkGetPastPresentationTimingGOOGLE(
@@ -4491,7 +4491,7 @@
     AEMU_SCOPED_TRACE("vkGetPastPresentationTimingGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetPastPresentationTimingGOOGLE_VkResult_return = (VkResult)0;
-    vkGetPastPresentationTimingGOOGLE_VkResult_return = vkEnc->vkGetPastPresentationTimingGOOGLE(device, swapchain, pPresentationTimingCount, pPresentationTimings);
+    vkGetPastPresentationTimingGOOGLE_VkResult_return = vkEnc->vkGetPastPresentationTimingGOOGLE(device, swapchain, pPresentationTimingCount, pPresentationTimings, true /* do lock */);
     return vkGetPastPresentationTimingGOOGLE_VkResult_return;
 }
 #endif
@@ -4515,7 +4515,7 @@
     AEMU_SCOPED_TRACE("vkCmdSetDiscardRectangleEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdSetDiscardRectangleEXT(commandBuffer, firstDiscardRectangle, discardRectangleCount, pDiscardRectangles);
+    vkEnc->vkCmdSetDiscardRectangleEXT(commandBuffer, firstDiscardRectangle, discardRectangleCount, pDiscardRectangles, true /* do lock */);
 }
 #endif
 #ifdef VK_EXT_conservative_rasterization
@@ -4531,7 +4531,7 @@
 {
     AEMU_SCOPED_TRACE("vkSetHdrMetadataEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkSetHdrMetadataEXT(device, swapchainCount, pSwapchains, pMetadata);
+    vkEnc->vkSetHdrMetadataEXT(device, swapchainCount, pSwapchains, pMetadata, true /* do lock */);
 }
 static void dynCheck_entry_vkSetHdrMetadataEXT(
     VkDevice device,
@@ -4546,7 +4546,7 @@
     }
     AEMU_SCOPED_TRACE("vkSetHdrMetadataEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkSetHdrMetadataEXT(device, swapchainCount, pSwapchains, pMetadata);
+    vkEnc->vkSetHdrMetadataEXT(device, swapchainCount, pSwapchains, pMetadata, true /* do lock */);
 }
 #endif
 #ifdef VK_MVK_ios_surface
@@ -4559,7 +4559,7 @@
     AEMU_SCOPED_TRACE("vkCreateIOSSurfaceMVK");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateIOSSurfaceMVK_VkResult_return = (VkResult)0;
-    vkCreateIOSSurfaceMVK_VkResult_return = vkEnc->vkCreateIOSSurfaceMVK(instance, pCreateInfo, pAllocator, pSurface);
+    vkCreateIOSSurfaceMVK_VkResult_return = vkEnc->vkCreateIOSSurfaceMVK(instance, pCreateInfo, pAllocator, pSurface, true /* do lock */);
     return vkCreateIOSSurfaceMVK_VkResult_return;
 }
 #endif
@@ -4573,7 +4573,7 @@
     AEMU_SCOPED_TRACE("vkCreateMacOSSurfaceMVK");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateMacOSSurfaceMVK_VkResult_return = (VkResult)0;
-    vkCreateMacOSSurfaceMVK_VkResult_return = vkEnc->vkCreateMacOSSurfaceMVK(instance, pCreateInfo, pAllocator, pSurface);
+    vkCreateMacOSSurfaceMVK_VkResult_return = vkEnc->vkCreateMacOSSurfaceMVK(instance, pCreateInfo, pAllocator, pSurface, true /* do lock */);
     return vkCreateMacOSSurfaceMVK_VkResult_return;
 }
 #endif
@@ -4589,7 +4589,7 @@
     AEMU_SCOPED_TRACE("vkSetDebugUtilsObjectNameEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkSetDebugUtilsObjectNameEXT_VkResult_return = (VkResult)0;
-    vkSetDebugUtilsObjectNameEXT_VkResult_return = vkEnc->vkSetDebugUtilsObjectNameEXT(device, pNameInfo);
+    vkSetDebugUtilsObjectNameEXT_VkResult_return = vkEnc->vkSetDebugUtilsObjectNameEXT(device, pNameInfo, true /* do lock */);
     return vkSetDebugUtilsObjectNameEXT_VkResult_return;
 }
 static VkResult dynCheck_entry_vkSetDebugUtilsObjectNameEXT(
@@ -4604,7 +4604,7 @@
     AEMU_SCOPED_TRACE("vkSetDebugUtilsObjectNameEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkSetDebugUtilsObjectNameEXT_VkResult_return = (VkResult)0;
-    vkSetDebugUtilsObjectNameEXT_VkResult_return = vkEnc->vkSetDebugUtilsObjectNameEXT(device, pNameInfo);
+    vkSetDebugUtilsObjectNameEXT_VkResult_return = vkEnc->vkSetDebugUtilsObjectNameEXT(device, pNameInfo, true /* do lock */);
     return vkSetDebugUtilsObjectNameEXT_VkResult_return;
 }
 static VkResult entry_vkSetDebugUtilsObjectTagEXT(
@@ -4614,7 +4614,7 @@
     AEMU_SCOPED_TRACE("vkSetDebugUtilsObjectTagEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkSetDebugUtilsObjectTagEXT_VkResult_return = (VkResult)0;
-    vkSetDebugUtilsObjectTagEXT_VkResult_return = vkEnc->vkSetDebugUtilsObjectTagEXT(device, pTagInfo);
+    vkSetDebugUtilsObjectTagEXT_VkResult_return = vkEnc->vkSetDebugUtilsObjectTagEXT(device, pTagInfo, true /* do lock */);
     return vkSetDebugUtilsObjectTagEXT_VkResult_return;
 }
 static VkResult dynCheck_entry_vkSetDebugUtilsObjectTagEXT(
@@ -4629,7 +4629,7 @@
     AEMU_SCOPED_TRACE("vkSetDebugUtilsObjectTagEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkSetDebugUtilsObjectTagEXT_VkResult_return = (VkResult)0;
-    vkSetDebugUtilsObjectTagEXT_VkResult_return = vkEnc->vkSetDebugUtilsObjectTagEXT(device, pTagInfo);
+    vkSetDebugUtilsObjectTagEXT_VkResult_return = vkEnc->vkSetDebugUtilsObjectTagEXT(device, pTagInfo, true /* do lock */);
     return vkSetDebugUtilsObjectTagEXT_VkResult_return;
 }
 static void entry_vkQueueBeginDebugUtilsLabelEXT(
@@ -4639,7 +4639,7 @@
     AEMU_SCOPED_TRACE("vkQueueBeginDebugUtilsLabelEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
-    vkEnc->vkQueueBeginDebugUtilsLabelEXT(queue, pLabelInfo);
+    vkEnc->vkQueueBeginDebugUtilsLabelEXT(queue, pLabelInfo, true /* do lock */);
 }
 static void entry_vkQueueEndDebugUtilsLabelEXT(
     VkQueue queue)
@@ -4647,7 +4647,7 @@
     AEMU_SCOPED_TRACE("vkQueueEndDebugUtilsLabelEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
-    vkEnc->vkQueueEndDebugUtilsLabelEXT(queue);
+    vkEnc->vkQueueEndDebugUtilsLabelEXT(queue, true /* do lock */);
 }
 static void entry_vkQueueInsertDebugUtilsLabelEXT(
     VkQueue queue,
@@ -4656,7 +4656,7 @@
     AEMU_SCOPED_TRACE("vkQueueInsertDebugUtilsLabelEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
-    vkEnc->vkQueueInsertDebugUtilsLabelEXT(queue, pLabelInfo);
+    vkEnc->vkQueueInsertDebugUtilsLabelEXT(queue, pLabelInfo, true /* do lock */);
 }
 static void entry_vkCmdBeginDebugUtilsLabelEXT(
     VkCommandBuffer commandBuffer,
@@ -4665,7 +4665,7 @@
     AEMU_SCOPED_TRACE("vkCmdBeginDebugUtilsLabelEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdBeginDebugUtilsLabelEXT(commandBuffer, pLabelInfo);
+    vkEnc->vkCmdBeginDebugUtilsLabelEXT(commandBuffer, pLabelInfo, true /* do lock */);
 }
 static void entry_vkCmdEndDebugUtilsLabelEXT(
     VkCommandBuffer commandBuffer)
@@ -4673,7 +4673,7 @@
     AEMU_SCOPED_TRACE("vkCmdEndDebugUtilsLabelEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdEndDebugUtilsLabelEXT(commandBuffer);
+    vkEnc->vkCmdEndDebugUtilsLabelEXT(commandBuffer, true /* do lock */);
 }
 static void entry_vkCmdInsertDebugUtilsLabelEXT(
     VkCommandBuffer commandBuffer,
@@ -4682,7 +4682,7 @@
     AEMU_SCOPED_TRACE("vkCmdInsertDebugUtilsLabelEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdInsertDebugUtilsLabelEXT(commandBuffer, pLabelInfo);
+    vkEnc->vkCmdInsertDebugUtilsLabelEXT(commandBuffer, pLabelInfo, true /* do lock */);
 }
 static VkResult entry_vkCreateDebugUtilsMessengerEXT(
     VkInstance instance,
@@ -4693,7 +4693,7 @@
     AEMU_SCOPED_TRACE("vkCreateDebugUtilsMessengerEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateDebugUtilsMessengerEXT_VkResult_return = (VkResult)0;
-    vkCreateDebugUtilsMessengerEXT_VkResult_return = vkEnc->vkCreateDebugUtilsMessengerEXT(instance, pCreateInfo, pAllocator, pMessenger);
+    vkCreateDebugUtilsMessengerEXT_VkResult_return = vkEnc->vkCreateDebugUtilsMessengerEXT(instance, pCreateInfo, pAllocator, pMessenger, true /* do lock */);
     return vkCreateDebugUtilsMessengerEXT_VkResult_return;
 }
 static void entry_vkDestroyDebugUtilsMessengerEXT(
@@ -4703,7 +4703,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroyDebugUtilsMessengerEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyDebugUtilsMessengerEXT(instance, messenger, pAllocator);
+    vkEnc->vkDestroyDebugUtilsMessengerEXT(instance, messenger, pAllocator, true /* do lock */);
 }
 static void entry_vkSubmitDebugUtilsMessageEXT(
     VkInstance instance,
@@ -4713,7 +4713,7 @@
 {
     AEMU_SCOPED_TRACE("vkSubmitDebugUtilsMessageEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkSubmitDebugUtilsMessageEXT(instance, messageSeverity, messageTypes, pCallbackData);
+    vkEnc->vkSubmitDebugUtilsMessageEXT(instance, messageSeverity, messageTypes, pCallbackData, true /* do lock */);
 }
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
@@ -4792,7 +4792,7 @@
     AEMU_SCOPED_TRACE("vkCmdSetSampleLocationsEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdSetSampleLocationsEXT(commandBuffer, pSampleLocationsInfo);
+    vkEnc->vkCmdSetSampleLocationsEXT(commandBuffer, pSampleLocationsInfo, true /* do lock */);
 }
 static void entry_vkGetPhysicalDeviceMultisamplePropertiesEXT(
     VkPhysicalDevice physicalDevice,
@@ -4801,7 +4801,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetPhysicalDeviceMultisamplePropertiesEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetPhysicalDeviceMultisamplePropertiesEXT(physicalDevice, samples, pMultisampleProperties);
+    vkEnc->vkGetPhysicalDeviceMultisamplePropertiesEXT(physicalDevice, samples, pMultisampleProperties, true /* do lock */);
 }
 #endif
 #ifdef VK_EXT_blend_operation_advanced
@@ -4824,7 +4824,7 @@
     AEMU_SCOPED_TRACE("vkCreateValidationCacheEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateValidationCacheEXT_VkResult_return = (VkResult)0;
-    vkCreateValidationCacheEXT_VkResult_return = vkEnc->vkCreateValidationCacheEXT(device, pCreateInfo, pAllocator, pValidationCache);
+    vkCreateValidationCacheEXT_VkResult_return = vkEnc->vkCreateValidationCacheEXT(device, pCreateInfo, pAllocator, pValidationCache, true /* do lock */);
     return vkCreateValidationCacheEXT_VkResult_return;
 }
 static VkResult dynCheck_entry_vkCreateValidationCacheEXT(
@@ -4841,7 +4841,7 @@
     AEMU_SCOPED_TRACE("vkCreateValidationCacheEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateValidationCacheEXT_VkResult_return = (VkResult)0;
-    vkCreateValidationCacheEXT_VkResult_return = vkEnc->vkCreateValidationCacheEXT(device, pCreateInfo, pAllocator, pValidationCache);
+    vkCreateValidationCacheEXT_VkResult_return = vkEnc->vkCreateValidationCacheEXT(device, pCreateInfo, pAllocator, pValidationCache, true /* do lock */);
     return vkCreateValidationCacheEXT_VkResult_return;
 }
 static void entry_vkDestroyValidationCacheEXT(
@@ -4851,7 +4851,7 @@
 {
     AEMU_SCOPED_TRACE("vkDestroyValidationCacheEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyValidationCacheEXT(device, validationCache, pAllocator);
+    vkEnc->vkDestroyValidationCacheEXT(device, validationCache, pAllocator, true /* do lock */);
 }
 static void dynCheck_entry_vkDestroyValidationCacheEXT(
     VkDevice device,
@@ -4865,7 +4865,7 @@
     }
     AEMU_SCOPED_TRACE("vkDestroyValidationCacheEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkDestroyValidationCacheEXT(device, validationCache, pAllocator);
+    vkEnc->vkDestroyValidationCacheEXT(device, validationCache, pAllocator, true /* do lock */);
 }
 static VkResult entry_vkMergeValidationCachesEXT(
     VkDevice device,
@@ -4876,7 +4876,7 @@
     AEMU_SCOPED_TRACE("vkMergeValidationCachesEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkMergeValidationCachesEXT_VkResult_return = (VkResult)0;
-    vkMergeValidationCachesEXT_VkResult_return = vkEnc->vkMergeValidationCachesEXT(device, dstCache, srcCacheCount, pSrcCaches);
+    vkMergeValidationCachesEXT_VkResult_return = vkEnc->vkMergeValidationCachesEXT(device, dstCache, srcCacheCount, pSrcCaches, true /* do lock */);
     return vkMergeValidationCachesEXT_VkResult_return;
 }
 static VkResult dynCheck_entry_vkMergeValidationCachesEXT(
@@ -4893,7 +4893,7 @@
     AEMU_SCOPED_TRACE("vkMergeValidationCachesEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkMergeValidationCachesEXT_VkResult_return = (VkResult)0;
-    vkMergeValidationCachesEXT_VkResult_return = vkEnc->vkMergeValidationCachesEXT(device, dstCache, srcCacheCount, pSrcCaches);
+    vkMergeValidationCachesEXT_VkResult_return = vkEnc->vkMergeValidationCachesEXT(device, dstCache, srcCacheCount, pSrcCaches, true /* do lock */);
     return vkMergeValidationCachesEXT_VkResult_return;
 }
 static VkResult entry_vkGetValidationCacheDataEXT(
@@ -4905,7 +4905,7 @@
     AEMU_SCOPED_TRACE("vkGetValidationCacheDataEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetValidationCacheDataEXT_VkResult_return = (VkResult)0;
-    vkGetValidationCacheDataEXT_VkResult_return = vkEnc->vkGetValidationCacheDataEXT(device, validationCache, pDataSize, pData);
+    vkGetValidationCacheDataEXT_VkResult_return = vkEnc->vkGetValidationCacheDataEXT(device, validationCache, pDataSize, pData, true /* do lock */);
     return vkGetValidationCacheDataEXT_VkResult_return;
 }
 static VkResult dynCheck_entry_vkGetValidationCacheDataEXT(
@@ -4922,7 +4922,7 @@
     AEMU_SCOPED_TRACE("vkGetValidationCacheDataEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetValidationCacheDataEXT_VkResult_return = (VkResult)0;
-    vkGetValidationCacheDataEXT_VkResult_return = vkEnc->vkGetValidationCacheDataEXT(device, validationCache, pDataSize, pData);
+    vkGetValidationCacheDataEXT_VkResult_return = vkEnc->vkGetValidationCacheDataEXT(device, validationCache, pDataSize, pData, true /* do lock */);
     return vkGetValidationCacheDataEXT_VkResult_return;
 }
 #endif
@@ -4942,7 +4942,7 @@
     AEMU_SCOPED_TRACE("vkGetMemoryHostPointerPropertiesEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetMemoryHostPointerPropertiesEXT_VkResult_return = (VkResult)0;
-    vkGetMemoryHostPointerPropertiesEXT_VkResult_return = vkEnc->vkGetMemoryHostPointerPropertiesEXT(device, handleType, pHostPointer, pMemoryHostPointerProperties);
+    vkGetMemoryHostPointerPropertiesEXT_VkResult_return = vkEnc->vkGetMemoryHostPointerPropertiesEXT(device, handleType, pHostPointer, pMemoryHostPointerProperties, true /* do lock */);
     return vkGetMemoryHostPointerPropertiesEXT_VkResult_return;
 }
 static VkResult dynCheck_entry_vkGetMemoryHostPointerPropertiesEXT(
@@ -4959,7 +4959,7 @@
     AEMU_SCOPED_TRACE("vkGetMemoryHostPointerPropertiesEXT");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetMemoryHostPointerPropertiesEXT_VkResult_return = (VkResult)0;
-    vkGetMemoryHostPointerPropertiesEXT_VkResult_return = vkEnc->vkGetMemoryHostPointerPropertiesEXT(device, handleType, pHostPointer, pMemoryHostPointerProperties);
+    vkGetMemoryHostPointerPropertiesEXT_VkResult_return = vkEnc->vkGetMemoryHostPointerPropertiesEXT(device, handleType, pHostPointer, pMemoryHostPointerProperties, true /* do lock */);
     return vkGetMemoryHostPointerPropertiesEXT_VkResult_return;
 }
 #endif
@@ -4974,7 +4974,7 @@
     AEMU_SCOPED_TRACE("vkCmdWriteBufferMarkerAMD");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdWriteBufferMarkerAMD(commandBuffer, pipelineStage, dstBuffer, dstOffset, marker);
+    vkEnc->vkCmdWriteBufferMarkerAMD(commandBuffer, pipelineStage, dstBuffer, dstOffset, marker, true /* do lock */);
 }
 #endif
 #ifdef VK_AMD_shader_core_properties
@@ -4991,7 +4991,7 @@
     AEMU_SCOPED_TRACE("vkCmdSetCheckpointNV");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCmdSetCheckpointNV(commandBuffer, pCheckpointMarker);
+    vkEnc->vkCmdSetCheckpointNV(commandBuffer, pCheckpointMarker, true /* do lock */);
 }
 static void entry_vkGetQueueCheckpointDataNV(
     VkQueue queue,
@@ -5001,7 +5001,7 @@
     AEMU_SCOPED_TRACE("vkGetQueueCheckpointDataNV");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
-    vkEnc->vkGetQueueCheckpointDataNV(queue, pCheckpointDataCount, pCheckpointData);
+    vkEnc->vkGetQueueCheckpointDataNV(queue, pCheckpointDataCount, pCheckpointData, true /* do lock */);
 }
 #endif
 #ifdef VK_GOOGLE_address_space
@@ -5013,7 +5013,7 @@
     AEMU_SCOPED_TRACE("vkMapMemoryIntoAddressSpaceGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return = (VkResult)0;
-    vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return = vkEnc->vkMapMemoryIntoAddressSpaceGOOGLE(device, memory, pAddress);
+    vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return = vkEnc->vkMapMemoryIntoAddressSpaceGOOGLE(device, memory, pAddress, true /* do lock */);
     return vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return;
 }
 static VkResult dynCheck_entry_vkMapMemoryIntoAddressSpaceGOOGLE(
@@ -5029,7 +5029,7 @@
     AEMU_SCOPED_TRACE("vkMapMemoryIntoAddressSpaceGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return = (VkResult)0;
-    vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return = vkEnc->vkMapMemoryIntoAddressSpaceGOOGLE(device, memory, pAddress);
+    vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return = vkEnc->vkMapMemoryIntoAddressSpaceGOOGLE(device, memory, pAddress, true /* do lock */);
     return vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return;
 }
 #endif
@@ -5042,7 +5042,7 @@
     AEMU_SCOPED_TRACE("vkRegisterImageColorBufferGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkRegisterImageColorBufferGOOGLE_VkResult_return = (VkResult)0;
-    vkRegisterImageColorBufferGOOGLE_VkResult_return = vkEnc->vkRegisterImageColorBufferGOOGLE(device, image, colorBuffer);
+    vkRegisterImageColorBufferGOOGLE_VkResult_return = vkEnc->vkRegisterImageColorBufferGOOGLE(device, image, colorBuffer, true /* do lock */);
     return vkRegisterImageColorBufferGOOGLE_VkResult_return;
 }
 static VkResult dynCheck_entry_vkRegisterImageColorBufferGOOGLE(
@@ -5058,7 +5058,7 @@
     AEMU_SCOPED_TRACE("vkRegisterImageColorBufferGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkRegisterImageColorBufferGOOGLE_VkResult_return = (VkResult)0;
-    vkRegisterImageColorBufferGOOGLE_VkResult_return = vkEnc->vkRegisterImageColorBufferGOOGLE(device, image, colorBuffer);
+    vkRegisterImageColorBufferGOOGLE_VkResult_return = vkEnc->vkRegisterImageColorBufferGOOGLE(device, image, colorBuffer, true /* do lock */);
     return vkRegisterImageColorBufferGOOGLE_VkResult_return;
 }
 static VkResult entry_vkRegisterBufferColorBufferGOOGLE(
@@ -5069,7 +5069,7 @@
     AEMU_SCOPED_TRACE("vkRegisterBufferColorBufferGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkRegisterBufferColorBufferGOOGLE_VkResult_return = (VkResult)0;
-    vkRegisterBufferColorBufferGOOGLE_VkResult_return = vkEnc->vkRegisterBufferColorBufferGOOGLE(device, buffer, colorBuffer);
+    vkRegisterBufferColorBufferGOOGLE_VkResult_return = vkEnc->vkRegisterBufferColorBufferGOOGLE(device, buffer, colorBuffer, true /* do lock */);
     return vkRegisterBufferColorBufferGOOGLE_VkResult_return;
 }
 static VkResult dynCheck_entry_vkRegisterBufferColorBufferGOOGLE(
@@ -5085,7 +5085,7 @@
     AEMU_SCOPED_TRACE("vkRegisterBufferColorBufferGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkRegisterBufferColorBufferGOOGLE_VkResult_return = (VkResult)0;
-    vkRegisterBufferColorBufferGOOGLE_VkResult_return = vkEnc->vkRegisterBufferColorBufferGOOGLE(device, buffer, colorBuffer);
+    vkRegisterBufferColorBufferGOOGLE_VkResult_return = vkEnc->vkRegisterBufferColorBufferGOOGLE(device, buffer, colorBuffer, true /* do lock */);
     return vkRegisterBufferColorBufferGOOGLE_VkResult_return;
 }
 #endif
@@ -5106,7 +5106,7 @@
 {
     AEMU_SCOPED_TRACE("vkUpdateDescriptorSetWithTemplateSizedGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkUpdateDescriptorSetWithTemplateSizedGOOGLE(device, descriptorSet, descriptorUpdateTemplate, imageInfoCount, bufferInfoCount, bufferViewCount, pImageInfoEntryIndices, pBufferInfoEntryIndices, pBufferViewEntryIndices, pImageInfos, pBufferInfos, pBufferViews);
+    vkEnc->vkUpdateDescriptorSetWithTemplateSizedGOOGLE(device, descriptorSet, descriptorUpdateTemplate, imageInfoCount, bufferInfoCount, bufferViewCount, pImageInfoEntryIndices, pBufferInfoEntryIndices, pBufferViewEntryIndices, pImageInfos, pBufferInfos, pBufferViews, true /* do lock */);
 }
 static void dynCheck_entry_vkUpdateDescriptorSetWithTemplateSizedGOOGLE(
     VkDevice device,
@@ -5129,7 +5129,7 @@
     }
     AEMU_SCOPED_TRACE("vkUpdateDescriptorSetWithTemplateSizedGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkUpdateDescriptorSetWithTemplateSizedGOOGLE(device, descriptorSet, descriptorUpdateTemplate, imageInfoCount, bufferInfoCount, bufferViewCount, pImageInfoEntryIndices, pBufferInfoEntryIndices, pBufferViewEntryIndices, pImageInfos, pBufferInfos, pBufferViews);
+    vkEnc->vkUpdateDescriptorSetWithTemplateSizedGOOGLE(device, descriptorSet, descriptorUpdateTemplate, imageInfoCount, bufferInfoCount, bufferViewCount, pImageInfoEntryIndices, pBufferInfoEntryIndices, pBufferViewEntryIndices, pImageInfos, pBufferInfos, pBufferViews, true /* do lock */);
 }
 #endif
 #ifdef VK_GOOGLE_async_command_buffers
@@ -5140,7 +5140,7 @@
     AEMU_SCOPED_TRACE("vkBeginCommandBufferAsyncGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkBeginCommandBufferAsyncGOOGLE(commandBuffer, pBeginInfo);
+    vkEnc->vkBeginCommandBufferAsyncGOOGLE(commandBuffer, pBeginInfo, true /* do lock */);
 }
 static void entry_vkEndCommandBufferAsyncGOOGLE(
     VkCommandBuffer commandBuffer)
@@ -5148,7 +5148,7 @@
     AEMU_SCOPED_TRACE("vkEndCommandBufferAsyncGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkEndCommandBufferAsyncGOOGLE(commandBuffer);
+    vkEnc->vkEndCommandBufferAsyncGOOGLE(commandBuffer, true /* do lock */);
 }
 static void entry_vkResetCommandBufferAsyncGOOGLE(
     VkCommandBuffer commandBuffer,
@@ -5157,7 +5157,7 @@
     AEMU_SCOPED_TRACE("vkResetCommandBufferAsyncGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkResetCommandBufferAsyncGOOGLE(commandBuffer, flags);
+    vkEnc->vkResetCommandBufferAsyncGOOGLE(commandBuffer, flags, true /* do lock */);
 }
 static void entry_vkCommandBufferHostSyncGOOGLE(
     VkCommandBuffer commandBuffer,
@@ -5167,7 +5167,7 @@
     AEMU_SCOPED_TRACE("vkCommandBufferHostSyncGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForCommandBuffer(commandBuffer, vkEnc);
-    vkEnc->vkCommandBufferHostSyncGOOGLE(commandBuffer, needHostSync, sequenceNumber);
+    vkEnc->vkCommandBufferHostSyncGOOGLE(commandBuffer, needHostSync, sequenceNumber, true /* do lock */);
 }
 #endif
 #ifdef VK_GOOGLE_create_resources_with_requirements
@@ -5181,7 +5181,7 @@
     AEMU_SCOPED_TRACE("vkCreateImageWithRequirementsGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateImageWithRequirementsGOOGLE_VkResult_return = (VkResult)0;
-    vkCreateImageWithRequirementsGOOGLE_VkResult_return = vkEnc->vkCreateImageWithRequirementsGOOGLE(device, pCreateInfo, pAllocator, pImage, pMemoryRequirements);
+    vkCreateImageWithRequirementsGOOGLE_VkResult_return = vkEnc->vkCreateImageWithRequirementsGOOGLE(device, pCreateInfo, pAllocator, pImage, pMemoryRequirements, true /* do lock */);
     return vkCreateImageWithRequirementsGOOGLE_VkResult_return;
 }
 static VkResult dynCheck_entry_vkCreateImageWithRequirementsGOOGLE(
@@ -5199,7 +5199,7 @@
     AEMU_SCOPED_TRACE("vkCreateImageWithRequirementsGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateImageWithRequirementsGOOGLE_VkResult_return = (VkResult)0;
-    vkCreateImageWithRequirementsGOOGLE_VkResult_return = vkEnc->vkCreateImageWithRequirementsGOOGLE(device, pCreateInfo, pAllocator, pImage, pMemoryRequirements);
+    vkCreateImageWithRequirementsGOOGLE_VkResult_return = vkEnc->vkCreateImageWithRequirementsGOOGLE(device, pCreateInfo, pAllocator, pImage, pMemoryRequirements, true /* do lock */);
     return vkCreateImageWithRequirementsGOOGLE_VkResult_return;
 }
 static VkResult entry_vkCreateBufferWithRequirementsGOOGLE(
@@ -5212,7 +5212,7 @@
     AEMU_SCOPED_TRACE("vkCreateBufferWithRequirementsGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateBufferWithRequirementsGOOGLE_VkResult_return = (VkResult)0;
-    vkCreateBufferWithRequirementsGOOGLE_VkResult_return = vkEnc->vkCreateBufferWithRequirementsGOOGLE(device, pCreateInfo, pAllocator, pBuffer, pMemoryRequirements);
+    vkCreateBufferWithRequirementsGOOGLE_VkResult_return = vkEnc->vkCreateBufferWithRequirementsGOOGLE(device, pCreateInfo, pAllocator, pBuffer, pMemoryRequirements, true /* do lock */);
     return vkCreateBufferWithRequirementsGOOGLE_VkResult_return;
 }
 static VkResult dynCheck_entry_vkCreateBufferWithRequirementsGOOGLE(
@@ -5230,7 +5230,7 @@
     AEMU_SCOPED_TRACE("vkCreateBufferWithRequirementsGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkCreateBufferWithRequirementsGOOGLE_VkResult_return = (VkResult)0;
-    vkCreateBufferWithRequirementsGOOGLE_VkResult_return = vkEnc->vkCreateBufferWithRequirementsGOOGLE(device, pCreateInfo, pAllocator, pBuffer, pMemoryRequirements);
+    vkCreateBufferWithRequirementsGOOGLE_VkResult_return = vkEnc->vkCreateBufferWithRequirementsGOOGLE(device, pCreateInfo, pAllocator, pBuffer, pMemoryRequirements, true /* do lock */);
     return vkCreateBufferWithRequirementsGOOGLE_VkResult_return;
 }
 #endif
@@ -5245,7 +5245,7 @@
     AEMU_SCOPED_TRACE("vkGetMemoryHostAddressInfoGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetMemoryHostAddressInfoGOOGLE_VkResult_return = (VkResult)0;
-    vkGetMemoryHostAddressInfoGOOGLE_VkResult_return = vkEnc->vkGetMemoryHostAddressInfoGOOGLE(device, memory, pAddress, pSize, pHostmemId);
+    vkGetMemoryHostAddressInfoGOOGLE_VkResult_return = vkEnc->vkGetMemoryHostAddressInfoGOOGLE(device, memory, pAddress, pSize, pHostmemId, true /* do lock */);
     return vkGetMemoryHostAddressInfoGOOGLE_VkResult_return;
 }
 static VkResult dynCheck_entry_vkGetMemoryHostAddressInfoGOOGLE(
@@ -5263,7 +5263,7 @@
     AEMU_SCOPED_TRACE("vkGetMemoryHostAddressInfoGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkGetMemoryHostAddressInfoGOOGLE_VkResult_return = (VkResult)0;
-    vkGetMemoryHostAddressInfoGOOGLE_VkResult_return = vkEnc->vkGetMemoryHostAddressInfoGOOGLE(device, memory, pAddress, pSize, pHostmemId);
+    vkGetMemoryHostAddressInfoGOOGLE_VkResult_return = vkEnc->vkGetMemoryHostAddressInfoGOOGLE(device, memory, pAddress, pSize, pHostmemId, true /* do lock */);
     return vkGetMemoryHostAddressInfoGOOGLE_VkResult_return;
 }
 #endif
@@ -5276,7 +5276,7 @@
     AEMU_SCOPED_TRACE("vkFreeMemorySyncGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkFreeMemorySyncGOOGLE_VkResult_return = (VkResult)0;
-    vkFreeMemorySyncGOOGLE_VkResult_return = vkEnc->vkFreeMemorySyncGOOGLE(device, memory, pAllocator);
+    vkFreeMemorySyncGOOGLE_VkResult_return = vkEnc->vkFreeMemorySyncGOOGLE(device, memory, pAllocator, true /* do lock */);
     return vkFreeMemorySyncGOOGLE_VkResult_return;
 }
 static VkResult dynCheck_entry_vkFreeMemorySyncGOOGLE(
@@ -5292,7 +5292,7 @@
     AEMU_SCOPED_TRACE("vkFreeMemorySyncGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkFreeMemorySyncGOOGLE_VkResult_return = (VkResult)0;
-    vkFreeMemorySyncGOOGLE_VkResult_return = vkEnc->vkFreeMemorySyncGOOGLE(device, memory, pAllocator);
+    vkFreeMemorySyncGOOGLE_VkResult_return = vkEnc->vkFreeMemorySyncGOOGLE(device, memory, pAllocator, true /* do lock */);
     return vkFreeMemorySyncGOOGLE_VkResult_return;
 }
 #endif
@@ -5305,7 +5305,7 @@
     AEMU_SCOPED_TRACE("vkQueueHostSyncGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
-    vkEnc->vkQueueHostSyncGOOGLE(queue, needHostSync, sequenceNumber);
+    vkEnc->vkQueueHostSyncGOOGLE(queue, needHostSync, sequenceNumber, true /* do lock */);
 }
 static void entry_vkQueueSubmitAsyncGOOGLE(
     VkQueue queue,
@@ -5316,7 +5316,7 @@
     AEMU_SCOPED_TRACE("vkQueueSubmitAsyncGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
-    vkEnc->vkQueueSubmitAsyncGOOGLE(queue, submitCount, pSubmits, fence);
+    vkEnc->vkQueueSubmitAsyncGOOGLE(queue, submitCount, pSubmits, fence, true /* do lock */);
 }
 static void entry_vkQueueWaitIdleAsyncGOOGLE(
     VkQueue queue)
@@ -5324,7 +5324,7 @@
     AEMU_SCOPED_TRACE("vkQueueWaitIdleAsyncGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
-    vkEnc->vkQueueWaitIdleAsyncGOOGLE(queue);
+    vkEnc->vkQueueWaitIdleAsyncGOOGLE(queue, true /* do lock */);
 }
 static void entry_vkQueueBindSparseAsyncGOOGLE(
     VkQueue queue,
@@ -5335,7 +5335,7 @@
     AEMU_SCOPED_TRACE("vkQueueBindSparseAsyncGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
     ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
-    vkEnc->vkQueueBindSparseAsyncGOOGLE(queue, bindInfoCount, pBindInfo, fence);
+    vkEnc->vkQueueBindSparseAsyncGOOGLE(queue, bindInfoCount, pBindInfo, fence, true /* do lock */);
 }
 #endif
 #ifdef VK_GOOGLE_linear_image_layout
@@ -5347,7 +5347,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetLinearImageLayoutGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetLinearImageLayoutGOOGLE(device, format, pOffset, pRowPitchAlignment);
+    vkEnc->vkGetLinearImageLayoutGOOGLE(device, format, pOffset, pRowPitchAlignment, true /* do lock */);
 }
 static void dynCheck_entry_vkGetLinearImageLayoutGOOGLE(
     VkDevice device,
@@ -5362,7 +5362,7 @@
     }
     AEMU_SCOPED_TRACE("vkGetLinearImageLayoutGOOGLE");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetLinearImageLayoutGOOGLE(device, format, pOffset, pRowPitchAlignment);
+    vkEnc->vkGetLinearImageLayoutGOOGLE(device, format, pOffset, pRowPitchAlignment, true /* do lock */);
 }
 #endif
 #ifdef VK_MVK_moltenvk
@@ -5372,7 +5372,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetMTLDeviceMVK");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetMTLDeviceMVK(physicalDevice, pMTLDevice);
+    vkEnc->vkGetMTLDeviceMVK(physicalDevice, pMTLDevice, true /* do lock */);
 }
 static VkResult entry_vkSetMTLTextureMVK(
     VkImage image,
@@ -5381,7 +5381,7 @@
     AEMU_SCOPED_TRACE("vkSetMTLTextureMVK");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkSetMTLTextureMVK_VkResult_return = (VkResult)0;
-    vkSetMTLTextureMVK_VkResult_return = vkEnc->vkSetMTLTextureMVK(image, mtlTexture);
+    vkSetMTLTextureMVK_VkResult_return = vkEnc->vkSetMTLTextureMVK(image, mtlTexture, true /* do lock */);
     return vkSetMTLTextureMVK_VkResult_return;
 }
 static void entry_vkGetMTLTextureMVK(
@@ -5390,7 +5390,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetMTLTextureMVK");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetMTLTextureMVK(image, pMTLTexture);
+    vkEnc->vkGetMTLTextureMVK(image, pMTLTexture, true /* do lock */);
 }
 static void entry_vkGetMTLBufferMVK(
     VkBuffer buffer,
@@ -5398,7 +5398,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetMTLBufferMVK");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetMTLBufferMVK(buffer, pMTLBuffer);
+    vkEnc->vkGetMTLBufferMVK(buffer, pMTLBuffer, true /* do lock */);
 }
 static VkResult entry_vkUseIOSurfaceMVK(
     VkImage image,
@@ -5407,7 +5407,7 @@
     AEMU_SCOPED_TRACE("vkUseIOSurfaceMVK");
     auto vkEnc = HostConnection::get()->vkEncoder();
     VkResult vkUseIOSurfaceMVK_VkResult_return = (VkResult)0;
-    vkUseIOSurfaceMVK_VkResult_return = vkEnc->vkUseIOSurfaceMVK(image, ioSurface);
+    vkUseIOSurfaceMVK_VkResult_return = vkEnc->vkUseIOSurfaceMVK(image, ioSurface, true /* do lock */);
     return vkUseIOSurfaceMVK_VkResult_return;
 }
 static void entry_vkGetIOSurfaceMVK(
@@ -5416,7 +5416,7 @@
 {
     AEMU_SCOPED_TRACE("vkGetIOSurfaceMVK");
     auto vkEnc = HostConnection::get()->vkEncoder();
-    vkEnc->vkGetIOSurfaceMVK(image, pIOSurface);
+    vkEnc->vkGetIOSurfaceMVK(image, pIOSurface, true /* do lock */);
 }
 #endif
 void* goldfish_vulkan_get_proc_address(const char* name){
diff --git a/system/vulkan/goldfish_vulkan.cpp b/system/vulkan/goldfish_vulkan.cpp
index 2b0d62e..2709c4e 100644
--- a/system/vulkan/goldfish_vulkan.cpp
+++ b/system/vulkan/goldfish_vulkan.cpp
@@ -417,7 +417,7 @@
         return vkstubhal::CreateInstance(create_info, allocator, out_instance);
     }
 
-    VkResult res = vkEnc->vkCreateInstance(create_info, nullptr, out_instance);
+    VkResult res = vkEnc->vkCreateInstance(create_info, nullptr, out_instance, true /* do lock */);
 
     return res;
 }
diff --git a/system/vulkan_enc/Android.mk b/system/vulkan_enc/Android.mk
index e49aac4..df32412 100644
--- a/system/vulkan_enc/Android.mk
+++ b/system/vulkan_enc/Android.mk
@@ -54,7 +54,9 @@
     VkEncoder.cpp \
     goldfish_vk_extension_structs_guest.cpp \
     goldfish_vk_marshaling_guest.cpp \
+    goldfish_vk_reserved_marshaling_guest.cpp \
     goldfish_vk_deepcopy_guest.cpp \
+    goldfish_vk_counting_guest.cpp \
     goldfish_vk_handlemap_guest.cpp \
     goldfish_vk_transform_guest.cpp \
 
diff --git a/system/vulkan_enc/CMakeLists.txt b/system/vulkan_enc/CMakeLists.txt
index 4488658..090779a 100644
--- a/system/vulkan_enc/CMakeLists.txt
+++ b/system/vulkan_enc/CMakeLists.txt
@@ -1,9 +1,9 @@
 # This is an autogenerated file! Do not edit!
 # instead run make from .../device/generic/goldfish-opengl
 # which will re-generate this file.
-android_validate_sha256("${GOLDFISH_DEVICE_ROOT}/system/vulkan_enc/Android.mk" "103f3f10c8af73d3d5c4263c4faa5bb70ebdbfbc9ed6f068a338d57344e2aa45")
-set(vulkan_enc_src AndroidHardwareBuffer.cpp HostVisibleMemoryVirtualization.cpp Resources.cpp Validation.cpp VulkanStreamGuest.cpp VulkanHandleMapping.cpp ResourceTracker.cpp VkEncoder.cpp goldfish_vk_extension_structs_guest.cpp goldfish_vk_marshaling_guest.cpp goldfish_vk_deepcopy_guest.cpp goldfish_vk_handlemap_guest.cpp goldfish_vk_transform_guest.cpp)
-android_add_library(TARGET vulkan_enc SHARED LICENSE Apache-2.0 SRC AndroidHardwareBuffer.cpp HostVisibleMemoryVirtualization.cpp Resources.cpp Validation.cpp VulkanStreamGuest.cpp VulkanHandleMapping.cpp ResourceTracker.cpp VkEncoder.cpp goldfish_vk_extension_structs_guest.cpp goldfish_vk_marshaling_guest.cpp goldfish_vk_deepcopy_guest.cpp goldfish_vk_handlemap_guest.cpp goldfish_vk_transform_guest.cpp)
+android_validate_sha256("${GOLDFISH_DEVICE_ROOT}/system/vulkan_enc/Android.mk" "d614f9f2d2a235ea9a52abf961580d4e56a2c8fb9ce08bc63c0f1b367223695c")
+set(vulkan_enc_src AndroidHardwareBuffer.cpp HostVisibleMemoryVirtualization.cpp Resources.cpp Validation.cpp VulkanStreamGuest.cpp VulkanHandleMapping.cpp ResourceTracker.cpp VkEncoder.cpp goldfish_vk_extension_structs_guest.cpp goldfish_vk_marshaling_guest.cpp goldfish_vk_reserved_marshaling_guest.cpp goldfish_vk_deepcopy_guest.cpp goldfish_vk_counting_guest.cpp goldfish_vk_handlemap_guest.cpp goldfish_vk_transform_guest.cpp)
+android_add_library(TARGET vulkan_enc SHARED LICENSE Apache-2.0 SRC AndroidHardwareBuffer.cpp HostVisibleMemoryVirtualization.cpp Resources.cpp Validation.cpp VulkanStreamGuest.cpp VulkanHandleMapping.cpp ResourceTracker.cpp VkEncoder.cpp goldfish_vk_extension_structs_guest.cpp goldfish_vk_marshaling_guest.cpp goldfish_vk_reserved_marshaling_guest.cpp goldfish_vk_deepcopy_guest.cpp goldfish_vk_counting_guest.cpp goldfish_vk_handlemap_guest.cpp goldfish_vk_transform_guest.cpp)
 target_include_directories(vulkan_enc PRIVATE ${GOLDFISH_DEVICE_ROOT}/shared/GoldfishAddressSpace/include ${GOLDFISH_DEVICE_ROOT}/system/renderControl_enc ${GOLDFISH_DEVICE_ROOT}/shared/OpenglCodecCommon ${GOLDFISH_DEVICE_ROOT}/android-emu ${GOLDFISH_DEVICE_ROOT}/shared/qemupipe/include-types ${GOLDFISH_DEVICE_ROOT}/shared/qemupipe/include ${GOLDFISH_DEVICE_ROOT}/system/vulkan_enc ${GOLDFISH_DEVICE_ROOT}/./host/include/libOpenglRender ${GOLDFISH_DEVICE_ROOT}/./system/include ${GOLDFISH_DEVICE_ROOT}/./../../../external/qemu/android/android-emugl/guest ${GOLDFISH_DEVICE_ROOT}/./../../../external/qemu/android/android-emugl/host/include ${GOLDFISH_DEVICE_ROOT}/./../../../external/qemu/android/android-emugl/host/include/vulkan)
 target_compile_definitions(vulkan_enc PRIVATE "-DWITH_GLES2" "-DPLATFORM_SDK_VERSION=29" "-DGOLDFISH_HIDL_GRALLOC" "-DEMULATOR_OPENGL_POST_O=1" "-DHOST_BUILD" "-DANDROID" "-DGL_GLEXT_PROTOTYPES" "-DPAGE_SIZE=4096" "-DGFXSTREAM" "-DLOG_TAG=\"goldfish_vulkan\"" "-DVK_ANDROID_native_buffer" "-DVK_GOOGLE_address_space" "-DVK_USE_PLATFORM_ANDROID_KHR" "-DVK_NO_PROTOTYPES" "-D__ANDROID_API__=28")
 target_compile_options(vulkan_enc PRIVATE "-fvisibility=default" "-Wno-unused-parameter" "-Wno-missing-field-initializers" "-Werror" "-fstrict-aliasing")
diff --git a/system/vulkan_enc/HostVisibleMemoryVirtualization.cpp b/system/vulkan_enc/HostVisibleMemoryVirtualization.cpp
index 1e4768f..e66c951 100644
--- a/system/vulkan_enc/HostVisibleMemoryVirtualization.cpp
+++ b/system/vulkan_enc/HostVisibleMemoryVirtualization.cpp
@@ -283,9 +283,9 @@
 #endif
 
     if (freeMemorySyncSupported) {
-        enc->vkFreeMemorySyncGOOGLE(device, toDestroy->memory, nullptr);
+        enc->vkFreeMemorySyncGOOGLE(device, toDestroy->memory, nullptr, false /* no lock */);
     } else {
-        enc->vkFreeMemory(device, toDestroy->memory, nullptr);
+        enc->vkFreeMemory(device, toDestroy->memory, nullptr, false /* no lock */);
     }
 
     delete toDestroy->subAlloc;
diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp
index 98e3e03..f6c6d22 100644
--- a/system/vulkan_enc/ResourceTracker.cpp
+++ b/system/vulkan_enc/ResourceTracker.cpp
@@ -1033,12 +1033,12 @@
         // Only advertise a select set of extensions.
         if (mHostInstanceExtensions.empty()) {
             uint32_t hostPropCount = 0;
-            enc->vkEnumerateInstanceExtensionProperties(nullptr, &hostPropCount, nullptr);
+            enc->vkEnumerateInstanceExtensionProperties(nullptr, &hostPropCount, nullptr, true /* do lock */);
             mHostInstanceExtensions.resize(hostPropCount);
 
             VkResult hostRes =
                 enc->vkEnumerateInstanceExtensionProperties(
-                    nullptr, &hostPropCount, mHostInstanceExtensions.data());
+                    nullptr, &hostPropCount, mHostInstanceExtensions.data(), true /* do lock */);
 
             if (hostRes != VK_SUCCESS) {
                 return hostRes;
@@ -1140,12 +1140,12 @@
 
         if (mHostDeviceExtensions.empty()) {
             uint32_t hostPropCount = 0;
-            enc->vkEnumerateDeviceExtensionProperties(physdev, nullptr, &hostPropCount, nullptr);
+            enc->vkEnumerateDeviceExtensionProperties(physdev, nullptr, &hostPropCount, nullptr, true /* do lock */);
             mHostDeviceExtensions.resize(hostPropCount);
 
             VkResult hostRes =
                 enc->vkEnumerateDeviceExtensionProperties(
-                    physdev, nullptr, &hostPropCount, mHostDeviceExtensions.data());
+                    physdev, nullptr, &hostPropCount, mHostDeviceExtensions.data(), true /* do lock */);
 
             if (hostRes != VK_SUCCESS) {
                 return hostRes;
@@ -1320,7 +1320,7 @@
 
             lock.unlock();
             VkResult countRes = enc->vkEnumeratePhysicalDevices(
-                instance, &hostPhysicalDeviceCount, nullptr);
+                instance, &hostPhysicalDeviceCount, nullptr, false /* no lock */);
             lock.lock();
 
             if (countRes != VK_SUCCESS) {
@@ -1333,7 +1333,7 @@
 
             lock.unlock();
             VkResult enumRes = enc->vkEnumeratePhysicalDevices(
-                instance, &hostPhysicalDeviceCount, info.physicalDevices.data());
+                instance, &hostPhysicalDeviceCount, info.physicalDevices.data(), false /* no lock */);
             lock.lock();
 
             if (enumRes != VK_SUCCESS) {
@@ -1444,7 +1444,7 @@
 
         uint32_t apiVersion;
         VkResult enumInstanceVersionRes =
-            enc->vkEnumerateInstanceVersion(&apiVersion);
+            enc->vkEnumerateInstanceVersion(&apiVersion, false /* no lock */);
 
         setInstanceInfo(
             *pInstance,
@@ -1469,8 +1469,8 @@
 
         VkPhysicalDeviceProperties props;
         VkPhysicalDeviceMemoryProperties memProps;
-        enc->vkGetPhysicalDeviceProperties(physicalDevice, &props);
-        enc->vkGetPhysicalDeviceMemoryProperties(physicalDevice, &memProps);
+        enc->vkGetPhysicalDeviceProperties(physicalDevice, &props, false /* no lock */);
+        enc->vkGetPhysicalDeviceMemoryProperties(physicalDevice, &memProps, false /* no lock */);
 
         setDeviceInfo(
             *pDevice, physicalDevice, props, memProps,
@@ -1878,7 +1878,7 @@
                 VkImageFormatProperties format_properties;
                 auto result = enc->vkGetPhysicalDeviceImageFormatProperties(
                     deviceInfo.physdev, pImageInfo->format, pImageInfo->imageType,
-                    pImageInfo->tiling, pImageInfo->usage, pImageInfo->flags, &format_properties);
+                    pImageInfo->tiling, pImageInfo->usage, pImageInfo->flags, &format_properties, true /* do lock */);
                 if (result != VK_SUCCESS) {
                     ALOGE(
                         "%s: Image format (%u) type (%u) tiling (%u) "
@@ -1898,7 +1898,7 @@
                 // Get row alignment from host GPU.
                 VkDeviceSize offset;
                 VkDeviceSize rowPitchAlignment;
-                enc->vkGetLinearImageLayoutGOOGLE(device, format, &offset, &rowPitchAlignment);
+                enc->vkGetLinearImageLayoutGOOGLE(device, format, &offset, &rowPitchAlignment, true /* do lock */);
 
                 ALOGD("vkGetLinearImageLayoutGOOGLE: format %d offset %lu rowPitchAlignment = %lu",
                     (int)format, offset, rowPitchAlignment);
@@ -2144,7 +2144,7 @@
                     device,
                     &allocInfoForHost,
                     nullptr,
-                    &hostMemAlloc.memory);
+                    &hostMemAlloc.memory, true /* do lock */);
             mLock.lock();
 
             if (host_res != VK_SUCCESS) {
@@ -2172,7 +2172,7 @@
                 mLock.unlock();
                 directMapResult =
                     enc->vkMapMemoryIntoAddressSpaceGOOGLE(
-                            device, hostMemAlloc.memory, &directMappedAddr);
+                            device, hostMemAlloc.memory, &directMappedAddr, true /* do lock */);
                 mLock.lock();
             } else if (mFeatureInfo->hasVirtioGpuNext) {
 #if !defined(HOST_BUILD) && defined(VK_USE_PLATFORM_ANDROID_KHR)
@@ -2184,7 +2184,7 @@
                 mLock.unlock();
                 enc->vkGetMemoryHostAddressInfoGOOGLE(
                         device, hostMemAlloc.memory,
-                        &hvaSizeId[0], &hvaSizeId[1], &hvaSizeId[2]);
+                        &hvaSizeId[0], &hvaSizeId[1], &hvaSizeId[2], true /* do lock */);
                 ALOGD("%s: hvaOff, size: 0x%llx 0x%llx id: 0x%llx\n", __func__,
                         (unsigned long long)hvaSizeId[0],
                         (unsigned long long)hvaSizeId[1],
@@ -2240,7 +2240,7 @@
                 hostMemAlloc.initialized = true;
                 hostMemAlloc.initResult = directMapResult;
                 mLock.unlock();
-                enc->vkFreeMemory(device, hostMemAlloc.memory, nullptr);
+                enc->vkFreeMemory(device, hostMemAlloc.memory, nullptr, true /* do lock */);
                 mLock.lock();
                 return INVALID_HOST_MEM_BLOCK;
             }
@@ -2762,7 +2762,7 @@
                 finalAllocInfo.memoryTypeIndex)) {
             input_result =
                 enc->vkAllocateMemory(
-                    device, &finalAllocInfo, pAllocator, pMemory);
+                    device, &finalAllocInfo, pAllocator, pMemory, true /* do lock */);
 
             if (input_result != VK_SUCCESS) return input_result;
 
@@ -2790,7 +2790,7 @@
 
 #ifdef VK_USE_PLATFORM_FUCHSIA
         if (vmo_handle != ZX_HANDLE_INVALID) {
-            input_result = enc->vkAllocateMemory(device, &finalAllocInfo, pAllocator, pMemory);
+            input_result = enc->vkAllocateMemory(device, &finalAllocInfo, pAllocator, pMemory, true /* do lock */);
 
             // Get VMO handle rights, and only use allowed rights to map the
             // host memory.
@@ -2832,7 +2832,7 @@
         if (!directMappingSupported) {
             input_result =
                 enc->vkAllocateMemory(
-                    device, &finalAllocInfo, pAllocator, pMemory);
+                    device, &finalAllocInfo, pAllocator, pMemory, true /* do lock */);
 
             if (input_result != VK_SUCCESS) return input_result;
 
@@ -2935,7 +2935,7 @@
         if (!info.directMapped) {
             lock.unlock();
             VkEncoder* enc = (VkEncoder*)context;
-            enc->vkFreeMemory(device, memory, pAllocateInfo);
+            enc->vkFreeMemory(device, memory, pAllocateInfo, true /* do lock */);
             return;
         }
 
@@ -3264,9 +3264,9 @@
         VkMemoryRequirements memReqs;
 
         if (supportsCreateResourcesWithRequirements()) {
-            res = enc->vkCreateImageWithRequirementsGOOGLE(device, &localCreateInfo, pAllocator, pImage, &memReqs);
+            res = enc->vkCreateImageWithRequirementsGOOGLE(device, &localCreateInfo, pAllocator, pImage, &memReqs, true /* do lock */);
         } else {
-            res = enc->vkCreateImage(device, &localCreateInfo, pAllocator, pImage);
+            res = enc->vkCreateImage(device, &localCreateInfo, pAllocator, pImage, true /* do lock */);
         }
 
         if (res != VK_SUCCESS) return res;
@@ -3334,7 +3334,7 @@
 
         VkEncoder* enc = (VkEncoder*)context;
         VkResult res = enc->vkCreateSamplerYcbcrConversion(
-            device, &localCreateInfo, pAllocator, pYcbcrConversion);
+            device, &localCreateInfo, pAllocator, pYcbcrConversion, true /* do lock */);
 
         if (*pYcbcrConversion == VK_YCBCR_CONVERSION_DO_NOTHING) {
             ALOGE("FATAL: vkCreateSamplerYcbcrConversion returned a reserved value (VK_YCBCR_CONVERSION_DO_NOTHING)");
@@ -3350,7 +3350,7 @@
         const VkAllocationCallbacks* pAllocator) {
         VkEncoder* enc = (VkEncoder*)context;
         if (ycbcrConversion != VK_YCBCR_CONVERSION_DO_NOTHING) {
-            enc->vkDestroySamplerYcbcrConversion(device, ycbcrConversion, pAllocator);
+            enc->vkDestroySamplerYcbcrConversion(device, ycbcrConversion, pAllocator, true /* do lock */);
         }
     }
 
@@ -3384,7 +3384,7 @@
 
         VkEncoder* enc = (VkEncoder*)context;
         VkResult res = enc->vkCreateSamplerYcbcrConversionKHR(
-            device, &localCreateInfo, pAllocator, pYcbcrConversion);
+            device, &localCreateInfo, pAllocator, pYcbcrConversion, true /* do lock */);
 
         if (*pYcbcrConversion == VK_YCBCR_CONVERSION_DO_NOTHING) {
             ALOGE("FATAL: vkCreateSamplerYcbcrConversionKHR returned a reserved value (VK_YCBCR_CONVERSION_DO_NOTHING)");
@@ -3400,7 +3400,7 @@
         const VkAllocationCallbacks* pAllocator) {
         VkEncoder* enc = (VkEncoder*)context;
         if (ycbcrConversion != VK_YCBCR_CONVERSION_DO_NOTHING) {
-            enc->vkDestroySamplerYcbcrConversionKHR(device, ycbcrConversion, pAllocator);
+            enc->vkDestroySamplerYcbcrConversionKHR(device, ycbcrConversion, pAllocator, true /* do lock */);
         }
     }
 
@@ -3427,7 +3427,7 @@
 #endif
 
         VkEncoder* enc = (VkEncoder*)context;
-        return enc->vkCreateSampler(device, &localCreateInfo, pAllocator, pSampler);
+        return enc->vkCreateSampler(device, &localCreateInfo, pAllocator, pSampler, true /* do lock */);
     }
 
     void on_vkGetPhysicalDeviceExternalFenceProperties(
@@ -3490,7 +3490,7 @@
 #endif
 
         input_result = enc->vkCreateFence(
-            device, &finalCreateInfo, pAllocator, pFence);
+            device, &finalCreateInfo, pAllocator, pFence, true /* do lock */);
 
         if (input_result != VK_SUCCESS) return input_result;
 
@@ -3527,7 +3527,7 @@
         VkFence fence,
         const VkAllocationCallbacks* pAllocator) {
         VkEncoder* enc = (VkEncoder*)context;
-        enc->vkDestroyFence(device, fence, pAllocator);
+        enc->vkDestroyFence(device, fence, pAllocator, true /* do lock */);
     }
 
     VkResult on_vkResetFences(
@@ -3538,7 +3538,7 @@
         const VkFence* pFences) {
 
         VkEncoder* enc = (VkEncoder*)context;
-        VkResult res = enc->vkResetFences(device, fenceCount, pFences);
+        VkResult res = enc->vkResetFences(device, fenceCount, pFences, true /* do lock */);
 
         if (res != VK_SUCCESS) return res;
 
@@ -3655,7 +3655,7 @@
             return VK_ERROR_OUT_OF_HOST_MEMORY;
         }
 
-        VkResult currentFenceStatus = enc->vkGetFenceStatus(device, pGetFdInfo->fence);
+        VkResult currentFenceStatus = enc->vkGetFenceStatus(device, pGetFdInfo->fence, true /* do lock */);
 
         if (VK_SUCCESS == currentFenceStatus) { // Fence already signaled
             ALOGV("%s: VK_SUCCESS: already signaled\n", __func__);
@@ -3780,7 +3780,7 @@
         if (fencesExternal.empty()) {
             // No need for work pool, just wait with host driver.
             return enc->vkWaitForFences(
-                device, fenceCount, pFences, waitAll, timeout);
+                device, fenceCount, pFences, waitAll, timeout, true /* do lock */);
         } else {
             // Depending on wait any or wait all,
             // schedule a wait group with waitAny/waitAll
@@ -3803,7 +3803,7 @@
                     auto hostConn = mThreadingCallbacks.hostConnectionGetFunc();
                     auto vkEncoder = mThreadingCallbacks.vkEncoderGetFunc(hostConn);
                     ALOGV("%s: vkWaitForFences to host\n", __func__);
-                    vkEncoder->vkWaitForFences(device, fencesNonExternal.size(), fencesNonExternal.data(), waitAll, timeout);
+                    vkEncoder->vkWaitForFences(device, fencesNonExternal.size(), fencesNonExternal.data(), waitAll, timeout, true /* do lock */);
                 });
             }
 
@@ -3827,7 +3827,7 @@
         }
 #else
         return enc->vkWaitForFences(
-            device, fenceCount, pFences, waitAll, timeout);
+            device, fenceCount, pFences, waitAll, timeout, true /* do lock */);
 #endif
     }
 
@@ -3842,7 +3842,7 @@
         VkEncoder* enc = (VkEncoder*)context;
 
         VkResult res = enc->vkCreateDescriptorPool(
-            device, pCreateInfo, pAllocator, pDescriptorPool);
+            device, pCreateInfo, pAllocator, pDescriptorPool, true /* do lock */);
 
         if (res != VK_SUCCESS) return res;
 
@@ -3864,7 +3864,7 @@
 
         VkEncoder* enc = (VkEncoder*)context;
 
-        enc->vkDestroyDescriptorPool(device, descriptorPool, pAllocator);
+        enc->vkDestroyDescriptorPool(device, descriptorPool, pAllocator, true /* do lock */);
     }
 
     VkResult on_vkResetDescriptorPool(
@@ -3876,7 +3876,7 @@
 
         VkEncoder* enc = (VkEncoder*)context;
 
-        VkResult res = enc->vkResetDescriptorPool(device, descriptorPool, flags);
+        VkResult res = enc->vkResetDescriptorPool(device, descriptorPool, flags, true /* do lock */);
 
         if (res != VK_SUCCESS) return res;
 
@@ -3894,7 +3894,7 @@
 
         VkEncoder* enc = (VkEncoder*)context;
 
-        VkResult res = enc->vkAllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
+        VkResult res = enc->vkAllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets, true /* do lock */);
 
         if (res != VK_SUCCESS) return res;
 
@@ -3937,7 +3937,7 @@
         return enc->vkFreeDescriptorSets(
             device, descriptorPool,
             (uint32_t)toActuallyFree.size(),
-            toActuallyFree.data());
+            toActuallyFree.data(), true /* do lock */);
     }
 
     VkResult on_vkCreateDescriptorSetLayout(
@@ -3951,7 +3951,7 @@
         VkEncoder* enc = (VkEncoder*)context;
 
         VkResult res = enc->vkCreateDescriptorSetLayout(
-            device, pCreateInfo, pAllocator, pSetLayout);
+            device, pCreateInfo, pAllocator, pSetLayout, true /* do lock */);
 
         if (res != VK_SUCCESS) return res;
 
@@ -3995,14 +3995,14 @@
 
         enc->vkUpdateDescriptorSets(
             device, descriptorWriteCount, writesWithSuppressedSamplers.data(),
-            descriptorCopyCount, pDescriptorCopies);
+            descriptorCopyCount, pDescriptorCopies, true /* do lock */);
     }
 
     void on_vkDestroyImage(
         void* context,
         VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) {
         VkEncoder* enc = (VkEncoder*)context;
-        enc->vkDestroyImage(device, image, pAllocator);
+        enc->vkDestroyImage(device, image, pAllocator, true /* do lock */);
     }
 
     void setMemoryRequirementsForSysmemBackedImage(
@@ -4044,7 +4044,7 @@
         VkEncoder* enc = (VkEncoder*)context;
 
         enc->vkGetImageMemoryRequirements(
-            device, image, pMemoryRequirements);
+            device, image, pMemoryRequirements, true /* do lock */);
 
         lock.lock();
 
@@ -4060,7 +4060,7 @@
         VkMemoryRequirements2 *pMemoryRequirements) {
         VkEncoder* enc = (VkEncoder*)context;
         enc->vkGetImageMemoryRequirements2(
-            device, pInfo, pMemoryRequirements);
+            device, pInfo, pMemoryRequirements, true /* do lock */);
         transformImageMemoryRequirements2ForGuest(
             pInfo->image, pMemoryRequirements);
     }
@@ -4070,7 +4070,7 @@
         VkMemoryRequirements2 *pMemoryRequirements) {
         VkEncoder* enc = (VkEncoder*)context;
         enc->vkGetImageMemoryRequirements2KHR(
-            device, pInfo, pMemoryRequirements);
+            device, pInfo, pMemoryRequirements, true /* do lock */);
         transformImageMemoryRequirements2ForGuest(
             pInfo->image, pMemoryRequirements);
     }
@@ -4080,21 +4080,21 @@
         VkDevice device, VkImage image, VkDeviceMemory memory,
         VkDeviceSize memoryOffset) {
         VkEncoder* enc = (VkEncoder*)context;
-        return enc->vkBindImageMemory(device, image, memory, memoryOffset);
+        return enc->vkBindImageMemory(device, image, memory, memoryOffset, true /* do lock */);
     }
 
     VkResult on_vkBindImageMemory2(
         void* context, VkResult,
         VkDevice device, uint32_t bindingCount, const VkBindImageMemoryInfo* pBindInfos) {
         VkEncoder* enc = (VkEncoder*)context;
-        return enc->vkBindImageMemory2(device, bindingCount, pBindInfos);
+        return enc->vkBindImageMemory2(device, bindingCount, pBindInfos, true /* do lock */);
     }
 
     VkResult on_vkBindImageMemory2KHR(
         void* context, VkResult,
         VkDevice device, uint32_t bindingCount, const VkBindImageMemoryInfo* pBindInfos) {
         VkEncoder* enc = (VkEncoder*)context;
-        return enc->vkBindImageMemory2KHR(device, bindingCount, pBindInfos);
+        return enc->vkBindImageMemory2KHR(device, bindingCount, pBindInfos, true /* do lock */);
     }
 
     VkResult on_vkCreateBuffer(
@@ -4165,9 +4165,9 @@
         VkMemoryRequirements memReqs;
 
         if (supportsCreateResourcesWithRequirements()) {
-            res = enc->vkCreateBufferWithRequirementsGOOGLE(device, pCreateInfo, pAllocator, pBuffer, &memReqs);
+            res = enc->vkCreateBufferWithRequirementsGOOGLE(device, pCreateInfo, pAllocator, pBuffer, &memReqs, true /* do lock */);
         } else {
-            res = enc->vkCreateBuffer(device, pCreateInfo, pAllocator, pBuffer);
+            res = enc->vkCreateBuffer(device, pCreateInfo, pAllocator, pBuffer, true /* do lock */);
         }
 
         if (res != VK_SUCCESS) return res;
@@ -4212,7 +4212,7 @@
         void* context,
         VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
         VkEncoder* enc = (VkEncoder*)context;
-        enc->vkDestroyBuffer(device, buffer, pAllocator);
+        enc->vkDestroyBuffer(device, buffer, pAllocator, true /* do lock */);
     }
 
     void on_vkGetBufferMemoryRequirements(
@@ -4234,7 +4234,7 @@
 
         VkEncoder* enc = (VkEncoder*)context;
         enc->vkGetBufferMemoryRequirements(
-            device, buffer, pMemoryRequirements);
+            device, buffer, pMemoryRequirements, true /* do lock */);
 
         lock.lock();
 
@@ -4248,7 +4248,7 @@
         void* context, VkDevice device, const VkBufferMemoryRequirementsInfo2* pInfo,
         VkMemoryRequirements2* pMemoryRequirements) {
         VkEncoder* enc = (VkEncoder*)context;
-        enc->vkGetBufferMemoryRequirements2(device, pInfo, pMemoryRequirements);
+        enc->vkGetBufferMemoryRequirements2(device, pInfo, pMemoryRequirements, true /* do lock */);
         transformBufferMemoryRequirements2ForGuest(
             pInfo->buffer, pMemoryRequirements);
     }
@@ -4257,7 +4257,7 @@
         void* context, VkDevice device, const VkBufferMemoryRequirementsInfo2* pInfo,
         VkMemoryRequirements2* pMemoryRequirements) {
         VkEncoder* enc = (VkEncoder*)context;
-        enc->vkGetBufferMemoryRequirements2KHR(device, pInfo, pMemoryRequirements);
+        enc->vkGetBufferMemoryRequirements2KHR(device, pInfo, pMemoryRequirements, true /* do lock */);
         transformBufferMemoryRequirements2ForGuest(
             pInfo->buffer, pMemoryRequirements);
     }
@@ -4267,7 +4267,7 @@
         VkDevice device, VkBuffer buffer, VkDeviceMemory memory, VkDeviceSize memoryOffset) {
         VkEncoder *enc = (VkEncoder *)context;
         return enc->vkBindBufferMemory(
-            device, buffer, memory, memoryOffset);
+            device, buffer, memory, memoryOffset, true /* do lock */);
     }
 
     VkResult on_vkBindBufferMemory2(
@@ -4275,7 +4275,7 @@
         VkDevice device, uint32_t bindInfoCount, const VkBindBufferMemoryInfo *pBindInfos) {
         VkEncoder *enc = (VkEncoder *)context;
         return enc->vkBindBufferMemory2(
-            device, bindInfoCount, pBindInfos);
+            device, bindInfoCount, pBindInfos, true /* do lock */);
     }
 
     VkResult on_vkBindBufferMemory2KHR(
@@ -4283,7 +4283,7 @@
         VkDevice device, uint32_t bindInfoCount, const VkBindBufferMemoryInfo *pBindInfos) {
         VkEncoder *enc = (VkEncoder *)context;
         return enc->vkBindBufferMemory2KHR(
-            device, bindInfoCount, pBindInfos);
+            device, bindInfoCount, pBindInfos, true /* do lock */);
     }
 
     void ensureSyncDeviceFd() {
@@ -4331,7 +4331,7 @@
         }
 #endif
         input_result = enc->vkCreateSemaphore(
-            device, &finalCreateInfo, pAllocator, pSemaphore);
+            device, &finalCreateInfo, pAllocator, pSemaphore, true /* do lock */);
 
         zx_handle_t event_handle = ZX_HANDLE_INVALID;
 
@@ -4417,7 +4417,7 @@
         void* context,
         VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) {
         VkEncoder* enc = (VkEncoder*)context;
-        enc->vkDestroySemaphore(device, semaphore, pAllocator);
+        enc->vkDestroySemaphore(device, semaphore, pAllocator, true /* do lock */);
     }
 
     // https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#vkGetSemaphoreFdKHR
@@ -4443,7 +4443,7 @@
         } else {
             // opaque fd
             int hostFd = 0;
-            VkResult result = enc->vkGetSemaphoreFdKHR(device, pGetFdInfo, &hostFd);
+            VkResult result = enc->vkGetSemaphoreFdKHR(device, pGetFdInfo, &hostFd, true /* do lock */);
             if (result != VK_SUCCESS) {
                 return result;
             }
@@ -4496,7 +4496,7 @@
             read(fd, &hostFd, sizeof(hostFd));
             VkImportSemaphoreFdInfoKHR tmpInfo = *pImportSemaphoreFdInfo;
             tmpInfo.fd = hostFd;
-            VkResult result = enc->vkImportSemaphoreFdKHR(device, &tmpInfo);
+            VkResult result = enc->vkImportSemaphoreFdKHR(device, &tmpInfo, true /* do lock */);
             close(fd);
             return result;
         }
@@ -4576,10 +4576,10 @@
 
         if (pre_signal_semaphores.empty()) {
             if (supportsAsyncQueueSubmit()) {
-                enc->vkQueueSubmitAsyncGOOGLE(queue, submitCount, pSubmits, fence);
+                enc->vkQueueSubmitAsyncGOOGLE(queue, submitCount, pSubmits, fence, true /* do lock */);
                 input_result = VK_SUCCESS;
             } else {
-                input_result = enc->vkQueueSubmit(queue, submitCount, pSubmits, fence);
+                input_result = enc->vkQueueSubmit(queue, submitCount, pSubmits, fence, true /* do lock */);
                 if (input_result != VK_SUCCESS) return input_result;
             }
         } else {
@@ -4619,16 +4619,16 @@
                 .pSignalSemaphores = pre_signal_semaphores.data()};
 
             if (supportsAsyncQueueSubmit()) {
-                enc->vkQueueSubmitAsyncGOOGLE(queue, 1, &submit_info, VK_NULL_HANDLE);
+                enc->vkQueueSubmitAsyncGOOGLE(queue, 1, &submit_info, VK_NULL_HANDLE, true /* do lock */);
             } else {
-                enc->vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
+                enc->vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE, true /* do lock */);
             }
 
             if (supportsAsyncQueueSubmit()) {
-                enc->vkQueueSubmitAsyncGOOGLE(queue, submitCount, pSubmits, fence);
+                enc->vkQueueSubmitAsyncGOOGLE(queue, submitCount, pSubmits, fence, true /* do lock */);
                 input_result = VK_SUCCESS;
             } else {
-                input_result = enc->vkQueueSubmit(queue, submitCount, pSubmits, fence);
+                input_result = enc->vkQueueSubmit(queue, submitCount, pSubmits, fence, true /* do lock */);
                 if (input_result != VK_SUCCESS) return input_result;
             }
         }
@@ -4658,7 +4658,7 @@
                              post_wait_sync_fds /* copy of sync fds */] {
                 auto hostConn = mThreadingCallbacks.hostConnectionGetFunc();
                 auto vkEncoder = mThreadingCallbacks.vkEncoderGetFunc(hostConn);
-                auto waitIdleRes = vkEncoder->vkQueueWaitIdle(queue);
+                auto waitIdleRes = vkEncoder->vkQueueWaitIdle(queue, true /* do lock */);
 #ifdef VK_USE_PLATFORM_FUCHSIA
                 AEMU_SCOPED_TRACE("on_vkQueueSubmit::SignalSemaphores");
                 (void)externalFenceFdToSignal;
@@ -4705,7 +4705,7 @@
 
         if (toWait.empty()) {
             ALOGV("%s: No queue-specific work pool items\n", __func__);
-            return enc->vkQueueWaitIdle(queue);
+            return enc->vkQueueWaitIdle(queue, true /* do lock */);
         }
 
         for (auto handle : toWait) {
@@ -4715,7 +4715,7 @@
         }
 
         // now done waiting, get the host's opinion
-        return enc->vkQueueWaitIdle(queue);
+        return enc->vkQueueWaitIdle(queue, true /* do lock */);
     }
 
     void unwrap_VkNativeBufferANDROID(
@@ -5024,7 +5024,7 @@
             info.bufferViewEntryIndices.data(),
             info.imageInfos.data(),
             info.bufferInfos.data(),
-            info.bufferViews.data());
+            info.bufferViews.data(), true /* do lock */);
     }
 
     VkResult on_vkGetPhysicalDeviceImageFormatProperties2_common(
@@ -5088,11 +5088,11 @@
         if (isKhr) {
             hostRes = enc->vkGetPhysicalDeviceImageFormatProperties2KHR(
                 physicalDevice, pImageFormatInfo,
-                pImageFormatProperties);
+                pImageFormatProperties, true /* do lock */);
         } else {
             hostRes = enc->vkGetPhysicalDeviceImageFormatProperties2(
                 physicalDevice, pImageFormatInfo,
-                pImageFormatProperties);
+                pImageFormatProperties, true /* do lock */);
         }
 
         if (hostRes != VK_SUCCESS) return hostRes;
@@ -5167,21 +5167,21 @@
         struct goldfish_VkCommandBuffer* cb = as_goldfish_VkCommandBuffer(commandBuffer);
         if (!cb) return 0;
 
-        currentEncoder->incRef();
-
         auto lastEncoder = cb->lastUsedEncoder;
 
+        if (lastEncoder == currentEncoder) return 0;
+
+        currentEncoder->incRef();
+
         cb->lastUsedEncoder = currentEncoder;
 
         if (!lastEncoder) return 0;
 
-        if (lastEncoder != currentEncoder) {
-            auto oldSeq = cb->sequenceNumber;
-            cb->sequenceNumber += 2;
-            lastEncoder->vkCommandBufferHostSyncGOOGLE(commandBuffer, false, oldSeq + 1);
-            lastEncoder->flush();
-            currentEncoder->vkCommandBufferHostSyncGOOGLE(commandBuffer, true, oldSeq + 2);
-        }
+        auto oldSeq = cb->sequenceNumber;
+        cb->sequenceNumber += 2;
+        lastEncoder->vkCommandBufferHostSyncGOOGLE(commandBuffer, false, oldSeq + 1, true /* do lock */);
+        lastEncoder->flush();
+        currentEncoder->vkCommandBufferHostSyncGOOGLE(commandBuffer, true, oldSeq + 2, true /* do lock */);
 
         if (lastEncoder->decRef()) {
             cb->lastUsedEncoder = nullptr;
@@ -5197,21 +5197,21 @@
         struct goldfish_VkQueue* q = as_goldfish_VkQueue(queue);
         if (!q) return 0;
 
-        currentEncoder->incRef();
-
         auto lastEncoder = q->lastUsedEncoder;
 
+        if (lastEncoder == currentEncoder) return 0;
+
+        currentEncoder->incRef();
+
         q->lastUsedEncoder = currentEncoder;
 
         if (!lastEncoder) return 0;
 
-        if (lastEncoder != currentEncoder) {
-            auto oldSeq = q->sequenceNumber;
-            q->sequenceNumber += 2;
-            lastEncoder->vkQueueHostSyncGOOGLE(queue, false, oldSeq + 1);
-            lastEncoder->flush();
-            currentEncoder->vkQueueHostSyncGOOGLE(queue, true, oldSeq + 2);
-        }
+        auto oldSeq = q->sequenceNumber;
+        q->sequenceNumber += 2;
+        lastEncoder->vkQueueHostSyncGOOGLE(queue, false, oldSeq + 1, true /* do lock */);
+        lastEncoder->flush();
+        currentEncoder->vkQueueHostSyncGOOGLE(queue, true, oldSeq + 2, true /* do lock */);
 
         if (lastEncoder->decRef()) {
             q->lastUsedEncoder = nullptr;
@@ -5229,10 +5229,10 @@
         (void)input_result;
 
         if (!supportsDeferredCommands()) {
-            return enc->vkBeginCommandBuffer(commandBuffer, pBeginInfo);
+            return enc->vkBeginCommandBuffer(commandBuffer, pBeginInfo, true /* do lock */);
         }
 
-        enc->vkBeginCommandBufferAsyncGOOGLE(commandBuffer, pBeginInfo);
+        enc->vkBeginCommandBufferAsyncGOOGLE(commandBuffer, pBeginInfo, true /* do lock */);
 
         return VK_SUCCESS;
     }
@@ -5245,10 +5245,10 @@
         (void)input_result;
 
         if (!supportsDeferredCommands()) {
-            return enc->vkEndCommandBuffer(commandBuffer);
+            return enc->vkEndCommandBuffer(commandBuffer, true /* do lock */);
         }
 
-        enc->vkEndCommandBufferAsyncGOOGLE(commandBuffer);
+        enc->vkEndCommandBufferAsyncGOOGLE(commandBuffer, true /* do lock */);
 
         return VK_SUCCESS;
     }
@@ -5262,10 +5262,10 @@
         (void)input_result;
 
         if (!supportsDeferredCommands()) {
-            return enc->vkResetCommandBuffer(commandBuffer, flags);
+            return enc->vkResetCommandBuffer(commandBuffer, flags, true /* do lock */);
         }
 
-        enc->vkResetCommandBufferAsyncGOOGLE(commandBuffer, flags);
+        enc->vkResetCommandBufferAsyncGOOGLE(commandBuffer, flags, true /* do lock */);
         return VK_SUCCESS;
     }
 
@@ -5292,7 +5292,7 @@
         }
 #endif
 
-        return enc->vkCreateImageView(device, &localCreateInfo, pAllocator, pView);
+        return enc->vkCreateImageView(device, &localCreateInfo, pAllocator, pView, true /* do lock */);
     }
 
     uint32_t getApiVersionFromInstance(VkInstance instance) const {
diff --git a/system/vulkan_enc/VkEncoder.cpp b/system/vulkan_enc/VkEncoder.cpp
index e90a931..cd7f920 100644
--- a/system/vulkan_enc/VkEncoder.cpp
+++ b/system/vulkan_enc/VkEncoder.cpp
@@ -38,7 +38,9 @@
 #include <cutils/properties.h>
 
 #include "goldfish_vk_marshaling_guest.h"
+#include "goldfish_vk_reserved_marshaling_guest.h"
 #include "goldfish_vk_deepcopy_guest.h"
+#include "goldfish_vk_counting_guest.h"
 #include "goldfish_vk_handlemap_guest.h"
 #include "goldfish_vk_private_defs.h"
 #include "goldfish_vk_transform_guest.h"
@@ -73,17 +75,17 @@
 VkResult VkEncoder::vkCreateInstance(
     const VkInstanceCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkInstance* pInstance)
+    VkInstance* pInstance,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateInstance");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkInstanceCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
     {
@@ -96,6 +98,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -105,66 +108,77 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        marshal_VkInstanceCreateInfo(countingStream, (VkInstanceCreateInfo*)(local_pCreateInfo));
+        count_VkInstanceCreateInfo(featureBits, (VkInstanceCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_0 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_0);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_1;
-        countingStream->handleMapping()->mapHandles_VkInstance_u64(pInstance, &cgen_var_1, 1);
-        countingStream->write((uint64_t*)&cgen_var_1, 8);
+        uint64_t cgen_var_0;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateInstance = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateInstance = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateInstance);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateInstance = OP_vkCreateInstance;
-    stream->write(&opcode_vkCreateInstance, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateInstance, sizeof(uint32_t));
-    marshal_VkInstanceCreateInfo(stream, (VkInstanceCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateInstance, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateInstance, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    reservedmarshal_VkInstanceCreateInfo(stream, (VkInstanceCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_2);
+    uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_1, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_3;
-    stream->handleMapping()->mapHandles_VkInstance_u64(pInstance, &cgen_var_3, 1);
-    stream->write((uint64_t*)&cgen_var_3, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_2;
+    *&cgen_var_2 = (uint64_t)((*pInstance));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_4;
-    stream->read((uint64_t*)&cgen_var_4, 8);
-    stream->handleMapping()->mapHandles_u64_VkInstance(&cgen_var_4, (VkInstance*)pInstance, 1);
+    uint64_t cgen_var_3;
+    stream->read((uint64_t*)&cgen_var_3, 8);
+    stream->handleMapping()->mapHandles_u64_VkInstance(&cgen_var_3, (VkInstance*)pInstance, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateInstance_VkResult_return = (VkResult)0;
     stream->read(&vkCreateInstance_VkResult_return, sizeof(VkResult));
     mImpl->resources()->on_vkCreateInstance(this, vkCreateInstance_VkResult_return, pCreateInfo, pAllocator, pInstance);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateInstance");;
     return vkCreateInstance_VkResult_return;
 }
 
 void VkEncoder::vkDestroyInstance(
     VkInstance instance,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyInstance");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkInstance local_instance;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_instance = instance;
     local_pAllocator = nullptr;
     if (pAllocator)
@@ -172,116 +186,139 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_5;
-        countingStream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_5, 1);
-        countingStream->write((uint64_t*)&cgen_var_5, 1 * 8);
+        uint64_t cgen_var_4;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_6 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_6);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyInstance = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyInstance = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyInstance);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyInstance = OP_vkDestroyInstance;
-    stream->write(&opcode_vkDestroyInstance, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyInstance, sizeof(uint32_t));
-    uint64_t cgen_var_7;
-    stream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_7, 1);
-    stream->write((uint64_t*)&cgen_var_7, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyInstance, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyInstance, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_5;
+    *&cgen_var_5 = get_host_u64_VkInstance((*&local_instance));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_5, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_8 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_8);
+    uint64_t cgen_var_6 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_6, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkInstance((VkInstance*)&instance);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyInstance");;
 }
 
 VkResult VkEncoder::vkEnumeratePhysicalDevices(
     VkInstance instance,
     uint32_t* pPhysicalDeviceCount,
-    VkPhysicalDevice* pPhysicalDevices)
+    VkPhysicalDevice* pPhysicalDevices,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkEnumeratePhysicalDevices");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkInstance local_instance;
+    uint32_t local_doLock;
     local_instance = instance;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_9;
-        countingStream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_9, 1);
-        countingStream->write((uint64_t*)&cgen_var_9, 1 * 8);
+        uint64_t cgen_var_7;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_10 = (uint64_t)(uintptr_t)pPhysicalDeviceCount;
-        countingStream->putBe64(cgen_var_10);
+        *countPtr += 8;
         if (pPhysicalDeviceCount)
         {
-            countingStream->write((uint32_t*)pPhysicalDeviceCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_11 = (uint64_t)(uintptr_t)pPhysicalDevices;
-        countingStream->putBe64(cgen_var_11);
+        *countPtr += 8;
         if (pPhysicalDevices)
         {
             if ((*(pPhysicalDeviceCount)))
             {
-                uint64_t* cgen_var_12;
-                countingStream->alloc((void**)&cgen_var_12, (*(pPhysicalDeviceCount)) * 8);
-                countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(pPhysicalDevices, cgen_var_12, (*(pPhysicalDeviceCount)));
-                countingStream->write((uint64_t*)cgen_var_12, (*(pPhysicalDeviceCount)) * 8);
+                *countPtr += (*(pPhysicalDeviceCount)) * 8;
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkEnumeratePhysicalDevices = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkEnumeratePhysicalDevices = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkEnumeratePhysicalDevices);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkEnumeratePhysicalDevices = OP_vkEnumeratePhysicalDevices;
-    stream->write(&opcode_vkEnumeratePhysicalDevices, sizeof(uint32_t));
-    stream->write(&packetSize_vkEnumeratePhysicalDevices, sizeof(uint32_t));
-    uint64_t cgen_var_13;
-    stream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_13, 1);
-    stream->write((uint64_t*)&cgen_var_13, 1 * 8);
+    memcpy(streamPtr, &opcode_vkEnumeratePhysicalDevices, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkEnumeratePhysicalDevices, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_9;
+    *&cgen_var_9 = get_host_u64_VkInstance((*&local_instance));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_9, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_14 = (uint64_t)(uintptr_t)pPhysicalDeviceCount;
-    stream->putBe64(cgen_var_14);
+    uint64_t cgen_var_10 = (uint64_t)(uintptr_t)pPhysicalDeviceCount;
+    memcpy((*streamPtrPtr), &cgen_var_10, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pPhysicalDeviceCount)
     {
-        stream->write((uint32_t*)pPhysicalDeviceCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pPhysicalDeviceCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
+    /* is handle, possibly out */;
     // WARNING PTR CHECK
-    uint64_t cgen_var_15 = (uint64_t)(uintptr_t)pPhysicalDevices;
-    stream->putBe64(cgen_var_15);
+    uint64_t cgen_var_11 = (uint64_t)(uintptr_t)pPhysicalDevices;
+    memcpy((*streamPtrPtr), &cgen_var_11, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pPhysicalDevices)
     {
         if ((*(pPhysicalDeviceCount)))
         {
-            uint64_t* cgen_var_16;
-            stream->alloc((void**)&cgen_var_16, (*(pPhysicalDeviceCount)) * 8);
-            stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(pPhysicalDevices, cgen_var_16, (*(pPhysicalDeviceCount)));
-            stream->write((uint64_t*)cgen_var_16, (*(pPhysicalDeviceCount)) * 8);
+            uint64_t* cgen_var_12;
+            stream->alloc((void**)&cgen_var_12, (*(pPhysicalDeviceCount)) * 8);
+            for (uint32_t k = 0; k < (*(pPhysicalDeviceCount)); ++k)
+            {
+                cgen_var_12[k] = (uint64_t)(pPhysicalDevices[k]);
+            }
+            memcpy(*streamPtrPtr, (uint64_t*)cgen_var_12, (*(pPhysicalDeviceCount)) * 8);
+            *streamPtrPtr += (*(pPhysicalDeviceCount)) * 8;
         }
     }
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pPhysicalDeviceCount;
     check_pPhysicalDeviceCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -305,104 +342,131 @@
         }
         if ((*(pPhysicalDeviceCount)))
         {
-            uint64_t* cgen_var_19;
-            stream->alloc((void**)&cgen_var_19, (*(pPhysicalDeviceCount)) * 8);
-            stream->read((uint64_t*)cgen_var_19, (*(pPhysicalDeviceCount)) * 8);
-            stream->handleMapping()->mapHandles_u64_VkPhysicalDevice(cgen_var_19, (VkPhysicalDevice*)pPhysicalDevices, (*(pPhysicalDeviceCount)));
+            uint64_t* cgen_var_15;
+            stream->alloc((void**)&cgen_var_15, (*(pPhysicalDeviceCount)) * 8);
+            stream->read((uint64_t*)cgen_var_15, (*(pPhysicalDeviceCount)) * 8);
+            stream->handleMapping()->mapHandles_u64_VkPhysicalDevice(cgen_var_15, (VkPhysicalDevice*)pPhysicalDevices, (*(pPhysicalDeviceCount)));
         }
     }
     stream->unsetHandleMapping();
     VkResult vkEnumeratePhysicalDevices_VkResult_return = (VkResult)0;
     stream->read(&vkEnumeratePhysicalDevices_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkEnumeratePhysicalDevices");;
     return vkEnumeratePhysicalDevices_VkResult_return;
 }
 
 void VkEncoder::vkGetPhysicalDeviceFeatures(
     VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceFeatures* pFeatures)
+    VkPhysicalDeviceFeatures* pFeatures,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceFeatures");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_20;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_20, 1);
-        countingStream->write((uint64_t*)&cgen_var_20, 1 * 8);
-        marshal_VkPhysicalDeviceFeatures(countingStream, (VkPhysicalDeviceFeatures*)(pFeatures));
+        uint64_t cgen_var_16;
+        *countPtr += 1 * 8;
+        count_VkPhysicalDeviceFeatures(featureBits, (VkPhysicalDeviceFeatures*)(pFeatures), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceFeatures = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceFeatures = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceFeatures);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceFeatures = OP_vkGetPhysicalDeviceFeatures;
-    stream->write(&opcode_vkGetPhysicalDeviceFeatures, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceFeatures, sizeof(uint32_t));
-    uint64_t cgen_var_21;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_21, 1);
-    stream->write((uint64_t*)&cgen_var_21, 1 * 8);
-    marshal_VkPhysicalDeviceFeatures(stream, (VkPhysicalDeviceFeatures*)(pFeatures));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceFeatures, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceFeatures, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_17;
+    *&cgen_var_17 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_17, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPhysicalDeviceFeatures(stream, (VkPhysicalDeviceFeatures*)(pFeatures), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkPhysicalDeviceFeatures(stream, (VkPhysicalDeviceFeatures*)(pFeatures));
     if (pFeatures)
     {
         transform_fromhost_VkPhysicalDeviceFeatures(mImpl->resources(), (VkPhysicalDeviceFeatures*)(pFeatures));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceFeatures");;
 }
 
 void VkEncoder::vkGetPhysicalDeviceFormatProperties(
     VkPhysicalDevice physicalDevice,
     VkFormat format,
-    VkFormatProperties* pFormatProperties)
+    VkFormatProperties* pFormatProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceFormatProperties");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkFormat local_format;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_format = format;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_22;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_22, 1);
-        countingStream->write((uint64_t*)&cgen_var_22, 1 * 8);
-        countingStream->write((VkFormat*)&local_format, sizeof(VkFormat));
-        marshal_VkFormatProperties(countingStream, (VkFormatProperties*)(pFormatProperties));
+        uint64_t cgen_var_18;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkFormat);
+        count_VkFormatProperties(featureBits, (VkFormatProperties*)(pFormatProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceFormatProperties = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceFormatProperties = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceFormatProperties);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceFormatProperties = OP_vkGetPhysicalDeviceFormatProperties;
-    stream->write(&opcode_vkGetPhysicalDeviceFormatProperties, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceFormatProperties, sizeof(uint32_t));
-    uint64_t cgen_var_23;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_23, 1);
-    stream->write((uint64_t*)&cgen_var_23, 1 * 8);
-    stream->write((VkFormat*)&local_format, sizeof(VkFormat));
-    marshal_VkFormatProperties(stream, (VkFormatProperties*)(pFormatProperties));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceFormatProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceFormatProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_19;
+    *&cgen_var_19 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_19, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkFormat*)&local_format, sizeof(VkFormat));
+    *streamPtrPtr += sizeof(VkFormat);
+    reservedmarshal_VkFormatProperties(stream, (VkFormatProperties*)(pFormatProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkFormatProperties(stream, (VkFormatProperties*)(pFormatProperties));
     if (pFormatProperties)
     {
         transform_fromhost_VkFormatProperties(mImpl->resources(), (VkFormatProperties*)(pFormatProperties));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceFormatProperties");;
 }
 
@@ -413,53 +477,65 @@
     VkImageTiling tiling,
     VkImageUsageFlags usage,
     VkImageCreateFlags flags,
-    VkImageFormatProperties* pImageFormatProperties)
+    VkImageFormatProperties* pImageFormatProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceImageFormatProperties");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkFormat local_format;
     VkImageType local_type;
     VkImageTiling local_tiling;
     VkImageUsageFlags local_usage;
     VkImageCreateFlags local_flags;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_format = format;
     local_type = type;
     local_tiling = tiling;
     local_usage = usage;
     local_flags = flags;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_24;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_24, 1);
-        countingStream->write((uint64_t*)&cgen_var_24, 1 * 8);
-        countingStream->write((VkFormat*)&local_format, sizeof(VkFormat));
-        countingStream->write((VkImageType*)&local_type, sizeof(VkImageType));
-        countingStream->write((VkImageTiling*)&local_tiling, sizeof(VkImageTiling));
-        countingStream->write((VkImageUsageFlags*)&local_usage, sizeof(VkImageUsageFlags));
-        countingStream->write((VkImageCreateFlags*)&local_flags, sizeof(VkImageCreateFlags));
-        marshal_VkImageFormatProperties(countingStream, (VkImageFormatProperties*)(pImageFormatProperties));
+        uint64_t cgen_var_20;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkFormat);
+        *countPtr += sizeof(VkImageType);
+        *countPtr += sizeof(VkImageTiling);
+        *countPtr += sizeof(VkImageUsageFlags);
+        *countPtr += sizeof(VkImageCreateFlags);
+        count_VkImageFormatProperties(featureBits, (VkImageFormatProperties*)(pImageFormatProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceImageFormatProperties = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceImageFormatProperties = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceImageFormatProperties);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceImageFormatProperties = OP_vkGetPhysicalDeviceImageFormatProperties;
-    stream->write(&opcode_vkGetPhysicalDeviceImageFormatProperties, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceImageFormatProperties, sizeof(uint32_t));
-    uint64_t cgen_var_25;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_25, 1);
-    stream->write((uint64_t*)&cgen_var_25, 1 * 8);
-    stream->write((VkFormat*)&local_format, sizeof(VkFormat));
-    stream->write((VkImageType*)&local_type, sizeof(VkImageType));
-    stream->write((VkImageTiling*)&local_tiling, sizeof(VkImageTiling));
-    stream->write((VkImageUsageFlags*)&local_usage, sizeof(VkImageUsageFlags));
-    stream->write((VkImageCreateFlags*)&local_flags, sizeof(VkImageCreateFlags));
-    marshal_VkImageFormatProperties(stream, (VkImageFormatProperties*)(pImageFormatProperties));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceImageFormatProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceImageFormatProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_21;
+    *&cgen_var_21 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_21, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkFormat*)&local_format, sizeof(VkFormat));
+    *streamPtrPtr += sizeof(VkFormat);
+    memcpy(*streamPtrPtr, (VkImageType*)&local_type, sizeof(VkImageType));
+    *streamPtrPtr += sizeof(VkImageType);
+    memcpy(*streamPtrPtr, (VkImageTiling*)&local_tiling, sizeof(VkImageTiling));
+    *streamPtrPtr += sizeof(VkImageTiling);
+    memcpy(*streamPtrPtr, (VkImageUsageFlags*)&local_usage, sizeof(VkImageUsageFlags));
+    *streamPtrPtr += sizeof(VkImageUsageFlags);
+    memcpy(*streamPtrPtr, (VkImageCreateFlags*)&local_flags, sizeof(VkImageCreateFlags));
+    *streamPtrPtr += sizeof(VkImageCreateFlags);
+    reservedmarshal_VkImageFormatProperties(stream, (VkImageFormatProperties*)(pImageFormatProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkImageFormatProperties(stream, (VkImageFormatProperties*)(pImageFormatProperties));
     if (pImageFormatProperties)
     {
@@ -467,116 +543,141 @@
     }
     VkResult vkGetPhysicalDeviceImageFormatProperties_VkResult_return = (VkResult)0;
     stream->read(&vkGetPhysicalDeviceImageFormatProperties_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceImageFormatProperties");;
     return vkGetPhysicalDeviceImageFormatProperties_VkResult_return;
 }
 
 void VkEncoder::vkGetPhysicalDeviceProperties(
     VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceProperties* pProperties)
+    VkPhysicalDeviceProperties* pProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceProperties");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_26;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_26, 1);
-        countingStream->write((uint64_t*)&cgen_var_26, 1 * 8);
-        marshal_VkPhysicalDeviceProperties(countingStream, (VkPhysicalDeviceProperties*)(pProperties));
+        uint64_t cgen_var_22;
+        *countPtr += 1 * 8;
+        count_VkPhysicalDeviceProperties(featureBits, (VkPhysicalDeviceProperties*)(pProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceProperties = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceProperties = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceProperties);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceProperties = OP_vkGetPhysicalDeviceProperties;
-    stream->write(&opcode_vkGetPhysicalDeviceProperties, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceProperties, sizeof(uint32_t));
-    uint64_t cgen_var_27;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_27, 1);
-    stream->write((uint64_t*)&cgen_var_27, 1 * 8);
-    marshal_VkPhysicalDeviceProperties(stream, (VkPhysicalDeviceProperties*)(pProperties));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_23;
+    *&cgen_var_23 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_23, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPhysicalDeviceProperties(stream, (VkPhysicalDeviceProperties*)(pProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkPhysicalDeviceProperties(stream, (VkPhysicalDeviceProperties*)(pProperties));
     if (pProperties)
     {
         transform_fromhost_VkPhysicalDeviceProperties(mImpl->resources(), (VkPhysicalDeviceProperties*)(pProperties));
     }
     mImpl->resources()->on_vkGetPhysicalDeviceProperties(this, physicalDevice, pProperties);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceProperties");;
 }
 
 void VkEncoder::vkGetPhysicalDeviceQueueFamilyProperties(
     VkPhysicalDevice physicalDevice,
     uint32_t* pQueueFamilyPropertyCount,
-    VkQueueFamilyProperties* pQueueFamilyProperties)
+    VkQueueFamilyProperties* pQueueFamilyProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceQueueFamilyProperties");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_28;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_28, 1);
-        countingStream->write((uint64_t*)&cgen_var_28, 1 * 8);
+        uint64_t cgen_var_24;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_29 = (uint64_t)(uintptr_t)pQueueFamilyPropertyCount;
-        countingStream->putBe64(cgen_var_29);
+        *countPtr += 8;
         if (pQueueFamilyPropertyCount)
         {
-            countingStream->write((uint32_t*)pQueueFamilyPropertyCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_30 = (uint64_t)(uintptr_t)pQueueFamilyProperties;
-        countingStream->putBe64(cgen_var_30);
+        *countPtr += 8;
         if (pQueueFamilyProperties)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
             {
-                marshal_VkQueueFamilyProperties(countingStream, (VkQueueFamilyProperties*)(pQueueFamilyProperties + i));
+                count_VkQueueFamilyProperties(featureBits, (VkQueueFamilyProperties*)(pQueueFamilyProperties + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceQueueFamilyProperties = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceQueueFamilyProperties = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceQueueFamilyProperties);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceQueueFamilyProperties = OP_vkGetPhysicalDeviceQueueFamilyProperties;
-    stream->write(&opcode_vkGetPhysicalDeviceQueueFamilyProperties, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceQueueFamilyProperties, sizeof(uint32_t));
-    uint64_t cgen_var_31;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_31, 1);
-    stream->write((uint64_t*)&cgen_var_31, 1 * 8);
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceQueueFamilyProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceQueueFamilyProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_25;
+    *&cgen_var_25 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_25, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_32 = (uint64_t)(uintptr_t)pQueueFamilyPropertyCount;
-    stream->putBe64(cgen_var_32);
+    uint64_t cgen_var_26 = (uint64_t)(uintptr_t)pQueueFamilyPropertyCount;
+    memcpy((*streamPtrPtr), &cgen_var_26, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pQueueFamilyPropertyCount)
     {
-        stream->write((uint32_t*)pQueueFamilyPropertyCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pQueueFamilyPropertyCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_33 = (uint64_t)(uintptr_t)pQueueFamilyProperties;
-    stream->putBe64(cgen_var_33);
+    uint64_t cgen_var_27 = (uint64_t)(uintptr_t)pQueueFamilyProperties;
+    memcpy((*streamPtrPtr), &cgen_var_27, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pQueueFamilyProperties)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
         {
-            marshal_VkQueueFamilyProperties(stream, (VkQueueFamilyProperties*)(pQueueFamilyProperties + i));
+            reservedmarshal_VkQueueFamilyProperties(stream, (VkQueueFamilyProperties*)(pQueueFamilyProperties + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pQueueFamilyPropertyCount;
     check_pQueueFamilyPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -609,137 +710,188 @@
             transform_fromhost_VkQueueFamilyProperties(mImpl->resources(), (VkQueueFamilyProperties*)(pQueueFamilyProperties + i));
         }
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceQueueFamilyProperties");;
 }
 
 void VkEncoder::vkGetPhysicalDeviceMemoryProperties(
     VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceMemoryProperties* pMemoryProperties)
+    VkPhysicalDeviceMemoryProperties* pMemoryProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceMemoryProperties");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_36;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_36, 1);
-        countingStream->write((uint64_t*)&cgen_var_36, 1 * 8);
-        marshal_VkPhysicalDeviceMemoryProperties(countingStream, (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties));
+        uint64_t cgen_var_30;
+        *countPtr += 1 * 8;
+        count_VkPhysicalDeviceMemoryProperties(featureBits, (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceMemoryProperties = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceMemoryProperties = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceMemoryProperties);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceMemoryProperties = OP_vkGetPhysicalDeviceMemoryProperties;
-    stream->write(&opcode_vkGetPhysicalDeviceMemoryProperties, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceMemoryProperties, sizeof(uint32_t));
-    uint64_t cgen_var_37;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_37, 1);
-    stream->write((uint64_t*)&cgen_var_37, 1 * 8);
-    marshal_VkPhysicalDeviceMemoryProperties(stream, (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceMemoryProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceMemoryProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_31;
+    *&cgen_var_31 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_31, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPhysicalDeviceMemoryProperties(stream, (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkPhysicalDeviceMemoryProperties(stream, (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties));
     if (pMemoryProperties)
     {
         transform_fromhost_VkPhysicalDeviceMemoryProperties(mImpl->resources(), (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties));
     }
     mImpl->resources()->on_vkGetPhysicalDeviceMemoryProperties(this, physicalDevice, pMemoryProperties);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceMemoryProperties");;
 }
 
 PFN_vkVoidFunction VkEncoder::vkGetInstanceProcAddr(
     VkInstance instance,
-    const char* pName)
+    const char* pName,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetInstanceProcAddr");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkInstance local_instance;
     char* local_pName;
+    uint32_t local_doLock;
     local_instance = instance;
     local_pName = nullptr;
     if (pName)
     {
         local_pName = pool->strDup(pName);
     }
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_38;
-        countingStream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_38, 1);
-        countingStream->write((uint64_t*)&cgen_var_38, 1 * 8);
-        countingStream->putString(local_pName);
+        uint64_t cgen_var_32;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t) + (local_pName ? strlen(local_pName) : 0);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetInstanceProcAddr = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetInstanceProcAddr = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetInstanceProcAddr);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetInstanceProcAddr = OP_vkGetInstanceProcAddr;
-    stream->write(&opcode_vkGetInstanceProcAddr, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetInstanceProcAddr, sizeof(uint32_t));
-    uint64_t cgen_var_39;
-    stream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_39, 1);
-    stream->write((uint64_t*)&cgen_var_39, 1 * 8);
-    stream->putString(local_pName);
+    memcpy(streamPtr, &opcode_vkGetInstanceProcAddr, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetInstanceProcAddr, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_33;
+    *&cgen_var_33 = get_host_u64_VkInstance((*&local_instance));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_33, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    {
+        uint32_t l = local_pName ? strlen(local_pName): 0;
+        memcpy(*streamPtrPtr, (uint32_t*)&l, sizeof(uint32_t));
+        android::base::Stream::toBe32((uint8_t*)*streamPtrPtr);
+        *streamPtrPtr += sizeof(uint32_t);
+        memcpy(*streamPtrPtr, (char*)local_pName, l);
+        *streamPtrPtr += l;
+    }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     PFN_vkVoidFunction vkGetInstanceProcAddr_PFN_vkVoidFunction_return = (PFN_vkVoidFunction)0;
     stream->read(&vkGetInstanceProcAddr_PFN_vkVoidFunction_return, sizeof(PFN_vkVoidFunction));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetInstanceProcAddr");;
     return vkGetInstanceProcAddr_PFN_vkVoidFunction_return;
 }
 
 PFN_vkVoidFunction VkEncoder::vkGetDeviceProcAddr(
     VkDevice device,
-    const char* pName)
+    const char* pName,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetDeviceProcAddr");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     char* local_pName;
+    uint32_t local_doLock;
     local_device = device;
     local_pName = nullptr;
     if (pName)
     {
         local_pName = pool->strDup(pName);
     }
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_40;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_40, 1);
-        countingStream->write((uint64_t*)&cgen_var_40, 1 * 8);
-        countingStream->putString(local_pName);
+        uint64_t cgen_var_34;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t) + (local_pName ? strlen(local_pName) : 0);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetDeviceProcAddr = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetDeviceProcAddr = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceProcAddr);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetDeviceProcAddr = OP_vkGetDeviceProcAddr;
-    stream->write(&opcode_vkGetDeviceProcAddr, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetDeviceProcAddr, sizeof(uint32_t));
-    uint64_t cgen_var_41;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_41, 1);
-    stream->write((uint64_t*)&cgen_var_41, 1 * 8);
-    stream->putString(local_pName);
+    memcpy(streamPtr, &opcode_vkGetDeviceProcAddr, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetDeviceProcAddr, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_35;
+    *&cgen_var_35 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_35, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    {
+        uint32_t l = local_pName ? strlen(local_pName): 0;
+        memcpy(*streamPtrPtr, (uint32_t*)&l, sizeof(uint32_t));
+        android::base::Stream::toBe32((uint8_t*)*streamPtrPtr);
+        *streamPtrPtr += sizeof(uint32_t);
+        memcpy(*streamPtrPtr, (char*)local_pName, l);
+        *streamPtrPtr += l;
+    }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     PFN_vkVoidFunction vkGetDeviceProcAddr_PFN_vkVoidFunction_return = (PFN_vkVoidFunction)0;
     stream->read(&vkGetDeviceProcAddr_PFN_vkVoidFunction_return, sizeof(PFN_vkVoidFunction));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetDeviceProcAddr");;
     return vkGetDeviceProcAddr_PFN_vkVoidFunction_return;
 }
@@ -748,18 +900,18 @@
     VkPhysicalDevice physicalDevice,
     const VkDeviceCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkDevice* pDevice)
+    VkDevice* pDevice,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateDevice");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkDeviceCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -773,6 +925,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -782,73 +935,84 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_42;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_42, 1);
-        countingStream->write((uint64_t*)&cgen_var_42, 1 * 8);
-        marshal_VkDeviceCreateInfo(countingStream, (VkDeviceCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_36;
+        *countPtr += 1 * 8;
+        count_VkDeviceCreateInfo(featureBits, (VkDeviceCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_43 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_43);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_44;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(pDevice, &cgen_var_44, 1);
-        countingStream->write((uint64_t*)&cgen_var_44, 8);
+        uint64_t cgen_var_37;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateDevice = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateDevice = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateDevice);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateDevice = OP_vkCreateDevice;
-    stream->write(&opcode_vkCreateDevice, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateDevice, sizeof(uint32_t));
-    uint64_t cgen_var_45;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_45, 1);
-    stream->write((uint64_t*)&cgen_var_45, 1 * 8);
-    marshal_VkDeviceCreateInfo(stream, (VkDeviceCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateDevice, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateDevice, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_38;
+    *&cgen_var_38 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_38, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDeviceCreateInfo(stream, (VkDeviceCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_46 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_46);
+    uint64_t cgen_var_39 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_39, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_47;
-    stream->handleMapping()->mapHandles_VkDevice_u64(pDevice, &cgen_var_47, 1);
-    stream->write((uint64_t*)&cgen_var_47, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_40;
+    *&cgen_var_40 = (uint64_t)((*pDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_40, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_48;
-    stream->read((uint64_t*)&cgen_var_48, 8);
-    stream->handleMapping()->mapHandles_u64_VkDevice(&cgen_var_48, (VkDevice*)pDevice, 1);
+    uint64_t cgen_var_41;
+    stream->read((uint64_t*)&cgen_var_41, 8);
+    stream->handleMapping()->mapHandles_u64_VkDevice(&cgen_var_41, (VkDevice*)pDevice, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateDevice_VkResult_return = (VkResult)0;
     stream->read(&vkCreateDevice_VkResult_return, sizeof(VkResult));
     mImpl->resources()->on_vkCreateDevice(this, vkCreateDevice_VkResult_return, physicalDevice, pCreateInfo, pAllocator, pDevice);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateDevice");;
     return vkCreateDevice_VkResult_return;
 }
 
 void VkEncoder::vkDestroyDevice(
     VkDevice device,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyDevice");
     mImpl->resources()->on_vkDestroyDevice_pre(this, device, pAllocator);
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pAllocator = nullptr;
     if (pAllocator)
@@ -856,135 +1020,172 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_49;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_49, 1);
-        countingStream->write((uint64_t*)&cgen_var_49, 1 * 8);
+        uint64_t cgen_var_42;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_50 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_50);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyDevice = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyDevice = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyDevice);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyDevice = OP_vkDestroyDevice;
-    stream->write(&opcode_vkDestroyDevice, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyDevice, sizeof(uint32_t));
-    uint64_t cgen_var_51;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_51, 1);
-    stream->write((uint64_t*)&cgen_var_51, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyDevice, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyDevice, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_43;
+    *&cgen_var_43 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_43, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_52 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_52);
+    uint64_t cgen_var_44 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_44, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkDevice((VkDevice*)&device);
     stream->flush();
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyDevice");;
 }
 
 VkResult VkEncoder::vkEnumerateInstanceExtensionProperties(
     const char* pLayerName,
     uint32_t* pPropertyCount,
-    VkExtensionProperties* pProperties)
+    VkExtensionProperties* pProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkEnumerateInstanceExtensionProperties");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     char* local_pLayerName;
+    uint32_t local_doLock;
     local_pLayerName = nullptr;
     if (pLayerName)
     {
         local_pLayerName = pool->strDup(pLayerName);
     }
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        if (countingStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+        if (featureBits & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
         {
             // WARNING PTR CHECK
-            uint64_t cgen_var_53 = (uint64_t)(uintptr_t)local_pLayerName;
-            countingStream->putBe64(cgen_var_53);
+            *countPtr += 8;
             if (local_pLayerName)
             {
-                countingStream->putString(local_pLayerName);
+                *countPtr += sizeof(uint32_t) + (local_pLayerName ? strlen(local_pLayerName) : 0);
             }
         }
         else
         {
-            countingStream->putString(local_pLayerName);
+            *countPtr += sizeof(uint32_t) + (local_pLayerName ? strlen(local_pLayerName) : 0);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_54 = (uint64_t)(uintptr_t)pPropertyCount;
-        countingStream->putBe64(cgen_var_54);
+        *countPtr += 8;
         if (pPropertyCount)
         {
-            countingStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_55 = (uint64_t)(uintptr_t)pProperties;
-        countingStream->putBe64(cgen_var_55);
+        *countPtr += 8;
         if (pProperties)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                marshal_VkExtensionProperties(countingStream, (VkExtensionProperties*)(pProperties + i));
+                count_VkExtensionProperties(featureBits, (VkExtensionProperties*)(pProperties + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkEnumerateInstanceExtensionProperties = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkEnumerateInstanceExtensionProperties = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkEnumerateInstanceExtensionProperties);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkEnumerateInstanceExtensionProperties = OP_vkEnumerateInstanceExtensionProperties;
-    stream->write(&opcode_vkEnumerateInstanceExtensionProperties, sizeof(uint32_t));
-    stream->write(&packetSize_vkEnumerateInstanceExtensionProperties, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkEnumerateInstanceExtensionProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkEnumerateInstanceExtensionProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
     if (stream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
     {
         // WARNING PTR CHECK
-        uint64_t cgen_var_56 = (uint64_t)(uintptr_t)local_pLayerName;
-        stream->putBe64(cgen_var_56);
+        uint64_t cgen_var_45 = (uint64_t)(uintptr_t)local_pLayerName;
+        memcpy((*streamPtrPtr), &cgen_var_45, 8);
+        android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+        *streamPtrPtr += 8;
         if (local_pLayerName)
         {
-            stream->putString(local_pLayerName);
+            {
+                uint32_t l = local_pLayerName ? strlen(local_pLayerName): 0;
+                memcpy(*streamPtrPtr, (uint32_t*)&l, sizeof(uint32_t));
+                android::base::Stream::toBe32((uint8_t*)*streamPtrPtr);
+                *streamPtrPtr += sizeof(uint32_t);
+                memcpy(*streamPtrPtr, (char*)local_pLayerName, l);
+                *streamPtrPtr += l;
+            }
         }
     }
     else
     {
-        stream->putString(local_pLayerName);
+        {
+            uint32_t l = local_pLayerName ? strlen(local_pLayerName): 0;
+            memcpy(*streamPtrPtr, (uint32_t*)&l, sizeof(uint32_t));
+            android::base::Stream::toBe32((uint8_t*)*streamPtrPtr);
+            *streamPtrPtr += sizeof(uint32_t);
+            memcpy(*streamPtrPtr, (char*)local_pLayerName, l);
+            *streamPtrPtr += l;
+        }
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_57 = (uint64_t)(uintptr_t)pPropertyCount;
-    stream->putBe64(cgen_var_57);
+    uint64_t cgen_var_46 = (uint64_t)(uintptr_t)pPropertyCount;
+    memcpy((*streamPtrPtr), &cgen_var_46, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pPropertyCount)
     {
-        stream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pPropertyCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_58 = (uint64_t)(uintptr_t)pProperties;
-    stream->putBe64(cgen_var_58);
+    uint64_t cgen_var_47 = (uint64_t)(uintptr_t)pProperties;
+    memcpy((*streamPtrPtr), &cgen_var_47, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pProperties)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            marshal_VkExtensionProperties(stream, (VkExtensionProperties*)(pProperties + i));
+            reservedmarshal_VkExtensionProperties(stream, (VkExtensionProperties*)(pProperties + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pPropertyCount;
     check_pPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -1019,9 +1220,13 @@
     }
     VkResult vkEnumerateInstanceExtensionProperties_VkResult_return = (VkResult)0;
     stream->read(&vkEnumerateInstanceExtensionProperties_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkEnumerateInstanceExtensionProperties");;
     return vkEnumerateInstanceExtensionProperties_VkResult_return;
 }
@@ -1030,99 +1235,124 @@
     VkPhysicalDevice physicalDevice,
     const char* pLayerName,
     uint32_t* pPropertyCount,
-    VkExtensionProperties* pProperties)
+    VkExtensionProperties* pProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkEnumerateDeviceExtensionProperties");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     char* local_pLayerName;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_pLayerName = nullptr;
     if (pLayerName)
     {
         local_pLayerName = pool->strDup(pLayerName);
     }
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_61;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_61, 1);
-        countingStream->write((uint64_t*)&cgen_var_61, 1 * 8);
-        if (countingStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+        uint64_t cgen_var_50;
+        *countPtr += 1 * 8;
+        if (featureBits & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
         {
             // WARNING PTR CHECK
-            uint64_t cgen_var_62 = (uint64_t)(uintptr_t)local_pLayerName;
-            countingStream->putBe64(cgen_var_62);
+            *countPtr += 8;
             if (local_pLayerName)
             {
-                countingStream->putString(local_pLayerName);
+                *countPtr += sizeof(uint32_t) + (local_pLayerName ? strlen(local_pLayerName) : 0);
             }
         }
         else
         {
-            countingStream->putString(local_pLayerName);
+            *countPtr += sizeof(uint32_t) + (local_pLayerName ? strlen(local_pLayerName) : 0);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_63 = (uint64_t)(uintptr_t)pPropertyCount;
-        countingStream->putBe64(cgen_var_63);
+        *countPtr += 8;
         if (pPropertyCount)
         {
-            countingStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_64 = (uint64_t)(uintptr_t)pProperties;
-        countingStream->putBe64(cgen_var_64);
+        *countPtr += 8;
         if (pProperties)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                marshal_VkExtensionProperties(countingStream, (VkExtensionProperties*)(pProperties + i));
+                count_VkExtensionProperties(featureBits, (VkExtensionProperties*)(pProperties + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkEnumerateDeviceExtensionProperties = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkEnumerateDeviceExtensionProperties = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkEnumerateDeviceExtensionProperties);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkEnumerateDeviceExtensionProperties = OP_vkEnumerateDeviceExtensionProperties;
-    stream->write(&opcode_vkEnumerateDeviceExtensionProperties, sizeof(uint32_t));
-    stream->write(&packetSize_vkEnumerateDeviceExtensionProperties, sizeof(uint32_t));
-    uint64_t cgen_var_65;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_65, 1);
-    stream->write((uint64_t*)&cgen_var_65, 1 * 8);
+    memcpy(streamPtr, &opcode_vkEnumerateDeviceExtensionProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkEnumerateDeviceExtensionProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_51;
+    *&cgen_var_51 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_51, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     if (stream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
     {
         // WARNING PTR CHECK
-        uint64_t cgen_var_66 = (uint64_t)(uintptr_t)local_pLayerName;
-        stream->putBe64(cgen_var_66);
+        uint64_t cgen_var_52 = (uint64_t)(uintptr_t)local_pLayerName;
+        memcpy((*streamPtrPtr), &cgen_var_52, 8);
+        android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+        *streamPtrPtr += 8;
         if (local_pLayerName)
         {
-            stream->putString(local_pLayerName);
+            {
+                uint32_t l = local_pLayerName ? strlen(local_pLayerName): 0;
+                memcpy(*streamPtrPtr, (uint32_t*)&l, sizeof(uint32_t));
+                android::base::Stream::toBe32((uint8_t*)*streamPtrPtr);
+                *streamPtrPtr += sizeof(uint32_t);
+                memcpy(*streamPtrPtr, (char*)local_pLayerName, l);
+                *streamPtrPtr += l;
+            }
         }
     }
     else
     {
-        stream->putString(local_pLayerName);
+        {
+            uint32_t l = local_pLayerName ? strlen(local_pLayerName): 0;
+            memcpy(*streamPtrPtr, (uint32_t*)&l, sizeof(uint32_t));
+            android::base::Stream::toBe32((uint8_t*)*streamPtrPtr);
+            *streamPtrPtr += sizeof(uint32_t);
+            memcpy(*streamPtrPtr, (char*)local_pLayerName, l);
+            *streamPtrPtr += l;
+        }
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_67 = (uint64_t)(uintptr_t)pPropertyCount;
-    stream->putBe64(cgen_var_67);
+    uint64_t cgen_var_53 = (uint64_t)(uintptr_t)pPropertyCount;
+    memcpy((*streamPtrPtr), &cgen_var_53, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pPropertyCount)
     {
-        stream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pPropertyCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_68 = (uint64_t)(uintptr_t)pProperties;
-    stream->putBe64(cgen_var_68);
+    uint64_t cgen_var_54 = (uint64_t)(uintptr_t)pProperties;
+    memcpy((*streamPtrPtr), &cgen_var_54, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pProperties)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            marshal_VkExtensionProperties(stream, (VkExtensionProperties*)(pProperties + i));
+            reservedmarshal_VkExtensionProperties(stream, (VkExtensionProperties*)(pProperties + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pPropertyCount;
     check_pPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -1157,66 +1387,80 @@
     }
     VkResult vkEnumerateDeviceExtensionProperties_VkResult_return = (VkResult)0;
     stream->read(&vkEnumerateDeviceExtensionProperties_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkEnumerateDeviceExtensionProperties");;
     return vkEnumerateDeviceExtensionProperties_VkResult_return;
 }
 
 VkResult VkEncoder::vkEnumerateInstanceLayerProperties(
     uint32_t* pPropertyCount,
-    VkLayerProperties* pProperties)
+    VkLayerProperties* pProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkEnumerateInstanceLayerProperties");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
-    countingStream->rewind();
+    uint32_t local_doLock;
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
         // WARNING PTR CHECK
-        uint64_t cgen_var_71 = (uint64_t)(uintptr_t)pPropertyCount;
-        countingStream->putBe64(cgen_var_71);
+        *countPtr += 8;
         if (pPropertyCount)
         {
-            countingStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_72 = (uint64_t)(uintptr_t)pProperties;
-        countingStream->putBe64(cgen_var_72);
+        *countPtr += 8;
         if (pProperties)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                marshal_VkLayerProperties(countingStream, (VkLayerProperties*)(pProperties + i));
+                count_VkLayerProperties(featureBits, (VkLayerProperties*)(pProperties + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkEnumerateInstanceLayerProperties = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkEnumerateInstanceLayerProperties = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkEnumerateInstanceLayerProperties);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkEnumerateInstanceLayerProperties = OP_vkEnumerateInstanceLayerProperties;
-    stream->write(&opcode_vkEnumerateInstanceLayerProperties, sizeof(uint32_t));
-    stream->write(&packetSize_vkEnumerateInstanceLayerProperties, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkEnumerateInstanceLayerProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkEnumerateInstanceLayerProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
-    uint64_t cgen_var_73 = (uint64_t)(uintptr_t)pPropertyCount;
-    stream->putBe64(cgen_var_73);
+    uint64_t cgen_var_57 = (uint64_t)(uintptr_t)pPropertyCount;
+    memcpy((*streamPtrPtr), &cgen_var_57, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pPropertyCount)
     {
-        stream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pPropertyCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_74 = (uint64_t)(uintptr_t)pProperties;
-    stream->putBe64(cgen_var_74);
+    uint64_t cgen_var_58 = (uint64_t)(uintptr_t)pProperties;
+    memcpy((*streamPtrPtr), &cgen_var_58, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pProperties)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            marshal_VkLayerProperties(stream, (VkLayerProperties*)(pProperties + i));
+            reservedmarshal_VkLayerProperties(stream, (VkLayerProperties*)(pProperties + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pPropertyCount;
     check_pPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -1251,9 +1495,13 @@
     }
     VkResult vkEnumerateInstanceLayerProperties_VkResult_return = (VkResult)0;
     stream->read(&vkEnumerateInstanceLayerProperties_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkEnumerateInstanceLayerProperties");;
     return vkEnumerateInstanceLayerProperties_VkResult_return;
 }
@@ -1261,65 +1509,75 @@
 VkResult VkEncoder::vkEnumerateDeviceLayerProperties(
     VkPhysicalDevice physicalDevice,
     uint32_t* pPropertyCount,
-    VkLayerProperties* pProperties)
+    VkLayerProperties* pProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkEnumerateDeviceLayerProperties");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_77;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_77, 1);
-        countingStream->write((uint64_t*)&cgen_var_77, 1 * 8);
+        uint64_t cgen_var_61;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_78 = (uint64_t)(uintptr_t)pPropertyCount;
-        countingStream->putBe64(cgen_var_78);
+        *countPtr += 8;
         if (pPropertyCount)
         {
-            countingStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_79 = (uint64_t)(uintptr_t)pProperties;
-        countingStream->putBe64(cgen_var_79);
+        *countPtr += 8;
         if (pProperties)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                marshal_VkLayerProperties(countingStream, (VkLayerProperties*)(pProperties + i));
+                count_VkLayerProperties(featureBits, (VkLayerProperties*)(pProperties + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkEnumerateDeviceLayerProperties = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkEnumerateDeviceLayerProperties = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkEnumerateDeviceLayerProperties);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkEnumerateDeviceLayerProperties = OP_vkEnumerateDeviceLayerProperties;
-    stream->write(&opcode_vkEnumerateDeviceLayerProperties, sizeof(uint32_t));
-    stream->write(&packetSize_vkEnumerateDeviceLayerProperties, sizeof(uint32_t));
-    uint64_t cgen_var_80;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_80, 1);
-    stream->write((uint64_t*)&cgen_var_80, 1 * 8);
+    memcpy(streamPtr, &opcode_vkEnumerateDeviceLayerProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkEnumerateDeviceLayerProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_62;
+    *&cgen_var_62 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_62, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_81 = (uint64_t)(uintptr_t)pPropertyCount;
-    stream->putBe64(cgen_var_81);
+    uint64_t cgen_var_63 = (uint64_t)(uintptr_t)pPropertyCount;
+    memcpy((*streamPtrPtr), &cgen_var_63, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pPropertyCount)
     {
-        stream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pPropertyCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_82 = (uint64_t)(uintptr_t)pProperties;
-    stream->putBe64(cgen_var_82);
+    uint64_t cgen_var_64 = (uint64_t)(uintptr_t)pProperties;
+    memcpy((*streamPtrPtr), &cgen_var_64, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pProperties)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            marshal_VkLayerProperties(stream, (VkLayerProperties*)(pProperties + i));
+            reservedmarshal_VkLayerProperties(stream, (VkLayerProperties*)(pProperties + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pPropertyCount;
     check_pPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -1354,9 +1612,13 @@
     }
     VkResult vkEnumerateDeviceLayerProperties_VkResult_return = (VkResult)0;
     stream->read(&vkEnumerateDeviceLayerProperties_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkEnumerateDeviceLayerProperties");;
     return vkEnumerateDeviceLayerProperties_VkResult_return;
 }
@@ -1365,55 +1627,68 @@
     VkDevice device,
     uint32_t queueFamilyIndex,
     uint32_t queueIndex,
-    VkQueue* pQueue)
+    VkQueue* pQueue,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetDeviceQueue");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     uint32_t local_queueFamilyIndex;
     uint32_t local_queueIndex;
+    uint32_t local_doLock;
     local_device = device;
     local_queueFamilyIndex = queueFamilyIndex;
     local_queueIndex = queueIndex;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_85;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_85, 1);
-        countingStream->write((uint64_t*)&cgen_var_85, 1 * 8);
-        countingStream->write((uint32_t*)&local_queueFamilyIndex, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_queueIndex, sizeof(uint32_t));
-        uint64_t cgen_var_86;
-        countingStream->handleMapping()->mapHandles_VkQueue_u64(pQueue, &cgen_var_86, 1);
-        countingStream->write((uint64_t*)&cgen_var_86, 8);
+        uint64_t cgen_var_67;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        uint64_t cgen_var_68;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetDeviceQueue = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetDeviceQueue = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceQueue);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetDeviceQueue = OP_vkGetDeviceQueue;
-    stream->write(&opcode_vkGetDeviceQueue, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetDeviceQueue, sizeof(uint32_t));
-    uint64_t cgen_var_87;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_87, 1);
-    stream->write((uint64_t*)&cgen_var_87, 1 * 8);
-    stream->write((uint32_t*)&local_queueFamilyIndex, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_queueIndex, sizeof(uint32_t));
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_88;
-    stream->handleMapping()->mapHandles_VkQueue_u64(pQueue, &cgen_var_88, 1);
-    stream->write((uint64_t*)&cgen_var_88, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    memcpy(streamPtr, &opcode_vkGetDeviceQueue, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetDeviceQueue, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_69;
+    *&cgen_var_69 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_69, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_queueFamilyIndex, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_queueIndex, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    /* is handle, possibly out */;
+    uint64_t cgen_var_70;
+    *&cgen_var_70 = (uint64_t)((*pQueue));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_70, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_89;
-    stream->read((uint64_t*)&cgen_var_89, 8);
-    stream->handleMapping()->mapHandles_u64_VkQueue(&cgen_var_89, (VkQueue*)pQueue, 1);
+    uint64_t cgen_var_71;
+    stream->read((uint64_t*)&cgen_var_71, 8);
+    stream->handleMapping()->mapHandles_u64_VkQueue(&cgen_var_71, (VkQueue*)pQueue, 1);
     stream->unsetHandleMapping();
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetDeviceQueue");;
 }
 
@@ -1421,19 +1696,19 @@
     VkQueue queue,
     uint32_t submitCount,
     const VkSubmitInfo* pSubmits,
-    VkFence fence)
+    VkFence fence,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkQueueSubmit");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkQueue local_queue;
     uint32_t local_submitCount;
     VkSubmitInfo* local_pSubmits;
     VkFence local_fence;
+    uint32_t local_doLock;
     local_queue = queue;
     local_submitCount = submitCount;
     local_pSubmits = nullptr;
@@ -1446,6 +1721,7 @@
         }
     }
     local_fence = fence;
+    local_doLock = doLock;
     if (local_pSubmits)
     {
         for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i)
@@ -1453,111 +1729,144 @@
             transform_tohost_VkSubmitInfo(mImpl->resources(), (VkSubmitInfo*)(local_pSubmits + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_90;
-        countingStream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_90, 1);
-        countingStream->write((uint64_t*)&cgen_var_90, 1 * 8);
-        countingStream->write((uint32_t*)&local_submitCount, sizeof(uint32_t));
+        uint64_t cgen_var_72;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i)
         {
-            marshal_VkSubmitInfo(countingStream, (VkSubmitInfo*)(local_pSubmits + i));
+            count_VkSubmitInfo(featureBits, (VkSubmitInfo*)(local_pSubmits + i), countPtr);
         }
-        uint64_t cgen_var_91;
-        countingStream->handleMapping()->mapHandles_VkFence_u64(&local_fence, &cgen_var_91, 1);
-        countingStream->write((uint64_t*)&cgen_var_91, 1 * 8);
+        uint64_t cgen_var_73;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkQueueSubmit = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkQueueSubmit = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkQueueSubmit);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkQueueSubmit = OP_vkQueueSubmit;
-    stream->write(&opcode_vkQueueSubmit, sizeof(uint32_t));
-    stream->write(&packetSize_vkQueueSubmit, sizeof(uint32_t));
-    uint64_t cgen_var_92;
-    stream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_92, 1);
-    stream->write((uint64_t*)&cgen_var_92, 1 * 8);
-    stream->write((uint32_t*)&local_submitCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkQueueSubmit, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkQueueSubmit, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_74;
+    *&cgen_var_74 = get_host_u64_VkQueue((*&local_queue));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_74, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_submitCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i)
     {
-        marshal_VkSubmitInfo(stream, (VkSubmitInfo*)(local_pSubmits + i));
+        reservedmarshal_VkSubmitInfo(stream, (VkSubmitInfo*)(local_pSubmits + i), streamPtrPtr);
     }
-    uint64_t cgen_var_93;
-    stream->handleMapping()->mapHandles_VkFence_u64(&local_fence, &cgen_var_93, 1);
-    stream->write((uint64_t*)&cgen_var_93, 1 * 8);
+    uint64_t cgen_var_75;
+    *&cgen_var_75 = get_host_u64_VkFence((*&local_fence));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_75, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkQueueSubmit_VkResult_return = (VkResult)0;
     stream->read(&vkQueueSubmit_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkQueueSubmit");;
     return vkQueueSubmit_VkResult_return;
 }
 
 VkResult VkEncoder::vkQueueWaitIdle(
-    VkQueue queue)
+    VkQueue queue,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkQueueWaitIdle");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkQueue local_queue;
+    uint32_t local_doLock;
     local_queue = queue;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_94;
-        countingStream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_94, 1);
-        countingStream->write((uint64_t*)&cgen_var_94, 1 * 8);
+        uint64_t cgen_var_76;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkQueueWaitIdle = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkQueueWaitIdle = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkQueueWaitIdle);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkQueueWaitIdle = OP_vkQueueWaitIdle;
-    stream->write(&opcode_vkQueueWaitIdle, sizeof(uint32_t));
-    stream->write(&packetSize_vkQueueWaitIdle, sizeof(uint32_t));
-    uint64_t cgen_var_95;
-    stream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_95, 1);
-    stream->write((uint64_t*)&cgen_var_95, 1 * 8);
+    memcpy(streamPtr, &opcode_vkQueueWaitIdle, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkQueueWaitIdle, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_77;
+    *&cgen_var_77 = get_host_u64_VkQueue((*&local_queue));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_77, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkQueueWaitIdle_VkResult_return = (VkResult)0;
     stream->read(&vkQueueWaitIdle_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkQueueWaitIdle");;
     return vkQueueWaitIdle_VkResult_return;
 }
 
 VkResult VkEncoder::vkDeviceWaitIdle(
-    VkDevice device)
+    VkDevice device,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDeviceWaitIdle");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
+    uint32_t local_doLock;
     local_device = device;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_96;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_96, 1);
-        countingStream->write((uint64_t*)&cgen_var_96, 1 * 8);
+        uint64_t cgen_var_78;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDeviceWaitIdle = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDeviceWaitIdle = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDeviceWaitIdle);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDeviceWaitIdle = OP_vkDeviceWaitIdle;
-    stream->write(&opcode_vkDeviceWaitIdle, sizeof(uint32_t));
-    stream->write(&packetSize_vkDeviceWaitIdle, sizeof(uint32_t));
-    uint64_t cgen_var_97;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_97, 1);
-    stream->write((uint64_t*)&cgen_var_97, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDeviceWaitIdle, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDeviceWaitIdle, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_79;
+    *&cgen_var_79 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_79, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkDeviceWaitIdle_VkResult_return = (VkResult)0;
     stream->read(&vkDeviceWaitIdle_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDeviceWaitIdle");;
     return vkDeviceWaitIdle_VkResult_return;
 }
@@ -1566,18 +1875,18 @@
     VkDevice device,
     const VkMemoryAllocateInfo* pAllocateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkDeviceMemory* pMemory)
+    VkDeviceMemory* pMemory,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkAllocateMemory");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkMemoryAllocateInfo* local_pAllocateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pAllocateInfo = nullptr;
     if (pAllocateInfo)
@@ -1591,6 +1900,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocateInfo)
     {
@@ -1600,54 +1910,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_98;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_98, 1);
-        countingStream->write((uint64_t*)&cgen_var_98, 1 * 8);
-        marshal_VkMemoryAllocateInfo(countingStream, (VkMemoryAllocateInfo*)(local_pAllocateInfo));
+        uint64_t cgen_var_80;
+        *countPtr += 1 * 8;
+        count_VkMemoryAllocateInfo(featureBits, (VkMemoryAllocateInfo*)(local_pAllocateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_99 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_99);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_100;
-        countingStream->handleMapping()->mapHandles_VkDeviceMemory_u64(pMemory, &cgen_var_100, 1);
-        countingStream->write((uint64_t*)&cgen_var_100, 8);
+        uint64_t cgen_var_81;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkAllocateMemory = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkAllocateMemory = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkAllocateMemory);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkAllocateMemory = OP_vkAllocateMemory;
-    stream->write(&opcode_vkAllocateMemory, sizeof(uint32_t));
-    stream->write(&packetSize_vkAllocateMemory, sizeof(uint32_t));
-    uint64_t cgen_var_101;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_101, 1);
-    stream->write((uint64_t*)&cgen_var_101, 1 * 8);
-    marshal_VkMemoryAllocateInfo(stream, (VkMemoryAllocateInfo*)(local_pAllocateInfo));
+    memcpy(streamPtr, &opcode_vkAllocateMemory, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkAllocateMemory, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_82;
+    *&cgen_var_82 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_82, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkMemoryAllocateInfo(stream, (VkMemoryAllocateInfo*)(local_pAllocateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_102 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_102);
+    uint64_t cgen_var_83 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_83, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_103;
-    stream->handleMapping()->mapHandles_VkDeviceMemory_u64(pMemory, &cgen_var_103, 1);
-    stream->write((uint64_t*)&cgen_var_103, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_84;
+    *&cgen_var_84 = (uint64_t)((*pMemory));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_84, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_104;
-    stream->read((uint64_t*)&cgen_var_104, 8);
-    stream->handleMapping()->mapHandles_u64_VkDeviceMemory(&cgen_var_104, (VkDeviceMemory*)pMemory, 1);
+    uint64_t cgen_var_85;
+    stream->read((uint64_t*)&cgen_var_85, 8);
+    stream->handleMapping()->mapHandles_u64_VkDeviceMemory(&cgen_var_85, (VkDeviceMemory*)pMemory, 1);
     stream->unsetHandleMapping();
     VkResult vkAllocateMemory_VkResult_return = (VkResult)0;
     stream->read(&vkAllocateMemory_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkAllocateMemory");;
     return vkAllocateMemory_VkResult_return;
 }
@@ -1655,18 +1976,18 @@
 void VkEncoder::vkFreeMemory(
     VkDevice device,
     VkDeviceMemory memory,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkFreeMemory");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDeviceMemory local_memory;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_memory = memory;
     local_pAllocator = nullptr;
@@ -1675,46 +1996,58 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     mImpl->resources()->deviceMemoryTransform_tohost((VkDeviceMemory*)&local_memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_105;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_105, 1);
-        countingStream->write((uint64_t*)&cgen_var_105, 1 * 8);
-        uint64_t cgen_var_106;
-        countingStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&local_memory, &cgen_var_106, 1);
-        countingStream->write((uint64_t*)&cgen_var_106, 1 * 8);
+        uint64_t cgen_var_86;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_87;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_107 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_107);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkFreeMemory = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkFreeMemory = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkFreeMemory);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkFreeMemory = OP_vkFreeMemory;
-    stream->write(&opcode_vkFreeMemory, sizeof(uint32_t));
-    stream->write(&packetSize_vkFreeMemory, sizeof(uint32_t));
-    uint64_t cgen_var_108;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_108, 1);
-    stream->write((uint64_t*)&cgen_var_108, 1 * 8);
-    uint64_t cgen_var_109;
-    stream->handleMapping()->mapHandles_VkDeviceMemory_u64(&local_memory, &cgen_var_109, 1);
-    stream->write((uint64_t*)&cgen_var_109, 1 * 8);
+    memcpy(streamPtr, &opcode_vkFreeMemory, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkFreeMemory, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_88;
+    *&cgen_var_88 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_88, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_89;
+    *&cgen_var_89 = get_host_u64_VkDeviceMemory((*&local_memory));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_89, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_110 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_110);
+    uint64_t cgen_var_90 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_90, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkDeviceMemory((VkDeviceMemory*)&memory);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkFreeMemory");;
 }
 
@@ -1724,8 +2057,10 @@
     VkDeviceSize offset,
     VkDeviceSize size,
     VkMemoryMapFlags flags,
-    void** ppData)
+    void** ppData,
+    uint32_t doLock)
 {
+    (void)doLock;
     VkResult vkMapMemory_VkResult_return = (VkResult)0;
     vkMapMemory_VkResult_return = mImpl->resources()->on_vkMapMemory(this, VK_SUCCESS, device, memory, offset, size, flags, ppData);
     mImpl->log("finish vkMapMemory");;
@@ -1734,27 +2069,29 @@
 
 void VkEncoder::vkUnmapMemory(
     VkDevice device,
-    VkDeviceMemory memory)
+    VkDeviceMemory memory,
+    uint32_t doLock)
 {
+    (void)doLock;
     mImpl->resources()->on_vkUnmapMemory(this, device, memory);
 }
 
 VkResult VkEncoder::vkFlushMappedMemoryRanges(
     VkDevice device,
     uint32_t memoryRangeCount,
-    const VkMappedMemoryRange* pMemoryRanges)
+    const VkMappedMemoryRange* pMemoryRanges,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkFlushMappedMemoryRanges");
     VALIDATE_RET(VkResult, VK_SUCCESS, mImpl->validation()->on_vkFlushMappedMemoryRanges(this, VK_SUCCESS, device, memoryRangeCount, pMemoryRanges));
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     uint32_t local_memoryRangeCount;
     VkMappedMemoryRange* local_pMemoryRanges;
+    uint32_t local_doLock;
     local_device = device;
     local_memoryRangeCount = memoryRangeCount;
     local_pMemoryRanges = nullptr;
@@ -1766,6 +2103,7 @@
             deepcopy_VkMappedMemoryRange(pool, pMemoryRanges + i, (VkMappedMemoryRange*)(local_pMemoryRanges + i));
         }
     }
+    local_doLock = doLock;
     if (local_pMemoryRanges)
     {
         for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i)
@@ -1773,49 +2111,37 @@
             transform_tohost_VkMappedMemoryRange(mImpl->resources(), (VkMappedMemoryRange*)(local_pMemoryRanges + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_111;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_111, 1);
-        countingStream->write((uint64_t*)&cgen_var_111, 1 * 8);
-        countingStream->write((uint32_t*)&local_memoryRangeCount, sizeof(uint32_t));
+        uint64_t cgen_var_91;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i)
         {
-            marshal_VkMappedMemoryRange(countingStream, (VkMappedMemoryRange*)(local_pMemoryRanges + i));
+            count_VkMappedMemoryRange(featureBits, (VkMappedMemoryRange*)(local_pMemoryRanges + i), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    if (!resources->usingDirectMapping())
-    {
-        for (uint32_t i = 0; i < memoryRangeCount; ++i)
-        {
-            auto range = pMemoryRanges[i];
-            auto memory = pMemoryRanges[i].memory;
-            auto size = pMemoryRanges[i].size;
-            auto offset = pMemoryRanges[i].offset;
-            uint64_t streamSize = 0;
-            if (!memory) { countingStream->write(&streamSize, sizeof(uint64_t)); continue; };
-            auto hostPtr = resources->getMappedPointer(memory);
-            auto actualSize = size == VK_WHOLE_SIZE ? resources->getMappedSize(memory) : size;
-            if (!hostPtr) { countingStream->write(&streamSize, sizeof(uint64_t)); continue; };
-            streamSize = actualSize;
-            countingStream->write(&streamSize, sizeof(uint64_t));
-            uint8_t* targetRange = hostPtr + offset;
-            countingStream->write(targetRange, actualSize);
-        }
-    }
-    uint32_t packetSize_vkFlushMappedMemoryRanges = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkFlushMappedMemoryRanges = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkFlushMappedMemoryRanges);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkFlushMappedMemoryRanges = OP_vkFlushMappedMemoryRanges;
-    stream->write(&opcode_vkFlushMappedMemoryRanges, sizeof(uint32_t));
-    stream->write(&packetSize_vkFlushMappedMemoryRanges, sizeof(uint32_t));
-    uint64_t cgen_var_112;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_112, 1);
-    stream->write((uint64_t*)&cgen_var_112, 1 * 8);
-    stream->write((uint32_t*)&local_memoryRangeCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkFlushMappedMemoryRanges, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkFlushMappedMemoryRanges, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_92;
+    *&cgen_var_92 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_92, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_memoryRangeCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i)
     {
-        marshal_VkMappedMemoryRange(stream, (VkMappedMemoryRange*)(local_pMemoryRanges + i));
+        reservedmarshal_VkMappedMemoryRange(stream, (VkMappedMemoryRange*)(local_pMemoryRanges + i), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     if (!resources->usingDirectMapping())
     {
         for (uint32_t i = 0; i < memoryRangeCount; ++i)
@@ -1837,9 +2163,13 @@
     }
     VkResult vkFlushMappedMemoryRanges_VkResult_return = (VkResult)0;
     stream->read(&vkFlushMappedMemoryRanges_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkFlushMappedMemoryRanges");;
     return vkFlushMappedMemoryRanges_VkResult_return;
 }
@@ -1847,19 +2177,19 @@
 VkResult VkEncoder::vkInvalidateMappedMemoryRanges(
     VkDevice device,
     uint32_t memoryRangeCount,
-    const VkMappedMemoryRange* pMemoryRanges)
+    const VkMappedMemoryRange* pMemoryRanges,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkInvalidateMappedMemoryRanges");
     VALIDATE_RET(VkResult, VK_SUCCESS, mImpl->validation()->on_vkInvalidateMappedMemoryRanges(this, VK_SUCCESS, device, memoryRangeCount, pMemoryRanges));
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     uint32_t local_memoryRangeCount;
     VkMappedMemoryRange* local_pMemoryRanges;
+    uint32_t local_doLock;
     local_device = device;
     local_memoryRangeCount = memoryRangeCount;
     local_pMemoryRanges = nullptr;
@@ -1871,6 +2201,7 @@
             deepcopy_VkMappedMemoryRange(pool, pMemoryRanges + i, (VkMappedMemoryRange*)(local_pMemoryRanges + i));
         }
     }
+    local_doLock = doLock;
     if (local_pMemoryRanges)
     {
         for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i)
@@ -1878,30 +2209,37 @@
             transform_tohost_VkMappedMemoryRange(mImpl->resources(), (VkMappedMemoryRange*)(local_pMemoryRanges + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_113;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_113, 1);
-        countingStream->write((uint64_t*)&cgen_var_113, 1 * 8);
-        countingStream->write((uint32_t*)&local_memoryRangeCount, sizeof(uint32_t));
+        uint64_t cgen_var_93;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i)
         {
-            marshal_VkMappedMemoryRange(countingStream, (VkMappedMemoryRange*)(local_pMemoryRanges + i));
+            count_VkMappedMemoryRange(featureBits, (VkMappedMemoryRange*)(local_pMemoryRanges + i), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkInvalidateMappedMemoryRanges = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkInvalidateMappedMemoryRanges = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkInvalidateMappedMemoryRanges);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkInvalidateMappedMemoryRanges = OP_vkInvalidateMappedMemoryRanges;
-    stream->write(&opcode_vkInvalidateMappedMemoryRanges, sizeof(uint32_t));
-    stream->write(&packetSize_vkInvalidateMappedMemoryRanges, sizeof(uint32_t));
-    uint64_t cgen_var_114;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_114, 1);
-    stream->write((uint64_t*)&cgen_var_114, 1 * 8);
-    stream->write((uint32_t*)&local_memoryRangeCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkInvalidateMappedMemoryRanges, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkInvalidateMappedMemoryRanges, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_94;
+    *&cgen_var_94 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_94, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_memoryRangeCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i)
     {
-        marshal_VkMappedMemoryRange(stream, (VkMappedMemoryRange*)(local_pMemoryRanges + i));
+        reservedmarshal_VkMappedMemoryRange(stream, (VkMappedMemoryRange*)(local_pMemoryRanges + i), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkInvalidateMappedMemoryRanges_VkResult_return = (VkResult)0;
     stream->read(&vkInvalidateMappedMemoryRanges_VkResult_return, sizeof(VkResult));
     if (!resources->usingDirectMapping())
@@ -1923,9 +2261,13 @@
             stream->read(targetRange, actualSize);
         }
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkInvalidateMappedMemoryRanges");;
     return vkInvalidateMappedMemoryRanges_VkResult_return;
 }
@@ -1933,46 +2275,58 @@
 void VkEncoder::vkGetDeviceMemoryCommitment(
     VkDevice device,
     VkDeviceMemory memory,
-    VkDeviceSize* pCommittedMemoryInBytes)
+    VkDeviceSize* pCommittedMemoryInBytes,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetDeviceMemoryCommitment");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDeviceMemory local_memory;
+    uint32_t local_doLock;
     local_device = device;
     local_memory = memory;
+    local_doLock = doLock;
     mImpl->resources()->deviceMemoryTransform_tohost((VkDeviceMemory*)&local_memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_115;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_115, 1);
-        countingStream->write((uint64_t*)&cgen_var_115, 1 * 8);
-        uint64_t cgen_var_116;
-        countingStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&local_memory, &cgen_var_116, 1);
-        countingStream->write((uint64_t*)&cgen_var_116, 1 * 8);
-        countingStream->write((VkDeviceSize*)pCommittedMemoryInBytes, sizeof(VkDeviceSize));
+        uint64_t cgen_var_95;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_96;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkDeviceSize);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetDeviceMemoryCommitment = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetDeviceMemoryCommitment = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceMemoryCommitment);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetDeviceMemoryCommitment = OP_vkGetDeviceMemoryCommitment;
-    stream->write(&opcode_vkGetDeviceMemoryCommitment, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetDeviceMemoryCommitment, sizeof(uint32_t));
-    uint64_t cgen_var_117;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_117, 1);
-    stream->write((uint64_t*)&cgen_var_117, 1 * 8);
-    uint64_t cgen_var_118;
-    stream->handleMapping()->mapHandles_VkDeviceMemory_u64(&local_memory, &cgen_var_118, 1);
-    stream->write((uint64_t*)&cgen_var_118, 1 * 8);
-    stream->write((VkDeviceSize*)pCommittedMemoryInBytes, sizeof(VkDeviceSize));
+    memcpy(streamPtr, &opcode_vkGetDeviceMemoryCommitment, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetDeviceMemoryCommitment, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_97;
+    *&cgen_var_97 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_97, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_98;
+    *&cgen_var_98 = get_host_u64_VkDeviceMemory((*&local_memory));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_98, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkDeviceSize*)pCommittedMemoryInBytes, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((VkDeviceSize*)pCommittedMemoryInBytes, sizeof(VkDeviceSize));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetDeviceMemoryCommitment");;
 }
 
@@ -1980,57 +2334,69 @@
     VkDevice device,
     VkBuffer buffer,
     VkDeviceMemory memory,
-    VkDeviceSize memoryOffset)
+    VkDeviceSize memoryOffset,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkBindBufferMemory");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkBuffer local_buffer;
     VkDeviceMemory local_memory;
     VkDeviceSize local_memoryOffset;
+    uint32_t local_doLock;
     local_device = device;
     local_buffer = buffer;
     local_memory = memory;
     local_memoryOffset = memoryOffset;
+    local_doLock = doLock;
     mImpl->resources()->deviceMemoryTransform_tohost((VkDeviceMemory*)&local_memory, 1, (VkDeviceSize*)&local_memoryOffset, 1, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_119;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_119, 1);
-        countingStream->write((uint64_t*)&cgen_var_119, 1 * 8);
-        uint64_t cgen_var_120;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_120, 1);
-        countingStream->write((uint64_t*)&cgen_var_120, 1 * 8);
-        uint64_t cgen_var_121;
-        countingStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&local_memory, &cgen_var_121, 1);
-        countingStream->write((uint64_t*)&cgen_var_121, 1 * 8);
-        countingStream->write((VkDeviceSize*)&local_memoryOffset, sizeof(VkDeviceSize));
+        uint64_t cgen_var_99;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_100;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_101;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkDeviceSize);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkBindBufferMemory = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkBindBufferMemory = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkBindBufferMemory);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkBindBufferMemory = OP_vkBindBufferMemory;
-    stream->write(&opcode_vkBindBufferMemory, sizeof(uint32_t));
-    stream->write(&packetSize_vkBindBufferMemory, sizeof(uint32_t));
-    uint64_t cgen_var_122;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_122, 1);
-    stream->write((uint64_t*)&cgen_var_122, 1 * 8);
-    uint64_t cgen_var_123;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_123, 1);
-    stream->write((uint64_t*)&cgen_var_123, 1 * 8);
-    uint64_t cgen_var_124;
-    stream->handleMapping()->mapHandles_VkDeviceMemory_u64(&local_memory, &cgen_var_124, 1);
-    stream->write((uint64_t*)&cgen_var_124, 1 * 8);
-    stream->write((VkDeviceSize*)&local_memoryOffset, sizeof(VkDeviceSize));
+    memcpy(streamPtr, &opcode_vkBindBufferMemory, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkBindBufferMemory, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_102;
+    *&cgen_var_102 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_102, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_103;
+    *&cgen_var_103 = get_host_u64_VkBuffer((*&local_buffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_103, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_104;
+    *&cgen_var_104 = get_host_u64_VkDeviceMemory((*&local_memory));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_104, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkDeviceSize*)&local_memoryOffset, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkBindBufferMemory_VkResult_return = (VkResult)0;
     stream->read(&vkBindBufferMemory_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkBindBufferMemory");;
     return vkBindBufferMemory_VkResult_return;
 }
@@ -2039,57 +2405,69 @@
     VkDevice device,
     VkImage image,
     VkDeviceMemory memory,
-    VkDeviceSize memoryOffset)
+    VkDeviceSize memoryOffset,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkBindImageMemory");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkImage local_image;
     VkDeviceMemory local_memory;
     VkDeviceSize local_memoryOffset;
+    uint32_t local_doLock;
     local_device = device;
     local_image = image;
     local_memory = memory;
     local_memoryOffset = memoryOffset;
+    local_doLock = doLock;
     mImpl->resources()->deviceMemoryTransform_tohost((VkDeviceMemory*)&local_memory, 1, (VkDeviceSize*)&local_memoryOffset, 1, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_125;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_125, 1);
-        countingStream->write((uint64_t*)&cgen_var_125, 1 * 8);
-        uint64_t cgen_var_126;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_126, 1);
-        countingStream->write((uint64_t*)&cgen_var_126, 1 * 8);
-        uint64_t cgen_var_127;
-        countingStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&local_memory, &cgen_var_127, 1);
-        countingStream->write((uint64_t*)&cgen_var_127, 1 * 8);
-        countingStream->write((VkDeviceSize*)&local_memoryOffset, sizeof(VkDeviceSize));
+        uint64_t cgen_var_105;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_106;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_107;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkDeviceSize);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkBindImageMemory = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkBindImageMemory = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkBindImageMemory);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkBindImageMemory = OP_vkBindImageMemory;
-    stream->write(&opcode_vkBindImageMemory, sizeof(uint32_t));
-    stream->write(&packetSize_vkBindImageMemory, sizeof(uint32_t));
-    uint64_t cgen_var_128;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_128, 1);
-    stream->write((uint64_t*)&cgen_var_128, 1 * 8);
-    uint64_t cgen_var_129;
-    stream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_129, 1);
-    stream->write((uint64_t*)&cgen_var_129, 1 * 8);
-    uint64_t cgen_var_130;
-    stream->handleMapping()->mapHandles_VkDeviceMemory_u64(&local_memory, &cgen_var_130, 1);
-    stream->write((uint64_t*)&cgen_var_130, 1 * 8);
-    stream->write((VkDeviceSize*)&local_memoryOffset, sizeof(VkDeviceSize));
+    memcpy(streamPtr, &opcode_vkBindImageMemory, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkBindImageMemory, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_108;
+    *&cgen_var_108 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_108, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_109;
+    *&cgen_var_109 = get_host_u64_VkImage((*&local_image));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_109, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_110;
+    *&cgen_var_110 = get_host_u64_VkDeviceMemory((*&local_memory));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_110, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkDeviceSize*)&local_memoryOffset, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkBindImageMemory_VkResult_return = (VkResult)0;
     stream->read(&vkBindImageMemory_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkBindImageMemory");;
     return vkBindImageMemory_VkResult_return;
 }
@@ -2097,98 +2475,120 @@
 void VkEncoder::vkGetBufferMemoryRequirements(
     VkDevice device,
     VkBuffer buffer,
-    VkMemoryRequirements* pMemoryRequirements)
+    VkMemoryRequirements* pMemoryRequirements,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetBufferMemoryRequirements");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkBuffer local_buffer;
+    uint32_t local_doLock;
     local_device = device;
     local_buffer = buffer;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_131;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_131, 1);
-        countingStream->write((uint64_t*)&cgen_var_131, 1 * 8);
-        uint64_t cgen_var_132;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_132, 1);
-        countingStream->write((uint64_t*)&cgen_var_132, 1 * 8);
-        marshal_VkMemoryRequirements(countingStream, (VkMemoryRequirements*)(pMemoryRequirements));
+        uint64_t cgen_var_111;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_112;
+        *countPtr += 1 * 8;
+        count_VkMemoryRequirements(featureBits, (VkMemoryRequirements*)(pMemoryRequirements), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetBufferMemoryRequirements = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetBufferMemoryRequirements = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetBufferMemoryRequirements);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetBufferMemoryRequirements = OP_vkGetBufferMemoryRequirements;
-    stream->write(&opcode_vkGetBufferMemoryRequirements, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetBufferMemoryRequirements, sizeof(uint32_t));
-    uint64_t cgen_var_133;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_133, 1);
-    stream->write((uint64_t*)&cgen_var_133, 1 * 8);
-    uint64_t cgen_var_134;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_134, 1);
-    stream->write((uint64_t*)&cgen_var_134, 1 * 8);
-    marshal_VkMemoryRequirements(stream, (VkMemoryRequirements*)(pMemoryRequirements));
+    memcpy(streamPtr, &opcode_vkGetBufferMemoryRequirements, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetBufferMemoryRequirements, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_113;
+    *&cgen_var_113 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_113, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_114;
+    *&cgen_var_114 = get_host_u64_VkBuffer((*&local_buffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_114, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkMemoryRequirements(stream, (VkMemoryRequirements*)(pMemoryRequirements), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkMemoryRequirements(stream, (VkMemoryRequirements*)(pMemoryRequirements));
     if (pMemoryRequirements)
     {
         transform_fromhost_VkMemoryRequirements(mImpl->resources(), (VkMemoryRequirements*)(pMemoryRequirements));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetBufferMemoryRequirements");;
 }
 
 void VkEncoder::vkGetImageMemoryRequirements(
     VkDevice device,
     VkImage image,
-    VkMemoryRequirements* pMemoryRequirements)
+    VkMemoryRequirements* pMemoryRequirements,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetImageMemoryRequirements");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkImage local_image;
+    uint32_t local_doLock;
     local_device = device;
     local_image = image;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_135;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_135, 1);
-        countingStream->write((uint64_t*)&cgen_var_135, 1 * 8);
-        uint64_t cgen_var_136;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_136, 1);
-        countingStream->write((uint64_t*)&cgen_var_136, 1 * 8);
-        marshal_VkMemoryRequirements(countingStream, (VkMemoryRequirements*)(pMemoryRequirements));
+        uint64_t cgen_var_115;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_116;
+        *countPtr += 1 * 8;
+        count_VkMemoryRequirements(featureBits, (VkMemoryRequirements*)(pMemoryRequirements), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetImageMemoryRequirements = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetImageMemoryRequirements = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageMemoryRequirements);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetImageMemoryRequirements = OP_vkGetImageMemoryRequirements;
-    stream->write(&opcode_vkGetImageMemoryRequirements, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetImageMemoryRequirements, sizeof(uint32_t));
-    uint64_t cgen_var_137;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_137, 1);
-    stream->write((uint64_t*)&cgen_var_137, 1 * 8);
-    uint64_t cgen_var_138;
-    stream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_138, 1);
-    stream->write((uint64_t*)&cgen_var_138, 1 * 8);
-    marshal_VkMemoryRequirements(stream, (VkMemoryRequirements*)(pMemoryRequirements));
+    memcpy(streamPtr, &opcode_vkGetImageMemoryRequirements, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetImageMemoryRequirements, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_117;
+    *&cgen_var_117 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_117, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_118;
+    *&cgen_var_118 = get_host_u64_VkImage((*&local_image));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_118, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkMemoryRequirements(stream, (VkMemoryRequirements*)(pMemoryRequirements), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkMemoryRequirements(stream, (VkMemoryRequirements*)(pMemoryRequirements));
     if (pMemoryRequirements)
     {
         transform_fromhost_VkMemoryRequirements(mImpl->resources(), (VkMemoryRequirements*)(pMemoryRequirements));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetImageMemoryRequirements");;
 }
 
@@ -2196,73 +2596,83 @@
     VkDevice device,
     VkImage image,
     uint32_t* pSparseMemoryRequirementCount,
-    VkSparseImageMemoryRequirements* pSparseMemoryRequirements)
+    VkSparseImageMemoryRequirements* pSparseMemoryRequirements,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetImageSparseMemoryRequirements");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkImage local_image;
+    uint32_t local_doLock;
     local_device = device;
     local_image = image;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_139;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_139, 1);
-        countingStream->write((uint64_t*)&cgen_var_139, 1 * 8);
-        uint64_t cgen_var_140;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_140, 1);
-        countingStream->write((uint64_t*)&cgen_var_140, 1 * 8);
+        uint64_t cgen_var_119;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_120;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_141 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
-        countingStream->putBe64(cgen_var_141);
+        *countPtr += 8;
         if (pSparseMemoryRequirementCount)
         {
-            countingStream->write((uint32_t*)pSparseMemoryRequirementCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_142 = (uint64_t)(uintptr_t)pSparseMemoryRequirements;
-        countingStream->putBe64(cgen_var_142);
+        *countPtr += 8;
         if (pSparseMemoryRequirements)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
             {
-                marshal_VkSparseImageMemoryRequirements(countingStream, (VkSparseImageMemoryRequirements*)(pSparseMemoryRequirements + i));
+                count_VkSparseImageMemoryRequirements(featureBits, (VkSparseImageMemoryRequirements*)(pSparseMemoryRequirements + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetImageSparseMemoryRequirements = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetImageSparseMemoryRequirements = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageSparseMemoryRequirements);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetImageSparseMemoryRequirements = OP_vkGetImageSparseMemoryRequirements;
-    stream->write(&opcode_vkGetImageSparseMemoryRequirements, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetImageSparseMemoryRequirements, sizeof(uint32_t));
-    uint64_t cgen_var_143;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_143, 1);
-    stream->write((uint64_t*)&cgen_var_143, 1 * 8);
-    uint64_t cgen_var_144;
-    stream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_144, 1);
-    stream->write((uint64_t*)&cgen_var_144, 1 * 8);
+    memcpy(streamPtr, &opcode_vkGetImageSparseMemoryRequirements, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetImageSparseMemoryRequirements, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_121;
+    *&cgen_var_121 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_121, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_122;
+    *&cgen_var_122 = get_host_u64_VkImage((*&local_image));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_122, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_145 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
-    stream->putBe64(cgen_var_145);
+    uint64_t cgen_var_123 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
+    memcpy((*streamPtrPtr), &cgen_var_123, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pSparseMemoryRequirementCount)
     {
-        stream->write((uint32_t*)pSparseMemoryRequirementCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pSparseMemoryRequirementCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_146 = (uint64_t)(uintptr_t)pSparseMemoryRequirements;
-    stream->putBe64(cgen_var_146);
+    uint64_t cgen_var_124 = (uint64_t)(uintptr_t)pSparseMemoryRequirements;
+    memcpy((*streamPtrPtr), &cgen_var_124, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pSparseMemoryRequirements)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
         {
-            marshal_VkSparseImageMemoryRequirements(stream, (VkSparseImageMemoryRequirements*)(pSparseMemoryRequirements + i));
+            reservedmarshal_VkSparseImageMemoryRequirements(stream, (VkSparseImageMemoryRequirements*)(pSparseMemoryRequirements + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pSparseMemoryRequirementCount;
     check_pSparseMemoryRequirementCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -2295,9 +2705,13 @@
             transform_fromhost_VkSparseImageMemoryRequirements(mImpl->resources(), (VkSparseImageMemoryRequirements*)(pSparseMemoryRequirements + i));
         }
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetImageSparseMemoryRequirements");;
 }
 
@@ -2309,85 +2723,100 @@
     VkImageUsageFlags usage,
     VkImageTiling tiling,
     uint32_t* pPropertyCount,
-    VkSparseImageFormatProperties* pProperties)
+    VkSparseImageFormatProperties* pProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceSparseImageFormatProperties");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkFormat local_format;
     VkImageType local_type;
     VkSampleCountFlagBits local_samples;
     VkImageUsageFlags local_usage;
     VkImageTiling local_tiling;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_format = format;
     local_type = type;
     local_samples = samples;
     local_usage = usage;
     local_tiling = tiling;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_149;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_149, 1);
-        countingStream->write((uint64_t*)&cgen_var_149, 1 * 8);
-        countingStream->write((VkFormat*)&local_format, sizeof(VkFormat));
-        countingStream->write((VkImageType*)&local_type, sizeof(VkImageType));
-        countingStream->write((VkSampleCountFlagBits*)&local_samples, sizeof(VkSampleCountFlagBits));
-        countingStream->write((VkImageUsageFlags*)&local_usage, sizeof(VkImageUsageFlags));
-        countingStream->write((VkImageTiling*)&local_tiling, sizeof(VkImageTiling));
+        uint64_t cgen_var_127;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkFormat);
+        *countPtr += sizeof(VkImageType);
+        *countPtr += sizeof(VkSampleCountFlagBits);
+        *countPtr += sizeof(VkImageUsageFlags);
+        *countPtr += sizeof(VkImageTiling);
         // WARNING PTR CHECK
-        uint64_t cgen_var_150 = (uint64_t)(uintptr_t)pPropertyCount;
-        countingStream->putBe64(cgen_var_150);
+        *countPtr += 8;
         if (pPropertyCount)
         {
-            countingStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_151 = (uint64_t)(uintptr_t)pProperties;
-        countingStream->putBe64(cgen_var_151);
+        *countPtr += 8;
         if (pProperties)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                marshal_VkSparseImageFormatProperties(countingStream, (VkSparseImageFormatProperties*)(pProperties + i));
+                count_VkSparseImageFormatProperties(featureBits, (VkSparseImageFormatProperties*)(pProperties + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceSparseImageFormatProperties = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceSparseImageFormatProperties = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceSparseImageFormatProperties);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceSparseImageFormatProperties = OP_vkGetPhysicalDeviceSparseImageFormatProperties;
-    stream->write(&opcode_vkGetPhysicalDeviceSparseImageFormatProperties, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceSparseImageFormatProperties, sizeof(uint32_t));
-    uint64_t cgen_var_152;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_152, 1);
-    stream->write((uint64_t*)&cgen_var_152, 1 * 8);
-    stream->write((VkFormat*)&local_format, sizeof(VkFormat));
-    stream->write((VkImageType*)&local_type, sizeof(VkImageType));
-    stream->write((VkSampleCountFlagBits*)&local_samples, sizeof(VkSampleCountFlagBits));
-    stream->write((VkImageUsageFlags*)&local_usage, sizeof(VkImageUsageFlags));
-    stream->write((VkImageTiling*)&local_tiling, sizeof(VkImageTiling));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceSparseImageFormatProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceSparseImageFormatProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_128;
+    *&cgen_var_128 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_128, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkFormat*)&local_format, sizeof(VkFormat));
+    *streamPtrPtr += sizeof(VkFormat);
+    memcpy(*streamPtrPtr, (VkImageType*)&local_type, sizeof(VkImageType));
+    *streamPtrPtr += sizeof(VkImageType);
+    memcpy(*streamPtrPtr, (VkSampleCountFlagBits*)&local_samples, sizeof(VkSampleCountFlagBits));
+    *streamPtrPtr += sizeof(VkSampleCountFlagBits);
+    memcpy(*streamPtrPtr, (VkImageUsageFlags*)&local_usage, sizeof(VkImageUsageFlags));
+    *streamPtrPtr += sizeof(VkImageUsageFlags);
+    memcpy(*streamPtrPtr, (VkImageTiling*)&local_tiling, sizeof(VkImageTiling));
+    *streamPtrPtr += sizeof(VkImageTiling);
     // WARNING PTR CHECK
-    uint64_t cgen_var_153 = (uint64_t)(uintptr_t)pPropertyCount;
-    stream->putBe64(cgen_var_153);
+    uint64_t cgen_var_129 = (uint64_t)(uintptr_t)pPropertyCount;
+    memcpy((*streamPtrPtr), &cgen_var_129, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pPropertyCount)
     {
-        stream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pPropertyCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_154 = (uint64_t)(uintptr_t)pProperties;
-    stream->putBe64(cgen_var_154);
+    uint64_t cgen_var_130 = (uint64_t)(uintptr_t)pProperties;
+    memcpy((*streamPtrPtr), &cgen_var_130, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pProperties)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            marshal_VkSparseImageFormatProperties(stream, (VkSparseImageFormatProperties*)(pProperties + i));
+            reservedmarshal_VkSparseImageFormatProperties(stream, (VkSparseImageFormatProperties*)(pProperties + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pPropertyCount;
     check_pPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -2420,9 +2849,13 @@
             transform_fromhost_VkSparseImageFormatProperties(mImpl->resources(), (VkSparseImageFormatProperties*)(pProperties + i));
         }
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceSparseImageFormatProperties");;
 }
 
@@ -2430,19 +2863,19 @@
     VkQueue queue,
     uint32_t bindInfoCount,
     const VkBindSparseInfo* pBindInfo,
-    VkFence fence)
+    VkFence fence,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkQueueBindSparse");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkQueue local_queue;
     uint32_t local_bindInfoCount;
     VkBindSparseInfo* local_pBindInfo;
     VkFence local_fence;
+    uint32_t local_doLock;
     local_queue = queue;
     local_bindInfoCount = bindInfoCount;
     local_pBindInfo = nullptr;
@@ -2455,6 +2888,7 @@
         }
     }
     local_fence = fence;
+    local_doLock = doLock;
     if (local_pBindInfo)
     {
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
@@ -2462,41 +2896,52 @@
             transform_tohost_VkBindSparseInfo(mImpl->resources(), (VkBindSparseInfo*)(local_pBindInfo + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_157;
-        countingStream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_157, 1);
-        countingStream->write((uint64_t*)&cgen_var_157, 1 * 8);
-        countingStream->write((uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
+        uint64_t cgen_var_133;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
         {
-            marshal_VkBindSparseInfo(countingStream, (VkBindSparseInfo*)(local_pBindInfo + i));
+            count_VkBindSparseInfo(featureBits, (VkBindSparseInfo*)(local_pBindInfo + i), countPtr);
         }
-        uint64_t cgen_var_158;
-        countingStream->handleMapping()->mapHandles_VkFence_u64(&local_fence, &cgen_var_158, 1);
-        countingStream->write((uint64_t*)&cgen_var_158, 1 * 8);
+        uint64_t cgen_var_134;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkQueueBindSparse = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkQueueBindSparse = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkQueueBindSparse);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkQueueBindSparse = OP_vkQueueBindSparse;
-    stream->write(&opcode_vkQueueBindSparse, sizeof(uint32_t));
-    stream->write(&packetSize_vkQueueBindSparse, sizeof(uint32_t));
-    uint64_t cgen_var_159;
-    stream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_159, 1);
-    stream->write((uint64_t*)&cgen_var_159, 1 * 8);
-    stream->write((uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkQueueBindSparse, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkQueueBindSparse, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_135;
+    *&cgen_var_135 = get_host_u64_VkQueue((*&local_queue));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_135, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
     {
-        marshal_VkBindSparseInfo(stream, (VkBindSparseInfo*)(local_pBindInfo + i));
+        reservedmarshal_VkBindSparseInfo(stream, (VkBindSparseInfo*)(local_pBindInfo + i), streamPtrPtr);
     }
-    uint64_t cgen_var_160;
-    stream->handleMapping()->mapHandles_VkFence_u64(&local_fence, &cgen_var_160, 1);
-    stream->write((uint64_t*)&cgen_var_160, 1 * 8);
+    uint64_t cgen_var_136;
+    *&cgen_var_136 = get_host_u64_VkFence((*&local_fence));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_136, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkQueueBindSparse_VkResult_return = (VkResult)0;
     stream->read(&vkQueueBindSparse_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkQueueBindSparse");;
     return vkQueueBindSparse_VkResult_return;
 }
@@ -2505,18 +2950,18 @@
     VkDevice device,
     const VkFenceCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkFence* pFence)
+    VkFence* pFence,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateFence");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkFenceCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -2530,6 +2975,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -2539,54 +2985,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_161;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_161, 1);
-        countingStream->write((uint64_t*)&cgen_var_161, 1 * 8);
-        marshal_VkFenceCreateInfo(countingStream, (VkFenceCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_137;
+        *countPtr += 1 * 8;
+        count_VkFenceCreateInfo(featureBits, (VkFenceCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_162 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_162);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_163;
-        countingStream->handleMapping()->mapHandles_VkFence_u64(pFence, &cgen_var_163, 1);
-        countingStream->write((uint64_t*)&cgen_var_163, 8);
+        uint64_t cgen_var_138;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateFence = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateFence = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateFence);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateFence = OP_vkCreateFence;
-    stream->write(&opcode_vkCreateFence, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateFence, sizeof(uint32_t));
-    uint64_t cgen_var_164;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_164, 1);
-    stream->write((uint64_t*)&cgen_var_164, 1 * 8);
-    marshal_VkFenceCreateInfo(stream, (VkFenceCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateFence, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateFence, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_139;
+    *&cgen_var_139 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_139, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkFenceCreateInfo(stream, (VkFenceCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_165 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_165);
+    uint64_t cgen_var_140 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_140, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_166;
-    stream->handleMapping()->mapHandles_VkFence_u64(pFence, &cgen_var_166, 1);
-    stream->write((uint64_t*)&cgen_var_166, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_141;
+    *&cgen_var_141 = (uint64_t)((*pFence));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_141, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_167;
-    stream->read((uint64_t*)&cgen_var_167, 8);
-    stream->handleMapping()->mapHandles_u64_VkFence(&cgen_var_167, (VkFence*)pFence, 1);
+    uint64_t cgen_var_142;
+    stream->read((uint64_t*)&cgen_var_142, 8);
+    stream->handleMapping()->mapHandles_u64_VkFence(&cgen_var_142, (VkFence*)pFence, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateFence_VkResult_return = (VkResult)0;
     stream->read(&vkCreateFence_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateFence");;
     return vkCreateFence_VkResult_return;
 }
@@ -2594,18 +3051,18 @@
 void VkEncoder::vkDestroyFence(
     VkDevice device,
     VkFence fence,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyFence");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkFence local_fence;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_fence = fence;
     local_pAllocator = nullptr;
@@ -2614,67 +3071,79 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_168;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_168, 1);
-        countingStream->write((uint64_t*)&cgen_var_168, 1 * 8);
-        uint64_t cgen_var_169;
-        countingStream->handleMapping()->mapHandles_VkFence_u64(&local_fence, &cgen_var_169, 1);
-        countingStream->write((uint64_t*)&cgen_var_169, 1 * 8);
+        uint64_t cgen_var_143;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_144;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_170 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_170);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyFence = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyFence = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyFence);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyFence = OP_vkDestroyFence;
-    stream->write(&opcode_vkDestroyFence, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyFence, sizeof(uint32_t));
-    uint64_t cgen_var_171;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_171, 1);
-    stream->write((uint64_t*)&cgen_var_171, 1 * 8);
-    uint64_t cgen_var_172;
-    stream->handleMapping()->mapHandles_VkFence_u64(&local_fence, &cgen_var_172, 1);
-    stream->write((uint64_t*)&cgen_var_172, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyFence, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyFence, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_145;
+    *&cgen_var_145 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_145, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_146;
+    *&cgen_var_146 = get_host_u64_VkFence((*&local_fence));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_146, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_173 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_173);
+    uint64_t cgen_var_147 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_147, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkFence((VkFence*)&fence);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyFence");;
 }
 
 VkResult VkEncoder::vkResetFences(
     VkDevice device,
     uint32_t fenceCount,
-    const VkFence* pFences)
+    const VkFence* pFences,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkResetFences");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     uint32_t local_fenceCount;
     VkFence* local_pFences;
+    uint32_t local_doLock;
     local_device = device;
     local_fenceCount = fenceCount;
     local_pFences = nullptr;
@@ -2682,85 +3151,109 @@
     {
         local_pFences = (VkFence*)pool->dupArray(pFences, ((fenceCount)) * sizeof(const VkFence));
     }
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_174;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_174, 1);
-        countingStream->write((uint64_t*)&cgen_var_174, 1 * 8);
-        countingStream->write((uint32_t*)&local_fenceCount, sizeof(uint32_t));
+        uint64_t cgen_var_148;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         if (((fenceCount)))
         {
-            uint64_t* cgen_var_175;
-            countingStream->alloc((void**)&cgen_var_175, ((fenceCount)) * 8);
-            countingStream->handleMapping()->mapHandles_VkFence_u64(local_pFences, cgen_var_175, ((fenceCount)));
-            countingStream->write((uint64_t*)cgen_var_175, ((fenceCount)) * 8);
+            *countPtr += ((fenceCount)) * 8;
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkResetFences = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkResetFences = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkResetFences);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkResetFences = OP_vkResetFences;
-    stream->write(&opcode_vkResetFences, sizeof(uint32_t));
-    stream->write(&packetSize_vkResetFences, sizeof(uint32_t));
-    uint64_t cgen_var_176;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_176, 1);
-    stream->write((uint64_t*)&cgen_var_176, 1 * 8);
-    stream->write((uint32_t*)&local_fenceCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkResetFences, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkResetFences, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_150;
+    *&cgen_var_150 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_150, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_fenceCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     if (((fenceCount)))
     {
-        uint64_t* cgen_var_177;
-        stream->alloc((void**)&cgen_var_177, ((fenceCount)) * 8);
-        stream->handleMapping()->mapHandles_VkFence_u64(local_pFences, cgen_var_177, ((fenceCount)));
-        stream->write((uint64_t*)cgen_var_177, ((fenceCount)) * 8);
+        uint64_t* cgen_var_151;
+        stream->alloc((void**)&cgen_var_151, ((fenceCount)) * 8);
+        for (uint32_t k = 0; k < ((fenceCount)); ++k)
+        {
+            cgen_var_151[k] = get_host_u64_VkFence(local_pFences[k]);
+        }
+        memcpy(*streamPtrPtr, (uint64_t*)cgen_var_151, ((fenceCount)) * 8);
+        *streamPtrPtr += ((fenceCount)) * 8;
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkResetFences_VkResult_return = (VkResult)0;
     stream->read(&vkResetFences_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkResetFences");;
     return vkResetFences_VkResult_return;
 }
 
 VkResult VkEncoder::vkGetFenceStatus(
     VkDevice device,
-    VkFence fence)
+    VkFence fence,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetFenceStatus");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkFence local_fence;
+    uint32_t local_doLock;
     local_device = device;
     local_fence = fence;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_178;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_178, 1);
-        countingStream->write((uint64_t*)&cgen_var_178, 1 * 8);
-        uint64_t cgen_var_179;
-        countingStream->handleMapping()->mapHandles_VkFence_u64(&local_fence, &cgen_var_179, 1);
-        countingStream->write((uint64_t*)&cgen_var_179, 1 * 8);
+        uint64_t cgen_var_152;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_153;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetFenceStatus = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetFenceStatus = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetFenceStatus);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetFenceStatus = OP_vkGetFenceStatus;
-    stream->write(&opcode_vkGetFenceStatus, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetFenceStatus, sizeof(uint32_t));
-    uint64_t cgen_var_180;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_180, 1);
-    stream->write((uint64_t*)&cgen_var_180, 1 * 8);
-    uint64_t cgen_var_181;
-    stream->handleMapping()->mapHandles_VkFence_u64(&local_fence, &cgen_var_181, 1);
-    stream->write((uint64_t*)&cgen_var_181, 1 * 8);
+    memcpy(streamPtr, &opcode_vkGetFenceStatus, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetFenceStatus, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_154;
+    *&cgen_var_154 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_154, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_155;
+    *&cgen_var_155 = get_host_u64_VkFence((*&local_fence));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_155, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkGetFenceStatus_VkResult_return = (VkResult)0;
     stream->read(&vkGetFenceStatus_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetFenceStatus");;
     return vkGetFenceStatus_VkResult_return;
 }
@@ -2770,20 +3263,20 @@
     uint32_t fenceCount,
     const VkFence* pFences,
     VkBool32 waitAll,
-    uint64_t timeout)
+    uint64_t timeout,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkWaitForFences");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     uint32_t local_fenceCount;
     VkFence* local_pFences;
     VkBool32 local_waitAll;
     uint64_t local_timeout;
+    uint32_t local_doLock;
     local_device = device;
     local_fenceCount = fenceCount;
     local_pFences = nullptr;
@@ -2793,45 +3286,60 @@
     }
     local_waitAll = waitAll;
     local_timeout = timeout;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_182;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_182, 1);
-        countingStream->write((uint64_t*)&cgen_var_182, 1 * 8);
-        countingStream->write((uint32_t*)&local_fenceCount, sizeof(uint32_t));
+        uint64_t cgen_var_156;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         if (((fenceCount)))
         {
-            uint64_t* cgen_var_183;
-            countingStream->alloc((void**)&cgen_var_183, ((fenceCount)) * 8);
-            countingStream->handleMapping()->mapHandles_VkFence_u64(local_pFences, cgen_var_183, ((fenceCount)));
-            countingStream->write((uint64_t*)cgen_var_183, ((fenceCount)) * 8);
+            *countPtr += ((fenceCount)) * 8;
         }
-        countingStream->write((VkBool32*)&local_waitAll, sizeof(VkBool32));
-        countingStream->write((uint64_t*)&local_timeout, sizeof(uint64_t));
+        *countPtr += sizeof(VkBool32);
+        *countPtr += sizeof(uint64_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkWaitForFences = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkWaitForFences = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkWaitForFences);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkWaitForFences = OP_vkWaitForFences;
-    stream->write(&opcode_vkWaitForFences, sizeof(uint32_t));
-    stream->write(&packetSize_vkWaitForFences, sizeof(uint32_t));
-    uint64_t cgen_var_184;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_184, 1);
-    stream->write((uint64_t*)&cgen_var_184, 1 * 8);
-    stream->write((uint32_t*)&local_fenceCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkWaitForFences, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkWaitForFences, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_158;
+    *&cgen_var_158 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_158, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_fenceCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     if (((fenceCount)))
     {
-        uint64_t* cgen_var_185;
-        stream->alloc((void**)&cgen_var_185, ((fenceCount)) * 8);
-        stream->handleMapping()->mapHandles_VkFence_u64(local_pFences, cgen_var_185, ((fenceCount)));
-        stream->write((uint64_t*)cgen_var_185, ((fenceCount)) * 8);
+        uint64_t* cgen_var_159;
+        stream->alloc((void**)&cgen_var_159, ((fenceCount)) * 8);
+        for (uint32_t k = 0; k < ((fenceCount)); ++k)
+        {
+            cgen_var_159[k] = get_host_u64_VkFence(local_pFences[k]);
+        }
+        memcpy(*streamPtrPtr, (uint64_t*)cgen_var_159, ((fenceCount)) * 8);
+        *streamPtrPtr += ((fenceCount)) * 8;
     }
-    stream->write((VkBool32*)&local_waitAll, sizeof(VkBool32));
-    stream->write((uint64_t*)&local_timeout, sizeof(uint64_t));
+    memcpy(*streamPtrPtr, (VkBool32*)&local_waitAll, sizeof(VkBool32));
+    *streamPtrPtr += sizeof(VkBool32);
+    memcpy(*streamPtrPtr, (uint64_t*)&local_timeout, sizeof(uint64_t));
+    *streamPtrPtr += sizeof(uint64_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkWaitForFences_VkResult_return = (VkResult)0;
     stream->read(&vkWaitForFences_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkWaitForFences");;
     return vkWaitForFences_VkResult_return;
 }
@@ -2840,18 +3348,18 @@
     VkDevice device,
     const VkSemaphoreCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkSemaphore* pSemaphore)
+    VkSemaphore* pSemaphore,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateSemaphore");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkSemaphoreCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -2865,6 +3373,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -2874,54 +3383,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_186;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_186, 1);
-        countingStream->write((uint64_t*)&cgen_var_186, 1 * 8);
-        marshal_VkSemaphoreCreateInfo(countingStream, (VkSemaphoreCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_160;
+        *countPtr += 1 * 8;
+        count_VkSemaphoreCreateInfo(featureBits, (VkSemaphoreCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_187 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_187);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_188;
-        countingStream->handleMapping()->mapHandles_VkSemaphore_u64(pSemaphore, &cgen_var_188, 1);
-        countingStream->write((uint64_t*)&cgen_var_188, 8);
+        uint64_t cgen_var_161;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateSemaphore = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateSemaphore = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateSemaphore);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateSemaphore = OP_vkCreateSemaphore;
-    stream->write(&opcode_vkCreateSemaphore, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateSemaphore, sizeof(uint32_t));
-    uint64_t cgen_var_189;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_189, 1);
-    stream->write((uint64_t*)&cgen_var_189, 1 * 8);
-    marshal_VkSemaphoreCreateInfo(stream, (VkSemaphoreCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateSemaphore, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateSemaphore, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_162;
+    *&cgen_var_162 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_162, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkSemaphoreCreateInfo(stream, (VkSemaphoreCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_190 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_190);
+    uint64_t cgen_var_163 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_163, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_191;
-    stream->handleMapping()->mapHandles_VkSemaphore_u64(pSemaphore, &cgen_var_191, 1);
-    stream->write((uint64_t*)&cgen_var_191, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_164;
+    *&cgen_var_164 = (uint64_t)((*pSemaphore));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_164, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_192;
-    stream->read((uint64_t*)&cgen_var_192, 8);
-    stream->handleMapping()->mapHandles_u64_VkSemaphore(&cgen_var_192, (VkSemaphore*)pSemaphore, 1);
+    uint64_t cgen_var_165;
+    stream->read((uint64_t*)&cgen_var_165, 8);
+    stream->handleMapping()->mapHandles_u64_VkSemaphore(&cgen_var_165, (VkSemaphore*)pSemaphore, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateSemaphore_VkResult_return = (VkResult)0;
     stream->read(&vkCreateSemaphore_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateSemaphore");;
     return vkCreateSemaphore_VkResult_return;
 }
@@ -2929,18 +3449,18 @@
 void VkEncoder::vkDestroySemaphore(
     VkDevice device,
     VkSemaphore semaphore,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroySemaphore");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkSemaphore local_semaphore;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_semaphore = semaphore;
     local_pAllocator = nullptr;
@@ -2949,49 +3469,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_193;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_193, 1);
-        countingStream->write((uint64_t*)&cgen_var_193, 1 * 8);
-        uint64_t cgen_var_194;
-        countingStream->handleMapping()->mapHandles_VkSemaphore_u64(&local_semaphore, &cgen_var_194, 1);
-        countingStream->write((uint64_t*)&cgen_var_194, 1 * 8);
+        uint64_t cgen_var_166;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_167;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_195 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_195);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroySemaphore = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroySemaphore = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroySemaphore);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroySemaphore = OP_vkDestroySemaphore;
-    stream->write(&opcode_vkDestroySemaphore, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroySemaphore, sizeof(uint32_t));
-    uint64_t cgen_var_196;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_196, 1);
-    stream->write((uint64_t*)&cgen_var_196, 1 * 8);
-    uint64_t cgen_var_197;
-    stream->handleMapping()->mapHandles_VkSemaphore_u64(&local_semaphore, &cgen_var_197, 1);
-    stream->write((uint64_t*)&cgen_var_197, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroySemaphore, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroySemaphore, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_168;
+    *&cgen_var_168 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_168, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_169;
+    *&cgen_var_169 = get_host_u64_VkSemaphore((*&local_semaphore));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_169, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_198 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_198);
+    uint64_t cgen_var_170 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_170, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkSemaphore((VkSemaphore*)&semaphore);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroySemaphore");;
 }
 
@@ -2999,18 +3531,18 @@
     VkDevice device,
     const VkEventCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkEvent* pEvent)
+    VkEvent* pEvent,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateEvent");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkEventCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -3024,6 +3556,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -3033,54 +3566,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_199;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_199, 1);
-        countingStream->write((uint64_t*)&cgen_var_199, 1 * 8);
-        marshal_VkEventCreateInfo(countingStream, (VkEventCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_171;
+        *countPtr += 1 * 8;
+        count_VkEventCreateInfo(featureBits, (VkEventCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_200 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_200);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_201;
-        countingStream->handleMapping()->mapHandles_VkEvent_u64(pEvent, &cgen_var_201, 1);
-        countingStream->write((uint64_t*)&cgen_var_201, 8);
+        uint64_t cgen_var_172;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateEvent = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateEvent = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateEvent);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateEvent = OP_vkCreateEvent;
-    stream->write(&opcode_vkCreateEvent, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateEvent, sizeof(uint32_t));
-    uint64_t cgen_var_202;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_202, 1);
-    stream->write((uint64_t*)&cgen_var_202, 1 * 8);
-    marshal_VkEventCreateInfo(stream, (VkEventCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateEvent, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateEvent, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_173;
+    *&cgen_var_173 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_173, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkEventCreateInfo(stream, (VkEventCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_203 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_203);
+    uint64_t cgen_var_174 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_174, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_204;
-    stream->handleMapping()->mapHandles_VkEvent_u64(pEvent, &cgen_var_204, 1);
-    stream->write((uint64_t*)&cgen_var_204, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_175;
+    *&cgen_var_175 = (uint64_t)((*pEvent));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_175, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_205;
-    stream->read((uint64_t*)&cgen_var_205, 8);
-    stream->handleMapping()->mapHandles_u64_VkEvent(&cgen_var_205, (VkEvent*)pEvent, 1);
+    uint64_t cgen_var_176;
+    stream->read((uint64_t*)&cgen_var_176, 8);
+    stream->handleMapping()->mapHandles_u64_VkEvent(&cgen_var_176, (VkEvent*)pEvent, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateEvent_VkResult_return = (VkResult)0;
     stream->read(&vkCreateEvent_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateEvent");;
     return vkCreateEvent_VkResult_return;
 }
@@ -3088,18 +3632,18 @@
 void VkEncoder::vkDestroyEvent(
     VkDevice device,
     VkEvent event,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyEvent");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkEvent local_event;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_event = event;
     local_pAllocator = nullptr;
@@ -3108,180 +3652,225 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_206;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_206, 1);
-        countingStream->write((uint64_t*)&cgen_var_206, 1 * 8);
-        uint64_t cgen_var_207;
-        countingStream->handleMapping()->mapHandles_VkEvent_u64(&local_event, &cgen_var_207, 1);
-        countingStream->write((uint64_t*)&cgen_var_207, 1 * 8);
+        uint64_t cgen_var_177;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_178;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_208 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_208);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyEvent = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyEvent = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyEvent);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyEvent = OP_vkDestroyEvent;
-    stream->write(&opcode_vkDestroyEvent, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyEvent, sizeof(uint32_t));
-    uint64_t cgen_var_209;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_209, 1);
-    stream->write((uint64_t*)&cgen_var_209, 1 * 8);
-    uint64_t cgen_var_210;
-    stream->handleMapping()->mapHandles_VkEvent_u64(&local_event, &cgen_var_210, 1);
-    stream->write((uint64_t*)&cgen_var_210, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyEvent, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyEvent, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_179;
+    *&cgen_var_179 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_179, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_180;
+    *&cgen_var_180 = get_host_u64_VkEvent((*&local_event));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_180, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_211 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_211);
+    uint64_t cgen_var_181 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_181, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkEvent((VkEvent*)&event);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyEvent");;
 }
 
 VkResult VkEncoder::vkGetEventStatus(
     VkDevice device,
-    VkEvent event)
+    VkEvent event,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetEventStatus");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkEvent local_event;
+    uint32_t local_doLock;
     local_device = device;
     local_event = event;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_212;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_212, 1);
-        countingStream->write((uint64_t*)&cgen_var_212, 1 * 8);
-        uint64_t cgen_var_213;
-        countingStream->handleMapping()->mapHandles_VkEvent_u64(&local_event, &cgen_var_213, 1);
-        countingStream->write((uint64_t*)&cgen_var_213, 1 * 8);
+        uint64_t cgen_var_182;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_183;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetEventStatus = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetEventStatus = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetEventStatus);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetEventStatus = OP_vkGetEventStatus;
-    stream->write(&opcode_vkGetEventStatus, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetEventStatus, sizeof(uint32_t));
-    uint64_t cgen_var_214;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_214, 1);
-    stream->write((uint64_t*)&cgen_var_214, 1 * 8);
-    uint64_t cgen_var_215;
-    stream->handleMapping()->mapHandles_VkEvent_u64(&local_event, &cgen_var_215, 1);
-    stream->write((uint64_t*)&cgen_var_215, 1 * 8);
+    memcpy(streamPtr, &opcode_vkGetEventStatus, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetEventStatus, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_184;
+    *&cgen_var_184 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_184, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_185;
+    *&cgen_var_185 = get_host_u64_VkEvent((*&local_event));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_185, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkGetEventStatus_VkResult_return = (VkResult)0;
     stream->read(&vkGetEventStatus_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetEventStatus");;
     return vkGetEventStatus_VkResult_return;
 }
 
 VkResult VkEncoder::vkSetEvent(
     VkDevice device,
-    VkEvent event)
+    VkEvent event,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkSetEvent");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkEvent local_event;
+    uint32_t local_doLock;
     local_device = device;
     local_event = event;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_216;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_216, 1);
-        countingStream->write((uint64_t*)&cgen_var_216, 1 * 8);
-        uint64_t cgen_var_217;
-        countingStream->handleMapping()->mapHandles_VkEvent_u64(&local_event, &cgen_var_217, 1);
-        countingStream->write((uint64_t*)&cgen_var_217, 1 * 8);
+        uint64_t cgen_var_186;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_187;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkSetEvent = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkSetEvent = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkSetEvent);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkSetEvent = OP_vkSetEvent;
-    stream->write(&opcode_vkSetEvent, sizeof(uint32_t));
-    stream->write(&packetSize_vkSetEvent, sizeof(uint32_t));
-    uint64_t cgen_var_218;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_218, 1);
-    stream->write((uint64_t*)&cgen_var_218, 1 * 8);
-    uint64_t cgen_var_219;
-    stream->handleMapping()->mapHandles_VkEvent_u64(&local_event, &cgen_var_219, 1);
-    stream->write((uint64_t*)&cgen_var_219, 1 * 8);
+    memcpy(streamPtr, &opcode_vkSetEvent, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkSetEvent, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_188;
+    *&cgen_var_188 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_188, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_189;
+    *&cgen_var_189 = get_host_u64_VkEvent((*&local_event));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_189, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkSetEvent_VkResult_return = (VkResult)0;
     stream->read(&vkSetEvent_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkSetEvent");;
     return vkSetEvent_VkResult_return;
 }
 
 VkResult VkEncoder::vkResetEvent(
     VkDevice device,
-    VkEvent event)
+    VkEvent event,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkResetEvent");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkEvent local_event;
+    uint32_t local_doLock;
     local_device = device;
     local_event = event;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_220;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_220, 1);
-        countingStream->write((uint64_t*)&cgen_var_220, 1 * 8);
-        uint64_t cgen_var_221;
-        countingStream->handleMapping()->mapHandles_VkEvent_u64(&local_event, &cgen_var_221, 1);
-        countingStream->write((uint64_t*)&cgen_var_221, 1 * 8);
+        uint64_t cgen_var_190;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_191;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkResetEvent = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkResetEvent = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkResetEvent);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkResetEvent = OP_vkResetEvent;
-    stream->write(&opcode_vkResetEvent, sizeof(uint32_t));
-    stream->write(&packetSize_vkResetEvent, sizeof(uint32_t));
-    uint64_t cgen_var_222;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_222, 1);
-    stream->write((uint64_t*)&cgen_var_222, 1 * 8);
-    uint64_t cgen_var_223;
-    stream->handleMapping()->mapHandles_VkEvent_u64(&local_event, &cgen_var_223, 1);
-    stream->write((uint64_t*)&cgen_var_223, 1 * 8);
+    memcpy(streamPtr, &opcode_vkResetEvent, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkResetEvent, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_192;
+    *&cgen_var_192 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_192, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_193;
+    *&cgen_var_193 = get_host_u64_VkEvent((*&local_event));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_193, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkResetEvent_VkResult_return = (VkResult)0;
     stream->read(&vkResetEvent_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkResetEvent");;
     return vkResetEvent_VkResult_return;
 }
@@ -3290,18 +3879,18 @@
     VkDevice device,
     const VkQueryPoolCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkQueryPool* pQueryPool)
+    VkQueryPool* pQueryPool,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateQueryPool");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkQueryPoolCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -3315,6 +3904,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -3324,54 +3914,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_224;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_224, 1);
-        countingStream->write((uint64_t*)&cgen_var_224, 1 * 8);
-        marshal_VkQueryPoolCreateInfo(countingStream, (VkQueryPoolCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_194;
+        *countPtr += 1 * 8;
+        count_VkQueryPoolCreateInfo(featureBits, (VkQueryPoolCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_225 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_225);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_226;
-        countingStream->handleMapping()->mapHandles_VkQueryPool_u64(pQueryPool, &cgen_var_226, 1);
-        countingStream->write((uint64_t*)&cgen_var_226, 8);
+        uint64_t cgen_var_195;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateQueryPool = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateQueryPool = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateQueryPool);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateQueryPool = OP_vkCreateQueryPool;
-    stream->write(&opcode_vkCreateQueryPool, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateQueryPool, sizeof(uint32_t));
-    uint64_t cgen_var_227;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_227, 1);
-    stream->write((uint64_t*)&cgen_var_227, 1 * 8);
-    marshal_VkQueryPoolCreateInfo(stream, (VkQueryPoolCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateQueryPool, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateQueryPool, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_196;
+    *&cgen_var_196 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_196, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkQueryPoolCreateInfo(stream, (VkQueryPoolCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_228 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_228);
+    uint64_t cgen_var_197 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_197, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_229;
-    stream->handleMapping()->mapHandles_VkQueryPool_u64(pQueryPool, &cgen_var_229, 1);
-    stream->write((uint64_t*)&cgen_var_229, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_198;
+    *&cgen_var_198 = (uint64_t)((*pQueryPool));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_198, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_230;
-    stream->read((uint64_t*)&cgen_var_230, 8);
-    stream->handleMapping()->mapHandles_u64_VkQueryPool(&cgen_var_230, (VkQueryPool*)pQueryPool, 1);
+    uint64_t cgen_var_199;
+    stream->read((uint64_t*)&cgen_var_199, 8);
+    stream->handleMapping()->mapHandles_u64_VkQueryPool(&cgen_var_199, (VkQueryPool*)pQueryPool, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateQueryPool_VkResult_return = (VkResult)0;
     stream->read(&vkCreateQueryPool_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateQueryPool");;
     return vkCreateQueryPool_VkResult_return;
 }
@@ -3379,18 +3980,18 @@
 void VkEncoder::vkDestroyQueryPool(
     VkDevice device,
     VkQueryPool queryPool,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyQueryPool");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkQueryPool local_queryPool;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_queryPool = queryPool;
     local_pAllocator = nullptr;
@@ -3399,49 +4000,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_231;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_231, 1);
-        countingStream->write((uint64_t*)&cgen_var_231, 1 * 8);
-        uint64_t cgen_var_232;
-        countingStream->handleMapping()->mapHandles_VkQueryPool_u64(&local_queryPool, &cgen_var_232, 1);
-        countingStream->write((uint64_t*)&cgen_var_232, 1 * 8);
+        uint64_t cgen_var_200;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_201;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_233 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_233);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyQueryPool = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyQueryPool = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyQueryPool);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyQueryPool = OP_vkDestroyQueryPool;
-    stream->write(&opcode_vkDestroyQueryPool, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyQueryPool, sizeof(uint32_t));
-    uint64_t cgen_var_234;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_234, 1);
-    stream->write((uint64_t*)&cgen_var_234, 1 * 8);
-    uint64_t cgen_var_235;
-    stream->handleMapping()->mapHandles_VkQueryPool_u64(&local_queryPool, &cgen_var_235, 1);
-    stream->write((uint64_t*)&cgen_var_235, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyQueryPool, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyQueryPool, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_202;
+    *&cgen_var_202 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_202, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_203;
+    *&cgen_var_203 = get_host_u64_VkQueryPool((*&local_queryPool));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_203, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_236 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_236);
+    uint64_t cgen_var_204 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_204, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkQueryPool((VkQueryPool*)&queryPool);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyQueryPool");;
 }
 
@@ -3453,15 +4066,14 @@
     size_t dataSize,
     void* pData,
     VkDeviceSize stride,
-    VkQueryResultFlags flags)
+    VkQueryResultFlags flags,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetQueryPoolResults");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkQueryPool local_queryPool;
     uint32_t local_firstQuery;
@@ -3469,6 +4081,7 @@
     size_t local_dataSize;
     VkDeviceSize local_stride;
     VkQueryResultFlags local_flags;
+    uint32_t local_doLock;
     local_device = device;
     local_queryPool = queryPool;
     local_firstQuery = firstQuery;
@@ -3476,46 +4089,63 @@
     local_dataSize = dataSize;
     local_stride = stride;
     local_flags = flags;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_237;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_237, 1);
-        countingStream->write((uint64_t*)&cgen_var_237, 1 * 8);
-        uint64_t cgen_var_238;
-        countingStream->handleMapping()->mapHandles_VkQueryPool_u64(&local_queryPool, &cgen_var_238, 1);
-        countingStream->write((uint64_t*)&cgen_var_238, 1 * 8);
-        countingStream->write((uint32_t*)&local_firstQuery, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_queryCount, sizeof(uint32_t));
-        uint64_t cgen_var_239 = (uint64_t)local_dataSize;
-        countingStream->putBe64(cgen_var_239);
-        countingStream->write((void*)pData, ((dataSize)) * sizeof(uint8_t));
-        countingStream->write((VkDeviceSize*)&local_stride, sizeof(VkDeviceSize));
-        countingStream->write((VkQueryResultFlags*)&local_flags, sizeof(VkQueryResultFlags));
+        uint64_t cgen_var_205;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_206;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += 8;
+        *countPtr += ((dataSize)) * sizeof(uint8_t);
+        *countPtr += sizeof(VkDeviceSize);
+        *countPtr += sizeof(VkQueryResultFlags);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetQueryPoolResults = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetQueryPoolResults = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetQueryPoolResults);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetQueryPoolResults = OP_vkGetQueryPoolResults;
-    stream->write(&opcode_vkGetQueryPoolResults, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetQueryPoolResults, sizeof(uint32_t));
-    uint64_t cgen_var_240;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_240, 1);
-    stream->write((uint64_t*)&cgen_var_240, 1 * 8);
-    uint64_t cgen_var_241;
-    stream->handleMapping()->mapHandles_VkQueryPool_u64(&local_queryPool, &cgen_var_241, 1);
-    stream->write((uint64_t*)&cgen_var_241, 1 * 8);
-    stream->write((uint32_t*)&local_firstQuery, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_queryCount, sizeof(uint32_t));
-    uint64_t cgen_var_242 = (uint64_t)local_dataSize;
-    stream->putBe64(cgen_var_242);
-    stream->write((void*)pData, ((dataSize)) * sizeof(uint8_t));
-    stream->write((VkDeviceSize*)&local_stride, sizeof(VkDeviceSize));
-    stream->write((VkQueryResultFlags*)&local_flags, sizeof(VkQueryResultFlags));
+    memcpy(streamPtr, &opcode_vkGetQueryPoolResults, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetQueryPoolResults, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_207;
+    *&cgen_var_207 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_207, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_208;
+    *&cgen_var_208 = get_host_u64_VkQueryPool((*&local_queryPool));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_208, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_firstQuery, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_queryCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    uint64_t cgen_var_209 = (uint64_t)local_dataSize;
+    memcpy((*streamPtrPtr), &cgen_var_209, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
+    memcpy(*streamPtrPtr, (void*)pData, ((dataSize)) * sizeof(uint8_t));
+    *streamPtrPtr += ((dataSize)) * sizeof(uint8_t);
+    memcpy(*streamPtrPtr, (VkDeviceSize*)&local_stride, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    memcpy(*streamPtrPtr, (VkQueryResultFlags*)&local_flags, sizeof(VkQueryResultFlags));
+    *streamPtrPtr += sizeof(VkQueryResultFlags);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((void*)pData, ((dataSize)) * sizeof(uint8_t));
     VkResult vkGetQueryPoolResults_VkResult_return = (VkResult)0;
     stream->read(&vkGetQueryPoolResults_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetQueryPoolResults");;
     return vkGetQueryPoolResults_VkResult_return;
 }
@@ -3524,18 +4154,18 @@
     VkDevice device,
     const VkBufferCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkBuffer* pBuffer)
+    VkBuffer* pBuffer,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateBuffer");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkBufferCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -3549,6 +4179,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -3558,54 +4189,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_243;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_243, 1);
-        countingStream->write((uint64_t*)&cgen_var_243, 1 * 8);
-        marshal_VkBufferCreateInfo(countingStream, (VkBufferCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_210;
+        *countPtr += 1 * 8;
+        count_VkBufferCreateInfo(featureBits, (VkBufferCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_244 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_244);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_245;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(pBuffer, &cgen_var_245, 1);
-        countingStream->write((uint64_t*)&cgen_var_245, 8);
+        uint64_t cgen_var_211;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateBuffer = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateBuffer = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateBuffer);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateBuffer = OP_vkCreateBuffer;
-    stream->write(&opcode_vkCreateBuffer, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateBuffer, sizeof(uint32_t));
-    uint64_t cgen_var_246;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_246, 1);
-    stream->write((uint64_t*)&cgen_var_246, 1 * 8);
-    marshal_VkBufferCreateInfo(stream, (VkBufferCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateBuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateBuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_212;
+    *&cgen_var_212 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_212, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkBufferCreateInfo(stream, (VkBufferCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_247 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_247);
+    uint64_t cgen_var_213 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_213, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_248;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(pBuffer, &cgen_var_248, 1);
-    stream->write((uint64_t*)&cgen_var_248, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_214;
+    *&cgen_var_214 = (uint64_t)((*pBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_214, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_249;
-    stream->read((uint64_t*)&cgen_var_249, 8);
-    stream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_249, (VkBuffer*)pBuffer, 1);
+    uint64_t cgen_var_215;
+    stream->read((uint64_t*)&cgen_var_215, 8);
+    stream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_215, (VkBuffer*)pBuffer, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateBuffer_VkResult_return = (VkResult)0;
     stream->read(&vkCreateBuffer_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateBuffer");;
     return vkCreateBuffer_VkResult_return;
 }
@@ -3613,18 +4255,18 @@
 void VkEncoder::vkDestroyBuffer(
     VkDevice device,
     VkBuffer buffer,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyBuffer");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkBuffer local_buffer;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_buffer = buffer;
     local_pAllocator = nullptr;
@@ -3633,49 +4275,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_250;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_250, 1);
-        countingStream->write((uint64_t*)&cgen_var_250, 1 * 8);
-        uint64_t cgen_var_251;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_251, 1);
-        countingStream->write((uint64_t*)&cgen_var_251, 1 * 8);
+        uint64_t cgen_var_216;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_217;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_252 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_252);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyBuffer = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyBuffer = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyBuffer);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyBuffer = OP_vkDestroyBuffer;
-    stream->write(&opcode_vkDestroyBuffer, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyBuffer, sizeof(uint32_t));
-    uint64_t cgen_var_253;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_253, 1);
-    stream->write((uint64_t*)&cgen_var_253, 1 * 8);
-    uint64_t cgen_var_254;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_254, 1);
-    stream->write((uint64_t*)&cgen_var_254, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyBuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyBuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_218;
+    *&cgen_var_218 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_218, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_219;
+    *&cgen_var_219 = get_host_u64_VkBuffer((*&local_buffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_219, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_255 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_255);
+    uint64_t cgen_var_220 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_220, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkBuffer((VkBuffer*)&buffer);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyBuffer");;
 }
 
@@ -3683,18 +4337,18 @@
     VkDevice device,
     const VkBufferViewCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkBufferView* pView)
+    VkBufferView* pView,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateBufferView");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkBufferViewCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -3708,6 +4362,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -3717,54 +4372,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_256;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_256, 1);
-        countingStream->write((uint64_t*)&cgen_var_256, 1 * 8);
-        marshal_VkBufferViewCreateInfo(countingStream, (VkBufferViewCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_221;
+        *countPtr += 1 * 8;
+        count_VkBufferViewCreateInfo(featureBits, (VkBufferViewCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_257 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_257);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_258;
-        countingStream->handleMapping()->mapHandles_VkBufferView_u64(pView, &cgen_var_258, 1);
-        countingStream->write((uint64_t*)&cgen_var_258, 8);
+        uint64_t cgen_var_222;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateBufferView = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateBufferView = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateBufferView);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateBufferView = OP_vkCreateBufferView;
-    stream->write(&opcode_vkCreateBufferView, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateBufferView, sizeof(uint32_t));
-    uint64_t cgen_var_259;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_259, 1);
-    stream->write((uint64_t*)&cgen_var_259, 1 * 8);
-    marshal_VkBufferViewCreateInfo(stream, (VkBufferViewCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateBufferView, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateBufferView, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_223;
+    *&cgen_var_223 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_223, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkBufferViewCreateInfo(stream, (VkBufferViewCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_260 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_260);
+    uint64_t cgen_var_224 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_224, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_261;
-    stream->handleMapping()->mapHandles_VkBufferView_u64(pView, &cgen_var_261, 1);
-    stream->write((uint64_t*)&cgen_var_261, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_225;
+    *&cgen_var_225 = (uint64_t)((*pView));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_225, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_262;
-    stream->read((uint64_t*)&cgen_var_262, 8);
-    stream->handleMapping()->mapHandles_u64_VkBufferView(&cgen_var_262, (VkBufferView*)pView, 1);
+    uint64_t cgen_var_226;
+    stream->read((uint64_t*)&cgen_var_226, 8);
+    stream->handleMapping()->mapHandles_u64_VkBufferView(&cgen_var_226, (VkBufferView*)pView, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateBufferView_VkResult_return = (VkResult)0;
     stream->read(&vkCreateBufferView_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateBufferView");;
     return vkCreateBufferView_VkResult_return;
 }
@@ -3772,18 +4438,18 @@
 void VkEncoder::vkDestroyBufferView(
     VkDevice device,
     VkBufferView bufferView,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyBufferView");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkBufferView local_bufferView;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_bufferView = bufferView;
     local_pAllocator = nullptr;
@@ -3792,49 +4458,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_263;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_263, 1);
-        countingStream->write((uint64_t*)&cgen_var_263, 1 * 8);
-        uint64_t cgen_var_264;
-        countingStream->handleMapping()->mapHandles_VkBufferView_u64(&local_bufferView, &cgen_var_264, 1);
-        countingStream->write((uint64_t*)&cgen_var_264, 1 * 8);
+        uint64_t cgen_var_227;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_228;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_265 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_265);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyBufferView = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyBufferView = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyBufferView);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyBufferView = OP_vkDestroyBufferView;
-    stream->write(&opcode_vkDestroyBufferView, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyBufferView, sizeof(uint32_t));
-    uint64_t cgen_var_266;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_266, 1);
-    stream->write((uint64_t*)&cgen_var_266, 1 * 8);
-    uint64_t cgen_var_267;
-    stream->handleMapping()->mapHandles_VkBufferView_u64(&local_bufferView, &cgen_var_267, 1);
-    stream->write((uint64_t*)&cgen_var_267, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyBufferView, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyBufferView, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_229;
+    *&cgen_var_229 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_229, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_230;
+    *&cgen_var_230 = get_host_u64_VkBufferView((*&local_bufferView));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_230, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_268 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_268);
+    uint64_t cgen_var_231 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_231, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkBufferView((VkBufferView*)&bufferView);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyBufferView");;
 }
 
@@ -3842,18 +4520,18 @@
     VkDevice device,
     const VkImageCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkImage* pImage)
+    VkImage* pImage,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateImage");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkImageCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -3867,6 +4545,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     mImpl->resources()->unwrap_VkNativeBufferANDROID(pCreateInfo, local_pCreateInfo);
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -3877,54 +4556,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_269;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_269, 1);
-        countingStream->write((uint64_t*)&cgen_var_269, 1 * 8);
-        marshal_VkImageCreateInfo(countingStream, (VkImageCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_232;
+        *countPtr += 1 * 8;
+        count_VkImageCreateInfo(featureBits, (VkImageCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_270 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_270);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_271;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(pImage, &cgen_var_271, 1);
-        countingStream->write((uint64_t*)&cgen_var_271, 8);
+        uint64_t cgen_var_233;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateImage = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateImage = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateImage);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateImage = OP_vkCreateImage;
-    stream->write(&opcode_vkCreateImage, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateImage, sizeof(uint32_t));
-    uint64_t cgen_var_272;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_272, 1);
-    stream->write((uint64_t*)&cgen_var_272, 1 * 8);
-    marshal_VkImageCreateInfo(stream, (VkImageCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateImage, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateImage, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_234;
+    *&cgen_var_234 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_234, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkImageCreateInfo(stream, (VkImageCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_273 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_273);
+    uint64_t cgen_var_235 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_235, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_274;
-    stream->handleMapping()->mapHandles_VkImage_u64(pImage, &cgen_var_274, 1);
-    stream->write((uint64_t*)&cgen_var_274, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_236;
+    *&cgen_var_236 = (uint64_t)((*pImage));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_236, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_275;
-    stream->read((uint64_t*)&cgen_var_275, 8);
-    stream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_275, (VkImage*)pImage, 1);
+    uint64_t cgen_var_237;
+    stream->read((uint64_t*)&cgen_var_237, 8);
+    stream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_237, (VkImage*)pImage, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateImage_VkResult_return = (VkResult)0;
     stream->read(&vkCreateImage_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateImage");;
     return vkCreateImage_VkResult_return;
 }
@@ -3932,18 +4622,18 @@
 void VkEncoder::vkDestroyImage(
     VkDevice device,
     VkImage image,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyImage");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkImage local_image;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_image = image;
     local_pAllocator = nullptr;
@@ -3952,49 +4642,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_276;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_276, 1);
-        countingStream->write((uint64_t*)&cgen_var_276, 1 * 8);
-        uint64_t cgen_var_277;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_277, 1);
-        countingStream->write((uint64_t*)&cgen_var_277, 1 * 8);
+        uint64_t cgen_var_238;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_239;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_278 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_278);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyImage = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyImage = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyImage);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyImage = OP_vkDestroyImage;
-    stream->write(&opcode_vkDestroyImage, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyImage, sizeof(uint32_t));
-    uint64_t cgen_var_279;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_279, 1);
-    stream->write((uint64_t*)&cgen_var_279, 1 * 8);
-    uint64_t cgen_var_280;
-    stream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_280, 1);
-    stream->write((uint64_t*)&cgen_var_280, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyImage, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyImage, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_240;
+    *&cgen_var_240 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_240, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_241;
+    *&cgen_var_241 = get_host_u64_VkImage((*&local_image));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_241, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_281 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_281);
+    uint64_t cgen_var_242 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_242, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkImage((VkImage*)&image);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyImage");;
 }
 
@@ -4002,18 +4704,18 @@
     VkDevice device,
     VkImage image,
     const VkImageSubresource* pSubresource,
-    VkSubresourceLayout* pLayout)
+    VkSubresourceLayout* pLayout,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetImageSubresourceLayout");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkImage local_image;
     VkImageSubresource* local_pSubresource;
+    uint32_t local_doLock;
     local_device = device;
     local_image = image;
     local_pSubresource = nullptr;
@@ -4022,42 +4724,53 @@
         local_pSubresource = (VkImageSubresource*)pool->alloc(sizeof(const VkImageSubresource));
         deepcopy_VkImageSubresource(pool, pSubresource, (VkImageSubresource*)(local_pSubresource));
     }
+    local_doLock = doLock;
     if (local_pSubresource)
     {
         transform_tohost_VkImageSubresource(mImpl->resources(), (VkImageSubresource*)(local_pSubresource));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_282;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_282, 1);
-        countingStream->write((uint64_t*)&cgen_var_282, 1 * 8);
-        uint64_t cgen_var_283;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_283, 1);
-        countingStream->write((uint64_t*)&cgen_var_283, 1 * 8);
-        marshal_VkImageSubresource(countingStream, (VkImageSubresource*)(local_pSubresource));
-        marshal_VkSubresourceLayout(countingStream, (VkSubresourceLayout*)(pLayout));
+        uint64_t cgen_var_243;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_244;
+        *countPtr += 1 * 8;
+        count_VkImageSubresource(featureBits, (VkImageSubresource*)(local_pSubresource), countPtr);
+        count_VkSubresourceLayout(featureBits, (VkSubresourceLayout*)(pLayout), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetImageSubresourceLayout = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetImageSubresourceLayout = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageSubresourceLayout);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetImageSubresourceLayout = OP_vkGetImageSubresourceLayout;
-    stream->write(&opcode_vkGetImageSubresourceLayout, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetImageSubresourceLayout, sizeof(uint32_t));
-    uint64_t cgen_var_284;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_284, 1);
-    stream->write((uint64_t*)&cgen_var_284, 1 * 8);
-    uint64_t cgen_var_285;
-    stream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_285, 1);
-    stream->write((uint64_t*)&cgen_var_285, 1 * 8);
-    marshal_VkImageSubresource(stream, (VkImageSubresource*)(local_pSubresource));
-    marshal_VkSubresourceLayout(stream, (VkSubresourceLayout*)(pLayout));
+    memcpy(streamPtr, &opcode_vkGetImageSubresourceLayout, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetImageSubresourceLayout, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_245;
+    *&cgen_var_245 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_245, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_246;
+    *&cgen_var_246 = get_host_u64_VkImage((*&local_image));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_246, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkImageSubresource(stream, (VkImageSubresource*)(local_pSubresource), streamPtrPtr);
+    reservedmarshal_VkSubresourceLayout(stream, (VkSubresourceLayout*)(pLayout), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkSubresourceLayout(stream, (VkSubresourceLayout*)(pLayout));
     if (pLayout)
     {
         transform_fromhost_VkSubresourceLayout(mImpl->resources(), (VkSubresourceLayout*)(pLayout));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetImageSubresourceLayout");;
 }
 
@@ -4065,18 +4778,18 @@
     VkDevice device,
     const VkImageViewCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkImageView* pView)
+    VkImageView* pView,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateImageView");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkImageViewCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -4090,6 +4803,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -4099,54 +4813,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_286;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_286, 1);
-        countingStream->write((uint64_t*)&cgen_var_286, 1 * 8);
-        marshal_VkImageViewCreateInfo(countingStream, (VkImageViewCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_247;
+        *countPtr += 1 * 8;
+        count_VkImageViewCreateInfo(featureBits, (VkImageViewCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_287 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_287);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_288;
-        countingStream->handleMapping()->mapHandles_VkImageView_u64(pView, &cgen_var_288, 1);
-        countingStream->write((uint64_t*)&cgen_var_288, 8);
+        uint64_t cgen_var_248;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateImageView = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateImageView = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateImageView);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateImageView = OP_vkCreateImageView;
-    stream->write(&opcode_vkCreateImageView, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateImageView, sizeof(uint32_t));
-    uint64_t cgen_var_289;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_289, 1);
-    stream->write((uint64_t*)&cgen_var_289, 1 * 8);
-    marshal_VkImageViewCreateInfo(stream, (VkImageViewCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateImageView, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateImageView, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_249;
+    *&cgen_var_249 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_249, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkImageViewCreateInfo(stream, (VkImageViewCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_290 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_290);
+    uint64_t cgen_var_250 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_250, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_291;
-    stream->handleMapping()->mapHandles_VkImageView_u64(pView, &cgen_var_291, 1);
-    stream->write((uint64_t*)&cgen_var_291, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_251;
+    *&cgen_var_251 = (uint64_t)((*pView));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_251, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_292;
-    stream->read((uint64_t*)&cgen_var_292, 8);
-    stream->handleMapping()->mapHandles_u64_VkImageView(&cgen_var_292, (VkImageView*)pView, 1);
+    uint64_t cgen_var_252;
+    stream->read((uint64_t*)&cgen_var_252, 8);
+    stream->handleMapping()->mapHandles_u64_VkImageView(&cgen_var_252, (VkImageView*)pView, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateImageView_VkResult_return = (VkResult)0;
     stream->read(&vkCreateImageView_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateImageView");;
     return vkCreateImageView_VkResult_return;
 }
@@ -4154,18 +4879,18 @@
 void VkEncoder::vkDestroyImageView(
     VkDevice device,
     VkImageView imageView,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyImageView");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkImageView local_imageView;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_imageView = imageView;
     local_pAllocator = nullptr;
@@ -4174,49 +4899,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_293;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_293, 1);
-        countingStream->write((uint64_t*)&cgen_var_293, 1 * 8);
-        uint64_t cgen_var_294;
-        countingStream->handleMapping()->mapHandles_VkImageView_u64(&local_imageView, &cgen_var_294, 1);
-        countingStream->write((uint64_t*)&cgen_var_294, 1 * 8);
+        uint64_t cgen_var_253;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_254;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_295 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_295);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyImageView = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyImageView = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyImageView);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyImageView = OP_vkDestroyImageView;
-    stream->write(&opcode_vkDestroyImageView, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyImageView, sizeof(uint32_t));
-    uint64_t cgen_var_296;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_296, 1);
-    stream->write((uint64_t*)&cgen_var_296, 1 * 8);
-    uint64_t cgen_var_297;
-    stream->handleMapping()->mapHandles_VkImageView_u64(&local_imageView, &cgen_var_297, 1);
-    stream->write((uint64_t*)&cgen_var_297, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyImageView, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyImageView, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_255;
+    *&cgen_var_255 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_255, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_256;
+    *&cgen_var_256 = get_host_u64_VkImageView((*&local_imageView));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_256, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_298 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_298);
+    uint64_t cgen_var_257 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_257, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkImageView((VkImageView*)&imageView);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyImageView");;
 }
 
@@ -4224,18 +4961,18 @@
     VkDevice device,
     const VkShaderModuleCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkShaderModule* pShaderModule)
+    VkShaderModule* pShaderModule,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateShaderModule");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkShaderModuleCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -4249,6 +4986,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -4258,54 +4996,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_299;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_299, 1);
-        countingStream->write((uint64_t*)&cgen_var_299, 1 * 8);
-        marshal_VkShaderModuleCreateInfo(countingStream, (VkShaderModuleCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_258;
+        *countPtr += 1 * 8;
+        count_VkShaderModuleCreateInfo(featureBits, (VkShaderModuleCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_300 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_300);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_301;
-        countingStream->handleMapping()->mapHandles_VkShaderModule_u64(pShaderModule, &cgen_var_301, 1);
-        countingStream->write((uint64_t*)&cgen_var_301, 8);
+        uint64_t cgen_var_259;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateShaderModule = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateShaderModule = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateShaderModule);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateShaderModule = OP_vkCreateShaderModule;
-    stream->write(&opcode_vkCreateShaderModule, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateShaderModule, sizeof(uint32_t));
-    uint64_t cgen_var_302;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_302, 1);
-    stream->write((uint64_t*)&cgen_var_302, 1 * 8);
-    marshal_VkShaderModuleCreateInfo(stream, (VkShaderModuleCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateShaderModule, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateShaderModule, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_260;
+    *&cgen_var_260 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_260, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkShaderModuleCreateInfo(stream, (VkShaderModuleCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_303 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_303);
+    uint64_t cgen_var_261 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_261, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_304;
-    stream->handleMapping()->mapHandles_VkShaderModule_u64(pShaderModule, &cgen_var_304, 1);
-    stream->write((uint64_t*)&cgen_var_304, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_262;
+    *&cgen_var_262 = (uint64_t)((*pShaderModule));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_262, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_305;
-    stream->read((uint64_t*)&cgen_var_305, 8);
-    stream->handleMapping()->mapHandles_u64_VkShaderModule(&cgen_var_305, (VkShaderModule*)pShaderModule, 1);
+    uint64_t cgen_var_263;
+    stream->read((uint64_t*)&cgen_var_263, 8);
+    stream->handleMapping()->mapHandles_u64_VkShaderModule(&cgen_var_263, (VkShaderModule*)pShaderModule, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateShaderModule_VkResult_return = (VkResult)0;
     stream->read(&vkCreateShaderModule_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateShaderModule");;
     return vkCreateShaderModule_VkResult_return;
 }
@@ -4313,18 +5062,18 @@
 void VkEncoder::vkDestroyShaderModule(
     VkDevice device,
     VkShaderModule shaderModule,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyShaderModule");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkShaderModule local_shaderModule;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_shaderModule = shaderModule;
     local_pAllocator = nullptr;
@@ -4333,49 +5082,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_306;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_306, 1);
-        countingStream->write((uint64_t*)&cgen_var_306, 1 * 8);
-        uint64_t cgen_var_307;
-        countingStream->handleMapping()->mapHandles_VkShaderModule_u64(&local_shaderModule, &cgen_var_307, 1);
-        countingStream->write((uint64_t*)&cgen_var_307, 1 * 8);
+        uint64_t cgen_var_264;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_265;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_308 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_308);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyShaderModule = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyShaderModule = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyShaderModule);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyShaderModule = OP_vkDestroyShaderModule;
-    stream->write(&opcode_vkDestroyShaderModule, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyShaderModule, sizeof(uint32_t));
-    uint64_t cgen_var_309;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_309, 1);
-    stream->write((uint64_t*)&cgen_var_309, 1 * 8);
-    uint64_t cgen_var_310;
-    stream->handleMapping()->mapHandles_VkShaderModule_u64(&local_shaderModule, &cgen_var_310, 1);
-    stream->write((uint64_t*)&cgen_var_310, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyShaderModule, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyShaderModule, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_266;
+    *&cgen_var_266 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_266, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_267;
+    *&cgen_var_267 = get_host_u64_VkShaderModule((*&local_shaderModule));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_267, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_311 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_311);
+    uint64_t cgen_var_268 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_268, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkShaderModule((VkShaderModule*)&shaderModule);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyShaderModule");;
 }
 
@@ -4383,18 +5144,18 @@
     VkDevice device,
     const VkPipelineCacheCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkPipelineCache* pPipelineCache)
+    VkPipelineCache* pPipelineCache,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreatePipelineCache");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkPipelineCacheCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -4408,6 +5169,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -4417,54 +5179,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_312;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_312, 1);
-        countingStream->write((uint64_t*)&cgen_var_312, 1 * 8);
-        marshal_VkPipelineCacheCreateInfo(countingStream, (VkPipelineCacheCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_269;
+        *countPtr += 1 * 8;
+        count_VkPipelineCacheCreateInfo(featureBits, (VkPipelineCacheCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_313 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_313);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_314;
-        countingStream->handleMapping()->mapHandles_VkPipelineCache_u64(pPipelineCache, &cgen_var_314, 1);
-        countingStream->write((uint64_t*)&cgen_var_314, 8);
+        uint64_t cgen_var_270;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreatePipelineCache = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreatePipelineCache = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreatePipelineCache);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreatePipelineCache = OP_vkCreatePipelineCache;
-    stream->write(&opcode_vkCreatePipelineCache, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreatePipelineCache, sizeof(uint32_t));
-    uint64_t cgen_var_315;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_315, 1);
-    stream->write((uint64_t*)&cgen_var_315, 1 * 8);
-    marshal_VkPipelineCacheCreateInfo(stream, (VkPipelineCacheCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreatePipelineCache, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreatePipelineCache, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_271;
+    *&cgen_var_271 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_271, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPipelineCacheCreateInfo(stream, (VkPipelineCacheCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_316 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_316);
+    uint64_t cgen_var_272 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_272, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_317;
-    stream->handleMapping()->mapHandles_VkPipelineCache_u64(pPipelineCache, &cgen_var_317, 1);
-    stream->write((uint64_t*)&cgen_var_317, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_273;
+    *&cgen_var_273 = (uint64_t)((*pPipelineCache));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_273, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_318;
-    stream->read((uint64_t*)&cgen_var_318, 8);
-    stream->handleMapping()->mapHandles_u64_VkPipelineCache(&cgen_var_318, (VkPipelineCache*)pPipelineCache, 1);
+    uint64_t cgen_var_274;
+    stream->read((uint64_t*)&cgen_var_274, 8);
+    stream->handleMapping()->mapHandles_u64_VkPipelineCache(&cgen_var_274, (VkPipelineCache*)pPipelineCache, 1);
     stream->unsetHandleMapping();
     VkResult vkCreatePipelineCache_VkResult_return = (VkResult)0;
     stream->read(&vkCreatePipelineCache_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreatePipelineCache");;
     return vkCreatePipelineCache_VkResult_return;
 }
@@ -4472,18 +5245,18 @@
 void VkEncoder::vkDestroyPipelineCache(
     VkDevice device,
     VkPipelineCache pipelineCache,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyPipelineCache");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkPipelineCache local_pipelineCache;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pipelineCache = pipelineCache;
     local_pAllocator = nullptr;
@@ -4492,49 +5265,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_319;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_319, 1);
-        countingStream->write((uint64_t*)&cgen_var_319, 1 * 8);
-        uint64_t cgen_var_320;
-        countingStream->handleMapping()->mapHandles_VkPipelineCache_u64(&local_pipelineCache, &cgen_var_320, 1);
-        countingStream->write((uint64_t*)&cgen_var_320, 1 * 8);
+        uint64_t cgen_var_275;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_276;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_321 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_321);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyPipelineCache = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyPipelineCache = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyPipelineCache);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyPipelineCache = OP_vkDestroyPipelineCache;
-    stream->write(&opcode_vkDestroyPipelineCache, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyPipelineCache, sizeof(uint32_t));
-    uint64_t cgen_var_322;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_322, 1);
-    stream->write((uint64_t*)&cgen_var_322, 1 * 8);
-    uint64_t cgen_var_323;
-    stream->handleMapping()->mapHandles_VkPipelineCache_u64(&local_pipelineCache, &cgen_var_323, 1);
-    stream->write((uint64_t*)&cgen_var_323, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyPipelineCache, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyPipelineCache, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_277;
+    *&cgen_var_277 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_277, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_278;
+    *&cgen_var_278 = get_host_u64_VkPipelineCache((*&local_pipelineCache));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_278, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_324 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_324);
+    uint64_t cgen_var_279 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_279, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkPipelineCache((VkPipelineCache*)&pipelineCache);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyPipelineCache");;
 }
 
@@ -4542,69 +5327,80 @@
     VkDevice device,
     VkPipelineCache pipelineCache,
     size_t* pDataSize,
-    void* pData)
+    void* pData,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPipelineCacheData");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkPipelineCache local_pipelineCache;
+    uint32_t local_doLock;
     local_device = device;
     local_pipelineCache = pipelineCache;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_325;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_325, 1);
-        countingStream->write((uint64_t*)&cgen_var_325, 1 * 8);
-        uint64_t cgen_var_326;
-        countingStream->handleMapping()->mapHandles_VkPipelineCache_u64(&local_pipelineCache, &cgen_var_326, 1);
-        countingStream->write((uint64_t*)&cgen_var_326, 1 * 8);
+        uint64_t cgen_var_280;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_281;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_327 = (uint64_t)(uintptr_t)pDataSize;
-        countingStream->putBe64(cgen_var_327);
+        *countPtr += 8;
         if (pDataSize)
         {
-            uint64_t cgen_var_328 = (uint64_t)(*pDataSize);
-            countingStream->putBe64(cgen_var_328);
+            *countPtr += 8;
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_329 = (uint64_t)(uintptr_t)pData;
-        countingStream->putBe64(cgen_var_329);
+        *countPtr += 8;
         if (pData)
         {
-            countingStream->write((void*)pData, (*(pDataSize)) * sizeof(uint8_t));
+            *countPtr += (*(pDataSize)) * sizeof(uint8_t);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPipelineCacheData = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPipelineCacheData = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPipelineCacheData);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPipelineCacheData = OP_vkGetPipelineCacheData;
-    stream->write(&opcode_vkGetPipelineCacheData, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPipelineCacheData, sizeof(uint32_t));
-    uint64_t cgen_var_330;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_330, 1);
-    stream->write((uint64_t*)&cgen_var_330, 1 * 8);
-    uint64_t cgen_var_331;
-    stream->handleMapping()->mapHandles_VkPipelineCache_u64(&local_pipelineCache, &cgen_var_331, 1);
-    stream->write((uint64_t*)&cgen_var_331, 1 * 8);
+    memcpy(streamPtr, &opcode_vkGetPipelineCacheData, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPipelineCacheData, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_282;
+    *&cgen_var_282 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_282, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_283;
+    *&cgen_var_283 = get_host_u64_VkPipelineCache((*&local_pipelineCache));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_283, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_332 = (uint64_t)(uintptr_t)pDataSize;
-    stream->putBe64(cgen_var_332);
+    uint64_t cgen_var_284 = (uint64_t)(uintptr_t)pDataSize;
+    memcpy((*streamPtrPtr), &cgen_var_284, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pDataSize)
     {
-        uint64_t cgen_var_333 = (uint64_t)(*pDataSize);
-        stream->putBe64(cgen_var_333);
+        uint64_t cgen_var_285 = (uint64_t)(*pDataSize);
+        memcpy((*streamPtrPtr), &cgen_var_285, 8);
+        android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+        *streamPtrPtr += 8;
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_334 = (uint64_t)(uintptr_t)pData;
-    stream->putBe64(cgen_var_334);
+    uint64_t cgen_var_286 = (uint64_t)(uintptr_t)pData;
+    memcpy((*streamPtrPtr), &cgen_var_286, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pData)
     {
-        stream->write((void*)pData, (*(pDataSize)) * sizeof(uint8_t));
+        memcpy(*streamPtrPtr, (void*)pData, (*(pDataSize)) * sizeof(uint8_t));
+        *streamPtrPtr += (*(pDataSize)) * sizeof(uint8_t);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     size_t* check_pDataSize;
     check_pDataSize = (size_t*)(uintptr_t)stream->getBe64();
@@ -4629,9 +5425,13 @@
     }
     VkResult vkGetPipelineCacheData_VkResult_return = (VkResult)0;
     stream->read(&vkGetPipelineCacheData_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPipelineCacheData");;
     return vkGetPipelineCacheData_VkResult_return;
 }
@@ -4640,19 +5440,19 @@
     VkDevice device,
     VkPipelineCache dstCache,
     uint32_t srcCacheCount,
-    const VkPipelineCache* pSrcCaches)
+    const VkPipelineCache* pSrcCaches,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkMergePipelineCaches");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkPipelineCache local_dstCache;
     uint32_t local_srcCacheCount;
     VkPipelineCache* local_pSrcCaches;
+    uint32_t local_doLock;
     local_device = device;
     local_dstCache = dstCache;
     local_srcCacheCount = srcCacheCount;
@@ -4661,47 +5461,60 @@
     {
         local_pSrcCaches = (VkPipelineCache*)pool->dupArray(pSrcCaches, ((srcCacheCount)) * sizeof(const VkPipelineCache));
     }
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_338;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_338, 1);
-        countingStream->write((uint64_t*)&cgen_var_338, 1 * 8);
-        uint64_t cgen_var_339;
-        countingStream->handleMapping()->mapHandles_VkPipelineCache_u64(&local_dstCache, &cgen_var_339, 1);
-        countingStream->write((uint64_t*)&cgen_var_339, 1 * 8);
-        countingStream->write((uint32_t*)&local_srcCacheCount, sizeof(uint32_t));
+        uint64_t cgen_var_290;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_291;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         if (((srcCacheCount)))
         {
-            uint64_t* cgen_var_340;
-            countingStream->alloc((void**)&cgen_var_340, ((srcCacheCount)) * 8);
-            countingStream->handleMapping()->mapHandles_VkPipelineCache_u64(local_pSrcCaches, cgen_var_340, ((srcCacheCount)));
-            countingStream->write((uint64_t*)cgen_var_340, ((srcCacheCount)) * 8);
+            *countPtr += ((srcCacheCount)) * 8;
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkMergePipelineCaches = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkMergePipelineCaches = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkMergePipelineCaches);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkMergePipelineCaches = OP_vkMergePipelineCaches;
-    stream->write(&opcode_vkMergePipelineCaches, sizeof(uint32_t));
-    stream->write(&packetSize_vkMergePipelineCaches, sizeof(uint32_t));
-    uint64_t cgen_var_341;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_341, 1);
-    stream->write((uint64_t*)&cgen_var_341, 1 * 8);
-    uint64_t cgen_var_342;
-    stream->handleMapping()->mapHandles_VkPipelineCache_u64(&local_dstCache, &cgen_var_342, 1);
-    stream->write((uint64_t*)&cgen_var_342, 1 * 8);
-    stream->write((uint32_t*)&local_srcCacheCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkMergePipelineCaches, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkMergePipelineCaches, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_293;
+    *&cgen_var_293 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_293, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_294;
+    *&cgen_var_294 = get_host_u64_VkPipelineCache((*&local_dstCache));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_294, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_srcCacheCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     if (((srcCacheCount)))
     {
-        uint64_t* cgen_var_343;
-        stream->alloc((void**)&cgen_var_343, ((srcCacheCount)) * 8);
-        stream->handleMapping()->mapHandles_VkPipelineCache_u64(local_pSrcCaches, cgen_var_343, ((srcCacheCount)));
-        stream->write((uint64_t*)cgen_var_343, ((srcCacheCount)) * 8);
+        uint64_t* cgen_var_295;
+        stream->alloc((void**)&cgen_var_295, ((srcCacheCount)) * 8);
+        for (uint32_t k = 0; k < ((srcCacheCount)); ++k)
+        {
+            cgen_var_295[k] = get_host_u64_VkPipelineCache(local_pSrcCaches[k]);
+        }
+        memcpy(*streamPtrPtr, (uint64_t*)cgen_var_295, ((srcCacheCount)) * 8);
+        *streamPtrPtr += ((srcCacheCount)) * 8;
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkMergePipelineCaches_VkResult_return = (VkResult)0;
     stream->read(&vkMergePipelineCaches_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkMergePipelineCaches");;
     return vkMergePipelineCaches_VkResult_return;
 }
@@ -4712,20 +5525,20 @@
     uint32_t createInfoCount,
     const VkGraphicsPipelineCreateInfo* pCreateInfos,
     const VkAllocationCallbacks* pAllocator,
-    VkPipeline* pPipelines)
+    VkPipeline* pPipelines,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateGraphicsPipelines");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkPipelineCache local_pipelineCache;
     uint32_t local_createInfoCount;
     VkGraphicsPipelineCreateInfo* local_pCreateInfos;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pipelineCache = pipelineCache;
     local_createInfoCount = createInfoCount;
@@ -4744,6 +5557,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfos)
     {
@@ -4756,80 +5570,93 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_344;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_344, 1);
-        countingStream->write((uint64_t*)&cgen_var_344, 1 * 8);
-        uint64_t cgen_var_345;
-        countingStream->handleMapping()->mapHandles_VkPipelineCache_u64(&local_pipelineCache, &cgen_var_345, 1);
-        countingStream->write((uint64_t*)&cgen_var_345, 1 * 8);
-        countingStream->write((uint32_t*)&local_createInfoCount, sizeof(uint32_t));
+        uint64_t cgen_var_296;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_297;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
         {
-            marshal_VkGraphicsPipelineCreateInfo(countingStream, (VkGraphicsPipelineCreateInfo*)(local_pCreateInfos + i));
+            count_VkGraphicsPipelineCreateInfo(featureBits, (VkGraphicsPipelineCreateInfo*)(local_pCreateInfos + i), countPtr);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_346 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_346);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         if (((createInfoCount)))
         {
-            uint64_t* cgen_var_347;
-            countingStream->alloc((void**)&cgen_var_347, ((createInfoCount)) * 8);
-            countingStream->handleMapping()->mapHandles_VkPipeline_u64(pPipelines, cgen_var_347, ((createInfoCount)));
-            countingStream->write((uint64_t*)cgen_var_347, ((createInfoCount)) * 8);
+            *countPtr += ((createInfoCount)) * 8;
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateGraphicsPipelines = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateGraphicsPipelines = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateGraphicsPipelines);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateGraphicsPipelines = OP_vkCreateGraphicsPipelines;
-    stream->write(&opcode_vkCreateGraphicsPipelines, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateGraphicsPipelines, sizeof(uint32_t));
-    uint64_t cgen_var_348;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_348, 1);
-    stream->write((uint64_t*)&cgen_var_348, 1 * 8);
-    uint64_t cgen_var_349;
-    stream->handleMapping()->mapHandles_VkPipelineCache_u64(&local_pipelineCache, &cgen_var_349, 1);
-    stream->write((uint64_t*)&cgen_var_349, 1 * 8);
-    stream->write((uint32_t*)&local_createInfoCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkCreateGraphicsPipelines, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateGraphicsPipelines, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_299;
+    *&cgen_var_299 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_299, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_300;
+    *&cgen_var_300 = get_host_u64_VkPipelineCache((*&local_pipelineCache));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_300, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_createInfoCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
     {
-        marshal_VkGraphicsPipelineCreateInfo(stream, (VkGraphicsPipelineCreateInfo*)(local_pCreateInfos + i));
+        reservedmarshal_VkGraphicsPipelineCreateInfo(stream, (VkGraphicsPipelineCreateInfo*)(local_pCreateInfos + i), streamPtrPtr);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_350 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_350);
+    uint64_t cgen_var_301 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_301, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
+    /* is handle, possibly out */;
     if (((createInfoCount)))
     {
-        uint64_t* cgen_var_351;
-        stream->alloc((void**)&cgen_var_351, ((createInfoCount)) * 8);
-        stream->handleMapping()->mapHandles_VkPipeline_u64(pPipelines, cgen_var_351, ((createInfoCount)));
-        stream->write((uint64_t*)cgen_var_351, ((createInfoCount)) * 8);
+        uint64_t* cgen_var_302;
+        stream->alloc((void**)&cgen_var_302, ((createInfoCount)) * 8);
+        for (uint32_t k = 0; k < ((createInfoCount)); ++k)
+        {
+            cgen_var_302[k] = (uint64_t)(pPipelines[k]);
+        }
+        memcpy(*streamPtrPtr, (uint64_t*)cgen_var_302, ((createInfoCount)) * 8);
+        *streamPtrPtr += ((createInfoCount)) * 8;
     }
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
     if (((createInfoCount)))
     {
-        uint64_t* cgen_var_352;
-        stream->alloc((void**)&cgen_var_352, ((createInfoCount)) * 8);
-        stream->read((uint64_t*)cgen_var_352, ((createInfoCount)) * 8);
-        stream->handleMapping()->mapHandles_u64_VkPipeline(cgen_var_352, (VkPipeline*)pPipelines, ((createInfoCount)));
+        uint64_t* cgen_var_303;
+        stream->alloc((void**)&cgen_var_303, ((createInfoCount)) * 8);
+        stream->read((uint64_t*)cgen_var_303, ((createInfoCount)) * 8);
+        stream->handleMapping()->mapHandles_u64_VkPipeline(cgen_var_303, (VkPipeline*)pPipelines, ((createInfoCount)));
     }
     stream->unsetHandleMapping();
     VkResult vkCreateGraphicsPipelines_VkResult_return = (VkResult)0;
     stream->read(&vkCreateGraphicsPipelines_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateGraphicsPipelines");;
     return vkCreateGraphicsPipelines_VkResult_return;
 }
@@ -4840,20 +5667,20 @@
     uint32_t createInfoCount,
     const VkComputePipelineCreateInfo* pCreateInfos,
     const VkAllocationCallbacks* pAllocator,
-    VkPipeline* pPipelines)
+    VkPipeline* pPipelines,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateComputePipelines");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkPipelineCache local_pipelineCache;
     uint32_t local_createInfoCount;
     VkComputePipelineCreateInfo* local_pCreateInfos;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pipelineCache = pipelineCache;
     local_createInfoCount = createInfoCount;
@@ -4872,6 +5699,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfos)
     {
@@ -4884,80 +5712,93 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_353;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_353, 1);
-        countingStream->write((uint64_t*)&cgen_var_353, 1 * 8);
-        uint64_t cgen_var_354;
-        countingStream->handleMapping()->mapHandles_VkPipelineCache_u64(&local_pipelineCache, &cgen_var_354, 1);
-        countingStream->write((uint64_t*)&cgen_var_354, 1 * 8);
-        countingStream->write((uint32_t*)&local_createInfoCount, sizeof(uint32_t));
+        uint64_t cgen_var_304;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_305;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
         {
-            marshal_VkComputePipelineCreateInfo(countingStream, (VkComputePipelineCreateInfo*)(local_pCreateInfos + i));
+            count_VkComputePipelineCreateInfo(featureBits, (VkComputePipelineCreateInfo*)(local_pCreateInfos + i), countPtr);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_355 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_355);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         if (((createInfoCount)))
         {
-            uint64_t* cgen_var_356;
-            countingStream->alloc((void**)&cgen_var_356, ((createInfoCount)) * 8);
-            countingStream->handleMapping()->mapHandles_VkPipeline_u64(pPipelines, cgen_var_356, ((createInfoCount)));
-            countingStream->write((uint64_t*)cgen_var_356, ((createInfoCount)) * 8);
+            *countPtr += ((createInfoCount)) * 8;
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateComputePipelines = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateComputePipelines = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateComputePipelines);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateComputePipelines = OP_vkCreateComputePipelines;
-    stream->write(&opcode_vkCreateComputePipelines, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateComputePipelines, sizeof(uint32_t));
-    uint64_t cgen_var_357;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_357, 1);
-    stream->write((uint64_t*)&cgen_var_357, 1 * 8);
-    uint64_t cgen_var_358;
-    stream->handleMapping()->mapHandles_VkPipelineCache_u64(&local_pipelineCache, &cgen_var_358, 1);
-    stream->write((uint64_t*)&cgen_var_358, 1 * 8);
-    stream->write((uint32_t*)&local_createInfoCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkCreateComputePipelines, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateComputePipelines, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_307;
+    *&cgen_var_307 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_307, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_308;
+    *&cgen_var_308 = get_host_u64_VkPipelineCache((*&local_pipelineCache));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_308, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_createInfoCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i)
     {
-        marshal_VkComputePipelineCreateInfo(stream, (VkComputePipelineCreateInfo*)(local_pCreateInfos + i));
+        reservedmarshal_VkComputePipelineCreateInfo(stream, (VkComputePipelineCreateInfo*)(local_pCreateInfos + i), streamPtrPtr);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_359 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_359);
+    uint64_t cgen_var_309 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_309, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
+    /* is handle, possibly out */;
     if (((createInfoCount)))
     {
-        uint64_t* cgen_var_360;
-        stream->alloc((void**)&cgen_var_360, ((createInfoCount)) * 8);
-        stream->handleMapping()->mapHandles_VkPipeline_u64(pPipelines, cgen_var_360, ((createInfoCount)));
-        stream->write((uint64_t*)cgen_var_360, ((createInfoCount)) * 8);
+        uint64_t* cgen_var_310;
+        stream->alloc((void**)&cgen_var_310, ((createInfoCount)) * 8);
+        for (uint32_t k = 0; k < ((createInfoCount)); ++k)
+        {
+            cgen_var_310[k] = (uint64_t)(pPipelines[k]);
+        }
+        memcpy(*streamPtrPtr, (uint64_t*)cgen_var_310, ((createInfoCount)) * 8);
+        *streamPtrPtr += ((createInfoCount)) * 8;
     }
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
     if (((createInfoCount)))
     {
-        uint64_t* cgen_var_361;
-        stream->alloc((void**)&cgen_var_361, ((createInfoCount)) * 8);
-        stream->read((uint64_t*)cgen_var_361, ((createInfoCount)) * 8);
-        stream->handleMapping()->mapHandles_u64_VkPipeline(cgen_var_361, (VkPipeline*)pPipelines, ((createInfoCount)));
+        uint64_t* cgen_var_311;
+        stream->alloc((void**)&cgen_var_311, ((createInfoCount)) * 8);
+        stream->read((uint64_t*)cgen_var_311, ((createInfoCount)) * 8);
+        stream->handleMapping()->mapHandles_u64_VkPipeline(cgen_var_311, (VkPipeline*)pPipelines, ((createInfoCount)));
     }
     stream->unsetHandleMapping();
     VkResult vkCreateComputePipelines_VkResult_return = (VkResult)0;
     stream->read(&vkCreateComputePipelines_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateComputePipelines");;
     return vkCreateComputePipelines_VkResult_return;
 }
@@ -4965,18 +5806,18 @@
 void VkEncoder::vkDestroyPipeline(
     VkDevice device,
     VkPipeline pipeline,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyPipeline");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkPipeline local_pipeline;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pipeline = pipeline;
     local_pAllocator = nullptr;
@@ -4985,49 +5826,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_362;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_362, 1);
-        countingStream->write((uint64_t*)&cgen_var_362, 1 * 8);
-        uint64_t cgen_var_363;
-        countingStream->handleMapping()->mapHandles_VkPipeline_u64(&local_pipeline, &cgen_var_363, 1);
-        countingStream->write((uint64_t*)&cgen_var_363, 1 * 8);
+        uint64_t cgen_var_312;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_313;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_364 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_364);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyPipeline = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyPipeline = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyPipeline);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyPipeline = OP_vkDestroyPipeline;
-    stream->write(&opcode_vkDestroyPipeline, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyPipeline, sizeof(uint32_t));
-    uint64_t cgen_var_365;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_365, 1);
-    stream->write((uint64_t*)&cgen_var_365, 1 * 8);
-    uint64_t cgen_var_366;
-    stream->handleMapping()->mapHandles_VkPipeline_u64(&local_pipeline, &cgen_var_366, 1);
-    stream->write((uint64_t*)&cgen_var_366, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyPipeline, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyPipeline, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_314;
+    *&cgen_var_314 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_314, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_315;
+    *&cgen_var_315 = get_host_u64_VkPipeline((*&local_pipeline));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_315, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_367 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_367);
+    uint64_t cgen_var_316 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_316, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkPipeline((VkPipeline*)&pipeline);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyPipeline");;
 }
 
@@ -5035,18 +5888,18 @@
     VkDevice device,
     const VkPipelineLayoutCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkPipelineLayout* pPipelineLayout)
+    VkPipelineLayout* pPipelineLayout,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreatePipelineLayout");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkPipelineLayoutCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -5060,6 +5913,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -5069,54 +5923,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_368;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_368, 1);
-        countingStream->write((uint64_t*)&cgen_var_368, 1 * 8);
-        marshal_VkPipelineLayoutCreateInfo(countingStream, (VkPipelineLayoutCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_317;
+        *countPtr += 1 * 8;
+        count_VkPipelineLayoutCreateInfo(featureBits, (VkPipelineLayoutCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_369 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_369);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_370;
-        countingStream->handleMapping()->mapHandles_VkPipelineLayout_u64(pPipelineLayout, &cgen_var_370, 1);
-        countingStream->write((uint64_t*)&cgen_var_370, 8);
+        uint64_t cgen_var_318;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreatePipelineLayout = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreatePipelineLayout = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreatePipelineLayout);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreatePipelineLayout = OP_vkCreatePipelineLayout;
-    stream->write(&opcode_vkCreatePipelineLayout, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreatePipelineLayout, sizeof(uint32_t));
-    uint64_t cgen_var_371;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_371, 1);
-    stream->write((uint64_t*)&cgen_var_371, 1 * 8);
-    marshal_VkPipelineLayoutCreateInfo(stream, (VkPipelineLayoutCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreatePipelineLayout, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreatePipelineLayout, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_319;
+    *&cgen_var_319 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_319, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPipelineLayoutCreateInfo(stream, (VkPipelineLayoutCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_372 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_372);
+    uint64_t cgen_var_320 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_320, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_373;
-    stream->handleMapping()->mapHandles_VkPipelineLayout_u64(pPipelineLayout, &cgen_var_373, 1);
-    stream->write((uint64_t*)&cgen_var_373, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_321;
+    *&cgen_var_321 = (uint64_t)((*pPipelineLayout));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_321, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_374;
-    stream->read((uint64_t*)&cgen_var_374, 8);
-    stream->handleMapping()->mapHandles_u64_VkPipelineLayout(&cgen_var_374, (VkPipelineLayout*)pPipelineLayout, 1);
+    uint64_t cgen_var_322;
+    stream->read((uint64_t*)&cgen_var_322, 8);
+    stream->handleMapping()->mapHandles_u64_VkPipelineLayout(&cgen_var_322, (VkPipelineLayout*)pPipelineLayout, 1);
     stream->unsetHandleMapping();
     VkResult vkCreatePipelineLayout_VkResult_return = (VkResult)0;
     stream->read(&vkCreatePipelineLayout_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreatePipelineLayout");;
     return vkCreatePipelineLayout_VkResult_return;
 }
@@ -5124,18 +5989,18 @@
 void VkEncoder::vkDestroyPipelineLayout(
     VkDevice device,
     VkPipelineLayout pipelineLayout,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyPipelineLayout");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkPipelineLayout local_pipelineLayout;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pipelineLayout = pipelineLayout;
     local_pAllocator = nullptr;
@@ -5144,49 +6009,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_375;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_375, 1);
-        countingStream->write((uint64_t*)&cgen_var_375, 1 * 8);
-        uint64_t cgen_var_376;
-        countingStream->handleMapping()->mapHandles_VkPipelineLayout_u64(&local_pipelineLayout, &cgen_var_376, 1);
-        countingStream->write((uint64_t*)&cgen_var_376, 1 * 8);
+        uint64_t cgen_var_323;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_324;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_377 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_377);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyPipelineLayout = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyPipelineLayout = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyPipelineLayout);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyPipelineLayout = OP_vkDestroyPipelineLayout;
-    stream->write(&opcode_vkDestroyPipelineLayout, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyPipelineLayout, sizeof(uint32_t));
-    uint64_t cgen_var_378;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_378, 1);
-    stream->write((uint64_t*)&cgen_var_378, 1 * 8);
-    uint64_t cgen_var_379;
-    stream->handleMapping()->mapHandles_VkPipelineLayout_u64(&local_pipelineLayout, &cgen_var_379, 1);
-    stream->write((uint64_t*)&cgen_var_379, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyPipelineLayout, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyPipelineLayout, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_325;
+    *&cgen_var_325 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_325, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_326;
+    *&cgen_var_326 = get_host_u64_VkPipelineLayout((*&local_pipelineLayout));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_326, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_380 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_380);
+    uint64_t cgen_var_327 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_327, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkPipelineLayout((VkPipelineLayout*)&pipelineLayout);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyPipelineLayout");;
 }
 
@@ -5194,18 +6071,18 @@
     VkDevice device,
     const VkSamplerCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkSampler* pSampler)
+    VkSampler* pSampler,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateSampler");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkSamplerCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -5219,6 +6096,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -5228,54 +6106,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_381;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_381, 1);
-        countingStream->write((uint64_t*)&cgen_var_381, 1 * 8);
-        marshal_VkSamplerCreateInfo(countingStream, (VkSamplerCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_328;
+        *countPtr += 1 * 8;
+        count_VkSamplerCreateInfo(featureBits, (VkSamplerCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_382 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_382);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_383;
-        countingStream->handleMapping()->mapHandles_VkSampler_u64(pSampler, &cgen_var_383, 1);
-        countingStream->write((uint64_t*)&cgen_var_383, 8);
+        uint64_t cgen_var_329;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateSampler = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateSampler = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateSampler);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateSampler = OP_vkCreateSampler;
-    stream->write(&opcode_vkCreateSampler, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateSampler, sizeof(uint32_t));
-    uint64_t cgen_var_384;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_384, 1);
-    stream->write((uint64_t*)&cgen_var_384, 1 * 8);
-    marshal_VkSamplerCreateInfo(stream, (VkSamplerCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateSampler, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateSampler, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_330;
+    *&cgen_var_330 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_330, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkSamplerCreateInfo(stream, (VkSamplerCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_385 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_385);
+    uint64_t cgen_var_331 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_331, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_386;
-    stream->handleMapping()->mapHandles_VkSampler_u64(pSampler, &cgen_var_386, 1);
-    stream->write((uint64_t*)&cgen_var_386, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_332;
+    *&cgen_var_332 = (uint64_t)((*pSampler));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_332, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_387;
-    stream->read((uint64_t*)&cgen_var_387, 8);
-    stream->handleMapping()->mapHandles_u64_VkSampler(&cgen_var_387, (VkSampler*)pSampler, 1);
+    uint64_t cgen_var_333;
+    stream->read((uint64_t*)&cgen_var_333, 8);
+    stream->handleMapping()->mapHandles_u64_VkSampler(&cgen_var_333, (VkSampler*)pSampler, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateSampler_VkResult_return = (VkResult)0;
     stream->read(&vkCreateSampler_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateSampler");;
     return vkCreateSampler_VkResult_return;
 }
@@ -5283,18 +6172,18 @@
 void VkEncoder::vkDestroySampler(
     VkDevice device,
     VkSampler sampler,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroySampler");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkSampler local_sampler;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_sampler = sampler;
     local_pAllocator = nullptr;
@@ -5303,49 +6192,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_388;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_388, 1);
-        countingStream->write((uint64_t*)&cgen_var_388, 1 * 8);
-        uint64_t cgen_var_389;
-        countingStream->handleMapping()->mapHandles_VkSampler_u64(&local_sampler, &cgen_var_389, 1);
-        countingStream->write((uint64_t*)&cgen_var_389, 1 * 8);
+        uint64_t cgen_var_334;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_335;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_390 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_390);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroySampler = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroySampler = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroySampler);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroySampler = OP_vkDestroySampler;
-    stream->write(&opcode_vkDestroySampler, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroySampler, sizeof(uint32_t));
-    uint64_t cgen_var_391;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_391, 1);
-    stream->write((uint64_t*)&cgen_var_391, 1 * 8);
-    uint64_t cgen_var_392;
-    stream->handleMapping()->mapHandles_VkSampler_u64(&local_sampler, &cgen_var_392, 1);
-    stream->write((uint64_t*)&cgen_var_392, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroySampler, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroySampler, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_336;
+    *&cgen_var_336 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_336, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_337;
+    *&cgen_var_337 = get_host_u64_VkSampler((*&local_sampler));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_337, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_393 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_393);
+    uint64_t cgen_var_338 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_338, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkSampler((VkSampler*)&sampler);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroySampler");;
 }
 
@@ -5353,18 +6254,18 @@
     VkDevice device,
     const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkDescriptorSetLayout* pSetLayout)
+    VkDescriptorSetLayout* pSetLayout,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateDescriptorSetLayout");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDescriptorSetLayoutCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -5378,6 +6279,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -5387,54 +6289,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_394;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_394, 1);
-        countingStream->write((uint64_t*)&cgen_var_394, 1 * 8);
-        marshal_VkDescriptorSetLayoutCreateInfo(countingStream, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_339;
+        *countPtr += 1 * 8;
+        count_VkDescriptorSetLayoutCreateInfo(featureBits, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_395 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_395);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_396;
-        countingStream->handleMapping()->mapHandles_VkDescriptorSetLayout_u64(pSetLayout, &cgen_var_396, 1);
-        countingStream->write((uint64_t*)&cgen_var_396, 8);
+        uint64_t cgen_var_340;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateDescriptorSetLayout = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateDescriptorSetLayout = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateDescriptorSetLayout);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateDescriptorSetLayout = OP_vkCreateDescriptorSetLayout;
-    stream->write(&opcode_vkCreateDescriptorSetLayout, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateDescriptorSetLayout, sizeof(uint32_t));
-    uint64_t cgen_var_397;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_397, 1);
-    stream->write((uint64_t*)&cgen_var_397, 1 * 8);
-    marshal_VkDescriptorSetLayoutCreateInfo(stream, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateDescriptorSetLayout, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateDescriptorSetLayout, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_341;
+    *&cgen_var_341 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_341, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDescriptorSetLayoutCreateInfo(stream, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_398 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_398);
+    uint64_t cgen_var_342 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_342, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_399;
-    stream->handleMapping()->mapHandles_VkDescriptorSetLayout_u64(pSetLayout, &cgen_var_399, 1);
-    stream->write((uint64_t*)&cgen_var_399, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_343;
+    *&cgen_var_343 = (uint64_t)((*pSetLayout));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_343, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_400;
-    stream->read((uint64_t*)&cgen_var_400, 8);
-    stream->handleMapping()->mapHandles_u64_VkDescriptorSetLayout(&cgen_var_400, (VkDescriptorSetLayout*)pSetLayout, 1);
+    uint64_t cgen_var_344;
+    stream->read((uint64_t*)&cgen_var_344, 8);
+    stream->handleMapping()->mapHandles_u64_VkDescriptorSetLayout(&cgen_var_344, (VkDescriptorSetLayout*)pSetLayout, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateDescriptorSetLayout_VkResult_return = (VkResult)0;
     stream->read(&vkCreateDescriptorSetLayout_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateDescriptorSetLayout");;
     return vkCreateDescriptorSetLayout_VkResult_return;
 }
@@ -5442,18 +6355,18 @@
 void VkEncoder::vkDestroyDescriptorSetLayout(
     VkDevice device,
     VkDescriptorSetLayout descriptorSetLayout,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyDescriptorSetLayout");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDescriptorSetLayout local_descriptorSetLayout;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_descriptorSetLayout = descriptorSetLayout;
     local_pAllocator = nullptr;
@@ -5462,49 +6375,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_401;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_401, 1);
-        countingStream->write((uint64_t*)&cgen_var_401, 1 * 8);
-        uint64_t cgen_var_402;
-        countingStream->handleMapping()->mapHandles_VkDescriptorSetLayout_u64(&local_descriptorSetLayout, &cgen_var_402, 1);
-        countingStream->write((uint64_t*)&cgen_var_402, 1 * 8);
+        uint64_t cgen_var_345;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_346;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_403 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_403);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyDescriptorSetLayout = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyDescriptorSetLayout = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyDescriptorSetLayout);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyDescriptorSetLayout = OP_vkDestroyDescriptorSetLayout;
-    stream->write(&opcode_vkDestroyDescriptorSetLayout, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyDescriptorSetLayout, sizeof(uint32_t));
-    uint64_t cgen_var_404;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_404, 1);
-    stream->write((uint64_t*)&cgen_var_404, 1 * 8);
-    uint64_t cgen_var_405;
-    stream->handleMapping()->mapHandles_VkDescriptorSetLayout_u64(&local_descriptorSetLayout, &cgen_var_405, 1);
-    stream->write((uint64_t*)&cgen_var_405, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyDescriptorSetLayout, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyDescriptorSetLayout, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_347;
+    *&cgen_var_347 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_347, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_348;
+    *&cgen_var_348 = get_host_u64_VkDescriptorSetLayout((*&local_descriptorSetLayout));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_348, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_406 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_406);
+    uint64_t cgen_var_349 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_349, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkDescriptorSetLayout((VkDescriptorSetLayout*)&descriptorSetLayout);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyDescriptorSetLayout");;
 }
 
@@ -5512,18 +6437,18 @@
     VkDevice device,
     const VkDescriptorPoolCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkDescriptorPool* pDescriptorPool)
+    VkDescriptorPool* pDescriptorPool,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateDescriptorPool");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDescriptorPoolCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -5537,6 +6462,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -5546,54 +6472,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_407;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_407, 1);
-        countingStream->write((uint64_t*)&cgen_var_407, 1 * 8);
-        marshal_VkDescriptorPoolCreateInfo(countingStream, (VkDescriptorPoolCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_350;
+        *countPtr += 1 * 8;
+        count_VkDescriptorPoolCreateInfo(featureBits, (VkDescriptorPoolCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_408 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_408);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_409;
-        countingStream->handleMapping()->mapHandles_VkDescriptorPool_u64(pDescriptorPool, &cgen_var_409, 1);
-        countingStream->write((uint64_t*)&cgen_var_409, 8);
+        uint64_t cgen_var_351;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateDescriptorPool = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateDescriptorPool = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateDescriptorPool);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateDescriptorPool = OP_vkCreateDescriptorPool;
-    stream->write(&opcode_vkCreateDescriptorPool, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateDescriptorPool, sizeof(uint32_t));
-    uint64_t cgen_var_410;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_410, 1);
-    stream->write((uint64_t*)&cgen_var_410, 1 * 8);
-    marshal_VkDescriptorPoolCreateInfo(stream, (VkDescriptorPoolCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateDescriptorPool, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateDescriptorPool, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_352;
+    *&cgen_var_352 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_352, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDescriptorPoolCreateInfo(stream, (VkDescriptorPoolCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_411 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_411);
+    uint64_t cgen_var_353 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_353, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_412;
-    stream->handleMapping()->mapHandles_VkDescriptorPool_u64(pDescriptorPool, &cgen_var_412, 1);
-    stream->write((uint64_t*)&cgen_var_412, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_354;
+    *&cgen_var_354 = (uint64_t)((*pDescriptorPool));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_354, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_413;
-    stream->read((uint64_t*)&cgen_var_413, 8);
-    stream->handleMapping()->mapHandles_u64_VkDescriptorPool(&cgen_var_413, (VkDescriptorPool*)pDescriptorPool, 1);
+    uint64_t cgen_var_355;
+    stream->read((uint64_t*)&cgen_var_355, 8);
+    stream->handleMapping()->mapHandles_u64_VkDescriptorPool(&cgen_var_355, (VkDescriptorPool*)pDescriptorPool, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateDescriptorPool_VkResult_return = (VkResult)0;
     stream->read(&vkCreateDescriptorPool_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateDescriptorPool");;
     return vkCreateDescriptorPool_VkResult_return;
 }
@@ -5601,18 +6538,18 @@
 void VkEncoder::vkDestroyDescriptorPool(
     VkDevice device,
     VkDescriptorPool descriptorPool,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyDescriptorPool");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDescriptorPool local_descriptorPool;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_descriptorPool = descriptorPool;
     local_pAllocator = nullptr;
@@ -5621,97 +6558,121 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_414;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_414, 1);
-        countingStream->write((uint64_t*)&cgen_var_414, 1 * 8);
-        uint64_t cgen_var_415;
-        countingStream->handleMapping()->mapHandles_VkDescriptorPool_u64(&local_descriptorPool, &cgen_var_415, 1);
-        countingStream->write((uint64_t*)&cgen_var_415, 1 * 8);
+        uint64_t cgen_var_356;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_357;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_416 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_416);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyDescriptorPool = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyDescriptorPool = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyDescriptorPool);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyDescriptorPool = OP_vkDestroyDescriptorPool;
-    stream->write(&opcode_vkDestroyDescriptorPool, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyDescriptorPool, sizeof(uint32_t));
-    uint64_t cgen_var_417;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_417, 1);
-    stream->write((uint64_t*)&cgen_var_417, 1 * 8);
-    uint64_t cgen_var_418;
-    stream->handleMapping()->mapHandles_VkDescriptorPool_u64(&local_descriptorPool, &cgen_var_418, 1);
-    stream->write((uint64_t*)&cgen_var_418, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyDescriptorPool, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyDescriptorPool, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_358;
+    *&cgen_var_358 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_358, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_359;
+    *&cgen_var_359 = get_host_u64_VkDescriptorPool((*&local_descriptorPool));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_359, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_419 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_419);
+    uint64_t cgen_var_360 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_360, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkDescriptorPool((VkDescriptorPool*)&descriptorPool);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyDescriptorPool");;
 }
 
 VkResult VkEncoder::vkResetDescriptorPool(
     VkDevice device,
     VkDescriptorPool descriptorPool,
-    VkDescriptorPoolResetFlags flags)
+    VkDescriptorPoolResetFlags flags,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkResetDescriptorPool");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDescriptorPool local_descriptorPool;
     VkDescriptorPoolResetFlags local_flags;
+    uint32_t local_doLock;
     local_device = device;
     local_descriptorPool = descriptorPool;
     local_flags = flags;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_420;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_420, 1);
-        countingStream->write((uint64_t*)&cgen_var_420, 1 * 8);
-        uint64_t cgen_var_421;
-        countingStream->handleMapping()->mapHandles_VkDescriptorPool_u64(&local_descriptorPool, &cgen_var_421, 1);
-        countingStream->write((uint64_t*)&cgen_var_421, 1 * 8);
-        countingStream->write((VkDescriptorPoolResetFlags*)&local_flags, sizeof(VkDescriptorPoolResetFlags));
+        uint64_t cgen_var_361;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_362;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkDescriptorPoolResetFlags);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkResetDescriptorPool = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkResetDescriptorPool = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkResetDescriptorPool);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkResetDescriptorPool = OP_vkResetDescriptorPool;
-    stream->write(&opcode_vkResetDescriptorPool, sizeof(uint32_t));
-    stream->write(&packetSize_vkResetDescriptorPool, sizeof(uint32_t));
-    uint64_t cgen_var_422;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_422, 1);
-    stream->write((uint64_t*)&cgen_var_422, 1 * 8);
-    uint64_t cgen_var_423;
-    stream->handleMapping()->mapHandles_VkDescriptorPool_u64(&local_descriptorPool, &cgen_var_423, 1);
-    stream->write((uint64_t*)&cgen_var_423, 1 * 8);
-    stream->write((VkDescriptorPoolResetFlags*)&local_flags, sizeof(VkDescriptorPoolResetFlags));
+    memcpy(streamPtr, &opcode_vkResetDescriptorPool, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkResetDescriptorPool, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_363;
+    *&cgen_var_363 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_363, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_364;
+    *&cgen_var_364 = get_host_u64_VkDescriptorPool((*&local_descriptorPool));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_364, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkDescriptorPoolResetFlags*)&local_flags, sizeof(VkDescriptorPoolResetFlags));
+    *streamPtrPtr += sizeof(VkDescriptorPoolResetFlags);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkResetDescriptorPool_VkResult_return = (VkResult)0;
     stream->read(&vkResetDescriptorPool_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkResetDescriptorPool");;
     return vkResetDescriptorPool_VkResult_return;
 }
@@ -5719,17 +6680,17 @@
 VkResult VkEncoder::vkAllocateDescriptorSets(
     VkDevice device,
     const VkDescriptorSetAllocateInfo* pAllocateInfo,
-    VkDescriptorSet* pDescriptorSets)
+    VkDescriptorSet* pDescriptorSets,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkAllocateDescriptorSets");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDescriptorSetAllocateInfo* local_pAllocateInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pAllocateInfo = nullptr;
     if (pAllocateInfo)
@@ -5737,56 +6698,68 @@
         local_pAllocateInfo = (VkDescriptorSetAllocateInfo*)pool->alloc(sizeof(const VkDescriptorSetAllocateInfo));
         deepcopy_VkDescriptorSetAllocateInfo(pool, pAllocateInfo, (VkDescriptorSetAllocateInfo*)(local_pAllocateInfo));
     }
+    local_doLock = doLock;
     if (local_pAllocateInfo)
     {
         transform_tohost_VkDescriptorSetAllocateInfo(mImpl->resources(), (VkDescriptorSetAllocateInfo*)(local_pAllocateInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_424;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_424, 1);
-        countingStream->write((uint64_t*)&cgen_var_424, 1 * 8);
-        marshal_VkDescriptorSetAllocateInfo(countingStream, (VkDescriptorSetAllocateInfo*)(local_pAllocateInfo));
+        uint64_t cgen_var_365;
+        *countPtr += 1 * 8;
+        count_VkDescriptorSetAllocateInfo(featureBits, (VkDescriptorSetAllocateInfo*)(local_pAllocateInfo), countPtr);
         if (pAllocateInfo->descriptorSetCount)
         {
-            uint64_t* cgen_var_425;
-            countingStream->alloc((void**)&cgen_var_425, pAllocateInfo->descriptorSetCount * 8);
-            countingStream->handleMapping()->mapHandles_VkDescriptorSet_u64(pDescriptorSets, cgen_var_425, pAllocateInfo->descriptorSetCount);
-            countingStream->write((uint64_t*)cgen_var_425, pAllocateInfo->descriptorSetCount * 8);
+            *countPtr += pAllocateInfo->descriptorSetCount * 8;
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkAllocateDescriptorSets = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkAllocateDescriptorSets = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkAllocateDescriptorSets);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkAllocateDescriptorSets = OP_vkAllocateDescriptorSets;
-    stream->write(&opcode_vkAllocateDescriptorSets, sizeof(uint32_t));
-    stream->write(&packetSize_vkAllocateDescriptorSets, sizeof(uint32_t));
-    uint64_t cgen_var_426;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_426, 1);
-    stream->write((uint64_t*)&cgen_var_426, 1 * 8);
-    marshal_VkDescriptorSetAllocateInfo(stream, (VkDescriptorSetAllocateInfo*)(local_pAllocateInfo));
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
+    memcpy(streamPtr, &opcode_vkAllocateDescriptorSets, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkAllocateDescriptorSets, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_367;
+    *&cgen_var_367 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_367, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDescriptorSetAllocateInfo(stream, (VkDescriptorSetAllocateInfo*)(local_pAllocateInfo), streamPtrPtr);
+    /* is handle, possibly out */;
     if (pAllocateInfo->descriptorSetCount)
     {
-        uint64_t* cgen_var_427;
-        stream->alloc((void**)&cgen_var_427, pAllocateInfo->descriptorSetCount * 8);
-        stream->handleMapping()->mapHandles_VkDescriptorSet_u64(pDescriptorSets, cgen_var_427, pAllocateInfo->descriptorSetCount);
-        stream->write((uint64_t*)cgen_var_427, pAllocateInfo->descriptorSetCount * 8);
+        uint64_t* cgen_var_368;
+        stream->alloc((void**)&cgen_var_368, pAllocateInfo->descriptorSetCount * 8);
+        for (uint32_t k = 0; k < pAllocateInfo->descriptorSetCount; ++k)
+        {
+            cgen_var_368[k] = (uint64_t)(pDescriptorSets[k]);
+        }
+        memcpy(*streamPtrPtr, (uint64_t*)cgen_var_368, pAllocateInfo->descriptorSetCount * 8);
+        *streamPtrPtr += pAllocateInfo->descriptorSetCount * 8;
     }
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
     if (pAllocateInfo->descriptorSetCount)
     {
-        uint64_t* cgen_var_428;
-        stream->alloc((void**)&cgen_var_428, pAllocateInfo->descriptorSetCount * 8);
-        stream->read((uint64_t*)cgen_var_428, pAllocateInfo->descriptorSetCount * 8);
-        stream->handleMapping()->mapHandles_u64_VkDescriptorSet(cgen_var_428, (VkDescriptorSet*)pDescriptorSets, pAllocateInfo->descriptorSetCount);
+        uint64_t* cgen_var_369;
+        stream->alloc((void**)&cgen_var_369, pAllocateInfo->descriptorSetCount * 8);
+        stream->read((uint64_t*)cgen_var_369, pAllocateInfo->descriptorSetCount * 8);
+        stream->handleMapping()->mapHandles_u64_VkDescriptorSet(cgen_var_369, (VkDescriptorSet*)pDescriptorSets, pAllocateInfo->descriptorSetCount);
     }
     stream->unsetHandleMapping();
     VkResult vkAllocateDescriptorSets_VkResult_return = (VkResult)0;
     stream->read(&vkAllocateDescriptorSets_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkAllocateDescriptorSets");;
     return vkAllocateDescriptorSets_VkResult_return;
 }
@@ -5795,19 +6768,19 @@
     VkDevice device,
     VkDescriptorPool descriptorPool,
     uint32_t descriptorSetCount,
-    const VkDescriptorSet* pDescriptorSets)
+    const VkDescriptorSet* pDescriptorSets,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkFreeDescriptorSets");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDescriptorPool local_descriptorPool;
     uint32_t local_descriptorSetCount;
     VkDescriptorSet* local_pDescriptorSets;
+    uint32_t local_doLock;
     local_device = device;
     local_descriptorPool = descriptorPool;
     local_descriptorSetCount = descriptorSetCount;
@@ -5816,63 +6789,77 @@
     {
         local_pDescriptorSets = (VkDescriptorSet*)pool->dupArray(pDescriptorSets, ((descriptorSetCount)) * sizeof(const VkDescriptorSet));
     }
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_429;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_429, 1);
-        countingStream->write((uint64_t*)&cgen_var_429, 1 * 8);
-        uint64_t cgen_var_430;
-        countingStream->handleMapping()->mapHandles_VkDescriptorPool_u64(&local_descriptorPool, &cgen_var_430, 1);
-        countingStream->write((uint64_t*)&cgen_var_430, 1 * 8);
-        countingStream->write((uint32_t*)&local_descriptorSetCount, sizeof(uint32_t));
+        uint64_t cgen_var_370;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_371;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         // WARNING PTR CHECK
-        uint64_t cgen_var_431 = (uint64_t)(uintptr_t)local_pDescriptorSets;
-        countingStream->putBe64(cgen_var_431);
+        *countPtr += 8;
         if (local_pDescriptorSets)
         {
             if (((descriptorSetCount)))
             {
-                uint64_t* cgen_var_432;
-                countingStream->alloc((void**)&cgen_var_432, ((descriptorSetCount)) * 8);
-                countingStream->handleMapping()->mapHandles_VkDescriptorSet_u64(local_pDescriptorSets, cgen_var_432, ((descriptorSetCount)));
-                countingStream->write((uint64_t*)cgen_var_432, ((descriptorSetCount)) * 8);
+                *countPtr += ((descriptorSetCount)) * 8;
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkFreeDescriptorSets = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkFreeDescriptorSets = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkFreeDescriptorSets);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkFreeDescriptorSets = OP_vkFreeDescriptorSets;
-    stream->write(&opcode_vkFreeDescriptorSets, sizeof(uint32_t));
-    stream->write(&packetSize_vkFreeDescriptorSets, sizeof(uint32_t));
-    uint64_t cgen_var_433;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_433, 1);
-    stream->write((uint64_t*)&cgen_var_433, 1 * 8);
-    uint64_t cgen_var_434;
-    stream->handleMapping()->mapHandles_VkDescriptorPool_u64(&local_descriptorPool, &cgen_var_434, 1);
-    stream->write((uint64_t*)&cgen_var_434, 1 * 8);
-    stream->write((uint32_t*)&local_descriptorSetCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkFreeDescriptorSets, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkFreeDescriptorSets, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_373;
+    *&cgen_var_373 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_373, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_374;
+    *&cgen_var_374 = get_host_u64_VkDescriptorPool((*&local_descriptorPool));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_374, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_descriptorSetCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
-    uint64_t cgen_var_435 = (uint64_t)(uintptr_t)local_pDescriptorSets;
-    stream->putBe64(cgen_var_435);
+    uint64_t cgen_var_375 = (uint64_t)(uintptr_t)local_pDescriptorSets;
+    memcpy((*streamPtrPtr), &cgen_var_375, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pDescriptorSets)
     {
         if (((descriptorSetCount)))
         {
-            uint64_t* cgen_var_436;
-            stream->alloc((void**)&cgen_var_436, ((descriptorSetCount)) * 8);
-            stream->handleMapping()->mapHandles_VkDescriptorSet_u64(local_pDescriptorSets, cgen_var_436, ((descriptorSetCount)));
-            stream->write((uint64_t*)cgen_var_436, ((descriptorSetCount)) * 8);
+            uint64_t* cgen_var_376;
+            stream->alloc((void**)&cgen_var_376, ((descriptorSetCount)) * 8);
+            for (uint32_t k = 0; k < ((descriptorSetCount)); ++k)
+            {
+                cgen_var_376[k] = get_host_u64_VkDescriptorSet(local_pDescriptorSets[k]);
+            }
+            memcpy(*streamPtrPtr, (uint64_t*)cgen_var_376, ((descriptorSetCount)) * 8);
+            *streamPtrPtr += ((descriptorSetCount)) * 8;
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkFreeDescriptorSets_VkResult_return = (VkResult)0;
     stream->read(&vkFreeDescriptorSets_VkResult_return, sizeof(VkResult));
     if (pDescriptorSets)
     {
         resources->destroyMapping()->mapHandles_VkDescriptorSet((VkDescriptorSet*)pDescriptorSets, ((descriptorSetCount)));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkFreeDescriptorSets");;
     return vkFreeDescriptorSets_VkResult_return;
 }
@@ -5882,20 +6869,20 @@
     uint32_t descriptorWriteCount,
     const VkWriteDescriptorSet* pDescriptorWrites,
     uint32_t descriptorCopyCount,
-    const VkCopyDescriptorSet* pDescriptorCopies)
+    const VkCopyDescriptorSet* pDescriptorCopies,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkUpdateDescriptorSets");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     uint32_t local_descriptorWriteCount;
     VkWriteDescriptorSet* local_pDescriptorWrites;
     uint32_t local_descriptorCopyCount;
     VkCopyDescriptorSet* local_pDescriptorCopies;
+    uint32_t local_doLock;
     local_device = device;
     local_descriptorWriteCount = descriptorWriteCount;
     local_pDescriptorWrites = nullptr;
@@ -5917,6 +6904,7 @@
             deepcopy_VkCopyDescriptorSet(pool, pDescriptorCopies + i, (VkCopyDescriptorSet*)(local_pDescriptorCopies + i));
         }
     }
+    local_doLock = doLock;
     if (local_pDescriptorWrites)
     {
         for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i)
@@ -5931,43 +6919,55 @@
             transform_tohost_VkCopyDescriptorSet(mImpl->resources(), (VkCopyDescriptorSet*)(local_pDescriptorCopies + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_437;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_437, 1);
-        countingStream->write((uint64_t*)&cgen_var_437, 1 * 8);
-        countingStream->write((uint32_t*)&local_descriptorWriteCount, sizeof(uint32_t));
+        uint64_t cgen_var_377;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i)
         {
-            marshal_VkWriteDescriptorSet(countingStream, (VkWriteDescriptorSet*)(local_pDescriptorWrites + i));
+            count_VkWriteDescriptorSet(featureBits, (VkWriteDescriptorSet*)(local_pDescriptorWrites + i), countPtr);
         }
-        countingStream->write((uint32_t*)&local_descriptorCopyCount, sizeof(uint32_t));
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((descriptorCopyCount)); ++i)
         {
-            marshal_VkCopyDescriptorSet(countingStream, (VkCopyDescriptorSet*)(local_pDescriptorCopies + i));
+            count_VkCopyDescriptorSet(featureBits, (VkCopyDescriptorSet*)(local_pDescriptorCopies + i), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkUpdateDescriptorSets = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkUpdateDescriptorSets = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkUpdateDescriptorSets);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkUpdateDescriptorSets = OP_vkUpdateDescriptorSets;
-    stream->write(&opcode_vkUpdateDescriptorSets, sizeof(uint32_t));
-    stream->write(&packetSize_vkUpdateDescriptorSets, sizeof(uint32_t));
-    uint64_t cgen_var_438;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_438, 1);
-    stream->write((uint64_t*)&cgen_var_438, 1 * 8);
-    stream->write((uint32_t*)&local_descriptorWriteCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkUpdateDescriptorSets, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkUpdateDescriptorSets, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_378;
+    *&cgen_var_378 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_378, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_descriptorWriteCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i)
     {
-        marshal_VkWriteDescriptorSet(stream, (VkWriteDescriptorSet*)(local_pDescriptorWrites + i));
+        reservedmarshal_VkWriteDescriptorSet(stream, (VkWriteDescriptorSet*)(local_pDescriptorWrites + i), streamPtrPtr);
     }
-    stream->write((uint32_t*)&local_descriptorCopyCount, sizeof(uint32_t));
+    memcpy(*streamPtrPtr, (uint32_t*)&local_descriptorCopyCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((descriptorCopyCount)); ++i)
     {
-        marshal_VkCopyDescriptorSet(stream, (VkCopyDescriptorSet*)(local_pDescriptorCopies + i));
+        reservedmarshal_VkCopyDescriptorSet(stream, (VkCopyDescriptorSet*)(local_pDescriptorCopies + i), streamPtrPtr);
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkUpdateDescriptorSets");;
 }
 
@@ -5975,18 +6975,18 @@
     VkDevice device,
     const VkFramebufferCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkFramebuffer* pFramebuffer)
+    VkFramebuffer* pFramebuffer,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateFramebuffer");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkFramebufferCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -6000,6 +7000,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -6009,54 +7010,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_439;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_439, 1);
-        countingStream->write((uint64_t*)&cgen_var_439, 1 * 8);
-        marshal_VkFramebufferCreateInfo(countingStream, (VkFramebufferCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_379;
+        *countPtr += 1 * 8;
+        count_VkFramebufferCreateInfo(featureBits, (VkFramebufferCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_440 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_440);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_441;
-        countingStream->handleMapping()->mapHandles_VkFramebuffer_u64(pFramebuffer, &cgen_var_441, 1);
-        countingStream->write((uint64_t*)&cgen_var_441, 8);
+        uint64_t cgen_var_380;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateFramebuffer = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateFramebuffer = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateFramebuffer);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateFramebuffer = OP_vkCreateFramebuffer;
-    stream->write(&opcode_vkCreateFramebuffer, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateFramebuffer, sizeof(uint32_t));
-    uint64_t cgen_var_442;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_442, 1);
-    stream->write((uint64_t*)&cgen_var_442, 1 * 8);
-    marshal_VkFramebufferCreateInfo(stream, (VkFramebufferCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateFramebuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateFramebuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_381;
+    *&cgen_var_381 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_381, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkFramebufferCreateInfo(stream, (VkFramebufferCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_443 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_443);
+    uint64_t cgen_var_382 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_382, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_444;
-    stream->handleMapping()->mapHandles_VkFramebuffer_u64(pFramebuffer, &cgen_var_444, 1);
-    stream->write((uint64_t*)&cgen_var_444, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_383;
+    *&cgen_var_383 = (uint64_t)((*pFramebuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_383, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_445;
-    stream->read((uint64_t*)&cgen_var_445, 8);
-    stream->handleMapping()->mapHandles_u64_VkFramebuffer(&cgen_var_445, (VkFramebuffer*)pFramebuffer, 1);
+    uint64_t cgen_var_384;
+    stream->read((uint64_t*)&cgen_var_384, 8);
+    stream->handleMapping()->mapHandles_u64_VkFramebuffer(&cgen_var_384, (VkFramebuffer*)pFramebuffer, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateFramebuffer_VkResult_return = (VkResult)0;
     stream->read(&vkCreateFramebuffer_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateFramebuffer");;
     return vkCreateFramebuffer_VkResult_return;
 }
@@ -6064,18 +7076,18 @@
 void VkEncoder::vkDestroyFramebuffer(
     VkDevice device,
     VkFramebuffer framebuffer,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyFramebuffer");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkFramebuffer local_framebuffer;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_framebuffer = framebuffer;
     local_pAllocator = nullptr;
@@ -6084,49 +7096,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_446;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_446, 1);
-        countingStream->write((uint64_t*)&cgen_var_446, 1 * 8);
-        uint64_t cgen_var_447;
-        countingStream->handleMapping()->mapHandles_VkFramebuffer_u64(&local_framebuffer, &cgen_var_447, 1);
-        countingStream->write((uint64_t*)&cgen_var_447, 1 * 8);
+        uint64_t cgen_var_385;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_386;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_448 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_448);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyFramebuffer = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyFramebuffer = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyFramebuffer);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyFramebuffer = OP_vkDestroyFramebuffer;
-    stream->write(&opcode_vkDestroyFramebuffer, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyFramebuffer, sizeof(uint32_t));
-    uint64_t cgen_var_449;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_449, 1);
-    stream->write((uint64_t*)&cgen_var_449, 1 * 8);
-    uint64_t cgen_var_450;
-    stream->handleMapping()->mapHandles_VkFramebuffer_u64(&local_framebuffer, &cgen_var_450, 1);
-    stream->write((uint64_t*)&cgen_var_450, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyFramebuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyFramebuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_387;
+    *&cgen_var_387 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_387, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_388;
+    *&cgen_var_388 = get_host_u64_VkFramebuffer((*&local_framebuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_388, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_451 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_451);
+    uint64_t cgen_var_389 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_389, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkFramebuffer((VkFramebuffer*)&framebuffer);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyFramebuffer");;
 }
 
@@ -6134,18 +7158,18 @@
     VkDevice device,
     const VkRenderPassCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkRenderPass* pRenderPass)
+    VkRenderPass* pRenderPass,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateRenderPass");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkRenderPassCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -6159,6 +7183,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -6168,54 +7193,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_452;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_452, 1);
-        countingStream->write((uint64_t*)&cgen_var_452, 1 * 8);
-        marshal_VkRenderPassCreateInfo(countingStream, (VkRenderPassCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_390;
+        *countPtr += 1 * 8;
+        count_VkRenderPassCreateInfo(featureBits, (VkRenderPassCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_453 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_453);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_454;
-        countingStream->handleMapping()->mapHandles_VkRenderPass_u64(pRenderPass, &cgen_var_454, 1);
-        countingStream->write((uint64_t*)&cgen_var_454, 8);
+        uint64_t cgen_var_391;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateRenderPass = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateRenderPass = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateRenderPass);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateRenderPass = OP_vkCreateRenderPass;
-    stream->write(&opcode_vkCreateRenderPass, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateRenderPass, sizeof(uint32_t));
-    uint64_t cgen_var_455;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_455, 1);
-    stream->write((uint64_t*)&cgen_var_455, 1 * 8);
-    marshal_VkRenderPassCreateInfo(stream, (VkRenderPassCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateRenderPass, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateRenderPass, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_392;
+    *&cgen_var_392 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_392, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkRenderPassCreateInfo(stream, (VkRenderPassCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_456 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_456);
+    uint64_t cgen_var_393 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_393, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_457;
-    stream->handleMapping()->mapHandles_VkRenderPass_u64(pRenderPass, &cgen_var_457, 1);
-    stream->write((uint64_t*)&cgen_var_457, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_394;
+    *&cgen_var_394 = (uint64_t)((*pRenderPass));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_394, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_458;
-    stream->read((uint64_t*)&cgen_var_458, 8);
-    stream->handleMapping()->mapHandles_u64_VkRenderPass(&cgen_var_458, (VkRenderPass*)pRenderPass, 1);
+    uint64_t cgen_var_395;
+    stream->read((uint64_t*)&cgen_var_395, 8);
+    stream->handleMapping()->mapHandles_u64_VkRenderPass(&cgen_var_395, (VkRenderPass*)pRenderPass, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateRenderPass_VkResult_return = (VkResult)0;
     stream->read(&vkCreateRenderPass_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateRenderPass");;
     return vkCreateRenderPass_VkResult_return;
 }
@@ -6223,18 +7259,18 @@
 void VkEncoder::vkDestroyRenderPass(
     VkDevice device,
     VkRenderPass renderPass,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyRenderPass");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkRenderPass local_renderPass;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_renderPass = renderPass;
     local_pAllocator = nullptr;
@@ -6243,98 +7279,121 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_459;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_459, 1);
-        countingStream->write((uint64_t*)&cgen_var_459, 1 * 8);
-        uint64_t cgen_var_460;
-        countingStream->handleMapping()->mapHandles_VkRenderPass_u64(&local_renderPass, &cgen_var_460, 1);
-        countingStream->write((uint64_t*)&cgen_var_460, 1 * 8);
+        uint64_t cgen_var_396;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_397;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_461 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_461);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyRenderPass = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyRenderPass = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyRenderPass);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyRenderPass = OP_vkDestroyRenderPass;
-    stream->write(&opcode_vkDestroyRenderPass, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyRenderPass, sizeof(uint32_t));
-    uint64_t cgen_var_462;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_462, 1);
-    stream->write((uint64_t*)&cgen_var_462, 1 * 8);
-    uint64_t cgen_var_463;
-    stream->handleMapping()->mapHandles_VkRenderPass_u64(&local_renderPass, &cgen_var_463, 1);
-    stream->write((uint64_t*)&cgen_var_463, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyRenderPass, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyRenderPass, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_398;
+    *&cgen_var_398 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_398, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_399;
+    *&cgen_var_399 = get_host_u64_VkRenderPass((*&local_renderPass));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_399, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_464 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_464);
+    uint64_t cgen_var_400 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_400, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkRenderPass((VkRenderPass*)&renderPass);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyRenderPass");;
 }
 
 void VkEncoder::vkGetRenderAreaGranularity(
     VkDevice device,
     VkRenderPass renderPass,
-    VkExtent2D* pGranularity)
+    VkExtent2D* pGranularity,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetRenderAreaGranularity");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkRenderPass local_renderPass;
+    uint32_t local_doLock;
     local_device = device;
     local_renderPass = renderPass;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_465;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_465, 1);
-        countingStream->write((uint64_t*)&cgen_var_465, 1 * 8);
-        uint64_t cgen_var_466;
-        countingStream->handleMapping()->mapHandles_VkRenderPass_u64(&local_renderPass, &cgen_var_466, 1);
-        countingStream->write((uint64_t*)&cgen_var_466, 1 * 8);
-        marshal_VkExtent2D(countingStream, (VkExtent2D*)(pGranularity));
+        uint64_t cgen_var_401;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_402;
+        *countPtr += 1 * 8;
+        count_VkExtent2D(featureBits, (VkExtent2D*)(pGranularity), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetRenderAreaGranularity = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetRenderAreaGranularity = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetRenderAreaGranularity);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetRenderAreaGranularity = OP_vkGetRenderAreaGranularity;
-    stream->write(&opcode_vkGetRenderAreaGranularity, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetRenderAreaGranularity, sizeof(uint32_t));
-    uint64_t cgen_var_467;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_467, 1);
-    stream->write((uint64_t*)&cgen_var_467, 1 * 8);
-    uint64_t cgen_var_468;
-    stream->handleMapping()->mapHandles_VkRenderPass_u64(&local_renderPass, &cgen_var_468, 1);
-    stream->write((uint64_t*)&cgen_var_468, 1 * 8);
-    marshal_VkExtent2D(stream, (VkExtent2D*)(pGranularity));
+    memcpy(streamPtr, &opcode_vkGetRenderAreaGranularity, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetRenderAreaGranularity, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_403;
+    *&cgen_var_403 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_403, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_404;
+    *&cgen_var_404 = get_host_u64_VkRenderPass((*&local_renderPass));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_404, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkExtent2D(stream, (VkExtent2D*)(pGranularity), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkExtent2D(stream, (VkExtent2D*)(pGranularity));
     if (pGranularity)
     {
         transform_fromhost_VkExtent2D(mImpl->resources(), (VkExtent2D*)(pGranularity));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetRenderAreaGranularity");;
 }
 
@@ -6342,18 +7401,18 @@
     VkDevice device,
     const VkCommandPoolCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkCommandPool* pCommandPool)
+    VkCommandPool* pCommandPool,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateCommandPool");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkCommandPoolCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -6367,6 +7426,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -6376,54 +7436,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_469;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_469, 1);
-        countingStream->write((uint64_t*)&cgen_var_469, 1 * 8);
-        marshal_VkCommandPoolCreateInfo(countingStream, (VkCommandPoolCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_405;
+        *countPtr += 1 * 8;
+        count_VkCommandPoolCreateInfo(featureBits, (VkCommandPoolCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_470 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_470);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_471;
-        countingStream->handleMapping()->mapHandles_VkCommandPool_u64(pCommandPool, &cgen_var_471, 1);
-        countingStream->write((uint64_t*)&cgen_var_471, 8);
+        uint64_t cgen_var_406;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateCommandPool = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateCommandPool = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateCommandPool);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateCommandPool = OP_vkCreateCommandPool;
-    stream->write(&opcode_vkCreateCommandPool, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateCommandPool, sizeof(uint32_t));
-    uint64_t cgen_var_472;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_472, 1);
-    stream->write((uint64_t*)&cgen_var_472, 1 * 8);
-    marshal_VkCommandPoolCreateInfo(stream, (VkCommandPoolCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateCommandPool, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateCommandPool, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_407;
+    *&cgen_var_407 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_407, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkCommandPoolCreateInfo(stream, (VkCommandPoolCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_473 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_473);
+    uint64_t cgen_var_408 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_408, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_474;
-    stream->handleMapping()->mapHandles_VkCommandPool_u64(pCommandPool, &cgen_var_474, 1);
-    stream->write((uint64_t*)&cgen_var_474, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_409;
+    *&cgen_var_409 = (uint64_t)((*pCommandPool));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_409, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_475;
-    stream->read((uint64_t*)&cgen_var_475, 8);
-    stream->handleMapping()->mapHandles_u64_VkCommandPool(&cgen_var_475, (VkCommandPool*)pCommandPool, 1);
+    uint64_t cgen_var_410;
+    stream->read((uint64_t*)&cgen_var_410, 8);
+    stream->handleMapping()->mapHandles_u64_VkCommandPool(&cgen_var_410, (VkCommandPool*)pCommandPool, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateCommandPool_VkResult_return = (VkResult)0;
     stream->read(&vkCreateCommandPool_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateCommandPool");;
     return vkCreateCommandPool_VkResult_return;
 }
@@ -6431,18 +7502,18 @@
 void VkEncoder::vkDestroyCommandPool(
     VkDevice device,
     VkCommandPool commandPool,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyCommandPool");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkCommandPool local_commandPool;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_commandPool = commandPool;
     local_pAllocator = nullptr;
@@ -6451,97 +7522,121 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_476;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_476, 1);
-        countingStream->write((uint64_t*)&cgen_var_476, 1 * 8);
-        uint64_t cgen_var_477;
-        countingStream->handleMapping()->mapHandles_VkCommandPool_u64(&local_commandPool, &cgen_var_477, 1);
-        countingStream->write((uint64_t*)&cgen_var_477, 1 * 8);
+        uint64_t cgen_var_411;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_412;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_478 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_478);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyCommandPool = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyCommandPool = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyCommandPool);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyCommandPool = OP_vkDestroyCommandPool;
-    stream->write(&opcode_vkDestroyCommandPool, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyCommandPool, sizeof(uint32_t));
-    uint64_t cgen_var_479;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_479, 1);
-    stream->write((uint64_t*)&cgen_var_479, 1 * 8);
-    uint64_t cgen_var_480;
-    stream->handleMapping()->mapHandles_VkCommandPool_u64(&local_commandPool, &cgen_var_480, 1);
-    stream->write((uint64_t*)&cgen_var_480, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyCommandPool, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyCommandPool, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_413;
+    *&cgen_var_413 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_413, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_414;
+    *&cgen_var_414 = get_host_u64_VkCommandPool((*&local_commandPool));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_414, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_481 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_481);
+    uint64_t cgen_var_415 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_415, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkCommandPool((VkCommandPool*)&commandPool);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyCommandPool");;
 }
 
 VkResult VkEncoder::vkResetCommandPool(
     VkDevice device,
     VkCommandPool commandPool,
-    VkCommandPoolResetFlags flags)
+    VkCommandPoolResetFlags flags,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkResetCommandPool");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkCommandPool local_commandPool;
     VkCommandPoolResetFlags local_flags;
+    uint32_t local_doLock;
     local_device = device;
     local_commandPool = commandPool;
     local_flags = flags;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_482;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_482, 1);
-        countingStream->write((uint64_t*)&cgen_var_482, 1 * 8);
-        uint64_t cgen_var_483;
-        countingStream->handleMapping()->mapHandles_VkCommandPool_u64(&local_commandPool, &cgen_var_483, 1);
-        countingStream->write((uint64_t*)&cgen_var_483, 1 * 8);
-        countingStream->write((VkCommandPoolResetFlags*)&local_flags, sizeof(VkCommandPoolResetFlags));
+        uint64_t cgen_var_416;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_417;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkCommandPoolResetFlags);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkResetCommandPool = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkResetCommandPool = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkResetCommandPool);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkResetCommandPool = OP_vkResetCommandPool;
-    stream->write(&opcode_vkResetCommandPool, sizeof(uint32_t));
-    stream->write(&packetSize_vkResetCommandPool, sizeof(uint32_t));
-    uint64_t cgen_var_484;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_484, 1);
-    stream->write((uint64_t*)&cgen_var_484, 1 * 8);
-    uint64_t cgen_var_485;
-    stream->handleMapping()->mapHandles_VkCommandPool_u64(&local_commandPool, &cgen_var_485, 1);
-    stream->write((uint64_t*)&cgen_var_485, 1 * 8);
-    stream->write((VkCommandPoolResetFlags*)&local_flags, sizeof(VkCommandPoolResetFlags));
+    memcpy(streamPtr, &opcode_vkResetCommandPool, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkResetCommandPool, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_418;
+    *&cgen_var_418 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_418, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_419;
+    *&cgen_var_419 = get_host_u64_VkCommandPool((*&local_commandPool));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_419, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkCommandPoolResetFlags*)&local_flags, sizeof(VkCommandPoolResetFlags));
+    *streamPtrPtr += sizeof(VkCommandPoolResetFlags);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkResetCommandPool_VkResult_return = (VkResult)0;
     stream->read(&vkResetCommandPool_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkResetCommandPool");;
     return vkResetCommandPool_VkResult_return;
 }
@@ -6549,17 +7644,17 @@
 VkResult VkEncoder::vkAllocateCommandBuffers(
     VkDevice device,
     const VkCommandBufferAllocateInfo* pAllocateInfo,
-    VkCommandBuffer* pCommandBuffers)
+    VkCommandBuffer* pCommandBuffers,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkAllocateCommandBuffers");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkCommandBufferAllocateInfo* local_pAllocateInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pAllocateInfo = nullptr;
     if (pAllocateInfo)
@@ -6567,56 +7662,68 @@
         local_pAllocateInfo = (VkCommandBufferAllocateInfo*)pool->alloc(sizeof(const VkCommandBufferAllocateInfo));
         deepcopy_VkCommandBufferAllocateInfo(pool, pAllocateInfo, (VkCommandBufferAllocateInfo*)(local_pAllocateInfo));
     }
+    local_doLock = doLock;
     if (local_pAllocateInfo)
     {
         transform_tohost_VkCommandBufferAllocateInfo(mImpl->resources(), (VkCommandBufferAllocateInfo*)(local_pAllocateInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_486;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_486, 1);
-        countingStream->write((uint64_t*)&cgen_var_486, 1 * 8);
-        marshal_VkCommandBufferAllocateInfo(countingStream, (VkCommandBufferAllocateInfo*)(local_pAllocateInfo));
+        uint64_t cgen_var_420;
+        *countPtr += 1 * 8;
+        count_VkCommandBufferAllocateInfo(featureBits, (VkCommandBufferAllocateInfo*)(local_pAllocateInfo), countPtr);
         if (pAllocateInfo->commandBufferCount)
         {
-            uint64_t* cgen_var_487;
-            countingStream->alloc((void**)&cgen_var_487, pAllocateInfo->commandBufferCount * 8);
-            countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(pCommandBuffers, cgen_var_487, pAllocateInfo->commandBufferCount);
-            countingStream->write((uint64_t*)cgen_var_487, pAllocateInfo->commandBufferCount * 8);
+            *countPtr += pAllocateInfo->commandBufferCount * 8;
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkAllocateCommandBuffers = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkAllocateCommandBuffers = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkAllocateCommandBuffers);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkAllocateCommandBuffers = OP_vkAllocateCommandBuffers;
-    stream->write(&opcode_vkAllocateCommandBuffers, sizeof(uint32_t));
-    stream->write(&packetSize_vkAllocateCommandBuffers, sizeof(uint32_t));
-    uint64_t cgen_var_488;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_488, 1);
-    stream->write((uint64_t*)&cgen_var_488, 1 * 8);
-    marshal_VkCommandBufferAllocateInfo(stream, (VkCommandBufferAllocateInfo*)(local_pAllocateInfo));
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
+    memcpy(streamPtr, &opcode_vkAllocateCommandBuffers, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkAllocateCommandBuffers, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_422;
+    *&cgen_var_422 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_422, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkCommandBufferAllocateInfo(stream, (VkCommandBufferAllocateInfo*)(local_pAllocateInfo), streamPtrPtr);
+    /* is handle, possibly out */;
     if (pAllocateInfo->commandBufferCount)
     {
-        uint64_t* cgen_var_489;
-        stream->alloc((void**)&cgen_var_489, pAllocateInfo->commandBufferCount * 8);
-        stream->handleMapping()->mapHandles_VkCommandBuffer_u64(pCommandBuffers, cgen_var_489, pAllocateInfo->commandBufferCount);
-        stream->write((uint64_t*)cgen_var_489, pAllocateInfo->commandBufferCount * 8);
+        uint64_t* cgen_var_423;
+        stream->alloc((void**)&cgen_var_423, pAllocateInfo->commandBufferCount * 8);
+        for (uint32_t k = 0; k < pAllocateInfo->commandBufferCount; ++k)
+        {
+            cgen_var_423[k] = (uint64_t)(pCommandBuffers[k]);
+        }
+        memcpy(*streamPtrPtr, (uint64_t*)cgen_var_423, pAllocateInfo->commandBufferCount * 8);
+        *streamPtrPtr += pAllocateInfo->commandBufferCount * 8;
     }
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
     if (pAllocateInfo->commandBufferCount)
     {
-        uint64_t* cgen_var_490;
-        stream->alloc((void**)&cgen_var_490, pAllocateInfo->commandBufferCount * 8);
-        stream->read((uint64_t*)cgen_var_490, pAllocateInfo->commandBufferCount * 8);
-        stream->handleMapping()->mapHandles_u64_VkCommandBuffer(cgen_var_490, (VkCommandBuffer*)pCommandBuffers, pAllocateInfo->commandBufferCount);
+        uint64_t* cgen_var_424;
+        stream->alloc((void**)&cgen_var_424, pAllocateInfo->commandBufferCount * 8);
+        stream->read((uint64_t*)cgen_var_424, pAllocateInfo->commandBufferCount * 8);
+        stream->handleMapping()->mapHandles_u64_VkCommandBuffer(cgen_var_424, (VkCommandBuffer*)pCommandBuffers, pAllocateInfo->commandBufferCount);
     }
     stream->unsetHandleMapping();
     VkResult vkAllocateCommandBuffers_VkResult_return = (VkResult)0;
     stream->read(&vkAllocateCommandBuffers_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkAllocateCommandBuffers");;
     return vkAllocateCommandBuffers_VkResult_return;
 }
@@ -6625,19 +7732,19 @@
     VkDevice device,
     VkCommandPool commandPool,
     uint32_t commandBufferCount,
-    const VkCommandBuffer* pCommandBuffers)
+    const VkCommandBuffer* pCommandBuffers,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkFreeCommandBuffers");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkCommandPool local_commandPool;
     uint32_t local_commandBufferCount;
     VkCommandBuffer* local_pCommandBuffers;
+    uint32_t local_doLock;
     local_device = device;
     local_commandPool = commandPool;
     local_commandBufferCount = commandBufferCount;
@@ -6646,77 +7753,91 @@
     {
         local_pCommandBuffers = (VkCommandBuffer*)pool->dupArray(pCommandBuffers, ((commandBufferCount)) * sizeof(const VkCommandBuffer));
     }
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_491;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_491, 1);
-        countingStream->write((uint64_t*)&cgen_var_491, 1 * 8);
-        uint64_t cgen_var_492;
-        countingStream->handleMapping()->mapHandles_VkCommandPool_u64(&local_commandPool, &cgen_var_492, 1);
-        countingStream->write((uint64_t*)&cgen_var_492, 1 * 8);
-        countingStream->write((uint32_t*)&local_commandBufferCount, sizeof(uint32_t));
+        uint64_t cgen_var_425;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_426;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         // WARNING PTR CHECK
-        uint64_t cgen_var_493 = (uint64_t)(uintptr_t)local_pCommandBuffers;
-        countingStream->putBe64(cgen_var_493);
+        *countPtr += 8;
         if (local_pCommandBuffers)
         {
             if (((commandBufferCount)))
             {
-                uint64_t* cgen_var_494;
-                countingStream->alloc((void**)&cgen_var_494, ((commandBufferCount)) * 8);
-                countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(local_pCommandBuffers, cgen_var_494, ((commandBufferCount)));
-                countingStream->write((uint64_t*)cgen_var_494, ((commandBufferCount)) * 8);
+                *countPtr += ((commandBufferCount)) * 8;
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkFreeCommandBuffers = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkFreeCommandBuffers = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkFreeCommandBuffers);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkFreeCommandBuffers = OP_vkFreeCommandBuffers;
-    stream->write(&opcode_vkFreeCommandBuffers, sizeof(uint32_t));
-    stream->write(&packetSize_vkFreeCommandBuffers, sizeof(uint32_t));
-    uint64_t cgen_var_495;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_495, 1);
-    stream->write((uint64_t*)&cgen_var_495, 1 * 8);
-    uint64_t cgen_var_496;
-    stream->handleMapping()->mapHandles_VkCommandPool_u64(&local_commandPool, &cgen_var_496, 1);
-    stream->write((uint64_t*)&cgen_var_496, 1 * 8);
-    stream->write((uint32_t*)&local_commandBufferCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkFreeCommandBuffers, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkFreeCommandBuffers, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_428;
+    *&cgen_var_428 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_428, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_429;
+    *&cgen_var_429 = get_host_u64_VkCommandPool((*&local_commandPool));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_429, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_commandBufferCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
-    uint64_t cgen_var_497 = (uint64_t)(uintptr_t)local_pCommandBuffers;
-    stream->putBe64(cgen_var_497);
+    uint64_t cgen_var_430 = (uint64_t)(uintptr_t)local_pCommandBuffers;
+    memcpy((*streamPtrPtr), &cgen_var_430, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pCommandBuffers)
     {
         if (((commandBufferCount)))
         {
-            uint64_t* cgen_var_498;
-            stream->alloc((void**)&cgen_var_498, ((commandBufferCount)) * 8);
-            stream->handleMapping()->mapHandles_VkCommandBuffer_u64(local_pCommandBuffers, cgen_var_498, ((commandBufferCount)));
-            stream->write((uint64_t*)cgen_var_498, ((commandBufferCount)) * 8);
+            uint64_t* cgen_var_431;
+            stream->alloc((void**)&cgen_var_431, ((commandBufferCount)) * 8);
+            for (uint32_t k = 0; k < ((commandBufferCount)); ++k)
+            {
+                cgen_var_431[k] = get_host_u64_VkCommandBuffer(local_pCommandBuffers[k]);
+            }
+            memcpy(*streamPtrPtr, (uint64_t*)cgen_var_431, ((commandBufferCount)) * 8);
+            *streamPtrPtr += ((commandBufferCount)) * 8;
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     if (pCommandBuffers)
     {
         resources->destroyMapping()->mapHandles_VkCommandBuffer((VkCommandBuffer*)pCommandBuffers, ((commandBufferCount)));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkFreeCommandBuffers");;
 }
 
 VkResult VkEncoder::vkBeginCommandBuffer(
     VkCommandBuffer commandBuffer,
-    const VkCommandBufferBeginInfo* pBeginInfo)
+    const VkCommandBufferBeginInfo* pBeginInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkBeginCommandBuffer");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkCommandBufferBeginInfo* local_pBeginInfo;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_pBeginInfo = nullptr;
     if (pBeginInfo)
@@ -6724,106 +7845,140 @@
         local_pBeginInfo = (VkCommandBufferBeginInfo*)pool->alloc(sizeof(const VkCommandBufferBeginInfo));
         deepcopy_VkCommandBufferBeginInfo(pool, pBeginInfo, (VkCommandBufferBeginInfo*)(local_pBeginInfo));
     }
+    local_doLock = doLock;
     if (local_pBeginInfo)
     {
         transform_tohost_VkCommandBufferBeginInfo(mImpl->resources(), (VkCommandBufferBeginInfo*)(local_pBeginInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_499;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_499, 1);
-        countingStream->write((uint64_t*)&cgen_var_499, 1 * 8);
-        marshal_VkCommandBufferBeginInfo(countingStream, (VkCommandBufferBeginInfo*)(local_pBeginInfo));
+        uint64_t cgen_var_432;
+        *countPtr += 1 * 8;
+        count_VkCommandBufferBeginInfo(featureBits, (VkCommandBufferBeginInfo*)(local_pBeginInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkBeginCommandBuffer = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkBeginCommandBuffer = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkBeginCommandBuffer);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkBeginCommandBuffer = OP_vkBeginCommandBuffer;
-    stream->write(&opcode_vkBeginCommandBuffer, sizeof(uint32_t));
-    stream->write(&packetSize_vkBeginCommandBuffer, sizeof(uint32_t));
-    uint64_t cgen_var_500;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_500, 1);
-    stream->write((uint64_t*)&cgen_var_500, 1 * 8);
-    marshal_VkCommandBufferBeginInfo(stream, (VkCommandBufferBeginInfo*)(local_pBeginInfo));
+    memcpy(streamPtr, &opcode_vkBeginCommandBuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkBeginCommandBuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_433;
+    *&cgen_var_433 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_433, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkCommandBufferBeginInfo(stream, (VkCommandBufferBeginInfo*)(local_pBeginInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkBeginCommandBuffer_VkResult_return = (VkResult)0;
     stream->read(&vkBeginCommandBuffer_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkBeginCommandBuffer");;
     return vkBeginCommandBuffer_VkResult_return;
 }
 
 VkResult VkEncoder::vkEndCommandBuffer(
-    VkCommandBuffer commandBuffer)
+    VkCommandBuffer commandBuffer,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkEndCommandBuffer");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_501;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_501, 1);
-        countingStream->write((uint64_t*)&cgen_var_501, 1 * 8);
+        uint64_t cgen_var_434;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkEndCommandBuffer = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkEndCommandBuffer = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkEndCommandBuffer);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkEndCommandBuffer = OP_vkEndCommandBuffer;
-    stream->write(&opcode_vkEndCommandBuffer, sizeof(uint32_t));
-    stream->write(&packetSize_vkEndCommandBuffer, sizeof(uint32_t));
-    uint64_t cgen_var_502;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_502, 1);
-    stream->write((uint64_t*)&cgen_var_502, 1 * 8);
+    memcpy(streamPtr, &opcode_vkEndCommandBuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkEndCommandBuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_435;
+    *&cgen_var_435 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_435, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkEndCommandBuffer_VkResult_return = (VkResult)0;
     stream->read(&vkEndCommandBuffer_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkEndCommandBuffer");;
     return vkEndCommandBuffer_VkResult_return;
 }
 
 VkResult VkEncoder::vkResetCommandBuffer(
     VkCommandBuffer commandBuffer,
-    VkCommandBufferResetFlags flags)
+    VkCommandBufferResetFlags flags,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkResetCommandBuffer");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkCommandBufferResetFlags local_flags;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_flags = flags;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_503;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_503, 1);
-        countingStream->write((uint64_t*)&cgen_var_503, 1 * 8);
-        countingStream->write((VkCommandBufferResetFlags*)&local_flags, sizeof(VkCommandBufferResetFlags));
+        uint64_t cgen_var_436;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkCommandBufferResetFlags);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkResetCommandBuffer = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkResetCommandBuffer = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkResetCommandBuffer);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkResetCommandBuffer = OP_vkResetCommandBuffer;
-    stream->write(&opcode_vkResetCommandBuffer, sizeof(uint32_t));
-    stream->write(&packetSize_vkResetCommandBuffer, sizeof(uint32_t));
-    uint64_t cgen_var_504;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_504, 1);
-    stream->write((uint64_t*)&cgen_var_504, 1 * 8);
-    stream->write((VkCommandBufferResetFlags*)&local_flags, sizeof(VkCommandBufferResetFlags));
+    memcpy(streamPtr, &opcode_vkResetCommandBuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkResetCommandBuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_437;
+    *&cgen_var_437 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_437, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkCommandBufferResetFlags*)&local_flags, sizeof(VkCommandBufferResetFlags));
+    *streamPtrPtr += sizeof(VkCommandBufferResetFlags);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkResetCommandBuffer_VkResult_return = (VkResult)0;
     stream->read(&vkResetCommandBuffer_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkResetCommandBuffer");;
     return vkResetCommandBuffer_VkResult_return;
 }
@@ -6831,46 +7986,58 @@
 void VkEncoder::vkCmdBindPipeline(
     VkCommandBuffer commandBuffer,
     VkPipelineBindPoint pipelineBindPoint,
-    VkPipeline pipeline)
+    VkPipeline pipeline,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdBindPipeline");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkPipelineBindPoint local_pipelineBindPoint;
     VkPipeline local_pipeline;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_pipelineBindPoint = pipelineBindPoint;
     local_pipeline = pipeline;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_505;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_505, 1);
-        countingStream->write((uint64_t*)&cgen_var_505, 1 * 8);
-        countingStream->write((VkPipelineBindPoint*)&local_pipelineBindPoint, sizeof(VkPipelineBindPoint));
-        uint64_t cgen_var_506;
-        countingStream->handleMapping()->mapHandles_VkPipeline_u64(&local_pipeline, &cgen_var_506, 1);
-        countingStream->write((uint64_t*)&cgen_var_506, 1 * 8);
+        uint64_t cgen_var_438;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkPipelineBindPoint);
+        uint64_t cgen_var_439;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdBindPipeline = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdBindPipeline = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBindPipeline);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdBindPipeline = OP_vkCmdBindPipeline;
-    stream->write(&opcode_vkCmdBindPipeline, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdBindPipeline, sizeof(uint32_t));
-    uint64_t cgen_var_507;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_507, 1);
-    stream->write((uint64_t*)&cgen_var_507, 1 * 8);
-    stream->write((VkPipelineBindPoint*)&local_pipelineBindPoint, sizeof(VkPipelineBindPoint));
-    uint64_t cgen_var_508;
-    stream->handleMapping()->mapHandles_VkPipeline_u64(&local_pipeline, &cgen_var_508, 1);
-    stream->write((uint64_t*)&cgen_var_508, 1 * 8);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdBindPipeline, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdBindPipeline, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_440;
+    *&cgen_var_440 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_440, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkPipelineBindPoint*)&local_pipelineBindPoint, sizeof(VkPipelineBindPoint));
+    *streamPtrPtr += sizeof(VkPipelineBindPoint);
+    uint64_t cgen_var_441;
+    *&cgen_var_441 = get_host_u64_VkPipeline((*&local_pipeline));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_441, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdBindPipeline");;
 }
 
@@ -6878,19 +8045,19 @@
     VkCommandBuffer commandBuffer,
     uint32_t firstViewport,
     uint32_t viewportCount,
-    const VkViewport* pViewports)
+    const VkViewport* pViewports,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdSetViewport");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     uint32_t local_firstViewport;
     uint32_t local_viewportCount;
     VkViewport* local_pViewports;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_firstViewport = firstViewport;
     local_viewportCount = viewportCount;
@@ -6903,6 +8070,7 @@
             deepcopy_VkViewport(pool, pViewports + i, (VkViewport*)(local_pViewports + i));
         }
     }
+    local_doLock = doLock;
     if (local_pViewports)
     {
         for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
@@ -6910,35 +8078,47 @@
             transform_tohost_VkViewport(mImpl->resources(), (VkViewport*)(local_pViewports + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_509;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_509, 1);
-        countingStream->write((uint64_t*)&cgen_var_509, 1 * 8);
-        countingStream->write((uint32_t*)&local_firstViewport, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_viewportCount, sizeof(uint32_t));
+        uint64_t cgen_var_442;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
         {
-            marshal_VkViewport(countingStream, (VkViewport*)(local_pViewports + i));
+            count_VkViewport(featureBits, (VkViewport*)(local_pViewports + i), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdSetViewport = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdSetViewport = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetViewport);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdSetViewport = OP_vkCmdSetViewport;
-    stream->write(&opcode_vkCmdSetViewport, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdSetViewport, sizeof(uint32_t));
-    uint64_t cgen_var_510;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_510, 1);
-    stream->write((uint64_t*)&cgen_var_510, 1 * 8);
-    stream->write((uint32_t*)&local_firstViewport, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_viewportCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkCmdSetViewport, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdSetViewport, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_443;
+    *&cgen_var_443 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_443, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_firstViewport, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_viewportCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
     {
-        marshal_VkViewport(stream, (VkViewport*)(local_pViewports + i));
+        reservedmarshal_VkViewport(stream, (VkViewport*)(local_pViewports + i), streamPtrPtr);
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdSetViewport");;
 }
 
@@ -6946,19 +8126,19 @@
     VkCommandBuffer commandBuffer,
     uint32_t firstScissor,
     uint32_t scissorCount,
-    const VkRect2D* pScissors)
+    const VkRect2D* pScissors,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdSetScissor");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     uint32_t local_firstScissor;
     uint32_t local_scissorCount;
     VkRect2D* local_pScissors;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_firstScissor = firstScissor;
     local_scissorCount = scissorCount;
@@ -6971,6 +8151,7 @@
             deepcopy_VkRect2D(pool, pScissors + i, (VkRect2D*)(local_pScissors + i));
         }
     }
+    local_doLock = doLock;
     if (local_pScissors)
     {
         for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i)
@@ -6978,72 +8159,96 @@
             transform_tohost_VkRect2D(mImpl->resources(), (VkRect2D*)(local_pScissors + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_511;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_511, 1);
-        countingStream->write((uint64_t*)&cgen_var_511, 1 * 8);
-        countingStream->write((uint32_t*)&local_firstScissor, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_scissorCount, sizeof(uint32_t));
+        uint64_t cgen_var_444;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i)
         {
-            marshal_VkRect2D(countingStream, (VkRect2D*)(local_pScissors + i));
+            count_VkRect2D(featureBits, (VkRect2D*)(local_pScissors + i), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdSetScissor = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdSetScissor = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetScissor);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdSetScissor = OP_vkCmdSetScissor;
-    stream->write(&opcode_vkCmdSetScissor, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdSetScissor, sizeof(uint32_t));
-    uint64_t cgen_var_512;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_512, 1);
-    stream->write((uint64_t*)&cgen_var_512, 1 * 8);
-    stream->write((uint32_t*)&local_firstScissor, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_scissorCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkCmdSetScissor, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdSetScissor, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_445;
+    *&cgen_var_445 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_445, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_firstScissor, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_scissorCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i)
     {
-        marshal_VkRect2D(stream, (VkRect2D*)(local_pScissors + i));
+        reservedmarshal_VkRect2D(stream, (VkRect2D*)(local_pScissors + i), streamPtrPtr);
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdSetScissor");;
 }
 
 void VkEncoder::vkCmdSetLineWidth(
     VkCommandBuffer commandBuffer,
-    float lineWidth)
+    float lineWidth,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdSetLineWidth");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     float local_lineWidth;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_lineWidth = lineWidth;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_513;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_513, 1);
-        countingStream->write((uint64_t*)&cgen_var_513, 1 * 8);
-        countingStream->write((float*)&local_lineWidth, sizeof(float));
+        uint64_t cgen_var_446;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(float);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdSetLineWidth = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdSetLineWidth = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetLineWidth);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdSetLineWidth = OP_vkCmdSetLineWidth;
-    stream->write(&opcode_vkCmdSetLineWidth, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdSetLineWidth, sizeof(uint32_t));
-    uint64_t cgen_var_514;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_514, 1);
-    stream->write((uint64_t*)&cgen_var_514, 1 * 8);
-    stream->write((float*)&local_lineWidth, sizeof(float));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdSetLineWidth, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdSetLineWidth, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_447;
+    *&cgen_var_447 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_447, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (float*)&local_lineWidth, sizeof(float));
+    *streamPtrPtr += sizeof(float);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdSetLineWidth");;
 }
 
@@ -7051,251 +8256,329 @@
     VkCommandBuffer commandBuffer,
     float depthBiasConstantFactor,
     float depthBiasClamp,
-    float depthBiasSlopeFactor)
+    float depthBiasSlopeFactor,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdSetDepthBias");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     float local_depthBiasConstantFactor;
     float local_depthBiasClamp;
     float local_depthBiasSlopeFactor;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_depthBiasConstantFactor = depthBiasConstantFactor;
     local_depthBiasClamp = depthBiasClamp;
     local_depthBiasSlopeFactor = depthBiasSlopeFactor;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_515;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_515, 1);
-        countingStream->write((uint64_t*)&cgen_var_515, 1 * 8);
-        countingStream->write((float*)&local_depthBiasConstantFactor, sizeof(float));
-        countingStream->write((float*)&local_depthBiasClamp, sizeof(float));
-        countingStream->write((float*)&local_depthBiasSlopeFactor, sizeof(float));
+        uint64_t cgen_var_448;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(float);
+        *countPtr += sizeof(float);
+        *countPtr += sizeof(float);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdSetDepthBias = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdSetDepthBias = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetDepthBias);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdSetDepthBias = OP_vkCmdSetDepthBias;
-    stream->write(&opcode_vkCmdSetDepthBias, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdSetDepthBias, sizeof(uint32_t));
-    uint64_t cgen_var_516;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_516, 1);
-    stream->write((uint64_t*)&cgen_var_516, 1 * 8);
-    stream->write((float*)&local_depthBiasConstantFactor, sizeof(float));
-    stream->write((float*)&local_depthBiasClamp, sizeof(float));
-    stream->write((float*)&local_depthBiasSlopeFactor, sizeof(float));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdSetDepthBias, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdSetDepthBias, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_449;
+    *&cgen_var_449 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_449, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (float*)&local_depthBiasConstantFactor, sizeof(float));
+    *streamPtrPtr += sizeof(float);
+    memcpy(*streamPtrPtr, (float*)&local_depthBiasClamp, sizeof(float));
+    *streamPtrPtr += sizeof(float);
+    memcpy(*streamPtrPtr, (float*)&local_depthBiasSlopeFactor, sizeof(float));
+    *streamPtrPtr += sizeof(float);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdSetDepthBias");;
 }
 
 void VkEncoder::vkCmdSetBlendConstants(
     VkCommandBuffer commandBuffer,
-    const float blendConstants[4])
+    const float blendConstants[4],
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdSetBlendConstants");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     float local_blendConstants[4];
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     memcpy(local_blendConstants, blendConstants, 4 * sizeof(const float));
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_517;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_517, 1);
-        countingStream->write((uint64_t*)&cgen_var_517, 1 * 8);
-        countingStream->write((float*)local_blendConstants, 4 * sizeof(float));
+        uint64_t cgen_var_450;
+        *countPtr += 1 * 8;
+        *countPtr += 4 * sizeof(float);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdSetBlendConstants = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdSetBlendConstants = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetBlendConstants);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdSetBlendConstants = OP_vkCmdSetBlendConstants;
-    stream->write(&opcode_vkCmdSetBlendConstants, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdSetBlendConstants, sizeof(uint32_t));
-    uint64_t cgen_var_518;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_518, 1);
-    stream->write((uint64_t*)&cgen_var_518, 1 * 8);
-    stream->write((float*)local_blendConstants, 4 * sizeof(float));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdSetBlendConstants, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdSetBlendConstants, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_451;
+    *&cgen_var_451 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_451, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (float*)local_blendConstants, 4 * sizeof(float));
+    *streamPtrPtr += 4 * sizeof(float);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdSetBlendConstants");;
 }
 
 void VkEncoder::vkCmdSetDepthBounds(
     VkCommandBuffer commandBuffer,
     float minDepthBounds,
-    float maxDepthBounds)
+    float maxDepthBounds,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdSetDepthBounds");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     float local_minDepthBounds;
     float local_maxDepthBounds;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_minDepthBounds = minDepthBounds;
     local_maxDepthBounds = maxDepthBounds;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_519;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_519, 1);
-        countingStream->write((uint64_t*)&cgen_var_519, 1 * 8);
-        countingStream->write((float*)&local_minDepthBounds, sizeof(float));
-        countingStream->write((float*)&local_maxDepthBounds, sizeof(float));
+        uint64_t cgen_var_452;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(float);
+        *countPtr += sizeof(float);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdSetDepthBounds = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdSetDepthBounds = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetDepthBounds);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdSetDepthBounds = OP_vkCmdSetDepthBounds;
-    stream->write(&opcode_vkCmdSetDepthBounds, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdSetDepthBounds, sizeof(uint32_t));
-    uint64_t cgen_var_520;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_520, 1);
-    stream->write((uint64_t*)&cgen_var_520, 1 * 8);
-    stream->write((float*)&local_minDepthBounds, sizeof(float));
-    stream->write((float*)&local_maxDepthBounds, sizeof(float));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdSetDepthBounds, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdSetDepthBounds, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_453;
+    *&cgen_var_453 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_453, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (float*)&local_minDepthBounds, sizeof(float));
+    *streamPtrPtr += sizeof(float);
+    memcpy(*streamPtrPtr, (float*)&local_maxDepthBounds, sizeof(float));
+    *streamPtrPtr += sizeof(float);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdSetDepthBounds");;
 }
 
 void VkEncoder::vkCmdSetStencilCompareMask(
     VkCommandBuffer commandBuffer,
     VkStencilFaceFlags faceMask,
-    uint32_t compareMask)
+    uint32_t compareMask,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdSetStencilCompareMask");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkStencilFaceFlags local_faceMask;
     uint32_t local_compareMask;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_faceMask = faceMask;
     local_compareMask = compareMask;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_521;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_521, 1);
-        countingStream->write((uint64_t*)&cgen_var_521, 1 * 8);
-        countingStream->write((VkStencilFaceFlags*)&local_faceMask, sizeof(VkStencilFaceFlags));
-        countingStream->write((uint32_t*)&local_compareMask, sizeof(uint32_t));
+        uint64_t cgen_var_454;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkStencilFaceFlags);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdSetStencilCompareMask = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdSetStencilCompareMask = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetStencilCompareMask);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdSetStencilCompareMask = OP_vkCmdSetStencilCompareMask;
-    stream->write(&opcode_vkCmdSetStencilCompareMask, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdSetStencilCompareMask, sizeof(uint32_t));
-    uint64_t cgen_var_522;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_522, 1);
-    stream->write((uint64_t*)&cgen_var_522, 1 * 8);
-    stream->write((VkStencilFaceFlags*)&local_faceMask, sizeof(VkStencilFaceFlags));
-    stream->write((uint32_t*)&local_compareMask, sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdSetStencilCompareMask, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdSetStencilCompareMask, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_455;
+    *&cgen_var_455 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_455, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkStencilFaceFlags*)&local_faceMask, sizeof(VkStencilFaceFlags));
+    *streamPtrPtr += sizeof(VkStencilFaceFlags);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_compareMask, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdSetStencilCompareMask");;
 }
 
 void VkEncoder::vkCmdSetStencilWriteMask(
     VkCommandBuffer commandBuffer,
     VkStencilFaceFlags faceMask,
-    uint32_t writeMask)
+    uint32_t writeMask,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdSetStencilWriteMask");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkStencilFaceFlags local_faceMask;
     uint32_t local_writeMask;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_faceMask = faceMask;
     local_writeMask = writeMask;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_523;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_523, 1);
-        countingStream->write((uint64_t*)&cgen_var_523, 1 * 8);
-        countingStream->write((VkStencilFaceFlags*)&local_faceMask, sizeof(VkStencilFaceFlags));
-        countingStream->write((uint32_t*)&local_writeMask, sizeof(uint32_t));
+        uint64_t cgen_var_456;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkStencilFaceFlags);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdSetStencilWriteMask = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdSetStencilWriteMask = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetStencilWriteMask);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdSetStencilWriteMask = OP_vkCmdSetStencilWriteMask;
-    stream->write(&opcode_vkCmdSetStencilWriteMask, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdSetStencilWriteMask, sizeof(uint32_t));
-    uint64_t cgen_var_524;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_524, 1);
-    stream->write((uint64_t*)&cgen_var_524, 1 * 8);
-    stream->write((VkStencilFaceFlags*)&local_faceMask, sizeof(VkStencilFaceFlags));
-    stream->write((uint32_t*)&local_writeMask, sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdSetStencilWriteMask, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdSetStencilWriteMask, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_457;
+    *&cgen_var_457 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_457, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkStencilFaceFlags*)&local_faceMask, sizeof(VkStencilFaceFlags));
+    *streamPtrPtr += sizeof(VkStencilFaceFlags);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_writeMask, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdSetStencilWriteMask");;
 }
 
 void VkEncoder::vkCmdSetStencilReference(
     VkCommandBuffer commandBuffer,
     VkStencilFaceFlags faceMask,
-    uint32_t reference)
+    uint32_t reference,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdSetStencilReference");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkStencilFaceFlags local_faceMask;
     uint32_t local_reference;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_faceMask = faceMask;
     local_reference = reference;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_525;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_525, 1);
-        countingStream->write((uint64_t*)&cgen_var_525, 1 * 8);
-        countingStream->write((VkStencilFaceFlags*)&local_faceMask, sizeof(VkStencilFaceFlags));
-        countingStream->write((uint32_t*)&local_reference, sizeof(uint32_t));
+        uint64_t cgen_var_458;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkStencilFaceFlags);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdSetStencilReference = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdSetStencilReference = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetStencilReference);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdSetStencilReference = OP_vkCmdSetStencilReference;
-    stream->write(&opcode_vkCmdSetStencilReference, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdSetStencilReference, sizeof(uint32_t));
-    uint64_t cgen_var_526;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_526, 1);
-    stream->write((uint64_t*)&cgen_var_526, 1 * 8);
-    stream->write((VkStencilFaceFlags*)&local_faceMask, sizeof(VkStencilFaceFlags));
-    stream->write((uint32_t*)&local_reference, sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdSetStencilReference, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdSetStencilReference, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_459;
+    *&cgen_var_459 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_459, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkStencilFaceFlags*)&local_faceMask, sizeof(VkStencilFaceFlags));
+    *streamPtrPtr += sizeof(VkStencilFaceFlags);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_reference, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdSetStencilReference");;
 }
 
@@ -7307,15 +8590,14 @@
     uint32_t descriptorSetCount,
     const VkDescriptorSet* pDescriptorSets,
     uint32_t dynamicOffsetCount,
-    const uint32_t* pDynamicOffsets)
+    const uint32_t* pDynamicOffsets,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdBindDescriptorSets");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkPipelineBindPoint local_pipelineBindPoint;
     VkPipelineLayout local_layout;
@@ -7324,6 +8606,7 @@
     VkDescriptorSet* local_pDescriptorSets;
     uint32_t local_dynamicOffsetCount;
     uint32_t* local_pDynamicOffsets;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_pipelineBindPoint = pipelineBindPoint;
     local_layout = layout;
@@ -7340,53 +8623,70 @@
     {
         local_pDynamicOffsets = (uint32_t*)pool->dupArray(pDynamicOffsets, ((dynamicOffsetCount)) * sizeof(const uint32_t));
     }
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_527;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_527, 1);
-        countingStream->write((uint64_t*)&cgen_var_527, 1 * 8);
-        countingStream->write((VkPipelineBindPoint*)&local_pipelineBindPoint, sizeof(VkPipelineBindPoint));
-        uint64_t cgen_var_528;
-        countingStream->handleMapping()->mapHandles_VkPipelineLayout_u64(&local_layout, &cgen_var_528, 1);
-        countingStream->write((uint64_t*)&cgen_var_528, 1 * 8);
-        countingStream->write((uint32_t*)&local_firstSet, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_descriptorSetCount, sizeof(uint32_t));
+        uint64_t cgen_var_460;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkPipelineBindPoint);
+        uint64_t cgen_var_461;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
         if (((descriptorSetCount)))
         {
-            uint64_t* cgen_var_529;
-            countingStream->alloc((void**)&cgen_var_529, ((descriptorSetCount)) * 8);
-            countingStream->handleMapping()->mapHandles_VkDescriptorSet_u64(local_pDescriptorSets, cgen_var_529, ((descriptorSetCount)));
-            countingStream->write((uint64_t*)cgen_var_529, ((descriptorSetCount)) * 8);
+            *countPtr += ((descriptorSetCount)) * 8;
         }
-        countingStream->write((uint32_t*)&local_dynamicOffsetCount, sizeof(uint32_t));
-        countingStream->write((uint32_t*)local_pDynamicOffsets, ((dynamicOffsetCount)) * sizeof(uint32_t));
+        *countPtr += sizeof(uint32_t);
+        *countPtr += ((dynamicOffsetCount)) * sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdBindDescriptorSets = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdBindDescriptorSets = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBindDescriptorSets);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdBindDescriptorSets = OP_vkCmdBindDescriptorSets;
-    stream->write(&opcode_vkCmdBindDescriptorSets, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdBindDescriptorSets, sizeof(uint32_t));
-    uint64_t cgen_var_530;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_530, 1);
-    stream->write((uint64_t*)&cgen_var_530, 1 * 8);
-    stream->write((VkPipelineBindPoint*)&local_pipelineBindPoint, sizeof(VkPipelineBindPoint));
-    uint64_t cgen_var_531;
-    stream->handleMapping()->mapHandles_VkPipelineLayout_u64(&local_layout, &cgen_var_531, 1);
-    stream->write((uint64_t*)&cgen_var_531, 1 * 8);
-    stream->write((uint32_t*)&local_firstSet, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_descriptorSetCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkCmdBindDescriptorSets, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdBindDescriptorSets, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_463;
+    *&cgen_var_463 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_463, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkPipelineBindPoint*)&local_pipelineBindPoint, sizeof(VkPipelineBindPoint));
+    *streamPtrPtr += sizeof(VkPipelineBindPoint);
+    uint64_t cgen_var_464;
+    *&cgen_var_464 = get_host_u64_VkPipelineLayout((*&local_layout));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_464, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_firstSet, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_descriptorSetCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     if (((descriptorSetCount)))
     {
-        uint64_t* cgen_var_532;
-        stream->alloc((void**)&cgen_var_532, ((descriptorSetCount)) * 8);
-        stream->handleMapping()->mapHandles_VkDescriptorSet_u64(local_pDescriptorSets, cgen_var_532, ((descriptorSetCount)));
-        stream->write((uint64_t*)cgen_var_532, ((descriptorSetCount)) * 8);
+        uint64_t* cgen_var_465;
+        stream->alloc((void**)&cgen_var_465, ((descriptorSetCount)) * 8);
+        for (uint32_t k = 0; k < ((descriptorSetCount)); ++k)
+        {
+            cgen_var_465[k] = get_host_u64_VkDescriptorSet(local_pDescriptorSets[k]);
+        }
+        memcpy(*streamPtrPtr, (uint64_t*)cgen_var_465, ((descriptorSetCount)) * 8);
+        *streamPtrPtr += ((descriptorSetCount)) * 8;
     }
-    stream->write((uint32_t*)&local_dynamicOffsetCount, sizeof(uint32_t));
-    stream->write((uint32_t*)local_pDynamicOffsets, ((dynamicOffsetCount)) * sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_dynamicOffsetCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)local_pDynamicOffsets, ((dynamicOffsetCount)) * sizeof(uint32_t));
+    *streamPtrPtr += ((dynamicOffsetCount)) * sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdBindDescriptorSets");;
 }
 
@@ -7394,50 +8694,63 @@
     VkCommandBuffer commandBuffer,
     VkBuffer buffer,
     VkDeviceSize offset,
-    VkIndexType indexType)
+    VkIndexType indexType,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdBindIndexBuffer");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkBuffer local_buffer;
     VkDeviceSize local_offset;
     VkIndexType local_indexType;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_buffer = buffer;
     local_offset = offset;
     local_indexType = indexType;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_533;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_533, 1);
-        countingStream->write((uint64_t*)&cgen_var_533, 1 * 8);
-        uint64_t cgen_var_534;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_534, 1);
-        countingStream->write((uint64_t*)&cgen_var_534, 1 * 8);
-        countingStream->write((VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
-        countingStream->write((VkIndexType*)&local_indexType, sizeof(VkIndexType));
+        uint64_t cgen_var_466;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_467;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkDeviceSize);
+        *countPtr += sizeof(VkIndexType);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdBindIndexBuffer = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdBindIndexBuffer = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBindIndexBuffer);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdBindIndexBuffer = OP_vkCmdBindIndexBuffer;
-    stream->write(&opcode_vkCmdBindIndexBuffer, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdBindIndexBuffer, sizeof(uint32_t));
-    uint64_t cgen_var_535;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_535, 1);
-    stream->write((uint64_t*)&cgen_var_535, 1 * 8);
-    uint64_t cgen_var_536;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_536, 1);
-    stream->write((uint64_t*)&cgen_var_536, 1 * 8);
-    stream->write((VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
-    stream->write((VkIndexType*)&local_indexType, sizeof(VkIndexType));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdBindIndexBuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdBindIndexBuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_468;
+    *&cgen_var_468 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_468, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_469;
+    *&cgen_var_469 = get_host_u64_VkBuffer((*&local_buffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_469, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    memcpy(*streamPtrPtr, (VkIndexType*)&local_indexType, sizeof(VkIndexType));
+    *streamPtrPtr += sizeof(VkIndexType);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdBindIndexBuffer");;
 }
 
@@ -7446,20 +8759,20 @@
     uint32_t firstBinding,
     uint32_t bindingCount,
     const VkBuffer* pBuffers,
-    const VkDeviceSize* pOffsets)
+    const VkDeviceSize* pOffsets,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdBindVertexBuffers");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     uint32_t local_firstBinding;
     uint32_t local_bindingCount;
     VkBuffer* local_pBuffers;
     VkDeviceSize* local_pOffsets;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_firstBinding = firstBinding;
     local_bindingCount = bindingCount;
@@ -7473,43 +8786,58 @@
     {
         local_pOffsets = (VkDeviceSize*)pool->dupArray(pOffsets, ((bindingCount)) * sizeof(const VkDeviceSize));
     }
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_537;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_537, 1);
-        countingStream->write((uint64_t*)&cgen_var_537, 1 * 8);
-        countingStream->write((uint32_t*)&local_firstBinding, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_bindingCount, sizeof(uint32_t));
+        uint64_t cgen_var_470;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
         if (((bindingCount)))
         {
-            uint64_t* cgen_var_538;
-            countingStream->alloc((void**)&cgen_var_538, ((bindingCount)) * 8);
-            countingStream->handleMapping()->mapHandles_VkBuffer_u64(local_pBuffers, cgen_var_538, ((bindingCount)));
-            countingStream->write((uint64_t*)cgen_var_538, ((bindingCount)) * 8);
+            *countPtr += ((bindingCount)) * 8;
         }
-        countingStream->write((VkDeviceSize*)local_pOffsets, ((bindingCount)) * sizeof(VkDeviceSize));
+        *countPtr += ((bindingCount)) * sizeof(VkDeviceSize);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdBindVertexBuffers = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdBindVertexBuffers = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBindVertexBuffers);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdBindVertexBuffers = OP_vkCmdBindVertexBuffers;
-    stream->write(&opcode_vkCmdBindVertexBuffers, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdBindVertexBuffers, sizeof(uint32_t));
-    uint64_t cgen_var_539;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_539, 1);
-    stream->write((uint64_t*)&cgen_var_539, 1 * 8);
-    stream->write((uint32_t*)&local_firstBinding, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_bindingCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkCmdBindVertexBuffers, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdBindVertexBuffers, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_472;
+    *&cgen_var_472 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_472, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_firstBinding, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_bindingCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     if (((bindingCount)))
     {
-        uint64_t* cgen_var_540;
-        stream->alloc((void**)&cgen_var_540, ((bindingCount)) * 8);
-        stream->handleMapping()->mapHandles_VkBuffer_u64(local_pBuffers, cgen_var_540, ((bindingCount)));
-        stream->write((uint64_t*)cgen_var_540, ((bindingCount)) * 8);
+        uint64_t* cgen_var_473;
+        stream->alloc((void**)&cgen_var_473, ((bindingCount)) * 8);
+        for (uint32_t k = 0; k < ((bindingCount)); ++k)
+        {
+            cgen_var_473[k] = get_host_u64_VkBuffer(local_pBuffers[k]);
+        }
+        memcpy(*streamPtrPtr, (uint64_t*)cgen_var_473, ((bindingCount)) * 8);
+        *streamPtrPtr += ((bindingCount)) * 8;
     }
-    stream->write((VkDeviceSize*)local_pOffsets, ((bindingCount)) * sizeof(VkDeviceSize));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (VkDeviceSize*)local_pOffsets, ((bindingCount)) * sizeof(VkDeviceSize));
+    *streamPtrPtr += ((bindingCount)) * sizeof(VkDeviceSize);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdBindVertexBuffers");;
 }
 
@@ -7518,50 +8846,65 @@
     uint32_t vertexCount,
     uint32_t instanceCount,
     uint32_t firstVertex,
-    uint32_t firstInstance)
+    uint32_t firstInstance,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdDraw");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     uint32_t local_vertexCount;
     uint32_t local_instanceCount;
     uint32_t local_firstVertex;
     uint32_t local_firstInstance;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_vertexCount = vertexCount;
     local_instanceCount = instanceCount;
     local_firstVertex = firstVertex;
     local_firstInstance = firstInstance;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_541;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_541, 1);
-        countingStream->write((uint64_t*)&cgen_var_541, 1 * 8);
-        countingStream->write((uint32_t*)&local_vertexCount, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_instanceCount, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_firstVertex, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_firstInstance, sizeof(uint32_t));
+        uint64_t cgen_var_474;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdDraw = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdDraw = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDraw);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdDraw = OP_vkCmdDraw;
-    stream->write(&opcode_vkCmdDraw, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdDraw, sizeof(uint32_t));
-    uint64_t cgen_var_542;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_542, 1);
-    stream->write((uint64_t*)&cgen_var_542, 1 * 8);
-    stream->write((uint32_t*)&local_vertexCount, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_instanceCount, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_firstVertex, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_firstInstance, sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdDraw, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdDraw, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_475;
+    *&cgen_var_475 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_475, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_vertexCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_instanceCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_firstVertex, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_firstInstance, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdDraw");;
 }
 
@@ -7571,54 +8914,70 @@
     uint32_t instanceCount,
     uint32_t firstIndex,
     int32_t vertexOffset,
-    uint32_t firstInstance)
+    uint32_t firstInstance,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdDrawIndexed");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     uint32_t local_indexCount;
     uint32_t local_instanceCount;
     uint32_t local_firstIndex;
     int32_t local_vertexOffset;
     uint32_t local_firstInstance;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_indexCount = indexCount;
     local_instanceCount = instanceCount;
     local_firstIndex = firstIndex;
     local_vertexOffset = vertexOffset;
     local_firstInstance = firstInstance;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_543;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_543, 1);
-        countingStream->write((uint64_t*)&cgen_var_543, 1 * 8);
-        countingStream->write((uint32_t*)&local_indexCount, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_instanceCount, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_firstIndex, sizeof(uint32_t));
-        countingStream->write((int32_t*)&local_vertexOffset, sizeof(int32_t));
-        countingStream->write((uint32_t*)&local_firstInstance, sizeof(uint32_t));
+        uint64_t cgen_var_476;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(int32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdDrawIndexed = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdDrawIndexed = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDrawIndexed);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdDrawIndexed = OP_vkCmdDrawIndexed;
-    stream->write(&opcode_vkCmdDrawIndexed, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdDrawIndexed, sizeof(uint32_t));
-    uint64_t cgen_var_544;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_544, 1);
-    stream->write((uint64_t*)&cgen_var_544, 1 * 8);
-    stream->write((uint32_t*)&local_indexCount, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_instanceCount, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_firstIndex, sizeof(uint32_t));
-    stream->write((int32_t*)&local_vertexOffset, sizeof(int32_t));
-    stream->write((uint32_t*)&local_firstInstance, sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdDrawIndexed, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdDrawIndexed, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_477;
+    *&cgen_var_477 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_477, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_indexCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_instanceCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_firstIndex, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (int32_t*)&local_vertexOffset, sizeof(int32_t));
+    *streamPtrPtr += sizeof(int32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_firstInstance, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdDrawIndexed");;
 }
 
@@ -7627,54 +8986,68 @@
     VkBuffer buffer,
     VkDeviceSize offset,
     uint32_t drawCount,
-    uint32_t stride)
+    uint32_t stride,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdDrawIndirect");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkBuffer local_buffer;
     VkDeviceSize local_offset;
     uint32_t local_drawCount;
     uint32_t local_stride;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_buffer = buffer;
     local_offset = offset;
     local_drawCount = drawCount;
     local_stride = stride;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_545;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_545, 1);
-        countingStream->write((uint64_t*)&cgen_var_545, 1 * 8);
-        uint64_t cgen_var_546;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_546, 1);
-        countingStream->write((uint64_t*)&cgen_var_546, 1 * 8);
-        countingStream->write((VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
-        countingStream->write((uint32_t*)&local_drawCount, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_stride, sizeof(uint32_t));
+        uint64_t cgen_var_478;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_479;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkDeviceSize);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdDrawIndirect = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdDrawIndirect = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDrawIndirect);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdDrawIndirect = OP_vkCmdDrawIndirect;
-    stream->write(&opcode_vkCmdDrawIndirect, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdDrawIndirect, sizeof(uint32_t));
-    uint64_t cgen_var_547;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_547, 1);
-    stream->write((uint64_t*)&cgen_var_547, 1 * 8);
-    uint64_t cgen_var_548;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_548, 1);
-    stream->write((uint64_t*)&cgen_var_548, 1 * 8);
-    stream->write((VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
-    stream->write((uint32_t*)&local_drawCount, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_stride, sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdDrawIndirect, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdDrawIndirect, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_480;
+    *&cgen_var_480 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_480, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_481;
+    *&cgen_var_481 = get_host_u64_VkBuffer((*&local_buffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_481, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_drawCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_stride, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdDrawIndirect");;
 }
 
@@ -7683,54 +9056,68 @@
     VkBuffer buffer,
     VkDeviceSize offset,
     uint32_t drawCount,
-    uint32_t stride)
+    uint32_t stride,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdDrawIndexedIndirect");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkBuffer local_buffer;
     VkDeviceSize local_offset;
     uint32_t local_drawCount;
     uint32_t local_stride;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_buffer = buffer;
     local_offset = offset;
     local_drawCount = drawCount;
     local_stride = stride;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_549;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_549, 1);
-        countingStream->write((uint64_t*)&cgen_var_549, 1 * 8);
-        uint64_t cgen_var_550;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_550, 1);
-        countingStream->write((uint64_t*)&cgen_var_550, 1 * 8);
-        countingStream->write((VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
-        countingStream->write((uint32_t*)&local_drawCount, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_stride, sizeof(uint32_t));
+        uint64_t cgen_var_482;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_483;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkDeviceSize);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdDrawIndexedIndirect = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdDrawIndexedIndirect = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDrawIndexedIndirect);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdDrawIndexedIndirect = OP_vkCmdDrawIndexedIndirect;
-    stream->write(&opcode_vkCmdDrawIndexedIndirect, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdDrawIndexedIndirect, sizeof(uint32_t));
-    uint64_t cgen_var_551;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_551, 1);
-    stream->write((uint64_t*)&cgen_var_551, 1 * 8);
-    uint64_t cgen_var_552;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_552, 1);
-    stream->write((uint64_t*)&cgen_var_552, 1 * 8);
-    stream->write((VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
-    stream->write((uint32_t*)&local_drawCount, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_stride, sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdDrawIndexedIndirect, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdDrawIndexedIndirect, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_484;
+    *&cgen_var_484 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_484, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_485;
+    *&cgen_var_485 = get_host_u64_VkBuffer((*&local_buffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_485, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_drawCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_stride, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdDrawIndexedIndirect");;
 }
 
@@ -7738,92 +9125,118 @@
     VkCommandBuffer commandBuffer,
     uint32_t groupCountX,
     uint32_t groupCountY,
-    uint32_t groupCountZ)
+    uint32_t groupCountZ,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdDispatch");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     uint32_t local_groupCountX;
     uint32_t local_groupCountY;
     uint32_t local_groupCountZ;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_groupCountX = groupCountX;
     local_groupCountY = groupCountY;
     local_groupCountZ = groupCountZ;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_553;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_553, 1);
-        countingStream->write((uint64_t*)&cgen_var_553, 1 * 8);
-        countingStream->write((uint32_t*)&local_groupCountX, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_groupCountY, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_groupCountZ, sizeof(uint32_t));
+        uint64_t cgen_var_486;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdDispatch = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdDispatch = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDispatch);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdDispatch = OP_vkCmdDispatch;
-    stream->write(&opcode_vkCmdDispatch, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdDispatch, sizeof(uint32_t));
-    uint64_t cgen_var_554;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_554, 1);
-    stream->write((uint64_t*)&cgen_var_554, 1 * 8);
-    stream->write((uint32_t*)&local_groupCountX, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_groupCountY, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_groupCountZ, sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdDispatch, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdDispatch, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_487;
+    *&cgen_var_487 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_487, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_groupCountX, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_groupCountY, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_groupCountZ, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdDispatch");;
 }
 
 void VkEncoder::vkCmdDispatchIndirect(
     VkCommandBuffer commandBuffer,
     VkBuffer buffer,
-    VkDeviceSize offset)
+    VkDeviceSize offset,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdDispatchIndirect");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkBuffer local_buffer;
     VkDeviceSize local_offset;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_buffer = buffer;
     local_offset = offset;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_555;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_555, 1);
-        countingStream->write((uint64_t*)&cgen_var_555, 1 * 8);
-        uint64_t cgen_var_556;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_556, 1);
-        countingStream->write((uint64_t*)&cgen_var_556, 1 * 8);
-        countingStream->write((VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
+        uint64_t cgen_var_488;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_489;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkDeviceSize);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdDispatchIndirect = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdDispatchIndirect = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDispatchIndirect);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdDispatchIndirect = OP_vkCmdDispatchIndirect;
-    stream->write(&opcode_vkCmdDispatchIndirect, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdDispatchIndirect, sizeof(uint32_t));
-    uint64_t cgen_var_557;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_557, 1);
-    stream->write((uint64_t*)&cgen_var_557, 1 * 8);
-    uint64_t cgen_var_558;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_558, 1);
-    stream->write((uint64_t*)&cgen_var_558, 1 * 8);
-    stream->write((VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdDispatchIndirect, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdDispatchIndirect, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_490;
+    *&cgen_var_490 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_490, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_491;
+    *&cgen_var_491 = get_host_u64_VkBuffer((*&local_buffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_491, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdDispatchIndirect");;
 }
 
@@ -7832,20 +9245,20 @@
     VkBuffer srcBuffer,
     VkBuffer dstBuffer,
     uint32_t regionCount,
-    const VkBufferCopy* pRegions)
+    const VkBufferCopy* pRegions,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdCopyBuffer");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkBuffer local_srcBuffer;
     VkBuffer local_dstBuffer;
     uint32_t local_regionCount;
     VkBufferCopy* local_pRegions;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_srcBuffer = srcBuffer;
     local_dstBuffer = dstBuffer;
@@ -7859,6 +9272,7 @@
             deepcopy_VkBufferCopy(pool, pRegions + i, (VkBufferCopy*)(local_pRegions + i));
         }
     }
+    local_doLock = doLock;
     if (local_pRegions)
     {
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
@@ -7866,45 +9280,56 @@
             transform_tohost_VkBufferCopy(mImpl->resources(), (VkBufferCopy*)(local_pRegions + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_559;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_559, 1);
-        countingStream->write((uint64_t*)&cgen_var_559, 1 * 8);
-        uint64_t cgen_var_560;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_srcBuffer, &cgen_var_560, 1);
-        countingStream->write((uint64_t*)&cgen_var_560, 1 * 8);
-        uint64_t cgen_var_561;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_dstBuffer, &cgen_var_561, 1);
-        countingStream->write((uint64_t*)&cgen_var_561, 1 * 8);
-        countingStream->write((uint32_t*)&local_regionCount, sizeof(uint32_t));
+        uint64_t cgen_var_492;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_493;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_494;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
         {
-            marshal_VkBufferCopy(countingStream, (VkBufferCopy*)(local_pRegions + i));
+            count_VkBufferCopy(featureBits, (VkBufferCopy*)(local_pRegions + i), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdCopyBuffer = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdCopyBuffer = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdCopyBuffer);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdCopyBuffer = OP_vkCmdCopyBuffer;
-    stream->write(&opcode_vkCmdCopyBuffer, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdCopyBuffer, sizeof(uint32_t));
-    uint64_t cgen_var_562;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_562, 1);
-    stream->write((uint64_t*)&cgen_var_562, 1 * 8);
-    uint64_t cgen_var_563;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_srcBuffer, &cgen_var_563, 1);
-    stream->write((uint64_t*)&cgen_var_563, 1 * 8);
-    uint64_t cgen_var_564;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_dstBuffer, &cgen_var_564, 1);
-    stream->write((uint64_t*)&cgen_var_564, 1 * 8);
-    stream->write((uint32_t*)&local_regionCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkCmdCopyBuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdCopyBuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_495;
+    *&cgen_var_495 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_495, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_496;
+    *&cgen_var_496 = get_host_u64_VkBuffer((*&local_srcBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_496, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_497;
+    *&cgen_var_497 = get_host_u64_VkBuffer((*&local_dstBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_497, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_regionCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
     {
-        marshal_VkBufferCopy(stream, (VkBufferCopy*)(local_pRegions + i));
+        reservedmarshal_VkBufferCopy(stream, (VkBufferCopy*)(local_pRegions + i), streamPtrPtr);
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdCopyBuffer");;
 }
 
@@ -7915,15 +9340,14 @@
     VkImage dstImage,
     VkImageLayout dstImageLayout,
     uint32_t regionCount,
-    const VkImageCopy* pRegions)
+    const VkImageCopy* pRegions,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdCopyImage");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkImage local_srcImage;
     VkImageLayout local_srcImageLayout;
@@ -7931,6 +9355,7 @@
     VkImageLayout local_dstImageLayout;
     uint32_t local_regionCount;
     VkImageCopy* local_pRegions;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_srcImage = srcImage;
     local_srcImageLayout = srcImageLayout;
@@ -7946,6 +9371,7 @@
             deepcopy_VkImageCopy(pool, pRegions + i, (VkImageCopy*)(local_pRegions + i));
         }
     }
+    local_doLock = doLock;
     if (local_pRegions)
     {
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
@@ -7953,49 +9379,62 @@
             transform_tohost_VkImageCopy(mImpl->resources(), (VkImageCopy*)(local_pRegions + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_565;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_565, 1);
-        countingStream->write((uint64_t*)&cgen_var_565, 1 * 8);
-        uint64_t cgen_var_566;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(&local_srcImage, &cgen_var_566, 1);
-        countingStream->write((uint64_t*)&cgen_var_566, 1 * 8);
-        countingStream->write((VkImageLayout*)&local_srcImageLayout, sizeof(VkImageLayout));
-        uint64_t cgen_var_567;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(&local_dstImage, &cgen_var_567, 1);
-        countingStream->write((uint64_t*)&cgen_var_567, 1 * 8);
-        countingStream->write((VkImageLayout*)&local_dstImageLayout, sizeof(VkImageLayout));
-        countingStream->write((uint32_t*)&local_regionCount, sizeof(uint32_t));
+        uint64_t cgen_var_498;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_499;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkImageLayout);
+        uint64_t cgen_var_500;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkImageLayout);
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
         {
-            marshal_VkImageCopy(countingStream, (VkImageCopy*)(local_pRegions + i));
+            count_VkImageCopy(featureBits, (VkImageCopy*)(local_pRegions + i), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdCopyImage = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdCopyImage = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdCopyImage);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdCopyImage = OP_vkCmdCopyImage;
-    stream->write(&opcode_vkCmdCopyImage, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdCopyImage, sizeof(uint32_t));
-    uint64_t cgen_var_568;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_568, 1);
-    stream->write((uint64_t*)&cgen_var_568, 1 * 8);
-    uint64_t cgen_var_569;
-    stream->handleMapping()->mapHandles_VkImage_u64(&local_srcImage, &cgen_var_569, 1);
-    stream->write((uint64_t*)&cgen_var_569, 1 * 8);
-    stream->write((VkImageLayout*)&local_srcImageLayout, sizeof(VkImageLayout));
-    uint64_t cgen_var_570;
-    stream->handleMapping()->mapHandles_VkImage_u64(&local_dstImage, &cgen_var_570, 1);
-    stream->write((uint64_t*)&cgen_var_570, 1 * 8);
-    stream->write((VkImageLayout*)&local_dstImageLayout, sizeof(VkImageLayout));
-    stream->write((uint32_t*)&local_regionCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkCmdCopyImage, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdCopyImage, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_501;
+    *&cgen_var_501 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_501, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_502;
+    *&cgen_var_502 = get_host_u64_VkImage((*&local_srcImage));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_502, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkImageLayout*)&local_srcImageLayout, sizeof(VkImageLayout));
+    *streamPtrPtr += sizeof(VkImageLayout);
+    uint64_t cgen_var_503;
+    *&cgen_var_503 = get_host_u64_VkImage((*&local_dstImage));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_503, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkImageLayout*)&local_dstImageLayout, sizeof(VkImageLayout));
+    *streamPtrPtr += sizeof(VkImageLayout);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_regionCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
     {
-        marshal_VkImageCopy(stream, (VkImageCopy*)(local_pRegions + i));
+        reservedmarshal_VkImageCopy(stream, (VkImageCopy*)(local_pRegions + i), streamPtrPtr);
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdCopyImage");;
 }
 
@@ -8007,15 +9446,14 @@
     VkImageLayout dstImageLayout,
     uint32_t regionCount,
     const VkImageBlit* pRegions,
-    VkFilter filter)
+    VkFilter filter,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdBlitImage");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkImage local_srcImage;
     VkImageLayout local_srcImageLayout;
@@ -8024,6 +9462,7 @@
     uint32_t local_regionCount;
     VkImageBlit* local_pRegions;
     VkFilter local_filter;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_srcImage = srcImage;
     local_srcImageLayout = srcImageLayout;
@@ -8040,6 +9479,7 @@
         }
     }
     local_filter = filter;
+    local_doLock = doLock;
     if (local_pRegions)
     {
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
@@ -8047,51 +9487,65 @@
             transform_tohost_VkImageBlit(mImpl->resources(), (VkImageBlit*)(local_pRegions + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_571;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_571, 1);
-        countingStream->write((uint64_t*)&cgen_var_571, 1 * 8);
-        uint64_t cgen_var_572;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(&local_srcImage, &cgen_var_572, 1);
-        countingStream->write((uint64_t*)&cgen_var_572, 1 * 8);
-        countingStream->write((VkImageLayout*)&local_srcImageLayout, sizeof(VkImageLayout));
-        uint64_t cgen_var_573;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(&local_dstImage, &cgen_var_573, 1);
-        countingStream->write((uint64_t*)&cgen_var_573, 1 * 8);
-        countingStream->write((VkImageLayout*)&local_dstImageLayout, sizeof(VkImageLayout));
-        countingStream->write((uint32_t*)&local_regionCount, sizeof(uint32_t));
+        uint64_t cgen_var_504;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_505;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkImageLayout);
+        uint64_t cgen_var_506;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkImageLayout);
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
         {
-            marshal_VkImageBlit(countingStream, (VkImageBlit*)(local_pRegions + i));
+            count_VkImageBlit(featureBits, (VkImageBlit*)(local_pRegions + i), countPtr);
         }
-        countingStream->write((VkFilter*)&local_filter, sizeof(VkFilter));
+        *countPtr += sizeof(VkFilter);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdBlitImage = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdBlitImage = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBlitImage);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdBlitImage = OP_vkCmdBlitImage;
-    stream->write(&opcode_vkCmdBlitImage, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdBlitImage, sizeof(uint32_t));
-    uint64_t cgen_var_574;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_574, 1);
-    stream->write((uint64_t*)&cgen_var_574, 1 * 8);
-    uint64_t cgen_var_575;
-    stream->handleMapping()->mapHandles_VkImage_u64(&local_srcImage, &cgen_var_575, 1);
-    stream->write((uint64_t*)&cgen_var_575, 1 * 8);
-    stream->write((VkImageLayout*)&local_srcImageLayout, sizeof(VkImageLayout));
-    uint64_t cgen_var_576;
-    stream->handleMapping()->mapHandles_VkImage_u64(&local_dstImage, &cgen_var_576, 1);
-    stream->write((uint64_t*)&cgen_var_576, 1 * 8);
-    stream->write((VkImageLayout*)&local_dstImageLayout, sizeof(VkImageLayout));
-    stream->write((uint32_t*)&local_regionCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkCmdBlitImage, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdBlitImage, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_507;
+    *&cgen_var_507 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_507, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_508;
+    *&cgen_var_508 = get_host_u64_VkImage((*&local_srcImage));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_508, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkImageLayout*)&local_srcImageLayout, sizeof(VkImageLayout));
+    *streamPtrPtr += sizeof(VkImageLayout);
+    uint64_t cgen_var_509;
+    *&cgen_var_509 = get_host_u64_VkImage((*&local_dstImage));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_509, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkImageLayout*)&local_dstImageLayout, sizeof(VkImageLayout));
+    *streamPtrPtr += sizeof(VkImageLayout);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_regionCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
     {
-        marshal_VkImageBlit(stream, (VkImageBlit*)(local_pRegions + i));
+        reservedmarshal_VkImageBlit(stream, (VkImageBlit*)(local_pRegions + i), streamPtrPtr);
     }
-    stream->write((VkFilter*)&local_filter, sizeof(VkFilter));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (VkFilter*)&local_filter, sizeof(VkFilter));
+    *streamPtrPtr += sizeof(VkFilter);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdBlitImage");;
 }
 
@@ -8101,21 +9555,21 @@
     VkImage dstImage,
     VkImageLayout dstImageLayout,
     uint32_t regionCount,
-    const VkBufferImageCopy* pRegions)
+    const VkBufferImageCopy* pRegions,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdCopyBufferToImage");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkBuffer local_srcBuffer;
     VkImage local_dstImage;
     VkImageLayout local_dstImageLayout;
     uint32_t local_regionCount;
     VkBufferImageCopy* local_pRegions;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_srcBuffer = srcBuffer;
     local_dstImage = dstImage;
@@ -8130,6 +9584,7 @@
             deepcopy_VkBufferImageCopy(pool, pRegions + i, (VkBufferImageCopy*)(local_pRegions + i));
         }
     }
+    local_doLock = doLock;
     if (local_pRegions)
     {
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
@@ -8137,47 +9592,59 @@
             transform_tohost_VkBufferImageCopy(mImpl->resources(), (VkBufferImageCopy*)(local_pRegions + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_577;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_577, 1);
-        countingStream->write((uint64_t*)&cgen_var_577, 1 * 8);
-        uint64_t cgen_var_578;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_srcBuffer, &cgen_var_578, 1);
-        countingStream->write((uint64_t*)&cgen_var_578, 1 * 8);
-        uint64_t cgen_var_579;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(&local_dstImage, &cgen_var_579, 1);
-        countingStream->write((uint64_t*)&cgen_var_579, 1 * 8);
-        countingStream->write((VkImageLayout*)&local_dstImageLayout, sizeof(VkImageLayout));
-        countingStream->write((uint32_t*)&local_regionCount, sizeof(uint32_t));
+        uint64_t cgen_var_510;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_511;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_512;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkImageLayout);
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
         {
-            marshal_VkBufferImageCopy(countingStream, (VkBufferImageCopy*)(local_pRegions + i));
+            count_VkBufferImageCopy(featureBits, (VkBufferImageCopy*)(local_pRegions + i), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdCopyBufferToImage = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdCopyBufferToImage = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdCopyBufferToImage);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdCopyBufferToImage = OP_vkCmdCopyBufferToImage;
-    stream->write(&opcode_vkCmdCopyBufferToImage, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdCopyBufferToImage, sizeof(uint32_t));
-    uint64_t cgen_var_580;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_580, 1);
-    stream->write((uint64_t*)&cgen_var_580, 1 * 8);
-    uint64_t cgen_var_581;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_srcBuffer, &cgen_var_581, 1);
-    stream->write((uint64_t*)&cgen_var_581, 1 * 8);
-    uint64_t cgen_var_582;
-    stream->handleMapping()->mapHandles_VkImage_u64(&local_dstImage, &cgen_var_582, 1);
-    stream->write((uint64_t*)&cgen_var_582, 1 * 8);
-    stream->write((VkImageLayout*)&local_dstImageLayout, sizeof(VkImageLayout));
-    stream->write((uint32_t*)&local_regionCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkCmdCopyBufferToImage, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdCopyBufferToImage, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_513;
+    *&cgen_var_513 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_513, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_514;
+    *&cgen_var_514 = get_host_u64_VkBuffer((*&local_srcBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_514, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_515;
+    *&cgen_var_515 = get_host_u64_VkImage((*&local_dstImage));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_515, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkImageLayout*)&local_dstImageLayout, sizeof(VkImageLayout));
+    *streamPtrPtr += sizeof(VkImageLayout);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_regionCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
     {
-        marshal_VkBufferImageCopy(stream, (VkBufferImageCopy*)(local_pRegions + i));
+        reservedmarshal_VkBufferImageCopy(stream, (VkBufferImageCopy*)(local_pRegions + i), streamPtrPtr);
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdCopyBufferToImage");;
 }
 
@@ -8187,21 +9654,21 @@
     VkImageLayout srcImageLayout,
     VkBuffer dstBuffer,
     uint32_t regionCount,
-    const VkBufferImageCopy* pRegions)
+    const VkBufferImageCopy* pRegions,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdCopyImageToBuffer");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkImage local_srcImage;
     VkImageLayout local_srcImageLayout;
     VkBuffer local_dstBuffer;
     uint32_t local_regionCount;
     VkBufferImageCopy* local_pRegions;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_srcImage = srcImage;
     local_srcImageLayout = srcImageLayout;
@@ -8216,6 +9683,7 @@
             deepcopy_VkBufferImageCopy(pool, pRegions + i, (VkBufferImageCopy*)(local_pRegions + i));
         }
     }
+    local_doLock = doLock;
     if (local_pRegions)
     {
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
@@ -8223,47 +9691,59 @@
             transform_tohost_VkBufferImageCopy(mImpl->resources(), (VkBufferImageCopy*)(local_pRegions + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_583;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_583, 1);
-        countingStream->write((uint64_t*)&cgen_var_583, 1 * 8);
-        uint64_t cgen_var_584;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(&local_srcImage, &cgen_var_584, 1);
-        countingStream->write((uint64_t*)&cgen_var_584, 1 * 8);
-        countingStream->write((VkImageLayout*)&local_srcImageLayout, sizeof(VkImageLayout));
-        uint64_t cgen_var_585;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_dstBuffer, &cgen_var_585, 1);
-        countingStream->write((uint64_t*)&cgen_var_585, 1 * 8);
-        countingStream->write((uint32_t*)&local_regionCount, sizeof(uint32_t));
+        uint64_t cgen_var_516;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_517;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkImageLayout);
+        uint64_t cgen_var_518;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
         {
-            marshal_VkBufferImageCopy(countingStream, (VkBufferImageCopy*)(local_pRegions + i));
+            count_VkBufferImageCopy(featureBits, (VkBufferImageCopy*)(local_pRegions + i), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdCopyImageToBuffer = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdCopyImageToBuffer = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdCopyImageToBuffer);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdCopyImageToBuffer = OP_vkCmdCopyImageToBuffer;
-    stream->write(&opcode_vkCmdCopyImageToBuffer, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdCopyImageToBuffer, sizeof(uint32_t));
-    uint64_t cgen_var_586;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_586, 1);
-    stream->write((uint64_t*)&cgen_var_586, 1 * 8);
-    uint64_t cgen_var_587;
-    stream->handleMapping()->mapHandles_VkImage_u64(&local_srcImage, &cgen_var_587, 1);
-    stream->write((uint64_t*)&cgen_var_587, 1 * 8);
-    stream->write((VkImageLayout*)&local_srcImageLayout, sizeof(VkImageLayout));
-    uint64_t cgen_var_588;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_dstBuffer, &cgen_var_588, 1);
-    stream->write((uint64_t*)&cgen_var_588, 1 * 8);
-    stream->write((uint32_t*)&local_regionCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkCmdCopyImageToBuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdCopyImageToBuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_519;
+    *&cgen_var_519 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_519, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_520;
+    *&cgen_var_520 = get_host_u64_VkImage((*&local_srcImage));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_520, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkImageLayout*)&local_srcImageLayout, sizeof(VkImageLayout));
+    *streamPtrPtr += sizeof(VkImageLayout);
+    uint64_t cgen_var_521;
+    *&cgen_var_521 = get_host_u64_VkBuffer((*&local_dstBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_521, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_regionCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
     {
-        marshal_VkBufferImageCopy(stream, (VkBufferImageCopy*)(local_pRegions + i));
+        reservedmarshal_VkBufferImageCopy(stream, (VkBufferImageCopy*)(local_pRegions + i), streamPtrPtr);
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdCopyImageToBuffer");;
 }
 
@@ -8272,20 +9752,20 @@
     VkBuffer dstBuffer,
     VkDeviceSize dstOffset,
     VkDeviceSize dataSize,
-    const void* pData)
+    const void* pData,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdUpdateBuffer");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkBuffer local_dstBuffer;
     VkDeviceSize local_dstOffset;
     VkDeviceSize local_dataSize;
     void* local_pData;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_dstBuffer = dstBuffer;
     local_dstOffset = dstOffset;
@@ -8295,35 +9775,49 @@
     {
         local_pData = (void*)pool->dupArray(pData, ((dataSize)) * sizeof(const uint8_t));
     }
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_589;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_589, 1);
-        countingStream->write((uint64_t*)&cgen_var_589, 1 * 8);
-        uint64_t cgen_var_590;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_dstBuffer, &cgen_var_590, 1);
-        countingStream->write((uint64_t*)&cgen_var_590, 1 * 8);
-        countingStream->write((VkDeviceSize*)&local_dstOffset, sizeof(VkDeviceSize));
-        countingStream->write((VkDeviceSize*)&local_dataSize, sizeof(VkDeviceSize));
-        countingStream->write((void*)local_pData, ((dataSize)) * sizeof(uint8_t));
+        uint64_t cgen_var_522;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_523;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkDeviceSize);
+        *countPtr += sizeof(VkDeviceSize);
+        *countPtr += ((dataSize)) * sizeof(uint8_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdUpdateBuffer = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdUpdateBuffer = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdUpdateBuffer);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdUpdateBuffer = OP_vkCmdUpdateBuffer;
-    stream->write(&opcode_vkCmdUpdateBuffer, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdUpdateBuffer, sizeof(uint32_t));
-    uint64_t cgen_var_591;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_591, 1);
-    stream->write((uint64_t*)&cgen_var_591, 1 * 8);
-    uint64_t cgen_var_592;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_dstBuffer, &cgen_var_592, 1);
-    stream->write((uint64_t*)&cgen_var_592, 1 * 8);
-    stream->write((VkDeviceSize*)&local_dstOffset, sizeof(VkDeviceSize));
-    stream->write((VkDeviceSize*)&local_dataSize, sizeof(VkDeviceSize));
-    stream->write((void*)local_pData, ((dataSize)) * sizeof(uint8_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdUpdateBuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdUpdateBuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_524;
+    *&cgen_var_524 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_524, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_525;
+    *&cgen_var_525 = get_host_u64_VkBuffer((*&local_dstBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_525, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkDeviceSize*)&local_dstOffset, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    memcpy(*streamPtrPtr, (VkDeviceSize*)&local_dataSize, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    memcpy(*streamPtrPtr, (void*)local_pData, ((dataSize)) * sizeof(uint8_t));
+    *streamPtrPtr += ((dataSize)) * sizeof(uint8_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdUpdateBuffer");;
 }
 
@@ -8332,54 +9826,68 @@
     VkBuffer dstBuffer,
     VkDeviceSize dstOffset,
     VkDeviceSize size,
-    uint32_t data)
+    uint32_t data,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdFillBuffer");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkBuffer local_dstBuffer;
     VkDeviceSize local_dstOffset;
     VkDeviceSize local_size;
     uint32_t local_data;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_dstBuffer = dstBuffer;
     local_dstOffset = dstOffset;
     local_size = size;
     local_data = data;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_593;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_593, 1);
-        countingStream->write((uint64_t*)&cgen_var_593, 1 * 8);
-        uint64_t cgen_var_594;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_dstBuffer, &cgen_var_594, 1);
-        countingStream->write((uint64_t*)&cgen_var_594, 1 * 8);
-        countingStream->write((VkDeviceSize*)&local_dstOffset, sizeof(VkDeviceSize));
-        countingStream->write((VkDeviceSize*)&local_size, sizeof(VkDeviceSize));
-        countingStream->write((uint32_t*)&local_data, sizeof(uint32_t));
+        uint64_t cgen_var_526;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_527;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkDeviceSize);
+        *countPtr += sizeof(VkDeviceSize);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdFillBuffer = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdFillBuffer = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdFillBuffer);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdFillBuffer = OP_vkCmdFillBuffer;
-    stream->write(&opcode_vkCmdFillBuffer, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdFillBuffer, sizeof(uint32_t));
-    uint64_t cgen_var_595;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_595, 1);
-    stream->write((uint64_t*)&cgen_var_595, 1 * 8);
-    uint64_t cgen_var_596;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_dstBuffer, &cgen_var_596, 1);
-    stream->write((uint64_t*)&cgen_var_596, 1 * 8);
-    stream->write((VkDeviceSize*)&local_dstOffset, sizeof(VkDeviceSize));
-    stream->write((VkDeviceSize*)&local_size, sizeof(VkDeviceSize));
-    stream->write((uint32_t*)&local_data, sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdFillBuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdFillBuffer, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_528;
+    *&cgen_var_528 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_528, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_529;
+    *&cgen_var_529 = get_host_u64_VkBuffer((*&local_dstBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_529, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkDeviceSize*)&local_dstOffset, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    memcpy(*streamPtrPtr, (VkDeviceSize*)&local_size, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_data, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdFillBuffer");;
 }
 
@@ -8389,21 +9897,21 @@
     VkImageLayout imageLayout,
     const VkClearColorValue* pColor,
     uint32_t rangeCount,
-    const VkImageSubresourceRange* pRanges)
+    const VkImageSubresourceRange* pRanges,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdClearColorImage");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkImage local_image;
     VkImageLayout local_imageLayout;
     VkClearColorValue* local_pColor;
     uint32_t local_rangeCount;
     VkImageSubresourceRange* local_pRanges;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_image = image;
     local_imageLayout = imageLayout;
@@ -8423,6 +9931,7 @@
             deepcopy_VkImageSubresourceRange(pool, pRanges + i, (VkImageSubresourceRange*)(local_pRanges + i));
         }
     }
+    local_doLock = doLock;
     if (local_pColor)
     {
         transform_tohost_VkClearColorValue(mImpl->resources(), (VkClearColorValue*)(local_pColor));
@@ -8434,43 +9943,55 @@
             transform_tohost_VkImageSubresourceRange(mImpl->resources(), (VkImageSubresourceRange*)(local_pRanges + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_597;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_597, 1);
-        countingStream->write((uint64_t*)&cgen_var_597, 1 * 8);
-        uint64_t cgen_var_598;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_598, 1);
-        countingStream->write((uint64_t*)&cgen_var_598, 1 * 8);
-        countingStream->write((VkImageLayout*)&local_imageLayout, sizeof(VkImageLayout));
-        marshal_VkClearColorValue(countingStream, (VkClearColorValue*)(local_pColor));
-        countingStream->write((uint32_t*)&local_rangeCount, sizeof(uint32_t));
+        uint64_t cgen_var_530;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_531;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkImageLayout);
+        count_VkClearColorValue(featureBits, (VkClearColorValue*)(local_pColor), countPtr);
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i)
         {
-            marshal_VkImageSubresourceRange(countingStream, (VkImageSubresourceRange*)(local_pRanges + i));
+            count_VkImageSubresourceRange(featureBits, (VkImageSubresourceRange*)(local_pRanges + i), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdClearColorImage = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdClearColorImage = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdClearColorImage);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdClearColorImage = OP_vkCmdClearColorImage;
-    stream->write(&opcode_vkCmdClearColorImage, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdClearColorImage, sizeof(uint32_t));
-    uint64_t cgen_var_599;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_599, 1);
-    stream->write((uint64_t*)&cgen_var_599, 1 * 8);
-    uint64_t cgen_var_600;
-    stream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_600, 1);
-    stream->write((uint64_t*)&cgen_var_600, 1 * 8);
-    stream->write((VkImageLayout*)&local_imageLayout, sizeof(VkImageLayout));
-    marshal_VkClearColorValue(stream, (VkClearColorValue*)(local_pColor));
-    stream->write((uint32_t*)&local_rangeCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkCmdClearColorImage, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdClearColorImage, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_532;
+    *&cgen_var_532 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_532, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_533;
+    *&cgen_var_533 = get_host_u64_VkImage((*&local_image));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_533, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkImageLayout*)&local_imageLayout, sizeof(VkImageLayout));
+    *streamPtrPtr += sizeof(VkImageLayout);
+    reservedmarshal_VkClearColorValue(stream, (VkClearColorValue*)(local_pColor), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_rangeCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i)
     {
-        marshal_VkImageSubresourceRange(stream, (VkImageSubresourceRange*)(local_pRanges + i));
+        reservedmarshal_VkImageSubresourceRange(stream, (VkImageSubresourceRange*)(local_pRanges + i), streamPtrPtr);
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdClearColorImage");;
 }
 
@@ -8480,21 +10001,21 @@
     VkImageLayout imageLayout,
     const VkClearDepthStencilValue* pDepthStencil,
     uint32_t rangeCount,
-    const VkImageSubresourceRange* pRanges)
+    const VkImageSubresourceRange* pRanges,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdClearDepthStencilImage");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkImage local_image;
     VkImageLayout local_imageLayout;
     VkClearDepthStencilValue* local_pDepthStencil;
     uint32_t local_rangeCount;
     VkImageSubresourceRange* local_pRanges;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_image = image;
     local_imageLayout = imageLayout;
@@ -8514,6 +10035,7 @@
             deepcopy_VkImageSubresourceRange(pool, pRanges + i, (VkImageSubresourceRange*)(local_pRanges + i));
         }
     }
+    local_doLock = doLock;
     if (local_pDepthStencil)
     {
         transform_tohost_VkClearDepthStencilValue(mImpl->resources(), (VkClearDepthStencilValue*)(local_pDepthStencil));
@@ -8525,43 +10047,55 @@
             transform_tohost_VkImageSubresourceRange(mImpl->resources(), (VkImageSubresourceRange*)(local_pRanges + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_601;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_601, 1);
-        countingStream->write((uint64_t*)&cgen_var_601, 1 * 8);
-        uint64_t cgen_var_602;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_602, 1);
-        countingStream->write((uint64_t*)&cgen_var_602, 1 * 8);
-        countingStream->write((VkImageLayout*)&local_imageLayout, sizeof(VkImageLayout));
-        marshal_VkClearDepthStencilValue(countingStream, (VkClearDepthStencilValue*)(local_pDepthStencil));
-        countingStream->write((uint32_t*)&local_rangeCount, sizeof(uint32_t));
+        uint64_t cgen_var_534;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_535;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkImageLayout);
+        count_VkClearDepthStencilValue(featureBits, (VkClearDepthStencilValue*)(local_pDepthStencil), countPtr);
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i)
         {
-            marshal_VkImageSubresourceRange(countingStream, (VkImageSubresourceRange*)(local_pRanges + i));
+            count_VkImageSubresourceRange(featureBits, (VkImageSubresourceRange*)(local_pRanges + i), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdClearDepthStencilImage = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdClearDepthStencilImage = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdClearDepthStencilImage);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdClearDepthStencilImage = OP_vkCmdClearDepthStencilImage;
-    stream->write(&opcode_vkCmdClearDepthStencilImage, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdClearDepthStencilImage, sizeof(uint32_t));
-    uint64_t cgen_var_603;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_603, 1);
-    stream->write((uint64_t*)&cgen_var_603, 1 * 8);
-    uint64_t cgen_var_604;
-    stream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_604, 1);
-    stream->write((uint64_t*)&cgen_var_604, 1 * 8);
-    stream->write((VkImageLayout*)&local_imageLayout, sizeof(VkImageLayout));
-    marshal_VkClearDepthStencilValue(stream, (VkClearDepthStencilValue*)(local_pDepthStencil));
-    stream->write((uint32_t*)&local_rangeCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkCmdClearDepthStencilImage, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdClearDepthStencilImage, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_536;
+    *&cgen_var_536 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_536, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_537;
+    *&cgen_var_537 = get_host_u64_VkImage((*&local_image));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_537, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkImageLayout*)&local_imageLayout, sizeof(VkImageLayout));
+    *streamPtrPtr += sizeof(VkImageLayout);
+    reservedmarshal_VkClearDepthStencilValue(stream, (VkClearDepthStencilValue*)(local_pDepthStencil), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_rangeCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i)
     {
-        marshal_VkImageSubresourceRange(stream, (VkImageSubresourceRange*)(local_pRanges + i));
+        reservedmarshal_VkImageSubresourceRange(stream, (VkImageSubresourceRange*)(local_pRanges + i), streamPtrPtr);
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdClearDepthStencilImage");;
 }
 
@@ -8570,20 +10104,20 @@
     uint32_t attachmentCount,
     const VkClearAttachment* pAttachments,
     uint32_t rectCount,
-    const VkClearRect* pRects)
+    const VkClearRect* pRects,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdClearAttachments");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     uint32_t local_attachmentCount;
     VkClearAttachment* local_pAttachments;
     uint32_t local_rectCount;
     VkClearRect* local_pRects;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_attachmentCount = attachmentCount;
     local_pAttachments = nullptr;
@@ -8605,6 +10139,7 @@
             deepcopy_VkClearRect(pool, pRects + i, (VkClearRect*)(local_pRects + i));
         }
     }
+    local_doLock = doLock;
     if (local_pAttachments)
     {
         for (uint32_t i = 0; i < (uint32_t)((attachmentCount)); ++i)
@@ -8619,43 +10154,55 @@
             transform_tohost_VkClearRect(mImpl->resources(), (VkClearRect*)(local_pRects + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_605;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_605, 1);
-        countingStream->write((uint64_t*)&cgen_var_605, 1 * 8);
-        countingStream->write((uint32_t*)&local_attachmentCount, sizeof(uint32_t));
+        uint64_t cgen_var_538;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((attachmentCount)); ++i)
         {
-            marshal_VkClearAttachment(countingStream, (VkClearAttachment*)(local_pAttachments + i));
+            count_VkClearAttachment(featureBits, (VkClearAttachment*)(local_pAttachments + i), countPtr);
         }
-        countingStream->write((uint32_t*)&local_rectCount, sizeof(uint32_t));
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((rectCount)); ++i)
         {
-            marshal_VkClearRect(countingStream, (VkClearRect*)(local_pRects + i));
+            count_VkClearRect(featureBits, (VkClearRect*)(local_pRects + i), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdClearAttachments = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdClearAttachments = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdClearAttachments);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdClearAttachments = OP_vkCmdClearAttachments;
-    stream->write(&opcode_vkCmdClearAttachments, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdClearAttachments, sizeof(uint32_t));
-    uint64_t cgen_var_606;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_606, 1);
-    stream->write((uint64_t*)&cgen_var_606, 1 * 8);
-    stream->write((uint32_t*)&local_attachmentCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkCmdClearAttachments, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdClearAttachments, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_539;
+    *&cgen_var_539 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_539, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_attachmentCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((attachmentCount)); ++i)
     {
-        marshal_VkClearAttachment(stream, (VkClearAttachment*)(local_pAttachments + i));
+        reservedmarshal_VkClearAttachment(stream, (VkClearAttachment*)(local_pAttachments + i), streamPtrPtr);
     }
-    stream->write((uint32_t*)&local_rectCount, sizeof(uint32_t));
+    memcpy(*streamPtrPtr, (uint32_t*)&local_rectCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((rectCount)); ++i)
     {
-        marshal_VkClearRect(stream, (VkClearRect*)(local_pRects + i));
+        reservedmarshal_VkClearRect(stream, (VkClearRect*)(local_pRects + i), streamPtrPtr);
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdClearAttachments");;
 }
 
@@ -8666,15 +10213,14 @@
     VkImage dstImage,
     VkImageLayout dstImageLayout,
     uint32_t regionCount,
-    const VkImageResolve* pRegions)
+    const VkImageResolve* pRegions,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdResolveImage");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkImage local_srcImage;
     VkImageLayout local_srcImageLayout;
@@ -8682,6 +10228,7 @@
     VkImageLayout local_dstImageLayout;
     uint32_t local_regionCount;
     VkImageResolve* local_pRegions;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_srcImage = srcImage;
     local_srcImageLayout = srcImageLayout;
@@ -8697,6 +10244,7 @@
             deepcopy_VkImageResolve(pool, pRegions + i, (VkImageResolve*)(local_pRegions + i));
         }
     }
+    local_doLock = doLock;
     if (local_pRegions)
     {
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
@@ -8704,141 +10252,178 @@
             transform_tohost_VkImageResolve(mImpl->resources(), (VkImageResolve*)(local_pRegions + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_607;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_607, 1);
-        countingStream->write((uint64_t*)&cgen_var_607, 1 * 8);
-        uint64_t cgen_var_608;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(&local_srcImage, &cgen_var_608, 1);
-        countingStream->write((uint64_t*)&cgen_var_608, 1 * 8);
-        countingStream->write((VkImageLayout*)&local_srcImageLayout, sizeof(VkImageLayout));
-        uint64_t cgen_var_609;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(&local_dstImage, &cgen_var_609, 1);
-        countingStream->write((uint64_t*)&cgen_var_609, 1 * 8);
-        countingStream->write((VkImageLayout*)&local_dstImageLayout, sizeof(VkImageLayout));
-        countingStream->write((uint32_t*)&local_regionCount, sizeof(uint32_t));
+        uint64_t cgen_var_540;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_541;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkImageLayout);
+        uint64_t cgen_var_542;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkImageLayout);
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
         {
-            marshal_VkImageResolve(countingStream, (VkImageResolve*)(local_pRegions + i));
+            count_VkImageResolve(featureBits, (VkImageResolve*)(local_pRegions + i), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdResolveImage = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdResolveImage = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdResolveImage);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdResolveImage = OP_vkCmdResolveImage;
-    stream->write(&opcode_vkCmdResolveImage, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdResolveImage, sizeof(uint32_t));
-    uint64_t cgen_var_610;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_610, 1);
-    stream->write((uint64_t*)&cgen_var_610, 1 * 8);
-    uint64_t cgen_var_611;
-    stream->handleMapping()->mapHandles_VkImage_u64(&local_srcImage, &cgen_var_611, 1);
-    stream->write((uint64_t*)&cgen_var_611, 1 * 8);
-    stream->write((VkImageLayout*)&local_srcImageLayout, sizeof(VkImageLayout));
-    uint64_t cgen_var_612;
-    stream->handleMapping()->mapHandles_VkImage_u64(&local_dstImage, &cgen_var_612, 1);
-    stream->write((uint64_t*)&cgen_var_612, 1 * 8);
-    stream->write((VkImageLayout*)&local_dstImageLayout, sizeof(VkImageLayout));
-    stream->write((uint32_t*)&local_regionCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkCmdResolveImage, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdResolveImage, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_543;
+    *&cgen_var_543 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_543, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_544;
+    *&cgen_var_544 = get_host_u64_VkImage((*&local_srcImage));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_544, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkImageLayout*)&local_srcImageLayout, sizeof(VkImageLayout));
+    *streamPtrPtr += sizeof(VkImageLayout);
+    uint64_t cgen_var_545;
+    *&cgen_var_545 = get_host_u64_VkImage((*&local_dstImage));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_545, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkImageLayout*)&local_dstImageLayout, sizeof(VkImageLayout));
+    *streamPtrPtr += sizeof(VkImageLayout);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_regionCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i)
     {
-        marshal_VkImageResolve(stream, (VkImageResolve*)(local_pRegions + i));
+        reservedmarshal_VkImageResolve(stream, (VkImageResolve*)(local_pRegions + i), streamPtrPtr);
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdResolveImage");;
 }
 
 void VkEncoder::vkCmdSetEvent(
     VkCommandBuffer commandBuffer,
     VkEvent event,
-    VkPipelineStageFlags stageMask)
+    VkPipelineStageFlags stageMask,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdSetEvent");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkEvent local_event;
     VkPipelineStageFlags local_stageMask;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_event = event;
     local_stageMask = stageMask;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_613;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_613, 1);
-        countingStream->write((uint64_t*)&cgen_var_613, 1 * 8);
-        uint64_t cgen_var_614;
-        countingStream->handleMapping()->mapHandles_VkEvent_u64(&local_event, &cgen_var_614, 1);
-        countingStream->write((uint64_t*)&cgen_var_614, 1 * 8);
-        countingStream->write((VkPipelineStageFlags*)&local_stageMask, sizeof(VkPipelineStageFlags));
+        uint64_t cgen_var_546;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_547;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkPipelineStageFlags);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdSetEvent = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdSetEvent = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetEvent);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdSetEvent = OP_vkCmdSetEvent;
-    stream->write(&opcode_vkCmdSetEvent, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdSetEvent, sizeof(uint32_t));
-    uint64_t cgen_var_615;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_615, 1);
-    stream->write((uint64_t*)&cgen_var_615, 1 * 8);
-    uint64_t cgen_var_616;
-    stream->handleMapping()->mapHandles_VkEvent_u64(&local_event, &cgen_var_616, 1);
-    stream->write((uint64_t*)&cgen_var_616, 1 * 8);
-    stream->write((VkPipelineStageFlags*)&local_stageMask, sizeof(VkPipelineStageFlags));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdSetEvent, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdSetEvent, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_548;
+    *&cgen_var_548 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_548, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_549;
+    *&cgen_var_549 = get_host_u64_VkEvent((*&local_event));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_549, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkPipelineStageFlags*)&local_stageMask, sizeof(VkPipelineStageFlags));
+    *streamPtrPtr += sizeof(VkPipelineStageFlags);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdSetEvent");;
 }
 
 void VkEncoder::vkCmdResetEvent(
     VkCommandBuffer commandBuffer,
     VkEvent event,
-    VkPipelineStageFlags stageMask)
+    VkPipelineStageFlags stageMask,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdResetEvent");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkEvent local_event;
     VkPipelineStageFlags local_stageMask;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_event = event;
     local_stageMask = stageMask;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_617;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_617, 1);
-        countingStream->write((uint64_t*)&cgen_var_617, 1 * 8);
-        uint64_t cgen_var_618;
-        countingStream->handleMapping()->mapHandles_VkEvent_u64(&local_event, &cgen_var_618, 1);
-        countingStream->write((uint64_t*)&cgen_var_618, 1 * 8);
-        countingStream->write((VkPipelineStageFlags*)&local_stageMask, sizeof(VkPipelineStageFlags));
+        uint64_t cgen_var_550;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_551;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkPipelineStageFlags);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdResetEvent = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdResetEvent = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdResetEvent);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdResetEvent = OP_vkCmdResetEvent;
-    stream->write(&opcode_vkCmdResetEvent, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdResetEvent, sizeof(uint32_t));
-    uint64_t cgen_var_619;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_619, 1);
-    stream->write((uint64_t*)&cgen_var_619, 1 * 8);
-    uint64_t cgen_var_620;
-    stream->handleMapping()->mapHandles_VkEvent_u64(&local_event, &cgen_var_620, 1);
-    stream->write((uint64_t*)&cgen_var_620, 1 * 8);
-    stream->write((VkPipelineStageFlags*)&local_stageMask, sizeof(VkPipelineStageFlags));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdResetEvent, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdResetEvent, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_552;
+    *&cgen_var_552 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_552, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_553;
+    *&cgen_var_553 = get_host_u64_VkEvent((*&local_event));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_553, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkPipelineStageFlags*)&local_stageMask, sizeof(VkPipelineStageFlags));
+    *streamPtrPtr += sizeof(VkPipelineStageFlags);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdResetEvent");;
 }
 
@@ -8853,15 +10438,14 @@
     uint32_t bufferMemoryBarrierCount,
     const VkBufferMemoryBarrier* pBufferMemoryBarriers,
     uint32_t imageMemoryBarrierCount,
-    const VkImageMemoryBarrier* pImageMemoryBarriers)
+    const VkImageMemoryBarrier* pImageMemoryBarriers,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdWaitEvents");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     uint32_t local_eventCount;
     VkEvent* local_pEvents;
@@ -8873,6 +10457,7 @@
     VkBufferMemoryBarrier* local_pBufferMemoryBarriers;
     uint32_t local_imageMemoryBarrierCount;
     VkImageMemoryBarrier* local_pImageMemoryBarriers;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_eventCount = eventCount;
     local_pEvents = nullptr;
@@ -8912,6 +10497,7 @@
             deepcopy_VkImageMemoryBarrier(pool, pImageMemoryBarriers + i, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i));
         }
     }
+    local_doLock = doLock;
     if (local_pMemoryBarriers)
     {
         for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i)
@@ -8933,73 +10519,90 @@
             transform_tohost_VkImageMemoryBarrier(mImpl->resources(), (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_621;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_621, 1);
-        countingStream->write((uint64_t*)&cgen_var_621, 1 * 8);
-        countingStream->write((uint32_t*)&local_eventCount, sizeof(uint32_t));
+        uint64_t cgen_var_554;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         if (((eventCount)))
         {
-            uint64_t* cgen_var_622;
-            countingStream->alloc((void**)&cgen_var_622, ((eventCount)) * 8);
-            countingStream->handleMapping()->mapHandles_VkEvent_u64(local_pEvents, cgen_var_622, ((eventCount)));
-            countingStream->write((uint64_t*)cgen_var_622, ((eventCount)) * 8);
+            *countPtr += ((eventCount)) * 8;
         }
-        countingStream->write((VkPipelineStageFlags*)&local_srcStageMask, sizeof(VkPipelineStageFlags));
-        countingStream->write((VkPipelineStageFlags*)&local_dstStageMask, sizeof(VkPipelineStageFlags));
-        countingStream->write((uint32_t*)&local_memoryBarrierCount, sizeof(uint32_t));
+        *countPtr += sizeof(VkPipelineStageFlags);
+        *countPtr += sizeof(VkPipelineStageFlags);
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i)
         {
-            marshal_VkMemoryBarrier(countingStream, (VkMemoryBarrier*)(local_pMemoryBarriers + i));
+            count_VkMemoryBarrier(featureBits, (VkMemoryBarrier*)(local_pMemoryBarriers + i), countPtr);
         }
-        countingStream->write((uint32_t*)&local_bufferMemoryBarrierCount, sizeof(uint32_t));
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i)
         {
-            marshal_VkBufferMemoryBarrier(countingStream, (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i));
+            count_VkBufferMemoryBarrier(featureBits, (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i), countPtr);
         }
-        countingStream->write((uint32_t*)&local_imageMemoryBarrierCount, sizeof(uint32_t));
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i)
         {
-            marshal_VkImageMemoryBarrier(countingStream, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i));
+            count_VkImageMemoryBarrier(featureBits, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdWaitEvents = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdWaitEvents = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdWaitEvents);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdWaitEvents = OP_vkCmdWaitEvents;
-    stream->write(&opcode_vkCmdWaitEvents, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdWaitEvents, sizeof(uint32_t));
-    uint64_t cgen_var_623;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_623, 1);
-    stream->write((uint64_t*)&cgen_var_623, 1 * 8);
-    stream->write((uint32_t*)&local_eventCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkCmdWaitEvents, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdWaitEvents, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_556;
+    *&cgen_var_556 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_556, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_eventCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     if (((eventCount)))
     {
-        uint64_t* cgen_var_624;
-        stream->alloc((void**)&cgen_var_624, ((eventCount)) * 8);
-        stream->handleMapping()->mapHandles_VkEvent_u64(local_pEvents, cgen_var_624, ((eventCount)));
-        stream->write((uint64_t*)cgen_var_624, ((eventCount)) * 8);
+        uint64_t* cgen_var_557;
+        stream->alloc((void**)&cgen_var_557, ((eventCount)) * 8);
+        for (uint32_t k = 0; k < ((eventCount)); ++k)
+        {
+            cgen_var_557[k] = get_host_u64_VkEvent(local_pEvents[k]);
+        }
+        memcpy(*streamPtrPtr, (uint64_t*)cgen_var_557, ((eventCount)) * 8);
+        *streamPtrPtr += ((eventCount)) * 8;
     }
-    stream->write((VkPipelineStageFlags*)&local_srcStageMask, sizeof(VkPipelineStageFlags));
-    stream->write((VkPipelineStageFlags*)&local_dstStageMask, sizeof(VkPipelineStageFlags));
-    stream->write((uint32_t*)&local_memoryBarrierCount, sizeof(uint32_t));
+    memcpy(*streamPtrPtr, (VkPipelineStageFlags*)&local_srcStageMask, sizeof(VkPipelineStageFlags));
+    *streamPtrPtr += sizeof(VkPipelineStageFlags);
+    memcpy(*streamPtrPtr, (VkPipelineStageFlags*)&local_dstStageMask, sizeof(VkPipelineStageFlags));
+    *streamPtrPtr += sizeof(VkPipelineStageFlags);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_memoryBarrierCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i)
     {
-        marshal_VkMemoryBarrier(stream, (VkMemoryBarrier*)(local_pMemoryBarriers + i));
+        reservedmarshal_VkMemoryBarrier(stream, (VkMemoryBarrier*)(local_pMemoryBarriers + i), streamPtrPtr);
     }
-    stream->write((uint32_t*)&local_bufferMemoryBarrierCount, sizeof(uint32_t));
+    memcpy(*streamPtrPtr, (uint32_t*)&local_bufferMemoryBarrierCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i)
     {
-        marshal_VkBufferMemoryBarrier(stream, (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i));
+        reservedmarshal_VkBufferMemoryBarrier(stream, (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i), streamPtrPtr);
     }
-    stream->write((uint32_t*)&local_imageMemoryBarrierCount, sizeof(uint32_t));
+    memcpy(*streamPtrPtr, (uint32_t*)&local_imageMemoryBarrierCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i)
     {
-        marshal_VkImageMemoryBarrier(stream, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i));
+        reservedmarshal_VkImageMemoryBarrier(stream, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i), streamPtrPtr);
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdWaitEvents");;
 }
 
@@ -9013,15 +10616,14 @@
     uint32_t bufferMemoryBarrierCount,
     const VkBufferMemoryBarrier* pBufferMemoryBarriers,
     uint32_t imageMemoryBarrierCount,
-    const VkImageMemoryBarrier* pImageMemoryBarriers)
+    const VkImageMemoryBarrier* pImageMemoryBarriers,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdPipelineBarrier");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkPipelineStageFlags local_srcStageMask;
     VkPipelineStageFlags local_dstStageMask;
@@ -9032,6 +10634,7 @@
     VkBufferMemoryBarrier* local_pBufferMemoryBarriers;
     uint32_t local_imageMemoryBarrierCount;
     VkImageMemoryBarrier* local_pImageMemoryBarriers;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_srcStageMask = srcStageMask;
     local_dstStageMask = dstStageMask;
@@ -9066,6 +10669,7 @@
             deepcopy_VkImageMemoryBarrier(pool, pImageMemoryBarriers + i, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i));
         }
     }
+    local_doLock = doLock;
     if (local_pMemoryBarriers)
     {
         for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i)
@@ -9087,59 +10691,75 @@
             transform_tohost_VkImageMemoryBarrier(mImpl->resources(), (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_625;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_625, 1);
-        countingStream->write((uint64_t*)&cgen_var_625, 1 * 8);
-        countingStream->write((VkPipelineStageFlags*)&local_srcStageMask, sizeof(VkPipelineStageFlags));
-        countingStream->write((VkPipelineStageFlags*)&local_dstStageMask, sizeof(VkPipelineStageFlags));
-        countingStream->write((VkDependencyFlags*)&local_dependencyFlags, sizeof(VkDependencyFlags));
-        countingStream->write((uint32_t*)&local_memoryBarrierCount, sizeof(uint32_t));
+        uint64_t cgen_var_558;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkPipelineStageFlags);
+        *countPtr += sizeof(VkPipelineStageFlags);
+        *countPtr += sizeof(VkDependencyFlags);
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i)
         {
-            marshal_VkMemoryBarrier(countingStream, (VkMemoryBarrier*)(local_pMemoryBarriers + i));
+            count_VkMemoryBarrier(featureBits, (VkMemoryBarrier*)(local_pMemoryBarriers + i), countPtr);
         }
-        countingStream->write((uint32_t*)&local_bufferMemoryBarrierCount, sizeof(uint32_t));
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i)
         {
-            marshal_VkBufferMemoryBarrier(countingStream, (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i));
+            count_VkBufferMemoryBarrier(featureBits, (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i), countPtr);
         }
-        countingStream->write((uint32_t*)&local_imageMemoryBarrierCount, sizeof(uint32_t));
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i)
         {
-            marshal_VkImageMemoryBarrier(countingStream, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i));
+            count_VkImageMemoryBarrier(featureBits, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdPipelineBarrier = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdPipelineBarrier = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdPipelineBarrier);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdPipelineBarrier = OP_vkCmdPipelineBarrier;
-    stream->write(&opcode_vkCmdPipelineBarrier, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdPipelineBarrier, sizeof(uint32_t));
-    uint64_t cgen_var_626;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_626, 1);
-    stream->write((uint64_t*)&cgen_var_626, 1 * 8);
-    stream->write((VkPipelineStageFlags*)&local_srcStageMask, sizeof(VkPipelineStageFlags));
-    stream->write((VkPipelineStageFlags*)&local_dstStageMask, sizeof(VkPipelineStageFlags));
-    stream->write((VkDependencyFlags*)&local_dependencyFlags, sizeof(VkDependencyFlags));
-    stream->write((uint32_t*)&local_memoryBarrierCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkCmdPipelineBarrier, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdPipelineBarrier, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_559;
+    *&cgen_var_559 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_559, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkPipelineStageFlags*)&local_srcStageMask, sizeof(VkPipelineStageFlags));
+    *streamPtrPtr += sizeof(VkPipelineStageFlags);
+    memcpy(*streamPtrPtr, (VkPipelineStageFlags*)&local_dstStageMask, sizeof(VkPipelineStageFlags));
+    *streamPtrPtr += sizeof(VkPipelineStageFlags);
+    memcpy(*streamPtrPtr, (VkDependencyFlags*)&local_dependencyFlags, sizeof(VkDependencyFlags));
+    *streamPtrPtr += sizeof(VkDependencyFlags);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_memoryBarrierCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i)
     {
-        marshal_VkMemoryBarrier(stream, (VkMemoryBarrier*)(local_pMemoryBarriers + i));
+        reservedmarshal_VkMemoryBarrier(stream, (VkMemoryBarrier*)(local_pMemoryBarriers + i), streamPtrPtr);
     }
-    stream->write((uint32_t*)&local_bufferMemoryBarrierCount, sizeof(uint32_t));
+    memcpy(*streamPtrPtr, (uint32_t*)&local_bufferMemoryBarrierCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i)
     {
-        marshal_VkBufferMemoryBarrier(stream, (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i));
+        reservedmarshal_VkBufferMemoryBarrier(stream, (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i), streamPtrPtr);
     }
-    stream->write((uint32_t*)&local_imageMemoryBarrierCount, sizeof(uint32_t));
+    memcpy(*streamPtrPtr, (uint32_t*)&local_imageMemoryBarrierCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i)
     {
-        marshal_VkImageMemoryBarrier(stream, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i));
+        reservedmarshal_VkImageMemoryBarrier(stream, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i), streamPtrPtr);
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdPipelineBarrier");;
 }
 
@@ -9147,96 +10767,121 @@
     VkCommandBuffer commandBuffer,
     VkQueryPool queryPool,
     uint32_t query,
-    VkQueryControlFlags flags)
+    VkQueryControlFlags flags,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdBeginQuery");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkQueryPool local_queryPool;
     uint32_t local_query;
     VkQueryControlFlags local_flags;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_queryPool = queryPool;
     local_query = query;
     local_flags = flags;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_627;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_627, 1);
-        countingStream->write((uint64_t*)&cgen_var_627, 1 * 8);
-        uint64_t cgen_var_628;
-        countingStream->handleMapping()->mapHandles_VkQueryPool_u64(&local_queryPool, &cgen_var_628, 1);
-        countingStream->write((uint64_t*)&cgen_var_628, 1 * 8);
-        countingStream->write((uint32_t*)&local_query, sizeof(uint32_t));
-        countingStream->write((VkQueryControlFlags*)&local_flags, sizeof(VkQueryControlFlags));
+        uint64_t cgen_var_560;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_561;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(VkQueryControlFlags);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdBeginQuery = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdBeginQuery = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBeginQuery);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdBeginQuery = OP_vkCmdBeginQuery;
-    stream->write(&opcode_vkCmdBeginQuery, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdBeginQuery, sizeof(uint32_t));
-    uint64_t cgen_var_629;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_629, 1);
-    stream->write((uint64_t*)&cgen_var_629, 1 * 8);
-    uint64_t cgen_var_630;
-    stream->handleMapping()->mapHandles_VkQueryPool_u64(&local_queryPool, &cgen_var_630, 1);
-    stream->write((uint64_t*)&cgen_var_630, 1 * 8);
-    stream->write((uint32_t*)&local_query, sizeof(uint32_t));
-    stream->write((VkQueryControlFlags*)&local_flags, sizeof(VkQueryControlFlags));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdBeginQuery, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdBeginQuery, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_562;
+    *&cgen_var_562 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_562, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_563;
+    *&cgen_var_563 = get_host_u64_VkQueryPool((*&local_queryPool));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_563, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_query, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (VkQueryControlFlags*)&local_flags, sizeof(VkQueryControlFlags));
+    *streamPtrPtr += sizeof(VkQueryControlFlags);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdBeginQuery");;
 }
 
 void VkEncoder::vkCmdEndQuery(
     VkCommandBuffer commandBuffer,
     VkQueryPool queryPool,
-    uint32_t query)
+    uint32_t query,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdEndQuery");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkQueryPool local_queryPool;
     uint32_t local_query;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_queryPool = queryPool;
     local_query = query;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_631;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_631, 1);
-        countingStream->write((uint64_t*)&cgen_var_631, 1 * 8);
-        uint64_t cgen_var_632;
-        countingStream->handleMapping()->mapHandles_VkQueryPool_u64(&local_queryPool, &cgen_var_632, 1);
-        countingStream->write((uint64_t*)&cgen_var_632, 1 * 8);
-        countingStream->write((uint32_t*)&local_query, sizeof(uint32_t));
+        uint64_t cgen_var_564;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_565;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdEndQuery = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdEndQuery = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdEndQuery);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdEndQuery = OP_vkCmdEndQuery;
-    stream->write(&opcode_vkCmdEndQuery, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdEndQuery, sizeof(uint32_t));
-    uint64_t cgen_var_633;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_633, 1);
-    stream->write((uint64_t*)&cgen_var_633, 1 * 8);
-    uint64_t cgen_var_634;
-    stream->handleMapping()->mapHandles_VkQueryPool_u64(&local_queryPool, &cgen_var_634, 1);
-    stream->write((uint64_t*)&cgen_var_634, 1 * 8);
-    stream->write((uint32_t*)&local_query, sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdEndQuery, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdEndQuery, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_566;
+    *&cgen_var_566 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_566, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_567;
+    *&cgen_var_567 = get_host_u64_VkQueryPool((*&local_queryPool));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_567, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_query, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdEndQuery");;
 }
 
@@ -9244,50 +10889,63 @@
     VkCommandBuffer commandBuffer,
     VkQueryPool queryPool,
     uint32_t firstQuery,
-    uint32_t queryCount)
+    uint32_t queryCount,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdResetQueryPool");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkQueryPool local_queryPool;
     uint32_t local_firstQuery;
     uint32_t local_queryCount;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_queryPool = queryPool;
     local_firstQuery = firstQuery;
     local_queryCount = queryCount;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_635;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_635, 1);
-        countingStream->write((uint64_t*)&cgen_var_635, 1 * 8);
-        uint64_t cgen_var_636;
-        countingStream->handleMapping()->mapHandles_VkQueryPool_u64(&local_queryPool, &cgen_var_636, 1);
-        countingStream->write((uint64_t*)&cgen_var_636, 1 * 8);
-        countingStream->write((uint32_t*)&local_firstQuery, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_queryCount, sizeof(uint32_t));
+        uint64_t cgen_var_568;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_569;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdResetQueryPool = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdResetQueryPool = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdResetQueryPool);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdResetQueryPool = OP_vkCmdResetQueryPool;
-    stream->write(&opcode_vkCmdResetQueryPool, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdResetQueryPool, sizeof(uint32_t));
-    uint64_t cgen_var_637;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_637, 1);
-    stream->write((uint64_t*)&cgen_var_637, 1 * 8);
-    uint64_t cgen_var_638;
-    stream->handleMapping()->mapHandles_VkQueryPool_u64(&local_queryPool, &cgen_var_638, 1);
-    stream->write((uint64_t*)&cgen_var_638, 1 * 8);
-    stream->write((uint32_t*)&local_firstQuery, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_queryCount, sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdResetQueryPool, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdResetQueryPool, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_570;
+    *&cgen_var_570 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_570, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_571;
+    *&cgen_var_571 = get_host_u64_VkQueryPool((*&local_queryPool));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_571, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_firstQuery, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_queryCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdResetQueryPool");;
 }
 
@@ -9295,50 +10953,63 @@
     VkCommandBuffer commandBuffer,
     VkPipelineStageFlagBits pipelineStage,
     VkQueryPool queryPool,
-    uint32_t query)
+    uint32_t query,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdWriteTimestamp");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkPipelineStageFlagBits local_pipelineStage;
     VkQueryPool local_queryPool;
     uint32_t local_query;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_pipelineStage = pipelineStage;
     local_queryPool = queryPool;
     local_query = query;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_639;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_639, 1);
-        countingStream->write((uint64_t*)&cgen_var_639, 1 * 8);
-        countingStream->write((VkPipelineStageFlagBits*)&local_pipelineStage, sizeof(VkPipelineStageFlagBits));
-        uint64_t cgen_var_640;
-        countingStream->handleMapping()->mapHandles_VkQueryPool_u64(&local_queryPool, &cgen_var_640, 1);
-        countingStream->write((uint64_t*)&cgen_var_640, 1 * 8);
-        countingStream->write((uint32_t*)&local_query, sizeof(uint32_t));
+        uint64_t cgen_var_572;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkPipelineStageFlagBits);
+        uint64_t cgen_var_573;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdWriteTimestamp = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdWriteTimestamp = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdWriteTimestamp);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdWriteTimestamp = OP_vkCmdWriteTimestamp;
-    stream->write(&opcode_vkCmdWriteTimestamp, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdWriteTimestamp, sizeof(uint32_t));
-    uint64_t cgen_var_641;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_641, 1);
-    stream->write((uint64_t*)&cgen_var_641, 1 * 8);
-    stream->write((VkPipelineStageFlagBits*)&local_pipelineStage, sizeof(VkPipelineStageFlagBits));
-    uint64_t cgen_var_642;
-    stream->handleMapping()->mapHandles_VkQueryPool_u64(&local_queryPool, &cgen_var_642, 1);
-    stream->write((uint64_t*)&cgen_var_642, 1 * 8);
-    stream->write((uint32_t*)&local_query, sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdWriteTimestamp, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdWriteTimestamp, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_574;
+    *&cgen_var_574 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_574, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkPipelineStageFlagBits*)&local_pipelineStage, sizeof(VkPipelineStageFlagBits));
+    *streamPtrPtr += sizeof(VkPipelineStageFlagBits);
+    uint64_t cgen_var_575;
+    *&cgen_var_575 = get_host_u64_VkQueryPool((*&local_queryPool));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_575, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_query, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdWriteTimestamp");;
 }
 
@@ -9350,15 +11021,14 @@
     VkBuffer dstBuffer,
     VkDeviceSize dstOffset,
     VkDeviceSize stride,
-    VkQueryResultFlags flags)
+    VkQueryResultFlags flags,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdCopyQueryPoolResults");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkQueryPool local_queryPool;
     uint32_t local_firstQuery;
@@ -9367,6 +11037,7 @@
     VkDeviceSize local_dstOffset;
     VkDeviceSize local_stride;
     VkQueryResultFlags local_flags;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_queryPool = queryPool;
     local_firstQuery = firstQuery;
@@ -9375,45 +11046,61 @@
     local_dstOffset = dstOffset;
     local_stride = stride;
     local_flags = flags;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_643;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_643, 1);
-        countingStream->write((uint64_t*)&cgen_var_643, 1 * 8);
-        uint64_t cgen_var_644;
-        countingStream->handleMapping()->mapHandles_VkQueryPool_u64(&local_queryPool, &cgen_var_644, 1);
-        countingStream->write((uint64_t*)&cgen_var_644, 1 * 8);
-        countingStream->write((uint32_t*)&local_firstQuery, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_queryCount, sizeof(uint32_t));
-        uint64_t cgen_var_645;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_dstBuffer, &cgen_var_645, 1);
-        countingStream->write((uint64_t*)&cgen_var_645, 1 * 8);
-        countingStream->write((VkDeviceSize*)&local_dstOffset, sizeof(VkDeviceSize));
-        countingStream->write((VkDeviceSize*)&local_stride, sizeof(VkDeviceSize));
-        countingStream->write((VkQueryResultFlags*)&local_flags, sizeof(VkQueryResultFlags));
+        uint64_t cgen_var_576;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_577;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        uint64_t cgen_var_578;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkDeviceSize);
+        *countPtr += sizeof(VkDeviceSize);
+        *countPtr += sizeof(VkQueryResultFlags);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdCopyQueryPoolResults = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdCopyQueryPoolResults = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdCopyQueryPoolResults);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdCopyQueryPoolResults = OP_vkCmdCopyQueryPoolResults;
-    stream->write(&opcode_vkCmdCopyQueryPoolResults, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdCopyQueryPoolResults, sizeof(uint32_t));
-    uint64_t cgen_var_646;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_646, 1);
-    stream->write((uint64_t*)&cgen_var_646, 1 * 8);
-    uint64_t cgen_var_647;
-    stream->handleMapping()->mapHandles_VkQueryPool_u64(&local_queryPool, &cgen_var_647, 1);
-    stream->write((uint64_t*)&cgen_var_647, 1 * 8);
-    stream->write((uint32_t*)&local_firstQuery, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_queryCount, sizeof(uint32_t));
-    uint64_t cgen_var_648;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_dstBuffer, &cgen_var_648, 1);
-    stream->write((uint64_t*)&cgen_var_648, 1 * 8);
-    stream->write((VkDeviceSize*)&local_dstOffset, sizeof(VkDeviceSize));
-    stream->write((VkDeviceSize*)&local_stride, sizeof(VkDeviceSize));
-    stream->write((VkQueryResultFlags*)&local_flags, sizeof(VkQueryResultFlags));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdCopyQueryPoolResults, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdCopyQueryPoolResults, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_579;
+    *&cgen_var_579 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_579, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_580;
+    *&cgen_var_580 = get_host_u64_VkQueryPool((*&local_queryPool));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_580, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_firstQuery, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_queryCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    uint64_t cgen_var_581;
+    *&cgen_var_581 = get_host_u64_VkBuffer((*&local_dstBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_581, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkDeviceSize*)&local_dstOffset, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    memcpy(*streamPtrPtr, (VkDeviceSize*)&local_stride, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    memcpy(*streamPtrPtr, (VkQueryResultFlags*)&local_flags, sizeof(VkQueryResultFlags));
+    *streamPtrPtr += sizeof(VkQueryResultFlags);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdCopyQueryPoolResults");;
 }
 
@@ -9423,21 +11110,21 @@
     VkShaderStageFlags stageFlags,
     uint32_t offset,
     uint32_t size,
-    const void* pValues)
+    const void* pValues,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdPushConstants");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkPipelineLayout local_layout;
     VkShaderStageFlags local_stageFlags;
     uint32_t local_offset;
     uint32_t local_size;
     void* local_pValues;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_layout = layout;
     local_stageFlags = stageFlags;
@@ -9448,55 +11135,70 @@
     {
         local_pValues = (void*)pool->dupArray(pValues, ((size)) * sizeof(const uint8_t));
     }
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_649;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_649, 1);
-        countingStream->write((uint64_t*)&cgen_var_649, 1 * 8);
-        uint64_t cgen_var_650;
-        countingStream->handleMapping()->mapHandles_VkPipelineLayout_u64(&local_layout, &cgen_var_650, 1);
-        countingStream->write((uint64_t*)&cgen_var_650, 1 * 8);
-        countingStream->write((VkShaderStageFlags*)&local_stageFlags, sizeof(VkShaderStageFlags));
-        countingStream->write((uint32_t*)&local_offset, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_size, sizeof(uint32_t));
-        countingStream->write((void*)local_pValues, ((size)) * sizeof(uint8_t));
+        uint64_t cgen_var_582;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_583;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkShaderStageFlags);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += ((size)) * sizeof(uint8_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdPushConstants = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdPushConstants = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdPushConstants);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdPushConstants = OP_vkCmdPushConstants;
-    stream->write(&opcode_vkCmdPushConstants, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdPushConstants, sizeof(uint32_t));
-    uint64_t cgen_var_651;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_651, 1);
-    stream->write((uint64_t*)&cgen_var_651, 1 * 8);
-    uint64_t cgen_var_652;
-    stream->handleMapping()->mapHandles_VkPipelineLayout_u64(&local_layout, &cgen_var_652, 1);
-    stream->write((uint64_t*)&cgen_var_652, 1 * 8);
-    stream->write((VkShaderStageFlags*)&local_stageFlags, sizeof(VkShaderStageFlags));
-    stream->write((uint32_t*)&local_offset, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_size, sizeof(uint32_t));
-    stream->write((void*)local_pValues, ((size)) * sizeof(uint8_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdPushConstants, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdPushConstants, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_584;
+    *&cgen_var_584 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_584, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_585;
+    *&cgen_var_585 = get_host_u64_VkPipelineLayout((*&local_layout));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_585, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkShaderStageFlags*)&local_stageFlags, sizeof(VkShaderStageFlags));
+    *streamPtrPtr += sizeof(VkShaderStageFlags);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_offset, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_size, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (void*)local_pValues, ((size)) * sizeof(uint8_t));
+    *streamPtrPtr += ((size)) * sizeof(uint8_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdPushConstants");;
 }
 
 void VkEncoder::vkCmdBeginRenderPass(
     VkCommandBuffer commandBuffer,
     const VkRenderPassBeginInfo* pRenderPassBegin,
-    VkSubpassContents contents)
+    VkSubpassContents contents,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdBeginRenderPass");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkRenderPassBeginInfo* local_pRenderPassBegin;
     VkSubpassContents local_contents;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_pRenderPassBegin = nullptr;
     if (pRenderPassBegin)
@@ -9505,118 +11207,153 @@
         deepcopy_VkRenderPassBeginInfo(pool, pRenderPassBegin, (VkRenderPassBeginInfo*)(local_pRenderPassBegin));
     }
     local_contents = contents;
+    local_doLock = doLock;
     if (local_pRenderPassBegin)
     {
         transform_tohost_VkRenderPassBeginInfo(mImpl->resources(), (VkRenderPassBeginInfo*)(local_pRenderPassBegin));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_653;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_653, 1);
-        countingStream->write((uint64_t*)&cgen_var_653, 1 * 8);
-        marshal_VkRenderPassBeginInfo(countingStream, (VkRenderPassBeginInfo*)(local_pRenderPassBegin));
-        countingStream->write((VkSubpassContents*)&local_contents, sizeof(VkSubpassContents));
+        uint64_t cgen_var_586;
+        *countPtr += 1 * 8;
+        count_VkRenderPassBeginInfo(featureBits, (VkRenderPassBeginInfo*)(local_pRenderPassBegin), countPtr);
+        *countPtr += sizeof(VkSubpassContents);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdBeginRenderPass = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdBeginRenderPass = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBeginRenderPass);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdBeginRenderPass = OP_vkCmdBeginRenderPass;
-    stream->write(&opcode_vkCmdBeginRenderPass, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdBeginRenderPass, sizeof(uint32_t));
-    uint64_t cgen_var_654;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_654, 1);
-    stream->write((uint64_t*)&cgen_var_654, 1 * 8);
-    marshal_VkRenderPassBeginInfo(stream, (VkRenderPassBeginInfo*)(local_pRenderPassBegin));
-    stream->write((VkSubpassContents*)&local_contents, sizeof(VkSubpassContents));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdBeginRenderPass, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdBeginRenderPass, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_587;
+    *&cgen_var_587 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_587, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkRenderPassBeginInfo(stream, (VkRenderPassBeginInfo*)(local_pRenderPassBegin), streamPtrPtr);
+    memcpy(*streamPtrPtr, (VkSubpassContents*)&local_contents, sizeof(VkSubpassContents));
+    *streamPtrPtr += sizeof(VkSubpassContents);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdBeginRenderPass");;
 }
 
 void VkEncoder::vkCmdNextSubpass(
     VkCommandBuffer commandBuffer,
-    VkSubpassContents contents)
+    VkSubpassContents contents,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdNextSubpass");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkSubpassContents local_contents;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_contents = contents;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_655;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_655, 1);
-        countingStream->write((uint64_t*)&cgen_var_655, 1 * 8);
-        countingStream->write((VkSubpassContents*)&local_contents, sizeof(VkSubpassContents));
+        uint64_t cgen_var_588;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkSubpassContents);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdNextSubpass = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdNextSubpass = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdNextSubpass);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdNextSubpass = OP_vkCmdNextSubpass;
-    stream->write(&opcode_vkCmdNextSubpass, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdNextSubpass, sizeof(uint32_t));
-    uint64_t cgen_var_656;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_656, 1);
-    stream->write((uint64_t*)&cgen_var_656, 1 * 8);
-    stream->write((VkSubpassContents*)&local_contents, sizeof(VkSubpassContents));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdNextSubpass, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdNextSubpass, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_589;
+    *&cgen_var_589 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_589, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkSubpassContents*)&local_contents, sizeof(VkSubpassContents));
+    *streamPtrPtr += sizeof(VkSubpassContents);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdNextSubpass");;
 }
 
 void VkEncoder::vkCmdEndRenderPass(
-    VkCommandBuffer commandBuffer)
+    VkCommandBuffer commandBuffer,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdEndRenderPass");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_657;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_657, 1);
-        countingStream->write((uint64_t*)&cgen_var_657, 1 * 8);
+        uint64_t cgen_var_590;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdEndRenderPass = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdEndRenderPass = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdEndRenderPass);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdEndRenderPass = OP_vkCmdEndRenderPass;
-    stream->write(&opcode_vkCmdEndRenderPass, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdEndRenderPass, sizeof(uint32_t));
-    uint64_t cgen_var_658;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_658, 1);
-    stream->write((uint64_t*)&cgen_var_658, 1 * 8);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdEndRenderPass, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdEndRenderPass, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_591;
+    *&cgen_var_591 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_591, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdEndRenderPass");;
 }
 
 void VkEncoder::vkCmdExecuteCommands(
     VkCommandBuffer commandBuffer,
     uint32_t commandBufferCount,
-    const VkCommandBuffer* pCommandBuffers)
+    const VkCommandBuffer* pCommandBuffers,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdExecuteCommands");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     uint32_t local_commandBufferCount;
     VkCommandBuffer* local_pCommandBuffers;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_commandBufferCount = commandBufferCount;
     local_pCommandBuffers = nullptr;
@@ -9624,70 +11361,95 @@
     {
         local_pCommandBuffers = (VkCommandBuffer*)pool->dupArray(pCommandBuffers, ((commandBufferCount)) * sizeof(const VkCommandBuffer));
     }
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_659;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_659, 1);
-        countingStream->write((uint64_t*)&cgen_var_659, 1 * 8);
-        countingStream->write((uint32_t*)&local_commandBufferCount, sizeof(uint32_t));
+        uint64_t cgen_var_592;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         if (((commandBufferCount)))
         {
-            uint64_t* cgen_var_660;
-            countingStream->alloc((void**)&cgen_var_660, ((commandBufferCount)) * 8);
-            countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(local_pCommandBuffers, cgen_var_660, ((commandBufferCount)));
-            countingStream->write((uint64_t*)cgen_var_660, ((commandBufferCount)) * 8);
+            *countPtr += ((commandBufferCount)) * 8;
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdExecuteCommands = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdExecuteCommands = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdExecuteCommands);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdExecuteCommands = OP_vkCmdExecuteCommands;
-    stream->write(&opcode_vkCmdExecuteCommands, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdExecuteCommands, sizeof(uint32_t));
-    uint64_t cgen_var_661;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_661, 1);
-    stream->write((uint64_t*)&cgen_var_661, 1 * 8);
-    stream->write((uint32_t*)&local_commandBufferCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkCmdExecuteCommands, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdExecuteCommands, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_594;
+    *&cgen_var_594 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_594, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_commandBufferCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     if (((commandBufferCount)))
     {
-        uint64_t* cgen_var_662;
-        stream->alloc((void**)&cgen_var_662, ((commandBufferCount)) * 8);
-        stream->handleMapping()->mapHandles_VkCommandBuffer_u64(local_pCommandBuffers, cgen_var_662, ((commandBufferCount)));
-        stream->write((uint64_t*)cgen_var_662, ((commandBufferCount)) * 8);
+        uint64_t* cgen_var_595;
+        stream->alloc((void**)&cgen_var_595, ((commandBufferCount)) * 8);
+        for (uint32_t k = 0; k < ((commandBufferCount)); ++k)
+        {
+            cgen_var_595[k] = get_host_u64_VkCommandBuffer(local_pCommandBuffers[k]);
+        }
+        memcpy(*streamPtrPtr, (uint64_t*)cgen_var_595, ((commandBufferCount)) * 8);
+        *streamPtrPtr += ((commandBufferCount)) * 8;
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdExecuteCommands");;
 }
 
 #endif
 #ifdef VK_VERSION_1_1
 VkResult VkEncoder::vkEnumerateInstanceVersion(
-    uint32_t* pApiVersion)
+    uint32_t* pApiVersion,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkEnumerateInstanceVersion");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
-    countingStream->rewind();
+    uint32_t local_doLock;
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        countingStream->write((uint32_t*)pApiVersion, sizeof(uint32_t));
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkEnumerateInstanceVersion = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkEnumerateInstanceVersion = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkEnumerateInstanceVersion);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkEnumerateInstanceVersion = OP_vkEnumerateInstanceVersion;
-    stream->write(&opcode_vkEnumerateInstanceVersion, sizeof(uint32_t));
-    stream->write(&packetSize_vkEnumerateInstanceVersion, sizeof(uint32_t));
-    stream->write((uint32_t*)pApiVersion, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkEnumerateInstanceVersion, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkEnumerateInstanceVersion, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)pApiVersion, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((uint32_t*)pApiVersion, sizeof(uint32_t));
     VkResult vkEnumerateInstanceVersion_VkResult_return = (VkResult)0;
     stream->read(&vkEnumerateInstanceVersion_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkEnumerateInstanceVersion");;
     return vkEnumerateInstanceVersion_VkResult_return;
 }
@@ -9695,18 +11457,18 @@
 VkResult VkEncoder::vkBindBufferMemory2(
     VkDevice device,
     uint32_t bindInfoCount,
-    const VkBindBufferMemoryInfo* pBindInfos)
+    const VkBindBufferMemoryInfo* pBindInfos,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkBindBufferMemory2");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     uint32_t local_bindInfoCount;
     VkBindBufferMemoryInfo* local_pBindInfos;
+    uint32_t local_doLock;
     local_device = device;
     local_bindInfoCount = bindInfoCount;
     local_pBindInfos = nullptr;
@@ -9718,6 +11480,7 @@
             deepcopy_VkBindBufferMemoryInfo(pool, pBindInfos + i, (VkBindBufferMemoryInfo*)(local_pBindInfos + i));
         }
     }
+    local_doLock = doLock;
     if (local_pBindInfos)
     {
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
@@ -9725,35 +11488,46 @@
             transform_tohost_VkBindBufferMemoryInfo(mImpl->resources(), (VkBindBufferMemoryInfo*)(local_pBindInfos + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_663;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_663, 1);
-        countingStream->write((uint64_t*)&cgen_var_663, 1 * 8);
-        countingStream->write((uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
+        uint64_t cgen_var_596;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
         {
-            marshal_VkBindBufferMemoryInfo(countingStream, (VkBindBufferMemoryInfo*)(local_pBindInfos + i));
+            count_VkBindBufferMemoryInfo(featureBits, (VkBindBufferMemoryInfo*)(local_pBindInfos + i), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkBindBufferMemory2 = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkBindBufferMemory2 = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkBindBufferMemory2);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkBindBufferMemory2 = OP_vkBindBufferMemory2;
-    stream->write(&opcode_vkBindBufferMemory2, sizeof(uint32_t));
-    stream->write(&packetSize_vkBindBufferMemory2, sizeof(uint32_t));
-    uint64_t cgen_var_664;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_664, 1);
-    stream->write((uint64_t*)&cgen_var_664, 1 * 8);
-    stream->write((uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkBindBufferMemory2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkBindBufferMemory2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_597;
+    *&cgen_var_597 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_597, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
     {
-        marshal_VkBindBufferMemoryInfo(stream, (VkBindBufferMemoryInfo*)(local_pBindInfos + i));
+        reservedmarshal_VkBindBufferMemoryInfo(stream, (VkBindBufferMemoryInfo*)(local_pBindInfos + i), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkBindBufferMemory2_VkResult_return = (VkResult)0;
     stream->read(&vkBindBufferMemory2_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkBindBufferMemory2");;
     return vkBindBufferMemory2_VkResult_return;
 }
@@ -9761,18 +11535,18 @@
 VkResult VkEncoder::vkBindImageMemory2(
     VkDevice device,
     uint32_t bindInfoCount,
-    const VkBindImageMemoryInfo* pBindInfos)
+    const VkBindImageMemoryInfo* pBindInfos,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkBindImageMemory2");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     uint32_t local_bindInfoCount;
     VkBindImageMemoryInfo* local_pBindInfos;
+    uint32_t local_doLock;
     local_device = device;
     local_bindInfoCount = bindInfoCount;
     local_pBindInfos = nullptr;
@@ -9784,6 +11558,7 @@
             deepcopy_VkBindImageMemoryInfo(pool, pBindInfos + i, (VkBindImageMemoryInfo*)(local_pBindInfos + i));
         }
     }
+    local_doLock = doLock;
     if (local_pBindInfos)
     {
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
@@ -9791,35 +11566,46 @@
             transform_tohost_VkBindImageMemoryInfo(mImpl->resources(), (VkBindImageMemoryInfo*)(local_pBindInfos + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_665;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_665, 1);
-        countingStream->write((uint64_t*)&cgen_var_665, 1 * 8);
-        countingStream->write((uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
+        uint64_t cgen_var_598;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
         {
-            marshal_VkBindImageMemoryInfo(countingStream, (VkBindImageMemoryInfo*)(local_pBindInfos + i));
+            count_VkBindImageMemoryInfo(featureBits, (VkBindImageMemoryInfo*)(local_pBindInfos + i), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkBindImageMemory2 = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkBindImageMemory2 = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkBindImageMemory2);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkBindImageMemory2 = OP_vkBindImageMemory2;
-    stream->write(&opcode_vkBindImageMemory2, sizeof(uint32_t));
-    stream->write(&packetSize_vkBindImageMemory2, sizeof(uint32_t));
-    uint64_t cgen_var_666;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_666, 1);
-    stream->write((uint64_t*)&cgen_var_666, 1 * 8);
-    stream->write((uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkBindImageMemory2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkBindImageMemory2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_599;
+    *&cgen_var_599 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_599, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
     {
-        marshal_VkBindImageMemoryInfo(stream, (VkBindImageMemoryInfo*)(local_pBindInfos + i));
+        reservedmarshal_VkBindImageMemoryInfo(stream, (VkBindImageMemoryInfo*)(local_pBindInfos + i), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkBindImageMemory2_VkResult_return = (VkResult)0;
     stream->read(&vkBindImageMemory2_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkBindImageMemory2");;
     return vkBindImageMemory2_VkResult_return;
 }
@@ -9829,86 +11615,113 @@
     uint32_t heapIndex,
     uint32_t localDeviceIndex,
     uint32_t remoteDeviceIndex,
-    VkPeerMemoryFeatureFlags* pPeerMemoryFeatures)
+    VkPeerMemoryFeatureFlags* pPeerMemoryFeatures,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetDeviceGroupPeerMemoryFeatures");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     uint32_t local_heapIndex;
     uint32_t local_localDeviceIndex;
     uint32_t local_remoteDeviceIndex;
+    uint32_t local_doLock;
     local_device = device;
     local_heapIndex = heapIndex;
     local_localDeviceIndex = localDeviceIndex;
     local_remoteDeviceIndex = remoteDeviceIndex;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_667;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_667, 1);
-        countingStream->write((uint64_t*)&cgen_var_667, 1 * 8);
-        countingStream->write((uint32_t*)&local_heapIndex, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_localDeviceIndex, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_remoteDeviceIndex, sizeof(uint32_t));
-        countingStream->write((VkPeerMemoryFeatureFlags*)pPeerMemoryFeatures, sizeof(VkPeerMemoryFeatureFlags));
+        uint64_t cgen_var_600;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(VkPeerMemoryFeatureFlags);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetDeviceGroupPeerMemoryFeatures = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetDeviceGroupPeerMemoryFeatures = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceGroupPeerMemoryFeatures);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetDeviceGroupPeerMemoryFeatures = OP_vkGetDeviceGroupPeerMemoryFeatures;
-    stream->write(&opcode_vkGetDeviceGroupPeerMemoryFeatures, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetDeviceGroupPeerMemoryFeatures, sizeof(uint32_t));
-    uint64_t cgen_var_668;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_668, 1);
-    stream->write((uint64_t*)&cgen_var_668, 1 * 8);
-    stream->write((uint32_t*)&local_heapIndex, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_localDeviceIndex, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_remoteDeviceIndex, sizeof(uint32_t));
-    stream->write((VkPeerMemoryFeatureFlags*)pPeerMemoryFeatures, sizeof(VkPeerMemoryFeatureFlags));
+    memcpy(streamPtr, &opcode_vkGetDeviceGroupPeerMemoryFeatures, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetDeviceGroupPeerMemoryFeatures, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_601;
+    *&cgen_var_601 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_601, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_heapIndex, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_localDeviceIndex, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_remoteDeviceIndex, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (VkPeerMemoryFeatureFlags*)pPeerMemoryFeatures, sizeof(VkPeerMemoryFeatureFlags));
+    *streamPtrPtr += sizeof(VkPeerMemoryFeatureFlags);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((VkPeerMemoryFeatureFlags*)pPeerMemoryFeatures, sizeof(VkPeerMemoryFeatureFlags));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetDeviceGroupPeerMemoryFeatures");;
 }
 
 void VkEncoder::vkCmdSetDeviceMask(
     VkCommandBuffer commandBuffer,
-    uint32_t deviceMask)
+    uint32_t deviceMask,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdSetDeviceMask");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     uint32_t local_deviceMask;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_deviceMask = deviceMask;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_669;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_669, 1);
-        countingStream->write((uint64_t*)&cgen_var_669, 1 * 8);
-        countingStream->write((uint32_t*)&local_deviceMask, sizeof(uint32_t));
+        uint64_t cgen_var_602;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdSetDeviceMask = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdSetDeviceMask = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetDeviceMask);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdSetDeviceMask = OP_vkCmdSetDeviceMask;
-    stream->write(&opcode_vkCmdSetDeviceMask, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdSetDeviceMask, sizeof(uint32_t));
-    uint64_t cgen_var_670;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_670, 1);
-    stream->write((uint64_t*)&cgen_var_670, 1 * 8);
-    stream->write((uint32_t*)&local_deviceMask, sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdSetDeviceMask, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdSetDeviceMask, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_603;
+    *&cgen_var_603 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_603, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_deviceMask, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdSetDeviceMask");;
 }
 
@@ -9919,15 +11732,14 @@
     uint32_t baseGroupZ,
     uint32_t groupCountX,
     uint32_t groupCountY,
-    uint32_t groupCountZ)
+    uint32_t groupCountZ,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdDispatchBase");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     uint32_t local_baseGroupX;
     uint32_t local_baseGroupY;
@@ -9935,6 +11747,7 @@
     uint32_t local_groupCountX;
     uint32_t local_groupCountY;
     uint32_t local_groupCountZ;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_baseGroupX = baseGroupX;
     local_baseGroupY = baseGroupY;
@@ -9942,100 +11755,127 @@
     local_groupCountX = groupCountX;
     local_groupCountY = groupCountY;
     local_groupCountZ = groupCountZ;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_671;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_671, 1);
-        countingStream->write((uint64_t*)&cgen_var_671, 1 * 8);
-        countingStream->write((uint32_t*)&local_baseGroupX, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_baseGroupY, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_baseGroupZ, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_groupCountX, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_groupCountY, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_groupCountZ, sizeof(uint32_t));
+        uint64_t cgen_var_604;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdDispatchBase = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdDispatchBase = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDispatchBase);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdDispatchBase = OP_vkCmdDispatchBase;
-    stream->write(&opcode_vkCmdDispatchBase, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdDispatchBase, sizeof(uint32_t));
-    uint64_t cgen_var_672;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_672, 1);
-    stream->write((uint64_t*)&cgen_var_672, 1 * 8);
-    stream->write((uint32_t*)&local_baseGroupX, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_baseGroupY, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_baseGroupZ, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_groupCountX, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_groupCountY, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_groupCountZ, sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdDispatchBase, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdDispatchBase, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_605;
+    *&cgen_var_605 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_605, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_baseGroupX, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_baseGroupY, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_baseGroupZ, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_groupCountX, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_groupCountY, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_groupCountZ, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdDispatchBase");;
 }
 
 VkResult VkEncoder::vkEnumeratePhysicalDeviceGroups(
     VkInstance instance,
     uint32_t* pPhysicalDeviceGroupCount,
-    VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties)
+    VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkEnumeratePhysicalDeviceGroups");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkInstance local_instance;
+    uint32_t local_doLock;
     local_instance = instance;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_673;
-        countingStream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_673, 1);
-        countingStream->write((uint64_t*)&cgen_var_673, 1 * 8);
+        uint64_t cgen_var_606;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_674 = (uint64_t)(uintptr_t)pPhysicalDeviceGroupCount;
-        countingStream->putBe64(cgen_var_674);
+        *countPtr += 8;
         if (pPhysicalDeviceGroupCount)
         {
-            countingStream->write((uint32_t*)pPhysicalDeviceGroupCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_675 = (uint64_t)(uintptr_t)pPhysicalDeviceGroupProperties;
-        countingStream->putBe64(cgen_var_675);
+        *countPtr += 8;
         if (pPhysicalDeviceGroupProperties)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i)
             {
-                marshal_VkPhysicalDeviceGroupProperties(countingStream, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i));
+                count_VkPhysicalDeviceGroupProperties(featureBits, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkEnumeratePhysicalDeviceGroups = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkEnumeratePhysicalDeviceGroups = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkEnumeratePhysicalDeviceGroups);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkEnumeratePhysicalDeviceGroups = OP_vkEnumeratePhysicalDeviceGroups;
-    stream->write(&opcode_vkEnumeratePhysicalDeviceGroups, sizeof(uint32_t));
-    stream->write(&packetSize_vkEnumeratePhysicalDeviceGroups, sizeof(uint32_t));
-    uint64_t cgen_var_676;
-    stream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_676, 1);
-    stream->write((uint64_t*)&cgen_var_676, 1 * 8);
+    memcpy(streamPtr, &opcode_vkEnumeratePhysicalDeviceGroups, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkEnumeratePhysicalDeviceGroups, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_607;
+    *&cgen_var_607 = get_host_u64_VkInstance((*&local_instance));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_607, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_677 = (uint64_t)(uintptr_t)pPhysicalDeviceGroupCount;
-    stream->putBe64(cgen_var_677);
+    uint64_t cgen_var_608 = (uint64_t)(uintptr_t)pPhysicalDeviceGroupCount;
+    memcpy((*streamPtrPtr), &cgen_var_608, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pPhysicalDeviceGroupCount)
     {
-        stream->write((uint32_t*)pPhysicalDeviceGroupCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pPhysicalDeviceGroupCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_678 = (uint64_t)(uintptr_t)pPhysicalDeviceGroupProperties;
-    stream->putBe64(cgen_var_678);
+    uint64_t cgen_var_609 = (uint64_t)(uintptr_t)pPhysicalDeviceGroupProperties;
+    memcpy((*streamPtrPtr), &cgen_var_609, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pPhysicalDeviceGroupProperties)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i)
         {
-            marshal_VkPhysicalDeviceGroupProperties(stream, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i));
+            reservedmarshal_VkPhysicalDeviceGroupProperties(stream, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pPhysicalDeviceGroupCount;
     check_pPhysicalDeviceGroupCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -10070,9 +11910,13 @@
     }
     VkResult vkEnumeratePhysicalDeviceGroups_VkResult_return = (VkResult)0;
     stream->read(&vkEnumeratePhysicalDeviceGroups_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkEnumeratePhysicalDeviceGroups");;
     return vkEnumeratePhysicalDeviceGroups_VkResult_return;
 }
@@ -10080,17 +11924,17 @@
 void VkEncoder::vkGetImageMemoryRequirements2(
     VkDevice device,
     const VkImageMemoryRequirementsInfo2* pInfo,
-    VkMemoryRequirements2* pMemoryRequirements)
+    VkMemoryRequirements2* pMemoryRequirements,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetImageMemoryRequirements2");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkImageMemoryRequirementsInfo2* local_pInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pInfo = nullptr;
     if (pInfo)
@@ -10098,53 +11942,64 @@
         local_pInfo = (VkImageMemoryRequirementsInfo2*)pool->alloc(sizeof(const VkImageMemoryRequirementsInfo2));
         deepcopy_VkImageMemoryRequirementsInfo2(pool, pInfo, (VkImageMemoryRequirementsInfo2*)(local_pInfo));
     }
+    local_doLock = doLock;
     if (local_pInfo)
     {
         transform_tohost_VkImageMemoryRequirementsInfo2(mImpl->resources(), (VkImageMemoryRequirementsInfo2*)(local_pInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_681;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_681, 1);
-        countingStream->write((uint64_t*)&cgen_var_681, 1 * 8);
-        marshal_VkImageMemoryRequirementsInfo2(countingStream, (VkImageMemoryRequirementsInfo2*)(local_pInfo));
-        marshal_VkMemoryRequirements2(countingStream, (VkMemoryRequirements2*)(pMemoryRequirements));
+        uint64_t cgen_var_612;
+        *countPtr += 1 * 8;
+        count_VkImageMemoryRequirementsInfo2(featureBits, (VkImageMemoryRequirementsInfo2*)(local_pInfo), countPtr);
+        count_VkMemoryRequirements2(featureBits, (VkMemoryRequirements2*)(pMemoryRequirements), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetImageMemoryRequirements2 = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetImageMemoryRequirements2 = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageMemoryRequirements2);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetImageMemoryRequirements2 = OP_vkGetImageMemoryRequirements2;
-    stream->write(&opcode_vkGetImageMemoryRequirements2, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetImageMemoryRequirements2, sizeof(uint32_t));
-    uint64_t cgen_var_682;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_682, 1);
-    stream->write((uint64_t*)&cgen_var_682, 1 * 8);
-    marshal_VkImageMemoryRequirementsInfo2(stream, (VkImageMemoryRequirementsInfo2*)(local_pInfo));
-    marshal_VkMemoryRequirements2(stream, (VkMemoryRequirements2*)(pMemoryRequirements));
+    memcpy(streamPtr, &opcode_vkGetImageMemoryRequirements2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetImageMemoryRequirements2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_613;
+    *&cgen_var_613 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_613, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkImageMemoryRequirementsInfo2(stream, (VkImageMemoryRequirementsInfo2*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkMemoryRequirements2(stream, (VkMemoryRequirements2*)(pMemoryRequirements), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkMemoryRequirements2(stream, (VkMemoryRequirements2*)(pMemoryRequirements));
     if (pMemoryRequirements)
     {
         transform_fromhost_VkMemoryRequirements2(mImpl->resources(), (VkMemoryRequirements2*)(pMemoryRequirements));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetImageMemoryRequirements2");;
 }
 
 void VkEncoder::vkGetBufferMemoryRequirements2(
     VkDevice device,
     const VkBufferMemoryRequirementsInfo2* pInfo,
-    VkMemoryRequirements2* pMemoryRequirements)
+    VkMemoryRequirements2* pMemoryRequirements,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetBufferMemoryRequirements2");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkBufferMemoryRequirementsInfo2* local_pInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pInfo = nullptr;
     if (pInfo)
@@ -10152,36 +12007,47 @@
         local_pInfo = (VkBufferMemoryRequirementsInfo2*)pool->alloc(sizeof(const VkBufferMemoryRequirementsInfo2));
         deepcopy_VkBufferMemoryRequirementsInfo2(pool, pInfo, (VkBufferMemoryRequirementsInfo2*)(local_pInfo));
     }
+    local_doLock = doLock;
     if (local_pInfo)
     {
         transform_tohost_VkBufferMemoryRequirementsInfo2(mImpl->resources(), (VkBufferMemoryRequirementsInfo2*)(local_pInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_683;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_683, 1);
-        countingStream->write((uint64_t*)&cgen_var_683, 1 * 8);
-        marshal_VkBufferMemoryRequirementsInfo2(countingStream, (VkBufferMemoryRequirementsInfo2*)(local_pInfo));
-        marshal_VkMemoryRequirements2(countingStream, (VkMemoryRequirements2*)(pMemoryRequirements));
+        uint64_t cgen_var_614;
+        *countPtr += 1 * 8;
+        count_VkBufferMemoryRequirementsInfo2(featureBits, (VkBufferMemoryRequirementsInfo2*)(local_pInfo), countPtr);
+        count_VkMemoryRequirements2(featureBits, (VkMemoryRequirements2*)(pMemoryRequirements), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetBufferMemoryRequirements2 = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetBufferMemoryRequirements2 = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetBufferMemoryRequirements2);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetBufferMemoryRequirements2 = OP_vkGetBufferMemoryRequirements2;
-    stream->write(&opcode_vkGetBufferMemoryRequirements2, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetBufferMemoryRequirements2, sizeof(uint32_t));
-    uint64_t cgen_var_684;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_684, 1);
-    stream->write((uint64_t*)&cgen_var_684, 1 * 8);
-    marshal_VkBufferMemoryRequirementsInfo2(stream, (VkBufferMemoryRequirementsInfo2*)(local_pInfo));
-    marshal_VkMemoryRequirements2(stream, (VkMemoryRequirements2*)(pMemoryRequirements));
+    memcpy(streamPtr, &opcode_vkGetBufferMemoryRequirements2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetBufferMemoryRequirements2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_615;
+    *&cgen_var_615 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_615, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkBufferMemoryRequirementsInfo2(stream, (VkBufferMemoryRequirementsInfo2*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkMemoryRequirements2(stream, (VkMemoryRequirements2*)(pMemoryRequirements), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkMemoryRequirements2(stream, (VkMemoryRequirements2*)(pMemoryRequirements));
     if (pMemoryRequirements)
     {
         transform_fromhost_VkMemoryRequirements2(mImpl->resources(), (VkMemoryRequirements2*)(pMemoryRequirements));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetBufferMemoryRequirements2");;
 }
 
@@ -10189,17 +12055,17 @@
     VkDevice device,
     const VkImageSparseMemoryRequirementsInfo2* pInfo,
     uint32_t* pSparseMemoryRequirementCount,
-    VkSparseImageMemoryRequirements2* pSparseMemoryRequirements)
+    VkSparseImageMemoryRequirements2* pSparseMemoryRequirements,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetImageSparseMemoryRequirements2");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkImageSparseMemoryRequirementsInfo2* local_pInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pInfo = nullptr;
     if (pInfo)
@@ -10207,60 +12073,70 @@
         local_pInfo = (VkImageSparseMemoryRequirementsInfo2*)pool->alloc(sizeof(const VkImageSparseMemoryRequirementsInfo2));
         deepcopy_VkImageSparseMemoryRequirementsInfo2(pool, pInfo, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo));
     }
+    local_doLock = doLock;
     if (local_pInfo)
     {
         transform_tohost_VkImageSparseMemoryRequirementsInfo2(mImpl->resources(), (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_685;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_685, 1);
-        countingStream->write((uint64_t*)&cgen_var_685, 1 * 8);
-        marshal_VkImageSparseMemoryRequirementsInfo2(countingStream, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo));
+        uint64_t cgen_var_616;
+        *countPtr += 1 * 8;
+        count_VkImageSparseMemoryRequirementsInfo2(featureBits, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_686 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
-        countingStream->putBe64(cgen_var_686);
+        *countPtr += 8;
         if (pSparseMemoryRequirementCount)
         {
-            countingStream->write((uint32_t*)pSparseMemoryRequirementCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_687 = (uint64_t)(uintptr_t)pSparseMemoryRequirements;
-        countingStream->putBe64(cgen_var_687);
+        *countPtr += 8;
         if (pSparseMemoryRequirements)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
             {
-                marshal_VkSparseImageMemoryRequirements2(countingStream, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
+                count_VkSparseImageMemoryRequirements2(featureBits, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetImageSparseMemoryRequirements2 = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetImageSparseMemoryRequirements2 = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageSparseMemoryRequirements2);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetImageSparseMemoryRequirements2 = OP_vkGetImageSparseMemoryRequirements2;
-    stream->write(&opcode_vkGetImageSparseMemoryRequirements2, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetImageSparseMemoryRequirements2, sizeof(uint32_t));
-    uint64_t cgen_var_688;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_688, 1);
-    stream->write((uint64_t*)&cgen_var_688, 1 * 8);
-    marshal_VkImageSparseMemoryRequirementsInfo2(stream, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo));
+    memcpy(streamPtr, &opcode_vkGetImageSparseMemoryRequirements2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetImageSparseMemoryRequirements2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_617;
+    *&cgen_var_617 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_617, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkImageSparseMemoryRequirementsInfo2(stream, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_689 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
-    stream->putBe64(cgen_var_689);
+    uint64_t cgen_var_618 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
+    memcpy((*streamPtrPtr), &cgen_var_618, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pSparseMemoryRequirementCount)
     {
-        stream->write((uint32_t*)pSparseMemoryRequirementCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pSparseMemoryRequirementCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_690 = (uint64_t)(uintptr_t)pSparseMemoryRequirements;
-    stream->putBe64(cgen_var_690);
+    uint64_t cgen_var_619 = (uint64_t)(uintptr_t)pSparseMemoryRequirements;
+    memcpy((*streamPtrPtr), &cgen_var_619, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pSparseMemoryRequirements)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
         {
-            marshal_VkSparseImageMemoryRequirements2(stream, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
+            reservedmarshal_VkSparseImageMemoryRequirements2(stream, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pSparseMemoryRequirementCount;
     check_pSparseMemoryRequirementCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -10293,152 +12169,190 @@
             transform_fromhost_VkSparseImageMemoryRequirements2(mImpl->resources(), (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
         }
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetImageSparseMemoryRequirements2");;
 }
 
 void VkEncoder::vkGetPhysicalDeviceFeatures2(
     VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceFeatures2* pFeatures)
+    VkPhysicalDeviceFeatures2* pFeatures,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceFeatures2");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_693;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_693, 1);
-        countingStream->write((uint64_t*)&cgen_var_693, 1 * 8);
-        marshal_VkPhysicalDeviceFeatures2(countingStream, (VkPhysicalDeviceFeatures2*)(pFeatures));
+        uint64_t cgen_var_622;
+        *countPtr += 1 * 8;
+        count_VkPhysicalDeviceFeatures2(featureBits, (VkPhysicalDeviceFeatures2*)(pFeatures), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceFeatures2 = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceFeatures2 = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceFeatures2);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceFeatures2 = OP_vkGetPhysicalDeviceFeatures2;
-    stream->write(&opcode_vkGetPhysicalDeviceFeatures2, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceFeatures2, sizeof(uint32_t));
-    uint64_t cgen_var_694;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_694, 1);
-    stream->write((uint64_t*)&cgen_var_694, 1 * 8);
-    marshal_VkPhysicalDeviceFeatures2(stream, (VkPhysicalDeviceFeatures2*)(pFeatures));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceFeatures2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceFeatures2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_623;
+    *&cgen_var_623 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_623, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPhysicalDeviceFeatures2(stream, (VkPhysicalDeviceFeatures2*)(pFeatures), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkPhysicalDeviceFeatures2(stream, (VkPhysicalDeviceFeatures2*)(pFeatures));
     if (pFeatures)
     {
         transform_fromhost_VkPhysicalDeviceFeatures2(mImpl->resources(), (VkPhysicalDeviceFeatures2*)(pFeatures));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceFeatures2");;
 }
 
 void VkEncoder::vkGetPhysicalDeviceProperties2(
     VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceProperties2* pProperties)
+    VkPhysicalDeviceProperties2* pProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceProperties2");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_695;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_695, 1);
-        countingStream->write((uint64_t*)&cgen_var_695, 1 * 8);
-        marshal_VkPhysicalDeviceProperties2(countingStream, (VkPhysicalDeviceProperties2*)(pProperties));
+        uint64_t cgen_var_624;
+        *countPtr += 1 * 8;
+        count_VkPhysicalDeviceProperties2(featureBits, (VkPhysicalDeviceProperties2*)(pProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceProperties2 = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceProperties2 = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceProperties2);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceProperties2 = OP_vkGetPhysicalDeviceProperties2;
-    stream->write(&opcode_vkGetPhysicalDeviceProperties2, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceProperties2, sizeof(uint32_t));
-    uint64_t cgen_var_696;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_696, 1);
-    stream->write((uint64_t*)&cgen_var_696, 1 * 8);
-    marshal_VkPhysicalDeviceProperties2(stream, (VkPhysicalDeviceProperties2*)(pProperties));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceProperties2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceProperties2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_625;
+    *&cgen_var_625 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_625, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPhysicalDeviceProperties2(stream, (VkPhysicalDeviceProperties2*)(pProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkPhysicalDeviceProperties2(stream, (VkPhysicalDeviceProperties2*)(pProperties));
     if (pProperties)
     {
         transform_fromhost_VkPhysicalDeviceProperties2(mImpl->resources(), (VkPhysicalDeviceProperties2*)(pProperties));
     }
     mImpl->resources()->on_vkGetPhysicalDeviceProperties2(this, physicalDevice, pProperties);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceProperties2");;
 }
 
 void VkEncoder::vkGetPhysicalDeviceFormatProperties2(
     VkPhysicalDevice physicalDevice,
     VkFormat format,
-    VkFormatProperties2* pFormatProperties)
+    VkFormatProperties2* pFormatProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceFormatProperties2");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkFormat local_format;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_format = format;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_697;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_697, 1);
-        countingStream->write((uint64_t*)&cgen_var_697, 1 * 8);
-        countingStream->write((VkFormat*)&local_format, sizeof(VkFormat));
-        marshal_VkFormatProperties2(countingStream, (VkFormatProperties2*)(pFormatProperties));
+        uint64_t cgen_var_626;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkFormat);
+        count_VkFormatProperties2(featureBits, (VkFormatProperties2*)(pFormatProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceFormatProperties2 = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceFormatProperties2 = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceFormatProperties2);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceFormatProperties2 = OP_vkGetPhysicalDeviceFormatProperties2;
-    stream->write(&opcode_vkGetPhysicalDeviceFormatProperties2, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceFormatProperties2, sizeof(uint32_t));
-    uint64_t cgen_var_698;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_698, 1);
-    stream->write((uint64_t*)&cgen_var_698, 1 * 8);
-    stream->write((VkFormat*)&local_format, sizeof(VkFormat));
-    marshal_VkFormatProperties2(stream, (VkFormatProperties2*)(pFormatProperties));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceFormatProperties2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceFormatProperties2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_627;
+    *&cgen_var_627 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_627, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkFormat*)&local_format, sizeof(VkFormat));
+    *streamPtrPtr += sizeof(VkFormat);
+    reservedmarshal_VkFormatProperties2(stream, (VkFormatProperties2*)(pFormatProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkFormatProperties2(stream, (VkFormatProperties2*)(pFormatProperties));
     if (pFormatProperties)
     {
         transform_fromhost_VkFormatProperties2(mImpl->resources(), (VkFormatProperties2*)(pFormatProperties));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceFormatProperties2");;
 }
 
 VkResult VkEncoder::vkGetPhysicalDeviceImageFormatProperties2(
     VkPhysicalDevice physicalDevice,
     const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
-    VkImageFormatProperties2* pImageFormatProperties)
+    VkImageFormatProperties2* pImageFormatProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceImageFormatProperties2");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkPhysicalDeviceImageFormatInfo2* local_pImageFormatInfo;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_pImageFormatInfo = nullptr;
     if (pImageFormatInfo)
@@ -10446,28 +12360,35 @@
         local_pImageFormatInfo = (VkPhysicalDeviceImageFormatInfo2*)pool->alloc(sizeof(const VkPhysicalDeviceImageFormatInfo2));
         deepcopy_VkPhysicalDeviceImageFormatInfo2(pool, pImageFormatInfo, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo));
     }
+    local_doLock = doLock;
     if (local_pImageFormatInfo)
     {
         transform_tohost_VkPhysicalDeviceImageFormatInfo2(mImpl->resources(), (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_699;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_699, 1);
-        countingStream->write((uint64_t*)&cgen_var_699, 1 * 8);
-        marshal_VkPhysicalDeviceImageFormatInfo2(countingStream, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo));
-        marshal_VkImageFormatProperties2(countingStream, (VkImageFormatProperties2*)(pImageFormatProperties));
+        uint64_t cgen_var_628;
+        *countPtr += 1 * 8;
+        count_VkPhysicalDeviceImageFormatInfo2(featureBits, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo), countPtr);
+        count_VkImageFormatProperties2(featureBits, (VkImageFormatProperties2*)(pImageFormatProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceImageFormatProperties2 = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceImageFormatProperties2 = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceImageFormatProperties2);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceImageFormatProperties2 = OP_vkGetPhysicalDeviceImageFormatProperties2;
-    stream->write(&opcode_vkGetPhysicalDeviceImageFormatProperties2, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceImageFormatProperties2, sizeof(uint32_t));
-    uint64_t cgen_var_700;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_700, 1);
-    stream->write((uint64_t*)&cgen_var_700, 1 * 8);
-    marshal_VkPhysicalDeviceImageFormatInfo2(stream, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo));
-    marshal_VkImageFormatProperties2(stream, (VkImageFormatProperties2*)(pImageFormatProperties));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceImageFormatProperties2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceImageFormatProperties2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_629;
+    *&cgen_var_629 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_629, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPhysicalDeviceImageFormatInfo2(stream, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo), streamPtrPtr);
+    reservedmarshal_VkImageFormatProperties2(stream, (VkImageFormatProperties2*)(pImageFormatProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkImageFormatProperties2(stream, (VkImageFormatProperties2*)(pImageFormatProperties));
     if (pImageFormatProperties)
     {
@@ -10475,9 +12396,13 @@
     }
     VkResult vkGetPhysicalDeviceImageFormatProperties2_VkResult_return = (VkResult)0;
     stream->read(&vkGetPhysicalDeviceImageFormatProperties2_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceImageFormatProperties2");;
     return vkGetPhysicalDeviceImageFormatProperties2_VkResult_return;
 }
@@ -10485,65 +12410,75 @@
 void VkEncoder::vkGetPhysicalDeviceQueueFamilyProperties2(
     VkPhysicalDevice physicalDevice,
     uint32_t* pQueueFamilyPropertyCount,
-    VkQueueFamilyProperties2* pQueueFamilyProperties)
+    VkQueueFamilyProperties2* pQueueFamilyProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceQueueFamilyProperties2");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_701;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_701, 1);
-        countingStream->write((uint64_t*)&cgen_var_701, 1 * 8);
+        uint64_t cgen_var_630;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_702 = (uint64_t)(uintptr_t)pQueueFamilyPropertyCount;
-        countingStream->putBe64(cgen_var_702);
+        *countPtr += 8;
         if (pQueueFamilyPropertyCount)
         {
-            countingStream->write((uint32_t*)pQueueFamilyPropertyCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_703 = (uint64_t)(uintptr_t)pQueueFamilyProperties;
-        countingStream->putBe64(cgen_var_703);
+        *countPtr += 8;
         if (pQueueFamilyProperties)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
             {
-                marshal_VkQueueFamilyProperties2(countingStream, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
+                count_VkQueueFamilyProperties2(featureBits, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceQueueFamilyProperties2 = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceQueueFamilyProperties2 = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceQueueFamilyProperties2);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceQueueFamilyProperties2 = OP_vkGetPhysicalDeviceQueueFamilyProperties2;
-    stream->write(&opcode_vkGetPhysicalDeviceQueueFamilyProperties2, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceQueueFamilyProperties2, sizeof(uint32_t));
-    uint64_t cgen_var_704;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_704, 1);
-    stream->write((uint64_t*)&cgen_var_704, 1 * 8);
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceQueueFamilyProperties2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceQueueFamilyProperties2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_631;
+    *&cgen_var_631 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_631, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_705 = (uint64_t)(uintptr_t)pQueueFamilyPropertyCount;
-    stream->putBe64(cgen_var_705);
+    uint64_t cgen_var_632 = (uint64_t)(uintptr_t)pQueueFamilyPropertyCount;
+    memcpy((*streamPtrPtr), &cgen_var_632, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pQueueFamilyPropertyCount)
     {
-        stream->write((uint32_t*)pQueueFamilyPropertyCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pQueueFamilyPropertyCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_706 = (uint64_t)(uintptr_t)pQueueFamilyProperties;
-    stream->putBe64(cgen_var_706);
+    uint64_t cgen_var_633 = (uint64_t)(uintptr_t)pQueueFamilyProperties;
+    memcpy((*streamPtrPtr), &cgen_var_633, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pQueueFamilyProperties)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
         {
-            marshal_VkQueueFamilyProperties2(stream, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
+            reservedmarshal_VkQueueFamilyProperties2(stream, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pQueueFamilyPropertyCount;
     check_pQueueFamilyPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -10576,50 +12511,65 @@
             transform_fromhost_VkQueueFamilyProperties2(mImpl->resources(), (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
         }
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceQueueFamilyProperties2");;
 }
 
 void VkEncoder::vkGetPhysicalDeviceMemoryProperties2(
     VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceMemoryProperties2* pMemoryProperties)
+    VkPhysicalDeviceMemoryProperties2* pMemoryProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceMemoryProperties2");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_709;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_709, 1);
-        countingStream->write((uint64_t*)&cgen_var_709, 1 * 8);
-        marshal_VkPhysicalDeviceMemoryProperties2(countingStream, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
+        uint64_t cgen_var_636;
+        *countPtr += 1 * 8;
+        count_VkPhysicalDeviceMemoryProperties2(featureBits, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceMemoryProperties2 = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceMemoryProperties2 = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceMemoryProperties2);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceMemoryProperties2 = OP_vkGetPhysicalDeviceMemoryProperties2;
-    stream->write(&opcode_vkGetPhysicalDeviceMemoryProperties2, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceMemoryProperties2, sizeof(uint32_t));
-    uint64_t cgen_var_710;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_710, 1);
-    stream->write((uint64_t*)&cgen_var_710, 1 * 8);
-    marshal_VkPhysicalDeviceMemoryProperties2(stream, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceMemoryProperties2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceMemoryProperties2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_637;
+    *&cgen_var_637 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_637, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPhysicalDeviceMemoryProperties2(stream, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkPhysicalDeviceMemoryProperties2(stream, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
     if (pMemoryProperties)
     {
         transform_fromhost_VkPhysicalDeviceMemoryProperties2(mImpl->resources(), (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
     }
     mImpl->resources()->on_vkGetPhysicalDeviceMemoryProperties2(this, physicalDevice, pMemoryProperties);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceMemoryProperties2");;
 }
 
@@ -10627,17 +12577,17 @@
     VkPhysicalDevice physicalDevice,
     const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo,
     uint32_t* pPropertyCount,
-    VkSparseImageFormatProperties2* pProperties)
+    VkSparseImageFormatProperties2* pProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceSparseImageFormatProperties2");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkPhysicalDeviceSparseImageFormatInfo2* local_pFormatInfo;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_pFormatInfo = nullptr;
     if (pFormatInfo)
@@ -10645,60 +12595,70 @@
         local_pFormatInfo = (VkPhysicalDeviceSparseImageFormatInfo2*)pool->alloc(sizeof(const VkPhysicalDeviceSparseImageFormatInfo2));
         deepcopy_VkPhysicalDeviceSparseImageFormatInfo2(pool, pFormatInfo, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo));
     }
+    local_doLock = doLock;
     if (local_pFormatInfo)
     {
         transform_tohost_VkPhysicalDeviceSparseImageFormatInfo2(mImpl->resources(), (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_711;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_711, 1);
-        countingStream->write((uint64_t*)&cgen_var_711, 1 * 8);
-        marshal_VkPhysicalDeviceSparseImageFormatInfo2(countingStream, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo));
+        uint64_t cgen_var_638;
+        *countPtr += 1 * 8;
+        count_VkPhysicalDeviceSparseImageFormatInfo2(featureBits, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_712 = (uint64_t)(uintptr_t)pPropertyCount;
-        countingStream->putBe64(cgen_var_712);
+        *countPtr += 8;
         if (pPropertyCount)
         {
-            countingStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_713 = (uint64_t)(uintptr_t)pProperties;
-        countingStream->putBe64(cgen_var_713);
+        *countPtr += 8;
         if (pProperties)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                marshal_VkSparseImageFormatProperties2(countingStream, (VkSparseImageFormatProperties2*)(pProperties + i));
+                count_VkSparseImageFormatProperties2(featureBits, (VkSparseImageFormatProperties2*)(pProperties + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceSparseImageFormatProperties2 = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceSparseImageFormatProperties2 = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceSparseImageFormatProperties2);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceSparseImageFormatProperties2 = OP_vkGetPhysicalDeviceSparseImageFormatProperties2;
-    stream->write(&opcode_vkGetPhysicalDeviceSparseImageFormatProperties2, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceSparseImageFormatProperties2, sizeof(uint32_t));
-    uint64_t cgen_var_714;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_714, 1);
-    stream->write((uint64_t*)&cgen_var_714, 1 * 8);
-    marshal_VkPhysicalDeviceSparseImageFormatInfo2(stream, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceSparseImageFormatProperties2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceSparseImageFormatProperties2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_639;
+    *&cgen_var_639 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_639, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPhysicalDeviceSparseImageFormatInfo2(stream, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_715 = (uint64_t)(uintptr_t)pPropertyCount;
-    stream->putBe64(cgen_var_715);
+    uint64_t cgen_var_640 = (uint64_t)(uintptr_t)pPropertyCount;
+    memcpy((*streamPtrPtr), &cgen_var_640, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pPropertyCount)
     {
-        stream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pPropertyCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_716 = (uint64_t)(uintptr_t)pProperties;
-    stream->putBe64(cgen_var_716);
+    uint64_t cgen_var_641 = (uint64_t)(uintptr_t)pProperties;
+    memcpy((*streamPtrPtr), &cgen_var_641, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pProperties)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            marshal_VkSparseImageFormatProperties2(stream, (VkSparseImageFormatProperties2*)(pProperties + i));
+            reservedmarshal_VkSparseImageFormatProperties2(stream, (VkSparseImageFormatProperties2*)(pProperties + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pPropertyCount;
     check_pPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -10731,72 +12691,88 @@
             transform_fromhost_VkSparseImageFormatProperties2(mImpl->resources(), (VkSparseImageFormatProperties2*)(pProperties + i));
         }
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceSparseImageFormatProperties2");;
 }
 
 void VkEncoder::vkTrimCommandPool(
     VkDevice device,
     VkCommandPool commandPool,
-    VkCommandPoolTrimFlags flags)
+    VkCommandPoolTrimFlags flags,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkTrimCommandPool");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkCommandPool local_commandPool;
     VkCommandPoolTrimFlags local_flags;
+    uint32_t local_doLock;
     local_device = device;
     local_commandPool = commandPool;
     local_flags = flags;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_719;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_719, 1);
-        countingStream->write((uint64_t*)&cgen_var_719, 1 * 8);
-        uint64_t cgen_var_720;
-        countingStream->handleMapping()->mapHandles_VkCommandPool_u64(&local_commandPool, &cgen_var_720, 1);
-        countingStream->write((uint64_t*)&cgen_var_720, 1 * 8);
-        countingStream->write((VkCommandPoolTrimFlags*)&local_flags, sizeof(VkCommandPoolTrimFlags));
+        uint64_t cgen_var_644;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_645;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkCommandPoolTrimFlags);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkTrimCommandPool = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkTrimCommandPool = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkTrimCommandPool);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkTrimCommandPool = OP_vkTrimCommandPool;
-    stream->write(&opcode_vkTrimCommandPool, sizeof(uint32_t));
-    stream->write(&packetSize_vkTrimCommandPool, sizeof(uint32_t));
-    uint64_t cgen_var_721;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_721, 1);
-    stream->write((uint64_t*)&cgen_var_721, 1 * 8);
-    uint64_t cgen_var_722;
-    stream->handleMapping()->mapHandles_VkCommandPool_u64(&local_commandPool, &cgen_var_722, 1);
-    stream->write((uint64_t*)&cgen_var_722, 1 * 8);
-    stream->write((VkCommandPoolTrimFlags*)&local_flags, sizeof(VkCommandPoolTrimFlags));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkTrimCommandPool, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkTrimCommandPool, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_646;
+    *&cgen_var_646 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_646, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_647;
+    *&cgen_var_647 = get_host_u64_VkCommandPool((*&local_commandPool));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_647, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkCommandPoolTrimFlags*)&local_flags, sizeof(VkCommandPoolTrimFlags));
+    *streamPtrPtr += sizeof(VkCommandPoolTrimFlags);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkTrimCommandPool");;
 }
 
 void VkEncoder::vkGetDeviceQueue2(
     VkDevice device,
     const VkDeviceQueueInfo2* pQueueInfo,
-    VkQueue* pQueue)
+    VkQueue* pQueue,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetDeviceQueue2");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDeviceQueueInfo2* local_pQueueInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pQueueInfo = nullptr;
     if (pQueueInfo)
@@ -10804,40 +12780,51 @@
         local_pQueueInfo = (VkDeviceQueueInfo2*)pool->alloc(sizeof(const VkDeviceQueueInfo2));
         deepcopy_VkDeviceQueueInfo2(pool, pQueueInfo, (VkDeviceQueueInfo2*)(local_pQueueInfo));
     }
+    local_doLock = doLock;
     if (local_pQueueInfo)
     {
         transform_tohost_VkDeviceQueueInfo2(mImpl->resources(), (VkDeviceQueueInfo2*)(local_pQueueInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_723;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_723, 1);
-        countingStream->write((uint64_t*)&cgen_var_723, 1 * 8);
-        marshal_VkDeviceQueueInfo2(countingStream, (VkDeviceQueueInfo2*)(local_pQueueInfo));
-        uint64_t cgen_var_724;
-        countingStream->handleMapping()->mapHandles_VkQueue_u64(pQueue, &cgen_var_724, 1);
-        countingStream->write((uint64_t*)&cgen_var_724, 8);
+        uint64_t cgen_var_648;
+        *countPtr += 1 * 8;
+        count_VkDeviceQueueInfo2(featureBits, (VkDeviceQueueInfo2*)(local_pQueueInfo), countPtr);
+        uint64_t cgen_var_649;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetDeviceQueue2 = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetDeviceQueue2 = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceQueue2);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetDeviceQueue2 = OP_vkGetDeviceQueue2;
-    stream->write(&opcode_vkGetDeviceQueue2, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetDeviceQueue2, sizeof(uint32_t));
-    uint64_t cgen_var_725;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_725, 1);
-    stream->write((uint64_t*)&cgen_var_725, 1 * 8);
-    marshal_VkDeviceQueueInfo2(stream, (VkDeviceQueueInfo2*)(local_pQueueInfo));
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_726;
-    stream->handleMapping()->mapHandles_VkQueue_u64(pQueue, &cgen_var_726, 1);
-    stream->write((uint64_t*)&cgen_var_726, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
-    uint64_t cgen_var_727;
-    stream->read((uint64_t*)&cgen_var_727, 8);
-    stream->handleMapping()->mapHandles_u64_VkQueue(&cgen_var_727, (VkQueue*)pQueue, 1);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkGetDeviceQueue2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetDeviceQueue2, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_650;
+    *&cgen_var_650 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_650, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDeviceQueueInfo2(stream, (VkDeviceQueueInfo2*)(local_pQueueInfo), streamPtrPtr);
+    /* is handle, possibly out */;
+    uint64_t cgen_var_651;
+    *&cgen_var_651 = (uint64_t)((*pQueue));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_651, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    uint64_t cgen_var_652;
+    stream->read((uint64_t*)&cgen_var_652, 8);
+    stream->handleMapping()->mapHandles_u64_VkQueue(&cgen_var_652, (VkQueue*)pQueue, 1);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetDeviceQueue2");;
 }
 
@@ -10845,18 +12832,18 @@
     VkDevice device,
     const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkSamplerYcbcrConversion* pYcbcrConversion)
+    VkSamplerYcbcrConversion* pYcbcrConversion,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateSamplerYcbcrConversion");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkSamplerYcbcrConversionCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -10870,6 +12857,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -10879,54 +12867,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_728;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_728, 1);
-        countingStream->write((uint64_t*)&cgen_var_728, 1 * 8);
-        marshal_VkSamplerYcbcrConversionCreateInfo(countingStream, (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_653;
+        *countPtr += 1 * 8;
+        count_VkSamplerYcbcrConversionCreateInfo(featureBits, (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_729 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_729);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_730;
-        countingStream->handleMapping()->mapHandles_VkSamplerYcbcrConversion_u64(pYcbcrConversion, &cgen_var_730, 1);
-        countingStream->write((uint64_t*)&cgen_var_730, 8);
+        uint64_t cgen_var_654;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateSamplerYcbcrConversion = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateSamplerYcbcrConversion = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateSamplerYcbcrConversion);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateSamplerYcbcrConversion = OP_vkCreateSamplerYcbcrConversion;
-    stream->write(&opcode_vkCreateSamplerYcbcrConversion, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateSamplerYcbcrConversion, sizeof(uint32_t));
-    uint64_t cgen_var_731;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_731, 1);
-    stream->write((uint64_t*)&cgen_var_731, 1 * 8);
-    marshal_VkSamplerYcbcrConversionCreateInfo(stream, (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateSamplerYcbcrConversion, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateSamplerYcbcrConversion, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_655;
+    *&cgen_var_655 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_655, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkSamplerYcbcrConversionCreateInfo(stream, (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_732 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_732);
+    uint64_t cgen_var_656 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_656, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_733;
-    stream->handleMapping()->mapHandles_VkSamplerYcbcrConversion_u64(pYcbcrConversion, &cgen_var_733, 1);
-    stream->write((uint64_t*)&cgen_var_733, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_657;
+    *&cgen_var_657 = (uint64_t)((*pYcbcrConversion));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_657, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_734;
-    stream->read((uint64_t*)&cgen_var_734, 8);
-    stream->handleMapping()->mapHandles_u64_VkSamplerYcbcrConversion(&cgen_var_734, (VkSamplerYcbcrConversion*)pYcbcrConversion, 1);
+    uint64_t cgen_var_658;
+    stream->read((uint64_t*)&cgen_var_658, 8);
+    stream->handleMapping()->mapHandles_u64_VkSamplerYcbcrConversion(&cgen_var_658, (VkSamplerYcbcrConversion*)pYcbcrConversion, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateSamplerYcbcrConversion_VkResult_return = (VkResult)0;
     stream->read(&vkCreateSamplerYcbcrConversion_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateSamplerYcbcrConversion");;
     return vkCreateSamplerYcbcrConversion_VkResult_return;
 }
@@ -10934,18 +12933,18 @@
 void VkEncoder::vkDestroySamplerYcbcrConversion(
     VkDevice device,
     VkSamplerYcbcrConversion ycbcrConversion,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroySamplerYcbcrConversion");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkSamplerYcbcrConversion local_ycbcrConversion;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_ycbcrConversion = ycbcrConversion;
     local_pAllocator = nullptr;
@@ -10954,49 +12953,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_735;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_735, 1);
-        countingStream->write((uint64_t*)&cgen_var_735, 1 * 8);
-        uint64_t cgen_var_736;
-        countingStream->handleMapping()->mapHandles_VkSamplerYcbcrConversion_u64(&local_ycbcrConversion, &cgen_var_736, 1);
-        countingStream->write((uint64_t*)&cgen_var_736, 1 * 8);
+        uint64_t cgen_var_659;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_660;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_737 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_737);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroySamplerYcbcrConversion = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroySamplerYcbcrConversion = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroySamplerYcbcrConversion);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroySamplerYcbcrConversion = OP_vkDestroySamplerYcbcrConversion;
-    stream->write(&opcode_vkDestroySamplerYcbcrConversion, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroySamplerYcbcrConversion, sizeof(uint32_t));
-    uint64_t cgen_var_738;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_738, 1);
-    stream->write((uint64_t*)&cgen_var_738, 1 * 8);
-    uint64_t cgen_var_739;
-    stream->handleMapping()->mapHandles_VkSamplerYcbcrConversion_u64(&local_ycbcrConversion, &cgen_var_739, 1);
-    stream->write((uint64_t*)&cgen_var_739, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroySamplerYcbcrConversion, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroySamplerYcbcrConversion, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_661;
+    *&cgen_var_661 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_661, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_662;
+    *&cgen_var_662 = get_host_u64_VkSamplerYcbcrConversion((*&local_ycbcrConversion));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_662, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_740 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_740);
+    uint64_t cgen_var_663 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_663, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkSamplerYcbcrConversion((VkSamplerYcbcrConversion*)&ycbcrConversion);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroySamplerYcbcrConversion");;
 }
 
@@ -11004,18 +13015,18 @@
     VkDevice device,
     const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate)
+    VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateDescriptorUpdateTemplate");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDescriptorUpdateTemplateCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -11029,6 +13040,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -11038,55 +13050,66 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_741;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_741, 1);
-        countingStream->write((uint64_t*)&cgen_var_741, 1 * 8);
-        marshal_VkDescriptorUpdateTemplateCreateInfo(countingStream, (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_664;
+        *countPtr += 1 * 8;
+        count_VkDescriptorUpdateTemplateCreateInfo(featureBits, (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_742 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_742);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_743;
-        countingStream->handleMapping()->mapHandles_VkDescriptorUpdateTemplate_u64(pDescriptorUpdateTemplate, &cgen_var_743, 1);
-        countingStream->write((uint64_t*)&cgen_var_743, 8);
+        uint64_t cgen_var_665;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateDescriptorUpdateTemplate = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateDescriptorUpdateTemplate = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateDescriptorUpdateTemplate);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateDescriptorUpdateTemplate = OP_vkCreateDescriptorUpdateTemplate;
-    stream->write(&opcode_vkCreateDescriptorUpdateTemplate, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateDescriptorUpdateTemplate, sizeof(uint32_t));
-    uint64_t cgen_var_744;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_744, 1);
-    stream->write((uint64_t*)&cgen_var_744, 1 * 8);
-    marshal_VkDescriptorUpdateTemplateCreateInfo(stream, (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateDescriptorUpdateTemplate, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateDescriptorUpdateTemplate, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_666;
+    *&cgen_var_666 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_666, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDescriptorUpdateTemplateCreateInfo(stream, (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_745 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_745);
+    uint64_t cgen_var_667 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_667, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_746;
-    stream->handleMapping()->mapHandles_VkDescriptorUpdateTemplate_u64(pDescriptorUpdateTemplate, &cgen_var_746, 1);
-    stream->write((uint64_t*)&cgen_var_746, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_668;
+    *&cgen_var_668 = (uint64_t)((*pDescriptorUpdateTemplate));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_668, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_747;
-    stream->read((uint64_t*)&cgen_var_747, 8);
-    stream->handleMapping()->mapHandles_u64_VkDescriptorUpdateTemplate(&cgen_var_747, (VkDescriptorUpdateTemplate*)pDescriptorUpdateTemplate, 1);
+    uint64_t cgen_var_669;
+    stream->read((uint64_t*)&cgen_var_669, 8);
+    stream->handleMapping()->mapHandles_u64_VkDescriptorUpdateTemplate(&cgen_var_669, (VkDescriptorUpdateTemplate*)pDescriptorUpdateTemplate, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateDescriptorUpdateTemplate_VkResult_return = (VkResult)0;
     stream->read(&vkCreateDescriptorUpdateTemplate_VkResult_return, sizeof(VkResult));
     mImpl->resources()->on_vkCreateDescriptorUpdateTemplate(this, vkCreateDescriptorUpdateTemplate_VkResult_return, device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateDescriptorUpdateTemplate");;
     return vkCreateDescriptorUpdateTemplate_VkResult_return;
 }
@@ -11094,18 +13117,18 @@
 void VkEncoder::vkDestroyDescriptorUpdateTemplate(
     VkDevice device,
     VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyDescriptorUpdateTemplate");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDescriptorUpdateTemplate local_descriptorUpdateTemplate;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_descriptorUpdateTemplate = descriptorUpdateTemplate;
     local_pAllocator = nullptr;
@@ -11114,49 +13137,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_748;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_748, 1);
-        countingStream->write((uint64_t*)&cgen_var_748, 1 * 8);
-        uint64_t cgen_var_749;
-        countingStream->handleMapping()->mapHandles_VkDescriptorUpdateTemplate_u64(&local_descriptorUpdateTemplate, &cgen_var_749, 1);
-        countingStream->write((uint64_t*)&cgen_var_749, 1 * 8);
+        uint64_t cgen_var_670;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_671;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_750 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_750);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyDescriptorUpdateTemplate = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyDescriptorUpdateTemplate = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyDescriptorUpdateTemplate);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyDescriptorUpdateTemplate = OP_vkDestroyDescriptorUpdateTemplate;
-    stream->write(&opcode_vkDestroyDescriptorUpdateTemplate, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyDescriptorUpdateTemplate, sizeof(uint32_t));
-    uint64_t cgen_var_751;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_751, 1);
-    stream->write((uint64_t*)&cgen_var_751, 1 * 8);
-    uint64_t cgen_var_752;
-    stream->handleMapping()->mapHandles_VkDescriptorUpdateTemplate_u64(&local_descriptorUpdateTemplate, &cgen_var_752, 1);
-    stream->write((uint64_t*)&cgen_var_752, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyDescriptorUpdateTemplate, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyDescriptorUpdateTemplate, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_672;
+    *&cgen_var_672 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_672, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_673;
+    *&cgen_var_673 = get_host_u64_VkDescriptorUpdateTemplate((*&local_descriptorUpdateTemplate));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_673, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_753 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_753);
+    uint64_t cgen_var_674 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_674, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkDescriptorUpdateTemplate((VkDescriptorUpdateTemplate*)&descriptorUpdateTemplate);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyDescriptorUpdateTemplate");;
 }
 
@@ -11164,19 +13199,19 @@
     VkDevice device,
     VkDescriptorSet descriptorSet,
     VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-    const void* pData)
+    const void* pData,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkUpdateDescriptorSetWithTemplate");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDescriptorSet local_descriptorSet;
     VkDescriptorUpdateTemplate local_descriptorUpdateTemplate;
     void* local_pData;
+    uint32_t local_doLock;
     local_device = device;
     local_descriptorSet = descriptorSet;
     local_descriptorUpdateTemplate = descriptorUpdateTemplate;
@@ -11185,66 +13220,79 @@
     {
         local_pData = (void*)pool->dupArray(pData, sizeof(const uint8_t));
     }
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_754;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_754, 1);
-        countingStream->write((uint64_t*)&cgen_var_754, 1 * 8);
-        uint64_t cgen_var_755;
-        countingStream->handleMapping()->mapHandles_VkDescriptorSet_u64(&local_descriptorSet, &cgen_var_755, 1);
-        countingStream->write((uint64_t*)&cgen_var_755, 1 * 8);
-        uint64_t cgen_var_756;
-        countingStream->handleMapping()->mapHandles_VkDescriptorUpdateTemplate_u64(&local_descriptorUpdateTemplate, &cgen_var_756, 1);
-        countingStream->write((uint64_t*)&cgen_var_756, 1 * 8);
+        uint64_t cgen_var_675;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_676;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_677;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_757 = (uint64_t)(uintptr_t)local_pData;
-        countingStream->putBe64(cgen_var_757);
+        *countPtr += 8;
         if (local_pData)
         {
-            countingStream->write((void*)local_pData, sizeof(uint8_t));
+            *countPtr += sizeof(uint8_t);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkUpdateDescriptorSetWithTemplate = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkUpdateDescriptorSetWithTemplate = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkUpdateDescriptorSetWithTemplate);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkUpdateDescriptorSetWithTemplate = OP_vkUpdateDescriptorSetWithTemplate;
-    stream->write(&opcode_vkUpdateDescriptorSetWithTemplate, sizeof(uint32_t));
-    stream->write(&packetSize_vkUpdateDescriptorSetWithTemplate, sizeof(uint32_t));
-    uint64_t cgen_var_758;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_758, 1);
-    stream->write((uint64_t*)&cgen_var_758, 1 * 8);
-    uint64_t cgen_var_759;
-    stream->handleMapping()->mapHandles_VkDescriptorSet_u64(&local_descriptorSet, &cgen_var_759, 1);
-    stream->write((uint64_t*)&cgen_var_759, 1 * 8);
-    uint64_t cgen_var_760;
-    stream->handleMapping()->mapHandles_VkDescriptorUpdateTemplate_u64(&local_descriptorUpdateTemplate, &cgen_var_760, 1);
-    stream->write((uint64_t*)&cgen_var_760, 1 * 8);
+    memcpy(streamPtr, &opcode_vkUpdateDescriptorSetWithTemplate, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkUpdateDescriptorSetWithTemplate, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_678;
+    *&cgen_var_678 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_678, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_679;
+    *&cgen_var_679 = get_host_u64_VkDescriptorSet((*&local_descriptorSet));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_679, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_680;
+    *&cgen_var_680 = get_host_u64_VkDescriptorUpdateTemplate((*&local_descriptorUpdateTemplate));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_680, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_761 = (uint64_t)(uintptr_t)local_pData;
-    stream->putBe64(cgen_var_761);
+    uint64_t cgen_var_681 = (uint64_t)(uintptr_t)local_pData;
+    memcpy((*streamPtrPtr), &cgen_var_681, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pData)
     {
-        stream->write((void*)local_pData, sizeof(uint8_t));
+        memcpy(*streamPtrPtr, (void*)local_pData, sizeof(uint8_t));
+        *streamPtrPtr += sizeof(uint8_t);
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkUpdateDescriptorSetWithTemplate");;
 }
 
 void VkEncoder::vkGetPhysicalDeviceExternalBufferProperties(
     VkPhysicalDevice physicalDevice,
     const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo,
-    VkExternalBufferProperties* pExternalBufferProperties)
+    VkExternalBufferProperties* pExternalBufferProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceExternalBufferProperties");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkPhysicalDeviceExternalBufferInfo* local_pExternalBufferInfo;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_pExternalBufferInfo = nullptr;
     if (pExternalBufferInfo)
@@ -11252,55 +13300,66 @@
         local_pExternalBufferInfo = (VkPhysicalDeviceExternalBufferInfo*)pool->alloc(sizeof(const VkPhysicalDeviceExternalBufferInfo));
         deepcopy_VkPhysicalDeviceExternalBufferInfo(pool, pExternalBufferInfo, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo));
     }
+    local_doLock = doLock;
     if (local_pExternalBufferInfo)
     {
         mImpl->resources()->transformImpl_VkPhysicalDeviceExternalBufferInfo_tohost(local_pExternalBufferInfo, 1);
         transform_tohost_VkPhysicalDeviceExternalBufferInfo(mImpl->resources(), (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_762;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_762, 1);
-        countingStream->write((uint64_t*)&cgen_var_762, 1 * 8);
-        marshal_VkPhysicalDeviceExternalBufferInfo(countingStream, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo));
-        marshal_VkExternalBufferProperties(countingStream, (VkExternalBufferProperties*)(pExternalBufferProperties));
+        uint64_t cgen_var_682;
+        *countPtr += 1 * 8;
+        count_VkPhysicalDeviceExternalBufferInfo(featureBits, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo), countPtr);
+        count_VkExternalBufferProperties(featureBits, (VkExternalBufferProperties*)(pExternalBufferProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceExternalBufferProperties = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceExternalBufferProperties = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceExternalBufferProperties);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceExternalBufferProperties = OP_vkGetPhysicalDeviceExternalBufferProperties;
-    stream->write(&opcode_vkGetPhysicalDeviceExternalBufferProperties, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceExternalBufferProperties, sizeof(uint32_t));
-    uint64_t cgen_var_763;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_763, 1);
-    stream->write((uint64_t*)&cgen_var_763, 1 * 8);
-    marshal_VkPhysicalDeviceExternalBufferInfo(stream, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo));
-    marshal_VkExternalBufferProperties(stream, (VkExternalBufferProperties*)(pExternalBufferProperties));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceExternalBufferProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceExternalBufferProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_683;
+    *&cgen_var_683 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_683, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPhysicalDeviceExternalBufferInfo(stream, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo), streamPtrPtr);
+    reservedmarshal_VkExternalBufferProperties(stream, (VkExternalBufferProperties*)(pExternalBufferProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkExternalBufferProperties(stream, (VkExternalBufferProperties*)(pExternalBufferProperties));
     if (pExternalBufferProperties)
     {
         mImpl->resources()->transformImpl_VkExternalBufferProperties_fromhost(pExternalBufferProperties, 1);
         transform_fromhost_VkExternalBufferProperties(mImpl->resources(), (VkExternalBufferProperties*)(pExternalBufferProperties));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceExternalBufferProperties");;
 }
 
 void VkEncoder::vkGetPhysicalDeviceExternalFenceProperties(
     VkPhysicalDevice physicalDevice,
     const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo,
-    VkExternalFenceProperties* pExternalFenceProperties)
+    VkExternalFenceProperties* pExternalFenceProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceExternalFenceProperties");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkPhysicalDeviceExternalFenceInfo* local_pExternalFenceInfo;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_pExternalFenceInfo = nullptr;
     if (pExternalFenceInfo)
@@ -11308,53 +13367,64 @@
         local_pExternalFenceInfo = (VkPhysicalDeviceExternalFenceInfo*)pool->alloc(sizeof(const VkPhysicalDeviceExternalFenceInfo));
         deepcopy_VkPhysicalDeviceExternalFenceInfo(pool, pExternalFenceInfo, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo));
     }
+    local_doLock = doLock;
     if (local_pExternalFenceInfo)
     {
         transform_tohost_VkPhysicalDeviceExternalFenceInfo(mImpl->resources(), (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_764;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_764, 1);
-        countingStream->write((uint64_t*)&cgen_var_764, 1 * 8);
-        marshal_VkPhysicalDeviceExternalFenceInfo(countingStream, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo));
-        marshal_VkExternalFenceProperties(countingStream, (VkExternalFenceProperties*)(pExternalFenceProperties));
+        uint64_t cgen_var_684;
+        *countPtr += 1 * 8;
+        count_VkPhysicalDeviceExternalFenceInfo(featureBits, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo), countPtr);
+        count_VkExternalFenceProperties(featureBits, (VkExternalFenceProperties*)(pExternalFenceProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceExternalFenceProperties = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceExternalFenceProperties = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceExternalFenceProperties);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceExternalFenceProperties = OP_vkGetPhysicalDeviceExternalFenceProperties;
-    stream->write(&opcode_vkGetPhysicalDeviceExternalFenceProperties, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceExternalFenceProperties, sizeof(uint32_t));
-    uint64_t cgen_var_765;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_765, 1);
-    stream->write((uint64_t*)&cgen_var_765, 1 * 8);
-    marshal_VkPhysicalDeviceExternalFenceInfo(stream, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo));
-    marshal_VkExternalFenceProperties(stream, (VkExternalFenceProperties*)(pExternalFenceProperties));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceExternalFenceProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceExternalFenceProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_685;
+    *&cgen_var_685 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_685, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPhysicalDeviceExternalFenceInfo(stream, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo), streamPtrPtr);
+    reservedmarshal_VkExternalFenceProperties(stream, (VkExternalFenceProperties*)(pExternalFenceProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkExternalFenceProperties(stream, (VkExternalFenceProperties*)(pExternalFenceProperties));
     if (pExternalFenceProperties)
     {
         transform_fromhost_VkExternalFenceProperties(mImpl->resources(), (VkExternalFenceProperties*)(pExternalFenceProperties));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceExternalFenceProperties");;
 }
 
 void VkEncoder::vkGetPhysicalDeviceExternalSemaphoreProperties(
     VkPhysicalDevice physicalDevice,
     const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,
-    VkExternalSemaphoreProperties* pExternalSemaphoreProperties)
+    VkExternalSemaphoreProperties* pExternalSemaphoreProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceExternalSemaphoreProperties");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkPhysicalDeviceExternalSemaphoreInfo* local_pExternalSemaphoreInfo;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_pExternalSemaphoreInfo = nullptr;
     if (pExternalSemaphoreInfo)
@@ -11362,53 +13432,64 @@
         local_pExternalSemaphoreInfo = (VkPhysicalDeviceExternalSemaphoreInfo*)pool->alloc(sizeof(const VkPhysicalDeviceExternalSemaphoreInfo));
         deepcopy_VkPhysicalDeviceExternalSemaphoreInfo(pool, pExternalSemaphoreInfo, (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo));
     }
+    local_doLock = doLock;
     if (local_pExternalSemaphoreInfo)
     {
         transform_tohost_VkPhysicalDeviceExternalSemaphoreInfo(mImpl->resources(), (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_766;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_766, 1);
-        countingStream->write((uint64_t*)&cgen_var_766, 1 * 8);
-        marshal_VkPhysicalDeviceExternalSemaphoreInfo(countingStream, (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo));
-        marshal_VkExternalSemaphoreProperties(countingStream, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
+        uint64_t cgen_var_686;
+        *countPtr += 1 * 8;
+        count_VkPhysicalDeviceExternalSemaphoreInfo(featureBits, (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo), countPtr);
+        count_VkExternalSemaphoreProperties(featureBits, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceExternalSemaphoreProperties = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceExternalSemaphoreProperties = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceExternalSemaphoreProperties);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceExternalSemaphoreProperties = OP_vkGetPhysicalDeviceExternalSemaphoreProperties;
-    stream->write(&opcode_vkGetPhysicalDeviceExternalSemaphoreProperties, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceExternalSemaphoreProperties, sizeof(uint32_t));
-    uint64_t cgen_var_767;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_767, 1);
-    stream->write((uint64_t*)&cgen_var_767, 1 * 8);
-    marshal_VkPhysicalDeviceExternalSemaphoreInfo(stream, (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo));
-    marshal_VkExternalSemaphoreProperties(stream, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceExternalSemaphoreProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceExternalSemaphoreProperties, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_687;
+    *&cgen_var_687 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_687, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPhysicalDeviceExternalSemaphoreInfo(stream, (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo), streamPtrPtr);
+    reservedmarshal_VkExternalSemaphoreProperties(stream, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkExternalSemaphoreProperties(stream, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
     if (pExternalSemaphoreProperties)
     {
         transform_fromhost_VkExternalSemaphoreProperties(mImpl->resources(), (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceExternalSemaphoreProperties");;
 }
 
 void VkEncoder::vkGetDescriptorSetLayoutSupport(
     VkDevice device,
     const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
-    VkDescriptorSetLayoutSupport* pSupport)
+    VkDescriptorSetLayoutSupport* pSupport,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetDescriptorSetLayoutSupport");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDescriptorSetLayoutCreateInfo* local_pCreateInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -11416,36 +13497,47 @@
         local_pCreateInfo = (VkDescriptorSetLayoutCreateInfo*)pool->alloc(sizeof(const VkDescriptorSetLayoutCreateInfo));
         deepcopy_VkDescriptorSetLayoutCreateInfo(pool, pCreateInfo, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo));
     }
+    local_doLock = doLock;
     if (local_pCreateInfo)
     {
         transform_tohost_VkDescriptorSetLayoutCreateInfo(mImpl->resources(), (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_768;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_768, 1);
-        countingStream->write((uint64_t*)&cgen_var_768, 1 * 8);
-        marshal_VkDescriptorSetLayoutCreateInfo(countingStream, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo));
-        marshal_VkDescriptorSetLayoutSupport(countingStream, (VkDescriptorSetLayoutSupport*)(pSupport));
+        uint64_t cgen_var_688;
+        *countPtr += 1 * 8;
+        count_VkDescriptorSetLayoutCreateInfo(featureBits, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkDescriptorSetLayoutSupport(featureBits, (VkDescriptorSetLayoutSupport*)(pSupport), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetDescriptorSetLayoutSupport = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetDescriptorSetLayoutSupport = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetDescriptorSetLayoutSupport);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetDescriptorSetLayoutSupport = OP_vkGetDescriptorSetLayoutSupport;
-    stream->write(&opcode_vkGetDescriptorSetLayoutSupport, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetDescriptorSetLayoutSupport, sizeof(uint32_t));
-    uint64_t cgen_var_769;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_769, 1);
-    stream->write((uint64_t*)&cgen_var_769, 1 * 8);
-    marshal_VkDescriptorSetLayoutCreateInfo(stream, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo));
-    marshal_VkDescriptorSetLayoutSupport(stream, (VkDescriptorSetLayoutSupport*)(pSupport));
+    memcpy(streamPtr, &opcode_vkGetDescriptorSetLayoutSupport, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetDescriptorSetLayoutSupport, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_689;
+    *&cgen_var_689 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_689, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDescriptorSetLayoutCreateInfo(stream, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkDescriptorSetLayoutSupport(stream, (VkDescriptorSetLayoutSupport*)(pSupport), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkDescriptorSetLayoutSupport(stream, (VkDescriptorSetLayoutSupport*)(pSupport));
     if (pSupport)
     {
         transform_fromhost_VkDescriptorSetLayoutSupport(mImpl->resources(), (VkDescriptorSetLayoutSupport*)(pSupport));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetDescriptorSetLayoutSupport");;
 }
 
@@ -11454,18 +13546,18 @@
 void VkEncoder::vkDestroySurfaceKHR(
     VkInstance instance,
     VkSurfaceKHR surface,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroySurfaceKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkInstance local_instance;
     VkSurfaceKHR local_surface;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_instance = instance;
     local_surface = surface;
     local_pAllocator = nullptr;
@@ -11474,49 +13566,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_770;
-        countingStream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_770, 1);
-        countingStream->write((uint64_t*)&cgen_var_770, 1 * 8);
-        uint64_t cgen_var_771;
-        countingStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(&local_surface, &cgen_var_771, 1);
-        countingStream->write((uint64_t*)&cgen_var_771, 1 * 8);
+        uint64_t cgen_var_690;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_691;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_772 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_772);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroySurfaceKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroySurfaceKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroySurfaceKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroySurfaceKHR = OP_vkDestroySurfaceKHR;
-    stream->write(&opcode_vkDestroySurfaceKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroySurfaceKHR, sizeof(uint32_t));
-    uint64_t cgen_var_773;
-    stream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_773, 1);
-    stream->write((uint64_t*)&cgen_var_773, 1 * 8);
-    uint64_t cgen_var_774;
-    stream->handleMapping()->mapHandles_VkSurfaceKHR_u64(&local_surface, &cgen_var_774, 1);
-    stream->write((uint64_t*)&cgen_var_774, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroySurfaceKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroySurfaceKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_692;
+    *&cgen_var_692 = get_host_u64_VkInstance((*&local_instance));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_692, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_693;
+    *&cgen_var_693 = get_host_u64_VkSurfaceKHR((*&local_surface));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_693, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_775 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_775);
+    uint64_t cgen_var_694 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_694, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkSurfaceKHR((VkSurfaceKHR*)&surface);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroySurfaceKHR");;
 }
 
@@ -11524,51 +13628,64 @@
     VkPhysicalDevice physicalDevice,
     uint32_t queueFamilyIndex,
     VkSurfaceKHR surface,
-    VkBool32* pSupported)
+    VkBool32* pSupported,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceSurfaceSupportKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     uint32_t local_queueFamilyIndex;
     VkSurfaceKHR local_surface;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_queueFamilyIndex = queueFamilyIndex;
     local_surface = surface;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_776;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_776, 1);
-        countingStream->write((uint64_t*)&cgen_var_776, 1 * 8);
-        countingStream->write((uint32_t*)&local_queueFamilyIndex, sizeof(uint32_t));
-        uint64_t cgen_var_777;
-        countingStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(&local_surface, &cgen_var_777, 1);
-        countingStream->write((uint64_t*)&cgen_var_777, 1 * 8);
-        countingStream->write((VkBool32*)pSupported, sizeof(VkBool32));
+        uint64_t cgen_var_695;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        uint64_t cgen_var_696;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkBool32);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceSurfaceSupportKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceSurfaceSupportKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceSurfaceSupportKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceSurfaceSupportKHR = OP_vkGetPhysicalDeviceSurfaceSupportKHR;
-    stream->write(&opcode_vkGetPhysicalDeviceSurfaceSupportKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceSurfaceSupportKHR, sizeof(uint32_t));
-    uint64_t cgen_var_778;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_778, 1);
-    stream->write((uint64_t*)&cgen_var_778, 1 * 8);
-    stream->write((uint32_t*)&local_queueFamilyIndex, sizeof(uint32_t));
-    uint64_t cgen_var_779;
-    stream->handleMapping()->mapHandles_VkSurfaceKHR_u64(&local_surface, &cgen_var_779, 1);
-    stream->write((uint64_t*)&cgen_var_779, 1 * 8);
-    stream->write((VkBool32*)pSupported, sizeof(VkBool32));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceSurfaceSupportKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceSurfaceSupportKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_697;
+    *&cgen_var_697 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_697, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_queueFamilyIndex, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    uint64_t cgen_var_698;
+    *&cgen_var_698 = get_host_u64_VkSurfaceKHR((*&local_surface));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_698, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkBool32*)pSupported, sizeof(VkBool32));
+    *streamPtrPtr += sizeof(VkBool32);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((VkBool32*)pSupported, sizeof(VkBool32));
     VkResult vkGetPhysicalDeviceSurfaceSupportKHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetPhysicalDeviceSurfaceSupportKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceSurfaceSupportKHR");;
     return vkGetPhysicalDeviceSurfaceSupportKHR_VkResult_return;
 }
@@ -11576,41 +13693,48 @@
 VkResult VkEncoder::vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
     VkPhysicalDevice physicalDevice,
     VkSurfaceKHR surface,
-    VkSurfaceCapabilitiesKHR* pSurfaceCapabilities)
+    VkSurfaceCapabilitiesKHR* pSurfaceCapabilities,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceSurfaceCapabilitiesKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkSurfaceKHR local_surface;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_surface = surface;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_780;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_780, 1);
-        countingStream->write((uint64_t*)&cgen_var_780, 1 * 8);
-        uint64_t cgen_var_781;
-        countingStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(&local_surface, &cgen_var_781, 1);
-        countingStream->write((uint64_t*)&cgen_var_781, 1 * 8);
-        marshal_VkSurfaceCapabilitiesKHR(countingStream, (VkSurfaceCapabilitiesKHR*)(pSurfaceCapabilities));
+        uint64_t cgen_var_699;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_700;
+        *countPtr += 1 * 8;
+        count_VkSurfaceCapabilitiesKHR(featureBits, (VkSurfaceCapabilitiesKHR*)(pSurfaceCapabilities), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceSurfaceCapabilitiesKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceSurfaceCapabilitiesKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceSurfaceCapabilitiesKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceSurfaceCapabilitiesKHR = OP_vkGetPhysicalDeviceSurfaceCapabilitiesKHR;
-    stream->write(&opcode_vkGetPhysicalDeviceSurfaceCapabilitiesKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceSurfaceCapabilitiesKHR, sizeof(uint32_t));
-    uint64_t cgen_var_782;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_782, 1);
-    stream->write((uint64_t*)&cgen_var_782, 1 * 8);
-    uint64_t cgen_var_783;
-    stream->handleMapping()->mapHandles_VkSurfaceKHR_u64(&local_surface, &cgen_var_783, 1);
-    stream->write((uint64_t*)&cgen_var_783, 1 * 8);
-    marshal_VkSurfaceCapabilitiesKHR(stream, (VkSurfaceCapabilitiesKHR*)(pSurfaceCapabilities));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceSurfaceCapabilitiesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceSurfaceCapabilitiesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_701;
+    *&cgen_var_701 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_701, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_702;
+    *&cgen_var_702 = get_host_u64_VkSurfaceKHR((*&local_surface));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_702, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkSurfaceCapabilitiesKHR(stream, (VkSurfaceCapabilitiesKHR*)(pSurfaceCapabilities), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkSurfaceCapabilitiesKHR(stream, (VkSurfaceCapabilitiesKHR*)(pSurfaceCapabilities));
     if (pSurfaceCapabilities)
     {
@@ -11618,9 +13742,13 @@
     }
     VkResult vkGetPhysicalDeviceSurfaceCapabilitiesKHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetPhysicalDeviceSurfaceCapabilitiesKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceSurfaceCapabilitiesKHR");;
     return vkGetPhysicalDeviceSurfaceCapabilitiesKHR_VkResult_return;
 }
@@ -11629,73 +13757,83 @@
     VkPhysicalDevice physicalDevice,
     VkSurfaceKHR surface,
     uint32_t* pSurfaceFormatCount,
-    VkSurfaceFormatKHR* pSurfaceFormats)
+    VkSurfaceFormatKHR* pSurfaceFormats,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceSurfaceFormatsKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkSurfaceKHR local_surface;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_surface = surface;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_784;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_784, 1);
-        countingStream->write((uint64_t*)&cgen_var_784, 1 * 8);
-        uint64_t cgen_var_785;
-        countingStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(&local_surface, &cgen_var_785, 1);
-        countingStream->write((uint64_t*)&cgen_var_785, 1 * 8);
+        uint64_t cgen_var_703;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_704;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_786 = (uint64_t)(uintptr_t)pSurfaceFormatCount;
-        countingStream->putBe64(cgen_var_786);
+        *countPtr += 8;
         if (pSurfaceFormatCount)
         {
-            countingStream->write((uint32_t*)pSurfaceFormatCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_787 = (uint64_t)(uintptr_t)pSurfaceFormats;
-        countingStream->putBe64(cgen_var_787);
+        *countPtr += 8;
         if (pSurfaceFormats)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i)
             {
-                marshal_VkSurfaceFormatKHR(countingStream, (VkSurfaceFormatKHR*)(pSurfaceFormats + i));
+                count_VkSurfaceFormatKHR(featureBits, (VkSurfaceFormatKHR*)(pSurfaceFormats + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceSurfaceFormatsKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceSurfaceFormatsKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceSurfaceFormatsKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceSurfaceFormatsKHR = OP_vkGetPhysicalDeviceSurfaceFormatsKHR;
-    stream->write(&opcode_vkGetPhysicalDeviceSurfaceFormatsKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceSurfaceFormatsKHR, sizeof(uint32_t));
-    uint64_t cgen_var_788;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_788, 1);
-    stream->write((uint64_t*)&cgen_var_788, 1 * 8);
-    uint64_t cgen_var_789;
-    stream->handleMapping()->mapHandles_VkSurfaceKHR_u64(&local_surface, &cgen_var_789, 1);
-    stream->write((uint64_t*)&cgen_var_789, 1 * 8);
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceSurfaceFormatsKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceSurfaceFormatsKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_705;
+    *&cgen_var_705 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_705, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_706;
+    *&cgen_var_706 = get_host_u64_VkSurfaceKHR((*&local_surface));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_706, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_790 = (uint64_t)(uintptr_t)pSurfaceFormatCount;
-    stream->putBe64(cgen_var_790);
+    uint64_t cgen_var_707 = (uint64_t)(uintptr_t)pSurfaceFormatCount;
+    memcpy((*streamPtrPtr), &cgen_var_707, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pSurfaceFormatCount)
     {
-        stream->write((uint32_t*)pSurfaceFormatCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pSurfaceFormatCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_791 = (uint64_t)(uintptr_t)pSurfaceFormats;
-    stream->putBe64(cgen_var_791);
+    uint64_t cgen_var_708 = (uint64_t)(uintptr_t)pSurfaceFormats;
+    memcpy((*streamPtrPtr), &cgen_var_708, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pSurfaceFormats)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i)
         {
-            marshal_VkSurfaceFormatKHR(stream, (VkSurfaceFormatKHR*)(pSurfaceFormats + i));
+            reservedmarshal_VkSurfaceFormatKHR(stream, (VkSurfaceFormatKHR*)(pSurfaceFormats + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pSurfaceFormatCount;
     check_pSurfaceFormatCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -11730,9 +13868,13 @@
     }
     VkResult vkGetPhysicalDeviceSurfaceFormatsKHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetPhysicalDeviceSurfaceFormatsKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceSurfaceFormatsKHR");;
     return vkGetPhysicalDeviceSurfaceFormatsKHR_VkResult_return;
 }
@@ -11741,67 +13883,78 @@
     VkPhysicalDevice physicalDevice,
     VkSurfaceKHR surface,
     uint32_t* pPresentModeCount,
-    VkPresentModeKHR* pPresentModes)
+    VkPresentModeKHR* pPresentModes,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceSurfacePresentModesKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkSurfaceKHR local_surface;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_surface = surface;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_794;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_794, 1);
-        countingStream->write((uint64_t*)&cgen_var_794, 1 * 8);
-        uint64_t cgen_var_795;
-        countingStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(&local_surface, &cgen_var_795, 1);
-        countingStream->write((uint64_t*)&cgen_var_795, 1 * 8);
+        uint64_t cgen_var_711;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_712;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_796 = (uint64_t)(uintptr_t)pPresentModeCount;
-        countingStream->putBe64(cgen_var_796);
+        *countPtr += 8;
         if (pPresentModeCount)
         {
-            countingStream->write((uint32_t*)pPresentModeCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_797 = (uint64_t)(uintptr_t)pPresentModes;
-        countingStream->putBe64(cgen_var_797);
+        *countPtr += 8;
         if (pPresentModes)
         {
-            countingStream->write((VkPresentModeKHR*)pPresentModes, (*(pPresentModeCount)) * sizeof(VkPresentModeKHR));
+            *countPtr += (*(pPresentModeCount)) * sizeof(VkPresentModeKHR);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceSurfacePresentModesKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceSurfacePresentModesKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceSurfacePresentModesKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceSurfacePresentModesKHR = OP_vkGetPhysicalDeviceSurfacePresentModesKHR;
-    stream->write(&opcode_vkGetPhysicalDeviceSurfacePresentModesKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceSurfacePresentModesKHR, sizeof(uint32_t));
-    uint64_t cgen_var_798;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_798, 1);
-    stream->write((uint64_t*)&cgen_var_798, 1 * 8);
-    uint64_t cgen_var_799;
-    stream->handleMapping()->mapHandles_VkSurfaceKHR_u64(&local_surface, &cgen_var_799, 1);
-    stream->write((uint64_t*)&cgen_var_799, 1 * 8);
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceSurfacePresentModesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceSurfacePresentModesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_713;
+    *&cgen_var_713 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_713, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_714;
+    *&cgen_var_714 = get_host_u64_VkSurfaceKHR((*&local_surface));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_714, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_800 = (uint64_t)(uintptr_t)pPresentModeCount;
-    stream->putBe64(cgen_var_800);
+    uint64_t cgen_var_715 = (uint64_t)(uintptr_t)pPresentModeCount;
+    memcpy((*streamPtrPtr), &cgen_var_715, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pPresentModeCount)
     {
-        stream->write((uint32_t*)pPresentModeCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pPresentModeCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_801 = (uint64_t)(uintptr_t)pPresentModes;
-    stream->putBe64(cgen_var_801);
+    uint64_t cgen_var_716 = (uint64_t)(uintptr_t)pPresentModes;
+    memcpy((*streamPtrPtr), &cgen_var_716, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pPresentModes)
     {
-        stream->write((VkPresentModeKHR*)pPresentModes, (*(pPresentModeCount)) * sizeof(VkPresentModeKHR));
+        memcpy(*streamPtrPtr, (VkPresentModeKHR*)pPresentModes, (*(pPresentModeCount)) * sizeof(VkPresentModeKHR));
+        *streamPtrPtr += (*(pPresentModeCount)) * sizeof(VkPresentModeKHR);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pPresentModeCount;
     check_pPresentModeCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -11826,9 +13979,13 @@
     }
     VkResult vkGetPhysicalDeviceSurfacePresentModesKHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetPhysicalDeviceSurfacePresentModesKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceSurfacePresentModesKHR");;
     return vkGetPhysicalDeviceSurfacePresentModesKHR_VkResult_return;
 }
@@ -11839,18 +13996,18 @@
     VkDevice device,
     const VkSwapchainCreateInfoKHR* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkSwapchainKHR* pSwapchain)
+    VkSwapchainKHR* pSwapchain,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateSwapchainKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkSwapchainCreateInfoKHR* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -11864,6 +14021,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -11873,54 +14031,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_804;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_804, 1);
-        countingStream->write((uint64_t*)&cgen_var_804, 1 * 8);
-        marshal_VkSwapchainCreateInfoKHR(countingStream, (VkSwapchainCreateInfoKHR*)(local_pCreateInfo));
+        uint64_t cgen_var_719;
+        *countPtr += 1 * 8;
+        count_VkSwapchainCreateInfoKHR(featureBits, (VkSwapchainCreateInfoKHR*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_805 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_805);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_806;
-        countingStream->handleMapping()->mapHandles_VkSwapchainKHR_u64(pSwapchain, &cgen_var_806, 1);
-        countingStream->write((uint64_t*)&cgen_var_806, 8);
+        uint64_t cgen_var_720;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateSwapchainKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateSwapchainKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateSwapchainKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateSwapchainKHR = OP_vkCreateSwapchainKHR;
-    stream->write(&opcode_vkCreateSwapchainKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateSwapchainKHR, sizeof(uint32_t));
-    uint64_t cgen_var_807;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_807, 1);
-    stream->write((uint64_t*)&cgen_var_807, 1 * 8);
-    marshal_VkSwapchainCreateInfoKHR(stream, (VkSwapchainCreateInfoKHR*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateSwapchainKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateSwapchainKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_721;
+    *&cgen_var_721 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_721, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkSwapchainCreateInfoKHR(stream, (VkSwapchainCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_808 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_808);
+    uint64_t cgen_var_722 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_722, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_809;
-    stream->handleMapping()->mapHandles_VkSwapchainKHR_u64(pSwapchain, &cgen_var_809, 1);
-    stream->write((uint64_t*)&cgen_var_809, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_723;
+    *&cgen_var_723 = (uint64_t)((*pSwapchain));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_723, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_810;
-    stream->read((uint64_t*)&cgen_var_810, 8);
-    stream->handleMapping()->mapHandles_u64_VkSwapchainKHR(&cgen_var_810, (VkSwapchainKHR*)pSwapchain, 1);
+    uint64_t cgen_var_724;
+    stream->read((uint64_t*)&cgen_var_724, 8);
+    stream->handleMapping()->mapHandles_u64_VkSwapchainKHR(&cgen_var_724, (VkSwapchainKHR*)pSwapchain, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateSwapchainKHR_VkResult_return = (VkResult)0;
     stream->read(&vkCreateSwapchainKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateSwapchainKHR");;
     return vkCreateSwapchainKHR_VkResult_return;
 }
@@ -11928,18 +14097,18 @@
 void VkEncoder::vkDestroySwapchainKHR(
     VkDevice device,
     VkSwapchainKHR swapchain,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroySwapchainKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkSwapchainKHR local_swapchain;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_swapchain = swapchain;
     local_pAllocator = nullptr;
@@ -11948,49 +14117,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_811;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_811, 1);
-        countingStream->write((uint64_t*)&cgen_var_811, 1 * 8);
-        uint64_t cgen_var_812;
-        countingStream->handleMapping()->mapHandles_VkSwapchainKHR_u64(&local_swapchain, &cgen_var_812, 1);
-        countingStream->write((uint64_t*)&cgen_var_812, 1 * 8);
+        uint64_t cgen_var_725;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_726;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_813 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_813);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroySwapchainKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroySwapchainKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroySwapchainKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroySwapchainKHR = OP_vkDestroySwapchainKHR;
-    stream->write(&opcode_vkDestroySwapchainKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroySwapchainKHR, sizeof(uint32_t));
-    uint64_t cgen_var_814;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_814, 1);
-    stream->write((uint64_t*)&cgen_var_814, 1 * 8);
-    uint64_t cgen_var_815;
-    stream->handleMapping()->mapHandles_VkSwapchainKHR_u64(&local_swapchain, &cgen_var_815, 1);
-    stream->write((uint64_t*)&cgen_var_815, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroySwapchainKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroySwapchainKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_727;
+    *&cgen_var_727 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_727, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_728;
+    *&cgen_var_728 = get_host_u64_VkSwapchainKHR((*&local_swapchain));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_728, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_816 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_816);
+    uint64_t cgen_var_729 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_729, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkSwapchainKHR((VkSwapchainKHR*)&swapchain);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroySwapchainKHR");;
 }
 
@@ -11998,81 +14179,92 @@
     VkDevice device,
     VkSwapchainKHR swapchain,
     uint32_t* pSwapchainImageCount,
-    VkImage* pSwapchainImages)
+    VkImage* pSwapchainImages,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetSwapchainImagesKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkSwapchainKHR local_swapchain;
+    uint32_t local_doLock;
     local_device = device;
     local_swapchain = swapchain;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_817;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_817, 1);
-        countingStream->write((uint64_t*)&cgen_var_817, 1 * 8);
-        uint64_t cgen_var_818;
-        countingStream->handleMapping()->mapHandles_VkSwapchainKHR_u64(&local_swapchain, &cgen_var_818, 1);
-        countingStream->write((uint64_t*)&cgen_var_818, 1 * 8);
+        uint64_t cgen_var_730;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_731;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_819 = (uint64_t)(uintptr_t)pSwapchainImageCount;
-        countingStream->putBe64(cgen_var_819);
+        *countPtr += 8;
         if (pSwapchainImageCount)
         {
-            countingStream->write((uint32_t*)pSwapchainImageCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_820 = (uint64_t)(uintptr_t)pSwapchainImages;
-        countingStream->putBe64(cgen_var_820);
+        *countPtr += 8;
         if (pSwapchainImages)
         {
             if ((*(pSwapchainImageCount)))
             {
-                uint64_t* cgen_var_821;
-                countingStream->alloc((void**)&cgen_var_821, (*(pSwapchainImageCount)) * 8);
-                countingStream->handleMapping()->mapHandles_VkImage_u64(pSwapchainImages, cgen_var_821, (*(pSwapchainImageCount)));
-                countingStream->write((uint64_t*)cgen_var_821, (*(pSwapchainImageCount)) * 8);
+                *countPtr += (*(pSwapchainImageCount)) * 8;
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetSwapchainImagesKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetSwapchainImagesKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetSwapchainImagesKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetSwapchainImagesKHR = OP_vkGetSwapchainImagesKHR;
-    stream->write(&opcode_vkGetSwapchainImagesKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetSwapchainImagesKHR, sizeof(uint32_t));
-    uint64_t cgen_var_822;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_822, 1);
-    stream->write((uint64_t*)&cgen_var_822, 1 * 8);
-    uint64_t cgen_var_823;
-    stream->handleMapping()->mapHandles_VkSwapchainKHR_u64(&local_swapchain, &cgen_var_823, 1);
-    stream->write((uint64_t*)&cgen_var_823, 1 * 8);
+    memcpy(streamPtr, &opcode_vkGetSwapchainImagesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetSwapchainImagesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_733;
+    *&cgen_var_733 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_733, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_734;
+    *&cgen_var_734 = get_host_u64_VkSwapchainKHR((*&local_swapchain));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_734, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_824 = (uint64_t)(uintptr_t)pSwapchainImageCount;
-    stream->putBe64(cgen_var_824);
+    uint64_t cgen_var_735 = (uint64_t)(uintptr_t)pSwapchainImageCount;
+    memcpy((*streamPtrPtr), &cgen_var_735, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pSwapchainImageCount)
     {
-        stream->write((uint32_t*)pSwapchainImageCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pSwapchainImageCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
+    /* is handle, possibly out */;
     // WARNING PTR CHECK
-    uint64_t cgen_var_825 = (uint64_t)(uintptr_t)pSwapchainImages;
-    stream->putBe64(cgen_var_825);
+    uint64_t cgen_var_736 = (uint64_t)(uintptr_t)pSwapchainImages;
+    memcpy((*streamPtrPtr), &cgen_var_736, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pSwapchainImages)
     {
         if ((*(pSwapchainImageCount)))
         {
-            uint64_t* cgen_var_826;
-            stream->alloc((void**)&cgen_var_826, (*(pSwapchainImageCount)) * 8);
-            stream->handleMapping()->mapHandles_VkImage_u64(pSwapchainImages, cgen_var_826, (*(pSwapchainImageCount)));
-            stream->write((uint64_t*)cgen_var_826, (*(pSwapchainImageCount)) * 8);
+            uint64_t* cgen_var_737;
+            stream->alloc((void**)&cgen_var_737, (*(pSwapchainImageCount)) * 8);
+            for (uint32_t k = 0; k < (*(pSwapchainImageCount)); ++k)
+            {
+                cgen_var_737[k] = (uint64_t)(pSwapchainImages[k]);
+            }
+            memcpy(*streamPtrPtr, (uint64_t*)cgen_var_737, (*(pSwapchainImageCount)) * 8);
+            *streamPtrPtr += (*(pSwapchainImageCount)) * 8;
         }
     }
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pSwapchainImageCount;
     check_pSwapchainImageCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -12095,17 +14287,21 @@
         }
         if ((*(pSwapchainImageCount)))
         {
-            uint64_t* cgen_var_829;
-            stream->alloc((void**)&cgen_var_829, (*(pSwapchainImageCount)) * 8);
-            stream->read((uint64_t*)cgen_var_829, (*(pSwapchainImageCount)) * 8);
-            stream->handleMapping()->mapHandles_u64_VkImage(cgen_var_829, (VkImage*)pSwapchainImages, (*(pSwapchainImageCount)));
+            uint64_t* cgen_var_740;
+            stream->alloc((void**)&cgen_var_740, (*(pSwapchainImageCount)) * 8);
+            stream->read((uint64_t*)cgen_var_740, (*(pSwapchainImageCount)) * 8);
+            stream->handleMapping()->mapHandles_u64_VkImage(cgen_var_740, (VkImage*)pSwapchainImages, (*(pSwapchainImageCount)));
         }
     }
     VkResult vkGetSwapchainImagesKHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetSwapchainImagesKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetSwapchainImagesKHR");;
     return vkGetSwapchainImagesKHR_VkResult_return;
 }
@@ -12116,84 +14312,97 @@
     uint64_t timeout,
     VkSemaphore semaphore,
     VkFence fence,
-    uint32_t* pImageIndex)
+    uint32_t* pImageIndex,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkAcquireNextImageKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkSwapchainKHR local_swapchain;
     uint64_t local_timeout;
     VkSemaphore local_semaphore;
     VkFence local_fence;
+    uint32_t local_doLock;
     local_device = device;
     local_swapchain = swapchain;
     local_timeout = timeout;
     local_semaphore = semaphore;
     local_fence = fence;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_830;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_830, 1);
-        countingStream->write((uint64_t*)&cgen_var_830, 1 * 8);
-        uint64_t cgen_var_831;
-        countingStream->handleMapping()->mapHandles_VkSwapchainKHR_u64(&local_swapchain, &cgen_var_831, 1);
-        countingStream->write((uint64_t*)&cgen_var_831, 1 * 8);
-        countingStream->write((uint64_t*)&local_timeout, sizeof(uint64_t));
-        uint64_t cgen_var_832;
-        countingStream->handleMapping()->mapHandles_VkSemaphore_u64(&local_semaphore, &cgen_var_832, 1);
-        countingStream->write((uint64_t*)&cgen_var_832, 1 * 8);
-        uint64_t cgen_var_833;
-        countingStream->handleMapping()->mapHandles_VkFence_u64(&local_fence, &cgen_var_833, 1);
-        countingStream->write((uint64_t*)&cgen_var_833, 1 * 8);
-        countingStream->write((uint32_t*)pImageIndex, sizeof(uint32_t));
+        uint64_t cgen_var_741;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_742;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint64_t);
+        uint64_t cgen_var_743;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_744;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkAcquireNextImageKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkAcquireNextImageKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkAcquireNextImageKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkAcquireNextImageKHR = OP_vkAcquireNextImageKHR;
-    stream->write(&opcode_vkAcquireNextImageKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkAcquireNextImageKHR, sizeof(uint32_t));
-    uint64_t cgen_var_834;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_834, 1);
-    stream->write((uint64_t*)&cgen_var_834, 1 * 8);
-    uint64_t cgen_var_835;
-    stream->handleMapping()->mapHandles_VkSwapchainKHR_u64(&local_swapchain, &cgen_var_835, 1);
-    stream->write((uint64_t*)&cgen_var_835, 1 * 8);
-    stream->write((uint64_t*)&local_timeout, sizeof(uint64_t));
-    uint64_t cgen_var_836;
-    stream->handleMapping()->mapHandles_VkSemaphore_u64(&local_semaphore, &cgen_var_836, 1);
-    stream->write((uint64_t*)&cgen_var_836, 1 * 8);
-    uint64_t cgen_var_837;
-    stream->handleMapping()->mapHandles_VkFence_u64(&local_fence, &cgen_var_837, 1);
-    stream->write((uint64_t*)&cgen_var_837, 1 * 8);
-    stream->write((uint32_t*)pImageIndex, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkAcquireNextImageKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkAcquireNextImageKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_745;
+    *&cgen_var_745 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_745, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_746;
+    *&cgen_var_746 = get_host_u64_VkSwapchainKHR((*&local_swapchain));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_746, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint64_t*)&local_timeout, sizeof(uint64_t));
+    *streamPtrPtr += sizeof(uint64_t);
+    uint64_t cgen_var_747;
+    *&cgen_var_747 = get_host_u64_VkSemaphore((*&local_semaphore));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_747, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_748;
+    *&cgen_var_748 = get_host_u64_VkFence((*&local_fence));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_748, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)pImageIndex, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((uint32_t*)pImageIndex, sizeof(uint32_t));
     VkResult vkAcquireNextImageKHR_VkResult_return = (VkResult)0;
     stream->read(&vkAcquireNextImageKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkAcquireNextImageKHR");;
     return vkAcquireNextImageKHR_VkResult_return;
 }
 
 VkResult VkEncoder::vkQueuePresentKHR(
     VkQueue queue,
-    const VkPresentInfoKHR* pPresentInfo)
+    const VkPresentInfoKHR* pPresentInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkQueuePresentKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkQueue local_queue;
     VkPresentInfoKHR* local_pPresentInfo;
+    uint32_t local_doLock;
     local_queue = queue;
     local_pPresentInfo = nullptr;
     if (pPresentInfo)
@@ -12201,64 +14410,82 @@
         local_pPresentInfo = (VkPresentInfoKHR*)pool->alloc(sizeof(const VkPresentInfoKHR));
         deepcopy_VkPresentInfoKHR(pool, pPresentInfo, (VkPresentInfoKHR*)(local_pPresentInfo));
     }
+    local_doLock = doLock;
     if (local_pPresentInfo)
     {
         transform_tohost_VkPresentInfoKHR(mImpl->resources(), (VkPresentInfoKHR*)(local_pPresentInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_838;
-        countingStream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_838, 1);
-        countingStream->write((uint64_t*)&cgen_var_838, 1 * 8);
-        marshal_VkPresentInfoKHR(countingStream, (VkPresentInfoKHR*)(local_pPresentInfo));
+        uint64_t cgen_var_749;
+        *countPtr += 1 * 8;
+        count_VkPresentInfoKHR(featureBits, (VkPresentInfoKHR*)(local_pPresentInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkQueuePresentKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkQueuePresentKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkQueuePresentKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkQueuePresentKHR = OP_vkQueuePresentKHR;
-    stream->write(&opcode_vkQueuePresentKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkQueuePresentKHR, sizeof(uint32_t));
-    uint64_t cgen_var_839;
-    stream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_839, 1);
-    stream->write((uint64_t*)&cgen_var_839, 1 * 8);
-    marshal_VkPresentInfoKHR(stream, (VkPresentInfoKHR*)(local_pPresentInfo));
+    memcpy(streamPtr, &opcode_vkQueuePresentKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkQueuePresentKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_750;
+    *&cgen_var_750 = get_host_u64_VkQueue((*&local_queue));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_750, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPresentInfoKHR(stream, (VkPresentInfoKHR*)(local_pPresentInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkQueuePresentKHR_VkResult_return = (VkResult)0;
     stream->read(&vkQueuePresentKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkQueuePresentKHR");;
     return vkQueuePresentKHR_VkResult_return;
 }
 
 VkResult VkEncoder::vkGetDeviceGroupPresentCapabilitiesKHR(
     VkDevice device,
-    VkDeviceGroupPresentCapabilitiesKHR* pDeviceGroupPresentCapabilities)
+    VkDeviceGroupPresentCapabilitiesKHR* pDeviceGroupPresentCapabilities,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetDeviceGroupPresentCapabilitiesKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
+    uint32_t local_doLock;
     local_device = device;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_840;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_840, 1);
-        countingStream->write((uint64_t*)&cgen_var_840, 1 * 8);
-        marshal_VkDeviceGroupPresentCapabilitiesKHR(countingStream, (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities));
+        uint64_t cgen_var_751;
+        *countPtr += 1 * 8;
+        count_VkDeviceGroupPresentCapabilitiesKHR(featureBits, (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetDeviceGroupPresentCapabilitiesKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetDeviceGroupPresentCapabilitiesKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceGroupPresentCapabilitiesKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetDeviceGroupPresentCapabilitiesKHR = OP_vkGetDeviceGroupPresentCapabilitiesKHR;
-    stream->write(&opcode_vkGetDeviceGroupPresentCapabilitiesKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetDeviceGroupPresentCapabilitiesKHR, sizeof(uint32_t));
-    uint64_t cgen_var_841;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_841, 1);
-    stream->write((uint64_t*)&cgen_var_841, 1 * 8);
-    marshal_VkDeviceGroupPresentCapabilitiesKHR(stream, (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities));
+    memcpy(streamPtr, &opcode_vkGetDeviceGroupPresentCapabilitiesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetDeviceGroupPresentCapabilitiesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_752;
+    *&cgen_var_752 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_752, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDeviceGroupPresentCapabilitiesKHR(stream, (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkDeviceGroupPresentCapabilitiesKHR(stream, (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities));
     if (pDeviceGroupPresentCapabilities)
     {
@@ -12266,9 +14493,13 @@
     }
     VkResult vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetDeviceGroupPresentCapabilitiesKHR");;
     return vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return;
 }
@@ -12276,53 +14507,62 @@
 VkResult VkEncoder::vkGetDeviceGroupSurfacePresentModesKHR(
     VkDevice device,
     VkSurfaceKHR surface,
-    VkDeviceGroupPresentModeFlagsKHR* pModes)
+    VkDeviceGroupPresentModeFlagsKHR* pModes,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetDeviceGroupSurfacePresentModesKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkSurfaceKHR local_surface;
+    uint32_t local_doLock;
     local_device = device;
     local_surface = surface;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_842;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_842, 1);
-        countingStream->write((uint64_t*)&cgen_var_842, 1 * 8);
-        uint64_t cgen_var_843;
-        countingStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(&local_surface, &cgen_var_843, 1);
-        countingStream->write((uint64_t*)&cgen_var_843, 1 * 8);
+        uint64_t cgen_var_753;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_754;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_844 = (uint64_t)(uintptr_t)pModes;
-        countingStream->putBe64(cgen_var_844);
+        *countPtr += 8;
         if (pModes)
         {
-            countingStream->write((VkDeviceGroupPresentModeFlagsKHR*)pModes, sizeof(VkDeviceGroupPresentModeFlagsKHR));
+            *countPtr += sizeof(VkDeviceGroupPresentModeFlagsKHR);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetDeviceGroupSurfacePresentModesKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetDeviceGroupSurfacePresentModesKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceGroupSurfacePresentModesKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetDeviceGroupSurfacePresentModesKHR = OP_vkGetDeviceGroupSurfacePresentModesKHR;
-    stream->write(&opcode_vkGetDeviceGroupSurfacePresentModesKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetDeviceGroupSurfacePresentModesKHR, sizeof(uint32_t));
-    uint64_t cgen_var_845;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_845, 1);
-    stream->write((uint64_t*)&cgen_var_845, 1 * 8);
-    uint64_t cgen_var_846;
-    stream->handleMapping()->mapHandles_VkSurfaceKHR_u64(&local_surface, &cgen_var_846, 1);
-    stream->write((uint64_t*)&cgen_var_846, 1 * 8);
+    memcpy(streamPtr, &opcode_vkGetDeviceGroupSurfacePresentModesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetDeviceGroupSurfacePresentModesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_755;
+    *&cgen_var_755 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_755, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_756;
+    *&cgen_var_756 = get_host_u64_VkSurfaceKHR((*&local_surface));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_756, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_847 = (uint64_t)(uintptr_t)pModes;
-    stream->putBe64(cgen_var_847);
+    uint64_t cgen_var_757 = (uint64_t)(uintptr_t)pModes;
+    memcpy((*streamPtrPtr), &cgen_var_757, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pModes)
     {
-        stream->write((VkDeviceGroupPresentModeFlagsKHR*)pModes, sizeof(VkDeviceGroupPresentModeFlagsKHR));
+        memcpy(*streamPtrPtr, (VkDeviceGroupPresentModeFlagsKHR*)pModes, sizeof(VkDeviceGroupPresentModeFlagsKHR));
+        *streamPtrPtr += sizeof(VkDeviceGroupPresentModeFlagsKHR);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     VkDeviceGroupPresentModeFlagsKHR* check_pModes;
     check_pModes = (VkDeviceGroupPresentModeFlagsKHR*)(uintptr_t)stream->getBe64();
@@ -12336,9 +14576,13 @@
     }
     VkResult vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetDeviceGroupSurfacePresentModesKHR");;
     return vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return;
 }
@@ -12347,73 +14591,83 @@
     VkPhysicalDevice physicalDevice,
     VkSurfaceKHR surface,
     uint32_t* pRectCount,
-    VkRect2D* pRects)
+    VkRect2D* pRects,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDevicePresentRectanglesKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkSurfaceKHR local_surface;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_surface = surface;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_849;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_849, 1);
-        countingStream->write((uint64_t*)&cgen_var_849, 1 * 8);
-        uint64_t cgen_var_850;
-        countingStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(&local_surface, &cgen_var_850, 1);
-        countingStream->write((uint64_t*)&cgen_var_850, 1 * 8);
+        uint64_t cgen_var_759;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_760;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_851 = (uint64_t)(uintptr_t)pRectCount;
-        countingStream->putBe64(cgen_var_851);
+        *countPtr += 8;
         if (pRectCount)
         {
-            countingStream->write((uint32_t*)pRectCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_852 = (uint64_t)(uintptr_t)pRects;
-        countingStream->putBe64(cgen_var_852);
+        *countPtr += 8;
         if (pRects)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pRectCount)); ++i)
             {
-                marshal_VkRect2D(countingStream, (VkRect2D*)(pRects + i));
+                count_VkRect2D(featureBits, (VkRect2D*)(pRects + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDevicePresentRectanglesKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDevicePresentRectanglesKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDevicePresentRectanglesKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDevicePresentRectanglesKHR = OP_vkGetPhysicalDevicePresentRectanglesKHR;
-    stream->write(&opcode_vkGetPhysicalDevicePresentRectanglesKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDevicePresentRectanglesKHR, sizeof(uint32_t));
-    uint64_t cgen_var_853;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_853, 1);
-    stream->write((uint64_t*)&cgen_var_853, 1 * 8);
-    uint64_t cgen_var_854;
-    stream->handleMapping()->mapHandles_VkSurfaceKHR_u64(&local_surface, &cgen_var_854, 1);
-    stream->write((uint64_t*)&cgen_var_854, 1 * 8);
+    memcpy(streamPtr, &opcode_vkGetPhysicalDevicePresentRectanglesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDevicePresentRectanglesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_761;
+    *&cgen_var_761 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_761, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_762;
+    *&cgen_var_762 = get_host_u64_VkSurfaceKHR((*&local_surface));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_762, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_855 = (uint64_t)(uintptr_t)pRectCount;
-    stream->putBe64(cgen_var_855);
+    uint64_t cgen_var_763 = (uint64_t)(uintptr_t)pRectCount;
+    memcpy((*streamPtrPtr), &cgen_var_763, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pRectCount)
     {
-        stream->write((uint32_t*)pRectCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pRectCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_856 = (uint64_t)(uintptr_t)pRects;
-    stream->putBe64(cgen_var_856);
+    uint64_t cgen_var_764 = (uint64_t)(uintptr_t)pRects;
+    memcpy((*streamPtrPtr), &cgen_var_764, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pRects)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pRectCount)); ++i)
         {
-            marshal_VkRect2D(stream, (VkRect2D*)(pRects + i));
+            reservedmarshal_VkRect2D(stream, (VkRect2D*)(pRects + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pRectCount;
     check_pRectCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -12448,9 +14702,13 @@
     }
     VkResult vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDevicePresentRectanglesKHR");;
     return vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return;
 }
@@ -12458,17 +14716,17 @@
 VkResult VkEncoder::vkAcquireNextImage2KHR(
     VkDevice device,
     const VkAcquireNextImageInfoKHR* pAcquireInfo,
-    uint32_t* pImageIndex)
+    uint32_t* pImageIndex,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkAcquireNextImage2KHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkAcquireNextImageInfoKHR* local_pAcquireInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pAcquireInfo = nullptr;
     if (pAcquireInfo)
@@ -12476,34 +14734,46 @@
         local_pAcquireInfo = (VkAcquireNextImageInfoKHR*)pool->alloc(sizeof(const VkAcquireNextImageInfoKHR));
         deepcopy_VkAcquireNextImageInfoKHR(pool, pAcquireInfo, (VkAcquireNextImageInfoKHR*)(local_pAcquireInfo));
     }
+    local_doLock = doLock;
     if (local_pAcquireInfo)
     {
         transform_tohost_VkAcquireNextImageInfoKHR(mImpl->resources(), (VkAcquireNextImageInfoKHR*)(local_pAcquireInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_859;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_859, 1);
-        countingStream->write((uint64_t*)&cgen_var_859, 1 * 8);
-        marshal_VkAcquireNextImageInfoKHR(countingStream, (VkAcquireNextImageInfoKHR*)(local_pAcquireInfo));
-        countingStream->write((uint32_t*)pImageIndex, sizeof(uint32_t));
+        uint64_t cgen_var_767;
+        *countPtr += 1 * 8;
+        count_VkAcquireNextImageInfoKHR(featureBits, (VkAcquireNextImageInfoKHR*)(local_pAcquireInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkAcquireNextImage2KHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkAcquireNextImage2KHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkAcquireNextImage2KHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkAcquireNextImage2KHR = OP_vkAcquireNextImage2KHR;
-    stream->write(&opcode_vkAcquireNextImage2KHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkAcquireNextImage2KHR, sizeof(uint32_t));
-    uint64_t cgen_var_860;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_860, 1);
-    stream->write((uint64_t*)&cgen_var_860, 1 * 8);
-    marshal_VkAcquireNextImageInfoKHR(stream, (VkAcquireNextImageInfoKHR*)(local_pAcquireInfo));
-    stream->write((uint32_t*)pImageIndex, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkAcquireNextImage2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkAcquireNextImage2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_768;
+    *&cgen_var_768 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_768, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkAcquireNextImageInfoKHR(stream, (VkAcquireNextImageInfoKHR*)(local_pAcquireInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)pImageIndex, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((uint32_t*)pImageIndex, sizeof(uint32_t));
     VkResult vkAcquireNextImage2KHR_VkResult_return = (VkResult)0;
     stream->read(&vkAcquireNextImage2KHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkAcquireNextImage2KHR");;
     return vkAcquireNextImage2KHR_VkResult_return;
 }
@@ -12513,65 +14783,75 @@
 VkResult VkEncoder::vkGetPhysicalDeviceDisplayPropertiesKHR(
     VkPhysicalDevice physicalDevice,
     uint32_t* pPropertyCount,
-    VkDisplayPropertiesKHR* pProperties)
+    VkDisplayPropertiesKHR* pProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceDisplayPropertiesKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_861;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_861, 1);
-        countingStream->write((uint64_t*)&cgen_var_861, 1 * 8);
+        uint64_t cgen_var_769;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_862 = (uint64_t)(uintptr_t)pPropertyCount;
-        countingStream->putBe64(cgen_var_862);
+        *countPtr += 8;
         if (pPropertyCount)
         {
-            countingStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_863 = (uint64_t)(uintptr_t)pProperties;
-        countingStream->putBe64(cgen_var_863);
+        *countPtr += 8;
         if (pProperties)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                marshal_VkDisplayPropertiesKHR(countingStream, (VkDisplayPropertiesKHR*)(pProperties + i));
+                count_VkDisplayPropertiesKHR(featureBits, (VkDisplayPropertiesKHR*)(pProperties + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceDisplayPropertiesKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceDisplayPropertiesKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceDisplayPropertiesKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceDisplayPropertiesKHR = OP_vkGetPhysicalDeviceDisplayPropertiesKHR;
-    stream->write(&opcode_vkGetPhysicalDeviceDisplayPropertiesKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceDisplayPropertiesKHR, sizeof(uint32_t));
-    uint64_t cgen_var_864;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_864, 1);
-    stream->write((uint64_t*)&cgen_var_864, 1 * 8);
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceDisplayPropertiesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceDisplayPropertiesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_770;
+    *&cgen_var_770 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_770, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_865 = (uint64_t)(uintptr_t)pPropertyCount;
-    stream->putBe64(cgen_var_865);
+    uint64_t cgen_var_771 = (uint64_t)(uintptr_t)pPropertyCount;
+    memcpy((*streamPtrPtr), &cgen_var_771, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pPropertyCount)
     {
-        stream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pPropertyCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_866 = (uint64_t)(uintptr_t)pProperties;
-    stream->putBe64(cgen_var_866);
+    uint64_t cgen_var_772 = (uint64_t)(uintptr_t)pProperties;
+    memcpy((*streamPtrPtr), &cgen_var_772, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pProperties)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            marshal_VkDisplayPropertiesKHR(stream, (VkDisplayPropertiesKHR*)(pProperties + i));
+            reservedmarshal_VkDisplayPropertiesKHR(stream, (VkDisplayPropertiesKHR*)(pProperties + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pPropertyCount;
     check_pPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -12606,9 +14886,13 @@
     }
     VkResult vkGetPhysicalDeviceDisplayPropertiesKHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetPhysicalDeviceDisplayPropertiesKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceDisplayPropertiesKHR");;
     return vkGetPhysicalDeviceDisplayPropertiesKHR_VkResult_return;
 }
@@ -12616,65 +14900,75 @@
 VkResult VkEncoder::vkGetPhysicalDeviceDisplayPlanePropertiesKHR(
     VkPhysicalDevice physicalDevice,
     uint32_t* pPropertyCount,
-    VkDisplayPlanePropertiesKHR* pProperties)
+    VkDisplayPlanePropertiesKHR* pProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceDisplayPlanePropertiesKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_869;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_869, 1);
-        countingStream->write((uint64_t*)&cgen_var_869, 1 * 8);
+        uint64_t cgen_var_775;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_870 = (uint64_t)(uintptr_t)pPropertyCount;
-        countingStream->putBe64(cgen_var_870);
+        *countPtr += 8;
         if (pPropertyCount)
         {
-            countingStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_871 = (uint64_t)(uintptr_t)pProperties;
-        countingStream->putBe64(cgen_var_871);
+        *countPtr += 8;
         if (pProperties)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                marshal_VkDisplayPlanePropertiesKHR(countingStream, (VkDisplayPlanePropertiesKHR*)(pProperties + i));
+                count_VkDisplayPlanePropertiesKHR(featureBits, (VkDisplayPlanePropertiesKHR*)(pProperties + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceDisplayPlanePropertiesKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceDisplayPlanePropertiesKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceDisplayPlanePropertiesKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceDisplayPlanePropertiesKHR = OP_vkGetPhysicalDeviceDisplayPlanePropertiesKHR;
-    stream->write(&opcode_vkGetPhysicalDeviceDisplayPlanePropertiesKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceDisplayPlanePropertiesKHR, sizeof(uint32_t));
-    uint64_t cgen_var_872;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_872, 1);
-    stream->write((uint64_t*)&cgen_var_872, 1 * 8);
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceDisplayPlanePropertiesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceDisplayPlanePropertiesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_776;
+    *&cgen_var_776 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_776, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_873 = (uint64_t)(uintptr_t)pPropertyCount;
-    stream->putBe64(cgen_var_873);
+    uint64_t cgen_var_777 = (uint64_t)(uintptr_t)pPropertyCount;
+    memcpy((*streamPtrPtr), &cgen_var_777, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pPropertyCount)
     {
-        stream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pPropertyCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_874 = (uint64_t)(uintptr_t)pProperties;
-    stream->putBe64(cgen_var_874);
+    uint64_t cgen_var_778 = (uint64_t)(uintptr_t)pProperties;
+    memcpy((*streamPtrPtr), &cgen_var_778, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pProperties)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            marshal_VkDisplayPlanePropertiesKHR(stream, (VkDisplayPlanePropertiesKHR*)(pProperties + i));
+            reservedmarshal_VkDisplayPlanePropertiesKHR(stream, (VkDisplayPlanePropertiesKHR*)(pProperties + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pPropertyCount;
     check_pPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -12709,9 +15003,13 @@
     }
     VkResult vkGetPhysicalDeviceDisplayPlanePropertiesKHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetPhysicalDeviceDisplayPlanePropertiesKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceDisplayPlanePropertiesKHR");;
     return vkGetPhysicalDeviceDisplayPlanePropertiesKHR_VkResult_return;
 }
@@ -12720,77 +15018,89 @@
     VkPhysicalDevice physicalDevice,
     uint32_t planeIndex,
     uint32_t* pDisplayCount,
-    VkDisplayKHR* pDisplays)
+    VkDisplayKHR* pDisplays,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetDisplayPlaneSupportedDisplaysKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     uint32_t local_planeIndex;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_planeIndex = planeIndex;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_877;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_877, 1);
-        countingStream->write((uint64_t*)&cgen_var_877, 1 * 8);
-        countingStream->write((uint32_t*)&local_planeIndex, sizeof(uint32_t));
+        uint64_t cgen_var_781;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         // WARNING PTR CHECK
-        uint64_t cgen_var_878 = (uint64_t)(uintptr_t)pDisplayCount;
-        countingStream->putBe64(cgen_var_878);
+        *countPtr += 8;
         if (pDisplayCount)
         {
-            countingStream->write((uint32_t*)pDisplayCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_879 = (uint64_t)(uintptr_t)pDisplays;
-        countingStream->putBe64(cgen_var_879);
+        *countPtr += 8;
         if (pDisplays)
         {
             if ((*(pDisplayCount)))
             {
-                uint64_t* cgen_var_880;
-                countingStream->alloc((void**)&cgen_var_880, (*(pDisplayCount)) * 8);
-                countingStream->handleMapping()->mapHandles_VkDisplayKHR_u64(pDisplays, cgen_var_880, (*(pDisplayCount)));
-                countingStream->write((uint64_t*)cgen_var_880, (*(pDisplayCount)) * 8);
+                *countPtr += (*(pDisplayCount)) * 8;
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetDisplayPlaneSupportedDisplaysKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetDisplayPlaneSupportedDisplaysKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetDisplayPlaneSupportedDisplaysKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetDisplayPlaneSupportedDisplaysKHR = OP_vkGetDisplayPlaneSupportedDisplaysKHR;
-    stream->write(&opcode_vkGetDisplayPlaneSupportedDisplaysKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetDisplayPlaneSupportedDisplaysKHR, sizeof(uint32_t));
-    uint64_t cgen_var_881;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_881, 1);
-    stream->write((uint64_t*)&cgen_var_881, 1 * 8);
-    stream->write((uint32_t*)&local_planeIndex, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkGetDisplayPlaneSupportedDisplaysKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetDisplayPlaneSupportedDisplaysKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_783;
+    *&cgen_var_783 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_783, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_planeIndex, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
-    uint64_t cgen_var_882 = (uint64_t)(uintptr_t)pDisplayCount;
-    stream->putBe64(cgen_var_882);
+    uint64_t cgen_var_784 = (uint64_t)(uintptr_t)pDisplayCount;
+    memcpy((*streamPtrPtr), &cgen_var_784, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pDisplayCount)
     {
-        stream->write((uint32_t*)pDisplayCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pDisplayCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
+    /* is handle, possibly out */;
     // WARNING PTR CHECK
-    uint64_t cgen_var_883 = (uint64_t)(uintptr_t)pDisplays;
-    stream->putBe64(cgen_var_883);
+    uint64_t cgen_var_785 = (uint64_t)(uintptr_t)pDisplays;
+    memcpy((*streamPtrPtr), &cgen_var_785, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pDisplays)
     {
         if ((*(pDisplayCount)))
         {
-            uint64_t* cgen_var_884;
-            stream->alloc((void**)&cgen_var_884, (*(pDisplayCount)) * 8);
-            stream->handleMapping()->mapHandles_VkDisplayKHR_u64(pDisplays, cgen_var_884, (*(pDisplayCount)));
-            stream->write((uint64_t*)cgen_var_884, (*(pDisplayCount)) * 8);
+            uint64_t* cgen_var_786;
+            stream->alloc((void**)&cgen_var_786, (*(pDisplayCount)) * 8);
+            for (uint32_t k = 0; k < (*(pDisplayCount)); ++k)
+            {
+                cgen_var_786[k] = (uint64_t)(pDisplays[k]);
+            }
+            memcpy(*streamPtrPtr, (uint64_t*)cgen_var_786, (*(pDisplayCount)) * 8);
+            *streamPtrPtr += (*(pDisplayCount)) * 8;
         }
     }
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pDisplayCount;
     check_pDisplayCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -12813,17 +15123,21 @@
         }
         if ((*(pDisplayCount)))
         {
-            uint64_t* cgen_var_887;
-            stream->alloc((void**)&cgen_var_887, (*(pDisplayCount)) * 8);
-            stream->read((uint64_t*)cgen_var_887, (*(pDisplayCount)) * 8);
-            stream->handleMapping()->mapHandles_u64_VkDisplayKHR(cgen_var_887, (VkDisplayKHR*)pDisplays, (*(pDisplayCount)));
+            uint64_t* cgen_var_789;
+            stream->alloc((void**)&cgen_var_789, (*(pDisplayCount)) * 8);
+            stream->read((uint64_t*)cgen_var_789, (*(pDisplayCount)) * 8);
+            stream->handleMapping()->mapHandles_u64_VkDisplayKHR(cgen_var_789, (VkDisplayKHR*)pDisplays, (*(pDisplayCount)));
         }
     }
     VkResult vkGetDisplayPlaneSupportedDisplaysKHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetDisplayPlaneSupportedDisplaysKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetDisplayPlaneSupportedDisplaysKHR");;
     return vkGetDisplayPlaneSupportedDisplaysKHR_VkResult_return;
 }
@@ -12832,73 +15146,83 @@
     VkPhysicalDevice physicalDevice,
     VkDisplayKHR display,
     uint32_t* pPropertyCount,
-    VkDisplayModePropertiesKHR* pProperties)
+    VkDisplayModePropertiesKHR* pProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetDisplayModePropertiesKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkDisplayKHR local_display;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_display = display;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_888;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_888, 1);
-        countingStream->write((uint64_t*)&cgen_var_888, 1 * 8);
-        uint64_t cgen_var_889;
-        countingStream->handleMapping()->mapHandles_VkDisplayKHR_u64(&local_display, &cgen_var_889, 1);
-        countingStream->write((uint64_t*)&cgen_var_889, 1 * 8);
+        uint64_t cgen_var_790;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_791;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_890 = (uint64_t)(uintptr_t)pPropertyCount;
-        countingStream->putBe64(cgen_var_890);
+        *countPtr += 8;
         if (pPropertyCount)
         {
-            countingStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_891 = (uint64_t)(uintptr_t)pProperties;
-        countingStream->putBe64(cgen_var_891);
+        *countPtr += 8;
         if (pProperties)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                marshal_VkDisplayModePropertiesKHR(countingStream, (VkDisplayModePropertiesKHR*)(pProperties + i));
+                count_VkDisplayModePropertiesKHR(featureBits, (VkDisplayModePropertiesKHR*)(pProperties + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetDisplayModePropertiesKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetDisplayModePropertiesKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetDisplayModePropertiesKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetDisplayModePropertiesKHR = OP_vkGetDisplayModePropertiesKHR;
-    stream->write(&opcode_vkGetDisplayModePropertiesKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetDisplayModePropertiesKHR, sizeof(uint32_t));
-    uint64_t cgen_var_892;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_892, 1);
-    stream->write((uint64_t*)&cgen_var_892, 1 * 8);
-    uint64_t cgen_var_893;
-    stream->handleMapping()->mapHandles_VkDisplayKHR_u64(&local_display, &cgen_var_893, 1);
-    stream->write((uint64_t*)&cgen_var_893, 1 * 8);
+    memcpy(streamPtr, &opcode_vkGetDisplayModePropertiesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetDisplayModePropertiesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_792;
+    *&cgen_var_792 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_792, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_793;
+    *&cgen_var_793 = get_host_u64_VkDisplayKHR((*&local_display));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_793, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_894 = (uint64_t)(uintptr_t)pPropertyCount;
-    stream->putBe64(cgen_var_894);
+    uint64_t cgen_var_794 = (uint64_t)(uintptr_t)pPropertyCount;
+    memcpy((*streamPtrPtr), &cgen_var_794, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pPropertyCount)
     {
-        stream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pPropertyCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_895 = (uint64_t)(uintptr_t)pProperties;
-    stream->putBe64(cgen_var_895);
+    uint64_t cgen_var_795 = (uint64_t)(uintptr_t)pProperties;
+    memcpy((*streamPtrPtr), &cgen_var_795, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pProperties)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            marshal_VkDisplayModePropertiesKHR(stream, (VkDisplayModePropertiesKHR*)(pProperties + i));
+            reservedmarshal_VkDisplayModePropertiesKHR(stream, (VkDisplayModePropertiesKHR*)(pProperties + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pPropertyCount;
     check_pPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -12933,9 +15257,13 @@
     }
     VkResult vkGetDisplayModePropertiesKHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetDisplayModePropertiesKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetDisplayModePropertiesKHR");;
     return vkGetDisplayModePropertiesKHR_VkResult_return;
 }
@@ -12945,19 +15273,19 @@
     VkDisplayKHR display,
     const VkDisplayModeCreateInfoKHR* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkDisplayModeKHR* pMode)
+    VkDisplayModeKHR* pMode,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateDisplayModeKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkDisplayKHR local_display;
     VkDisplayModeCreateInfoKHR* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_display = display;
     local_pCreateInfo = nullptr;
@@ -12972,6 +15300,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -12981,60 +15310,71 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_898;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_898, 1);
-        countingStream->write((uint64_t*)&cgen_var_898, 1 * 8);
-        uint64_t cgen_var_899;
-        countingStream->handleMapping()->mapHandles_VkDisplayKHR_u64(&local_display, &cgen_var_899, 1);
-        countingStream->write((uint64_t*)&cgen_var_899, 1 * 8);
-        marshal_VkDisplayModeCreateInfoKHR(countingStream, (VkDisplayModeCreateInfoKHR*)(local_pCreateInfo));
+        uint64_t cgen_var_798;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_799;
+        *countPtr += 1 * 8;
+        count_VkDisplayModeCreateInfoKHR(featureBits, (VkDisplayModeCreateInfoKHR*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_900 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_900);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_901;
-        countingStream->handleMapping()->mapHandles_VkDisplayModeKHR_u64(pMode, &cgen_var_901, 1);
-        countingStream->write((uint64_t*)&cgen_var_901, 8);
+        uint64_t cgen_var_800;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateDisplayModeKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateDisplayModeKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateDisplayModeKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateDisplayModeKHR = OP_vkCreateDisplayModeKHR;
-    stream->write(&opcode_vkCreateDisplayModeKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateDisplayModeKHR, sizeof(uint32_t));
-    uint64_t cgen_var_902;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_902, 1);
-    stream->write((uint64_t*)&cgen_var_902, 1 * 8);
-    uint64_t cgen_var_903;
-    stream->handleMapping()->mapHandles_VkDisplayKHR_u64(&local_display, &cgen_var_903, 1);
-    stream->write((uint64_t*)&cgen_var_903, 1 * 8);
-    marshal_VkDisplayModeCreateInfoKHR(stream, (VkDisplayModeCreateInfoKHR*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateDisplayModeKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateDisplayModeKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_801;
+    *&cgen_var_801 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_801, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_802;
+    *&cgen_var_802 = get_host_u64_VkDisplayKHR((*&local_display));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_802, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDisplayModeCreateInfoKHR(stream, (VkDisplayModeCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_904 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_904);
+    uint64_t cgen_var_803 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_803, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_905;
-    stream->handleMapping()->mapHandles_VkDisplayModeKHR_u64(pMode, &cgen_var_905, 1);
-    stream->write((uint64_t*)&cgen_var_905, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_804;
+    *&cgen_var_804 = (uint64_t)((*pMode));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_804, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_906;
-    stream->read((uint64_t*)&cgen_var_906, 8);
-    stream->handleMapping()->mapHandles_u64_VkDisplayModeKHR(&cgen_var_906, (VkDisplayModeKHR*)pMode, 1);
+    uint64_t cgen_var_805;
+    stream->read((uint64_t*)&cgen_var_805, 8);
+    stream->handleMapping()->mapHandles_u64_VkDisplayModeKHR(&cgen_var_805, (VkDisplayModeKHR*)pMode, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateDisplayModeKHR_VkResult_return = (VkResult)0;
     stream->read(&vkCreateDisplayModeKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateDisplayModeKHR");;
     return vkCreateDisplayModeKHR_VkResult_return;
 }
@@ -13043,45 +15383,53 @@
     VkPhysicalDevice physicalDevice,
     VkDisplayModeKHR mode,
     uint32_t planeIndex,
-    VkDisplayPlaneCapabilitiesKHR* pCapabilities)
+    VkDisplayPlaneCapabilitiesKHR* pCapabilities,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetDisplayPlaneCapabilitiesKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkDisplayModeKHR local_mode;
     uint32_t local_planeIndex;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_mode = mode;
     local_planeIndex = planeIndex;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_907;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_907, 1);
-        countingStream->write((uint64_t*)&cgen_var_907, 1 * 8);
-        uint64_t cgen_var_908;
-        countingStream->handleMapping()->mapHandles_VkDisplayModeKHR_u64(&local_mode, &cgen_var_908, 1);
-        countingStream->write((uint64_t*)&cgen_var_908, 1 * 8);
-        countingStream->write((uint32_t*)&local_planeIndex, sizeof(uint32_t));
-        marshal_VkDisplayPlaneCapabilitiesKHR(countingStream, (VkDisplayPlaneCapabilitiesKHR*)(pCapabilities));
+        uint64_t cgen_var_806;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_807;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        count_VkDisplayPlaneCapabilitiesKHR(featureBits, (VkDisplayPlaneCapabilitiesKHR*)(pCapabilities), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetDisplayPlaneCapabilitiesKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetDisplayPlaneCapabilitiesKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetDisplayPlaneCapabilitiesKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetDisplayPlaneCapabilitiesKHR = OP_vkGetDisplayPlaneCapabilitiesKHR;
-    stream->write(&opcode_vkGetDisplayPlaneCapabilitiesKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetDisplayPlaneCapabilitiesKHR, sizeof(uint32_t));
-    uint64_t cgen_var_909;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_909, 1);
-    stream->write((uint64_t*)&cgen_var_909, 1 * 8);
-    uint64_t cgen_var_910;
-    stream->handleMapping()->mapHandles_VkDisplayModeKHR_u64(&local_mode, &cgen_var_910, 1);
-    stream->write((uint64_t*)&cgen_var_910, 1 * 8);
-    stream->write((uint32_t*)&local_planeIndex, sizeof(uint32_t));
-    marshal_VkDisplayPlaneCapabilitiesKHR(stream, (VkDisplayPlaneCapabilitiesKHR*)(pCapabilities));
+    memcpy(streamPtr, &opcode_vkGetDisplayPlaneCapabilitiesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetDisplayPlaneCapabilitiesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_808;
+    *&cgen_var_808 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_808, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_809;
+    *&cgen_var_809 = get_host_u64_VkDisplayModeKHR((*&local_mode));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_809, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_planeIndex, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    reservedmarshal_VkDisplayPlaneCapabilitiesKHR(stream, (VkDisplayPlaneCapabilitiesKHR*)(pCapabilities), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkDisplayPlaneCapabilitiesKHR(stream, (VkDisplayPlaneCapabilitiesKHR*)(pCapabilities));
     if (pCapabilities)
     {
@@ -13089,9 +15437,13 @@
     }
     VkResult vkGetDisplayPlaneCapabilitiesKHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetDisplayPlaneCapabilitiesKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetDisplayPlaneCapabilitiesKHR");;
     return vkGetDisplayPlaneCapabilitiesKHR_VkResult_return;
 }
@@ -13100,18 +15452,18 @@
     VkInstance instance,
     const VkDisplaySurfaceCreateInfoKHR* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
+    VkSurfaceKHR* pSurface,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateDisplayPlaneSurfaceKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkInstance local_instance;
     VkDisplaySurfaceCreateInfoKHR* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_instance = instance;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -13125,6 +15477,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -13134,52 +15487,63 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_911;
-        countingStream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_911, 1);
-        countingStream->write((uint64_t*)&cgen_var_911, 1 * 8);
-        marshal_VkDisplaySurfaceCreateInfoKHR(countingStream, (VkDisplaySurfaceCreateInfoKHR*)(local_pCreateInfo));
+        uint64_t cgen_var_810;
+        *countPtr += 1 * 8;
+        count_VkDisplaySurfaceCreateInfoKHR(featureBits, (VkDisplaySurfaceCreateInfoKHR*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_912 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_912);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_913;
-        countingStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_913, 1);
-        countingStream->write((uint64_t*)&cgen_var_913, 8);
+        uint64_t cgen_var_811;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateDisplayPlaneSurfaceKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateDisplayPlaneSurfaceKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateDisplayPlaneSurfaceKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateDisplayPlaneSurfaceKHR = OP_vkCreateDisplayPlaneSurfaceKHR;
-    stream->write(&opcode_vkCreateDisplayPlaneSurfaceKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateDisplayPlaneSurfaceKHR, sizeof(uint32_t));
-    uint64_t cgen_var_914;
-    stream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_914, 1);
-    stream->write((uint64_t*)&cgen_var_914, 1 * 8);
-    marshal_VkDisplaySurfaceCreateInfoKHR(stream, (VkDisplaySurfaceCreateInfoKHR*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateDisplayPlaneSurfaceKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateDisplayPlaneSurfaceKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_812;
+    *&cgen_var_812 = get_host_u64_VkInstance((*&local_instance));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_812, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDisplaySurfaceCreateInfoKHR(stream, (VkDisplaySurfaceCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_915 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_915);
+    uint64_t cgen_var_813 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_813, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_916;
-    stream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_916, 1);
-    stream->write((uint64_t*)&cgen_var_916, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
-    uint64_t cgen_var_917;
-    stream->read((uint64_t*)&cgen_var_917, 8);
-    stream->handleMapping()->mapHandles_u64_VkSurfaceKHR(&cgen_var_917, (VkSurfaceKHR*)pSurface, 1);
+    /* is handle, possibly out */;
+    uint64_t cgen_var_814;
+    *&cgen_var_814 = (uint64_t)((*pSurface));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_814, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    uint64_t cgen_var_815;
+    stream->read((uint64_t*)&cgen_var_815, 8);
+    stream->handleMapping()->mapHandles_u64_VkSurfaceKHR(&cgen_var_815, (VkSurfaceKHR*)pSurface, 1);
     VkResult vkCreateDisplayPlaneSurfaceKHR_VkResult_return = (VkResult)0;
     stream->read(&vkCreateDisplayPlaneSurfaceKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateDisplayPlaneSurfaceKHR");;
     return vkCreateDisplayPlaneSurfaceKHR_VkResult_return;
 }
@@ -13191,19 +15555,19 @@
     uint32_t swapchainCount,
     const VkSwapchainCreateInfoKHR* pCreateInfos,
     const VkAllocationCallbacks* pAllocator,
-    VkSwapchainKHR* pSwapchains)
+    VkSwapchainKHR* pSwapchains,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateSharedSwapchainsKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     uint32_t local_swapchainCount;
     VkSwapchainCreateInfoKHR* local_pCreateInfos;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_swapchainCount = swapchainCount;
     local_pCreateInfos = nullptr;
@@ -13221,6 +15585,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfos)
     {
@@ -13233,72 +15598,85 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_918;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_918, 1);
-        countingStream->write((uint64_t*)&cgen_var_918, 1 * 8);
-        countingStream->write((uint32_t*)&local_swapchainCount, sizeof(uint32_t));
+        uint64_t cgen_var_816;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((swapchainCount)); ++i)
         {
-            marshal_VkSwapchainCreateInfoKHR(countingStream, (VkSwapchainCreateInfoKHR*)(local_pCreateInfos + i));
+            count_VkSwapchainCreateInfoKHR(featureBits, (VkSwapchainCreateInfoKHR*)(local_pCreateInfos + i), countPtr);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_919 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_919);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
         if (((swapchainCount)))
         {
-            uint64_t* cgen_var_920;
-            countingStream->alloc((void**)&cgen_var_920, ((swapchainCount)) * 8);
-            countingStream->handleMapping()->mapHandles_VkSwapchainKHR_u64(pSwapchains, cgen_var_920, ((swapchainCount)));
-            countingStream->write((uint64_t*)cgen_var_920, ((swapchainCount)) * 8);
+            *countPtr += ((swapchainCount)) * 8;
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateSharedSwapchainsKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateSharedSwapchainsKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateSharedSwapchainsKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateSharedSwapchainsKHR = OP_vkCreateSharedSwapchainsKHR;
-    stream->write(&opcode_vkCreateSharedSwapchainsKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateSharedSwapchainsKHR, sizeof(uint32_t));
-    uint64_t cgen_var_921;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_921, 1);
-    stream->write((uint64_t*)&cgen_var_921, 1 * 8);
-    stream->write((uint32_t*)&local_swapchainCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkCreateSharedSwapchainsKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateSharedSwapchainsKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_818;
+    *&cgen_var_818 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_818, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_swapchainCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((swapchainCount)); ++i)
     {
-        marshal_VkSwapchainCreateInfoKHR(stream, (VkSwapchainCreateInfoKHR*)(local_pCreateInfos + i));
+        reservedmarshal_VkSwapchainCreateInfoKHR(stream, (VkSwapchainCreateInfoKHR*)(local_pCreateInfos + i), streamPtrPtr);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_922 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_922);
+    uint64_t cgen_var_819 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_819, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
+    /* is handle, possibly out */;
     if (((swapchainCount)))
     {
-        uint64_t* cgen_var_923;
-        stream->alloc((void**)&cgen_var_923, ((swapchainCount)) * 8);
-        stream->handleMapping()->mapHandles_VkSwapchainKHR_u64(pSwapchains, cgen_var_923, ((swapchainCount)));
-        stream->write((uint64_t*)cgen_var_923, ((swapchainCount)) * 8);
+        uint64_t* cgen_var_820;
+        stream->alloc((void**)&cgen_var_820, ((swapchainCount)) * 8);
+        for (uint32_t k = 0; k < ((swapchainCount)); ++k)
+        {
+            cgen_var_820[k] = (uint64_t)(pSwapchains[k]);
+        }
+        memcpy(*streamPtrPtr, (uint64_t*)cgen_var_820, ((swapchainCount)) * 8);
+        *streamPtrPtr += ((swapchainCount)) * 8;
     }
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     if (((swapchainCount)))
     {
-        uint64_t* cgen_var_924;
-        stream->alloc((void**)&cgen_var_924, ((swapchainCount)) * 8);
-        stream->read((uint64_t*)cgen_var_924, ((swapchainCount)) * 8);
-        stream->handleMapping()->mapHandles_u64_VkSwapchainKHR(cgen_var_924, (VkSwapchainKHR*)pSwapchains, ((swapchainCount)));
+        uint64_t* cgen_var_821;
+        stream->alloc((void**)&cgen_var_821, ((swapchainCount)) * 8);
+        stream->read((uint64_t*)cgen_var_821, ((swapchainCount)) * 8);
+        stream->handleMapping()->mapHandles_u64_VkSwapchainKHR(cgen_var_821, (VkSwapchainKHR*)pSwapchains, ((swapchainCount)));
     }
     VkResult vkCreateSharedSwapchainsKHR_VkResult_return = (VkResult)0;
     stream->read(&vkCreateSharedSwapchainsKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateSharedSwapchainsKHR");;
     return vkCreateSharedSwapchainsKHR_VkResult_return;
 }
@@ -13309,18 +15687,18 @@
     VkInstance instance,
     const VkXlibSurfaceCreateInfoKHR* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
+    VkSurfaceKHR* pSurface,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateXlibSurfaceKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkInstance local_instance;
     VkXlibSurfaceCreateInfoKHR* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_instance = instance;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -13334,6 +15712,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -13343,52 +15722,63 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_925;
-        countingStream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_925, 1);
-        countingStream->write((uint64_t*)&cgen_var_925, 1 * 8);
-        marshal_VkXlibSurfaceCreateInfoKHR(countingStream, (VkXlibSurfaceCreateInfoKHR*)(local_pCreateInfo));
+        uint64_t cgen_var_822;
+        *countPtr += 1 * 8;
+        count_VkXlibSurfaceCreateInfoKHR(featureBits, (VkXlibSurfaceCreateInfoKHR*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_926 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_926);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_927;
-        countingStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_927, 1);
-        countingStream->write((uint64_t*)&cgen_var_927, 8);
+        uint64_t cgen_var_823;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateXlibSurfaceKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateXlibSurfaceKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateXlibSurfaceKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateXlibSurfaceKHR = OP_vkCreateXlibSurfaceKHR;
-    stream->write(&opcode_vkCreateXlibSurfaceKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateXlibSurfaceKHR, sizeof(uint32_t));
-    uint64_t cgen_var_928;
-    stream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_928, 1);
-    stream->write((uint64_t*)&cgen_var_928, 1 * 8);
-    marshal_VkXlibSurfaceCreateInfoKHR(stream, (VkXlibSurfaceCreateInfoKHR*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateXlibSurfaceKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateXlibSurfaceKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_824;
+    *&cgen_var_824 = get_host_u64_VkInstance((*&local_instance));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_824, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkXlibSurfaceCreateInfoKHR(stream, (VkXlibSurfaceCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_929 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_929);
+    uint64_t cgen_var_825 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_825, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_930;
-    stream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_930, 1);
-    stream->write((uint64_t*)&cgen_var_930, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
-    uint64_t cgen_var_931;
-    stream->read((uint64_t*)&cgen_var_931, 8);
-    stream->handleMapping()->mapHandles_u64_VkSurfaceKHR(&cgen_var_931, (VkSurfaceKHR*)pSurface, 1);
+    /* is handle, possibly out */;
+    uint64_t cgen_var_826;
+    *&cgen_var_826 = (uint64_t)((*pSurface));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_826, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    uint64_t cgen_var_827;
+    stream->read((uint64_t*)&cgen_var_827, 8);
+    stream->handleMapping()->mapHandles_u64_VkSurfaceKHR(&cgen_var_827, (VkSurfaceKHR*)pSurface, 1);
     VkResult vkCreateXlibSurfaceKHR_VkResult_return = (VkResult)0;
     stream->read(&vkCreateXlibSurfaceKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateXlibSurfaceKHR");;
     return vkCreateXlibSurfaceKHR_VkResult_return;
 }
@@ -13397,47 +15787,61 @@
     VkPhysicalDevice physicalDevice,
     uint32_t queueFamilyIndex,
     Display* dpy,
-    VisualID visualID)
+    VisualID visualID,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceXlibPresentationSupportKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     uint32_t local_queueFamilyIndex;
     VisualID local_visualID;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_queueFamilyIndex = queueFamilyIndex;
     local_visualID = visualID;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_932;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_932, 1);
-        countingStream->write((uint64_t*)&cgen_var_932, 1 * 8);
-        countingStream->write((uint32_t*)&local_queueFamilyIndex, sizeof(uint32_t));
-        countingStream->write((Display*)dpy, sizeof(Display));
-        countingStream->write((VisualID*)&local_visualID, sizeof(VisualID));
+        uint64_t cgen_var_828;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(Display);
+        *countPtr += sizeof(VisualID);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceXlibPresentationSupportKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceXlibPresentationSupportKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceXlibPresentationSupportKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceXlibPresentationSupportKHR = OP_vkGetPhysicalDeviceXlibPresentationSupportKHR;
-    stream->write(&opcode_vkGetPhysicalDeviceXlibPresentationSupportKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceXlibPresentationSupportKHR, sizeof(uint32_t));
-    uint64_t cgen_var_933;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_933, 1);
-    stream->write((uint64_t*)&cgen_var_933, 1 * 8);
-    stream->write((uint32_t*)&local_queueFamilyIndex, sizeof(uint32_t));
-    stream->write((Display*)dpy, sizeof(Display));
-    stream->write((VisualID*)&local_visualID, sizeof(VisualID));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceXlibPresentationSupportKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceXlibPresentationSupportKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_829;
+    *&cgen_var_829 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_829, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_queueFamilyIndex, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (Display*)dpy, sizeof(Display));
+    *streamPtrPtr += sizeof(Display);
+    memcpy(*streamPtrPtr, (VisualID*)&local_visualID, sizeof(VisualID));
+    *streamPtrPtr += sizeof(VisualID);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((Display*)dpy, sizeof(Display));
     VkBool32 vkGetPhysicalDeviceXlibPresentationSupportKHR_VkBool32_return = (VkBool32)0;
     stream->read(&vkGetPhysicalDeviceXlibPresentationSupportKHR_VkBool32_return, sizeof(VkBool32));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceXlibPresentationSupportKHR");;
     return vkGetPhysicalDeviceXlibPresentationSupportKHR_VkBool32_return;
 }
@@ -13448,18 +15852,18 @@
     VkInstance instance,
     const VkXcbSurfaceCreateInfoKHR* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
+    VkSurfaceKHR* pSurface,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateXcbSurfaceKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkInstance local_instance;
     VkXcbSurfaceCreateInfoKHR* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_instance = instance;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -13473,6 +15877,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -13482,52 +15887,63 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_934;
-        countingStream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_934, 1);
-        countingStream->write((uint64_t*)&cgen_var_934, 1 * 8);
-        marshal_VkXcbSurfaceCreateInfoKHR(countingStream, (VkXcbSurfaceCreateInfoKHR*)(local_pCreateInfo));
+        uint64_t cgen_var_830;
+        *countPtr += 1 * 8;
+        count_VkXcbSurfaceCreateInfoKHR(featureBits, (VkXcbSurfaceCreateInfoKHR*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_935 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_935);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_936;
-        countingStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_936, 1);
-        countingStream->write((uint64_t*)&cgen_var_936, 8);
+        uint64_t cgen_var_831;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateXcbSurfaceKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateXcbSurfaceKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateXcbSurfaceKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateXcbSurfaceKHR = OP_vkCreateXcbSurfaceKHR;
-    stream->write(&opcode_vkCreateXcbSurfaceKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateXcbSurfaceKHR, sizeof(uint32_t));
-    uint64_t cgen_var_937;
-    stream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_937, 1);
-    stream->write((uint64_t*)&cgen_var_937, 1 * 8);
-    marshal_VkXcbSurfaceCreateInfoKHR(stream, (VkXcbSurfaceCreateInfoKHR*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateXcbSurfaceKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateXcbSurfaceKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_832;
+    *&cgen_var_832 = get_host_u64_VkInstance((*&local_instance));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_832, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkXcbSurfaceCreateInfoKHR(stream, (VkXcbSurfaceCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_938 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_938);
+    uint64_t cgen_var_833 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_833, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_939;
-    stream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_939, 1);
-    stream->write((uint64_t*)&cgen_var_939, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
-    uint64_t cgen_var_940;
-    stream->read((uint64_t*)&cgen_var_940, 8);
-    stream->handleMapping()->mapHandles_u64_VkSurfaceKHR(&cgen_var_940, (VkSurfaceKHR*)pSurface, 1);
+    /* is handle, possibly out */;
+    uint64_t cgen_var_834;
+    *&cgen_var_834 = (uint64_t)((*pSurface));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_834, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    uint64_t cgen_var_835;
+    stream->read((uint64_t*)&cgen_var_835, 8);
+    stream->handleMapping()->mapHandles_u64_VkSurfaceKHR(&cgen_var_835, (VkSurfaceKHR*)pSurface, 1);
     VkResult vkCreateXcbSurfaceKHR_VkResult_return = (VkResult)0;
     stream->read(&vkCreateXcbSurfaceKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateXcbSurfaceKHR");;
     return vkCreateXcbSurfaceKHR_VkResult_return;
 }
@@ -13536,47 +15952,61 @@
     VkPhysicalDevice physicalDevice,
     uint32_t queueFamilyIndex,
     xcb_connection_t* connection,
-    xcb_visualid_t visual_id)
+    xcb_visualid_t visual_id,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceXcbPresentationSupportKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     uint32_t local_queueFamilyIndex;
     xcb_visualid_t local_visual_id;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_queueFamilyIndex = queueFamilyIndex;
     local_visual_id = visual_id;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_941;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_941, 1);
-        countingStream->write((uint64_t*)&cgen_var_941, 1 * 8);
-        countingStream->write((uint32_t*)&local_queueFamilyIndex, sizeof(uint32_t));
-        countingStream->write((xcb_connection_t*)connection, sizeof(xcb_connection_t));
-        countingStream->write((xcb_visualid_t*)&local_visual_id, sizeof(xcb_visualid_t));
+        uint64_t cgen_var_836;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(xcb_connection_t);
+        *countPtr += sizeof(xcb_visualid_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceXcbPresentationSupportKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceXcbPresentationSupportKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceXcbPresentationSupportKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceXcbPresentationSupportKHR = OP_vkGetPhysicalDeviceXcbPresentationSupportKHR;
-    stream->write(&opcode_vkGetPhysicalDeviceXcbPresentationSupportKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceXcbPresentationSupportKHR, sizeof(uint32_t));
-    uint64_t cgen_var_942;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_942, 1);
-    stream->write((uint64_t*)&cgen_var_942, 1 * 8);
-    stream->write((uint32_t*)&local_queueFamilyIndex, sizeof(uint32_t));
-    stream->write((xcb_connection_t*)connection, sizeof(xcb_connection_t));
-    stream->write((xcb_visualid_t*)&local_visual_id, sizeof(xcb_visualid_t));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceXcbPresentationSupportKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceXcbPresentationSupportKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_837;
+    *&cgen_var_837 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_837, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_queueFamilyIndex, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (xcb_connection_t*)connection, sizeof(xcb_connection_t));
+    *streamPtrPtr += sizeof(xcb_connection_t);
+    memcpy(*streamPtrPtr, (xcb_visualid_t*)&local_visual_id, sizeof(xcb_visualid_t));
+    *streamPtrPtr += sizeof(xcb_visualid_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((xcb_connection_t*)connection, sizeof(xcb_connection_t));
     VkBool32 vkGetPhysicalDeviceXcbPresentationSupportKHR_VkBool32_return = (VkBool32)0;
     stream->read(&vkGetPhysicalDeviceXcbPresentationSupportKHR_VkBool32_return, sizeof(VkBool32));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceXcbPresentationSupportKHR");;
     return vkGetPhysicalDeviceXcbPresentationSupportKHR_VkBool32_return;
 }
@@ -13587,18 +16017,18 @@
     VkInstance instance,
     const VkWaylandSurfaceCreateInfoKHR* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
+    VkSurfaceKHR* pSurface,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateWaylandSurfaceKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkInstance local_instance;
     VkWaylandSurfaceCreateInfoKHR* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_instance = instance;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -13612,6 +16042,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -13621,52 +16052,63 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_943;
-        countingStream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_943, 1);
-        countingStream->write((uint64_t*)&cgen_var_943, 1 * 8);
-        marshal_VkWaylandSurfaceCreateInfoKHR(countingStream, (VkWaylandSurfaceCreateInfoKHR*)(local_pCreateInfo));
+        uint64_t cgen_var_838;
+        *countPtr += 1 * 8;
+        count_VkWaylandSurfaceCreateInfoKHR(featureBits, (VkWaylandSurfaceCreateInfoKHR*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_944 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_944);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_945;
-        countingStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_945, 1);
-        countingStream->write((uint64_t*)&cgen_var_945, 8);
+        uint64_t cgen_var_839;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateWaylandSurfaceKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateWaylandSurfaceKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateWaylandSurfaceKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateWaylandSurfaceKHR = OP_vkCreateWaylandSurfaceKHR;
-    stream->write(&opcode_vkCreateWaylandSurfaceKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateWaylandSurfaceKHR, sizeof(uint32_t));
-    uint64_t cgen_var_946;
-    stream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_946, 1);
-    stream->write((uint64_t*)&cgen_var_946, 1 * 8);
-    marshal_VkWaylandSurfaceCreateInfoKHR(stream, (VkWaylandSurfaceCreateInfoKHR*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateWaylandSurfaceKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateWaylandSurfaceKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_840;
+    *&cgen_var_840 = get_host_u64_VkInstance((*&local_instance));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_840, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkWaylandSurfaceCreateInfoKHR(stream, (VkWaylandSurfaceCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_947 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_947);
+    uint64_t cgen_var_841 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_841, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_948;
-    stream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_948, 1);
-    stream->write((uint64_t*)&cgen_var_948, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
-    uint64_t cgen_var_949;
-    stream->read((uint64_t*)&cgen_var_949, 8);
-    stream->handleMapping()->mapHandles_u64_VkSurfaceKHR(&cgen_var_949, (VkSurfaceKHR*)pSurface, 1);
+    /* is handle, possibly out */;
+    uint64_t cgen_var_842;
+    *&cgen_var_842 = (uint64_t)((*pSurface));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_842, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    uint64_t cgen_var_843;
+    stream->read((uint64_t*)&cgen_var_843, 8);
+    stream->handleMapping()->mapHandles_u64_VkSurfaceKHR(&cgen_var_843, (VkSurfaceKHR*)pSurface, 1);
     VkResult vkCreateWaylandSurfaceKHR_VkResult_return = (VkResult)0;
     stream->read(&vkCreateWaylandSurfaceKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateWaylandSurfaceKHR");;
     return vkCreateWaylandSurfaceKHR_VkResult_return;
 }
@@ -13674,43 +16116,56 @@
 VkBool32 VkEncoder::vkGetPhysicalDeviceWaylandPresentationSupportKHR(
     VkPhysicalDevice physicalDevice,
     uint32_t queueFamilyIndex,
-    wl_display* display)
+    wl_display* display,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceWaylandPresentationSupportKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     uint32_t local_queueFamilyIndex;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_queueFamilyIndex = queueFamilyIndex;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_950;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_950, 1);
-        countingStream->write((uint64_t*)&cgen_var_950, 1 * 8);
-        countingStream->write((uint32_t*)&local_queueFamilyIndex, sizeof(uint32_t));
-        countingStream->write((wl_display*)display, sizeof(wl_display));
+        uint64_t cgen_var_844;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(wl_display);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceWaylandPresentationSupportKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceWaylandPresentationSupportKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceWaylandPresentationSupportKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceWaylandPresentationSupportKHR = OP_vkGetPhysicalDeviceWaylandPresentationSupportKHR;
-    stream->write(&opcode_vkGetPhysicalDeviceWaylandPresentationSupportKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceWaylandPresentationSupportKHR, sizeof(uint32_t));
-    uint64_t cgen_var_951;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_951, 1);
-    stream->write((uint64_t*)&cgen_var_951, 1 * 8);
-    stream->write((uint32_t*)&local_queueFamilyIndex, sizeof(uint32_t));
-    stream->write((wl_display*)display, sizeof(wl_display));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceWaylandPresentationSupportKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceWaylandPresentationSupportKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_845;
+    *&cgen_var_845 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_845, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_queueFamilyIndex, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (wl_display*)display, sizeof(wl_display));
+    *streamPtrPtr += sizeof(wl_display);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((wl_display*)display, sizeof(wl_display));
     VkBool32 vkGetPhysicalDeviceWaylandPresentationSupportKHR_VkBool32_return = (VkBool32)0;
     stream->read(&vkGetPhysicalDeviceWaylandPresentationSupportKHR_VkBool32_return, sizeof(VkBool32));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceWaylandPresentationSupportKHR");;
     return vkGetPhysicalDeviceWaylandPresentationSupportKHR_VkBool32_return;
 }
@@ -13721,18 +16176,18 @@
     VkInstance instance,
     const VkMirSurfaceCreateInfoKHR* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
+    VkSurfaceKHR* pSurface,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateMirSurfaceKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkInstance local_instance;
     VkMirSurfaceCreateInfoKHR* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_instance = instance;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -13746,6 +16201,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -13755,52 +16211,63 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_952;
-        countingStream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_952, 1);
-        countingStream->write((uint64_t*)&cgen_var_952, 1 * 8);
-        marshal_VkMirSurfaceCreateInfoKHR(countingStream, (VkMirSurfaceCreateInfoKHR*)(local_pCreateInfo));
+        uint64_t cgen_var_846;
+        *countPtr += 1 * 8;
+        count_VkMirSurfaceCreateInfoKHR(featureBits, (VkMirSurfaceCreateInfoKHR*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_953 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_953);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_954;
-        countingStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_954, 1);
-        countingStream->write((uint64_t*)&cgen_var_954, 8);
+        uint64_t cgen_var_847;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateMirSurfaceKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateMirSurfaceKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateMirSurfaceKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateMirSurfaceKHR = OP_vkCreateMirSurfaceKHR;
-    stream->write(&opcode_vkCreateMirSurfaceKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateMirSurfaceKHR, sizeof(uint32_t));
-    uint64_t cgen_var_955;
-    stream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_955, 1);
-    stream->write((uint64_t*)&cgen_var_955, 1 * 8);
-    marshal_VkMirSurfaceCreateInfoKHR(stream, (VkMirSurfaceCreateInfoKHR*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateMirSurfaceKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateMirSurfaceKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_848;
+    *&cgen_var_848 = get_host_u64_VkInstance((*&local_instance));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_848, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkMirSurfaceCreateInfoKHR(stream, (VkMirSurfaceCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_956 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_956);
+    uint64_t cgen_var_849 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_849, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_957;
-    stream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_957, 1);
-    stream->write((uint64_t*)&cgen_var_957, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
-    uint64_t cgen_var_958;
-    stream->read((uint64_t*)&cgen_var_958, 8);
-    stream->handleMapping()->mapHandles_u64_VkSurfaceKHR(&cgen_var_958, (VkSurfaceKHR*)pSurface, 1);
+    /* is handle, possibly out */;
+    uint64_t cgen_var_850;
+    *&cgen_var_850 = (uint64_t)((*pSurface));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_850, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    uint64_t cgen_var_851;
+    stream->read((uint64_t*)&cgen_var_851, 8);
+    stream->handleMapping()->mapHandles_u64_VkSurfaceKHR(&cgen_var_851, (VkSurfaceKHR*)pSurface, 1);
     VkResult vkCreateMirSurfaceKHR_VkResult_return = (VkResult)0;
     stream->read(&vkCreateMirSurfaceKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateMirSurfaceKHR");;
     return vkCreateMirSurfaceKHR_VkResult_return;
 }
@@ -13808,43 +16275,56 @@
 VkBool32 VkEncoder::vkGetPhysicalDeviceMirPresentationSupportKHR(
     VkPhysicalDevice physicalDevice,
     uint32_t queueFamilyIndex,
-    MirConnection* connection)
+    MirConnection* connection,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceMirPresentationSupportKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     uint32_t local_queueFamilyIndex;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_queueFamilyIndex = queueFamilyIndex;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_959;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_959, 1);
-        countingStream->write((uint64_t*)&cgen_var_959, 1 * 8);
-        countingStream->write((uint32_t*)&local_queueFamilyIndex, sizeof(uint32_t));
-        countingStream->write((MirConnection*)connection, sizeof(MirConnection));
+        uint64_t cgen_var_852;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(MirConnection);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceMirPresentationSupportKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceMirPresentationSupportKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceMirPresentationSupportKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceMirPresentationSupportKHR = OP_vkGetPhysicalDeviceMirPresentationSupportKHR;
-    stream->write(&opcode_vkGetPhysicalDeviceMirPresentationSupportKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceMirPresentationSupportKHR, sizeof(uint32_t));
-    uint64_t cgen_var_960;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_960, 1);
-    stream->write((uint64_t*)&cgen_var_960, 1 * 8);
-    stream->write((uint32_t*)&local_queueFamilyIndex, sizeof(uint32_t));
-    stream->write((MirConnection*)connection, sizeof(MirConnection));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceMirPresentationSupportKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceMirPresentationSupportKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_853;
+    *&cgen_var_853 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_853, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_queueFamilyIndex, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (MirConnection*)connection, sizeof(MirConnection));
+    *streamPtrPtr += sizeof(MirConnection);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((MirConnection*)connection, sizeof(MirConnection));
     VkBool32 vkGetPhysicalDeviceMirPresentationSupportKHR_VkBool32_return = (VkBool32)0;
     stream->read(&vkGetPhysicalDeviceMirPresentationSupportKHR_VkBool32_return, sizeof(VkBool32));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceMirPresentationSupportKHR");;
     return vkGetPhysicalDeviceMirPresentationSupportKHR_VkBool32_return;
 }
@@ -13855,18 +16335,18 @@
     VkInstance instance,
     const VkAndroidSurfaceCreateInfoKHR* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
+    VkSurfaceKHR* pSurface,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateAndroidSurfaceKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkInstance local_instance;
     VkAndroidSurfaceCreateInfoKHR* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_instance = instance;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -13880,6 +16360,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -13889,52 +16370,63 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_961;
-        countingStream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_961, 1);
-        countingStream->write((uint64_t*)&cgen_var_961, 1 * 8);
-        marshal_VkAndroidSurfaceCreateInfoKHR(countingStream, (VkAndroidSurfaceCreateInfoKHR*)(local_pCreateInfo));
+        uint64_t cgen_var_854;
+        *countPtr += 1 * 8;
+        count_VkAndroidSurfaceCreateInfoKHR(featureBits, (VkAndroidSurfaceCreateInfoKHR*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_962 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_962);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_963;
-        countingStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_963, 1);
-        countingStream->write((uint64_t*)&cgen_var_963, 8);
+        uint64_t cgen_var_855;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateAndroidSurfaceKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateAndroidSurfaceKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateAndroidSurfaceKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateAndroidSurfaceKHR = OP_vkCreateAndroidSurfaceKHR;
-    stream->write(&opcode_vkCreateAndroidSurfaceKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateAndroidSurfaceKHR, sizeof(uint32_t));
-    uint64_t cgen_var_964;
-    stream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_964, 1);
-    stream->write((uint64_t*)&cgen_var_964, 1 * 8);
-    marshal_VkAndroidSurfaceCreateInfoKHR(stream, (VkAndroidSurfaceCreateInfoKHR*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateAndroidSurfaceKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateAndroidSurfaceKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_856;
+    *&cgen_var_856 = get_host_u64_VkInstance((*&local_instance));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_856, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkAndroidSurfaceCreateInfoKHR(stream, (VkAndroidSurfaceCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_965 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_965);
+    uint64_t cgen_var_857 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_857, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_966;
-    stream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_966, 1);
-    stream->write((uint64_t*)&cgen_var_966, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
-    uint64_t cgen_var_967;
-    stream->read((uint64_t*)&cgen_var_967, 8);
-    stream->handleMapping()->mapHandles_u64_VkSurfaceKHR(&cgen_var_967, (VkSurfaceKHR*)pSurface, 1);
+    /* is handle, possibly out */;
+    uint64_t cgen_var_858;
+    *&cgen_var_858 = (uint64_t)((*pSurface));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_858, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    uint64_t cgen_var_859;
+    stream->read((uint64_t*)&cgen_var_859, 8);
+    stream->handleMapping()->mapHandles_u64_VkSurfaceKHR(&cgen_var_859, (VkSurfaceKHR*)pSurface, 1);
     VkResult vkCreateAndroidSurfaceKHR_VkResult_return = (VkResult)0;
     stream->read(&vkCreateAndroidSurfaceKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateAndroidSurfaceKHR");;
     return vkCreateAndroidSurfaceKHR_VkResult_return;
 }
@@ -13945,18 +16437,18 @@
     VkInstance instance,
     const VkWin32SurfaceCreateInfoKHR* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
+    VkSurfaceKHR* pSurface,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateWin32SurfaceKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkInstance local_instance;
     VkWin32SurfaceCreateInfoKHR* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_instance = instance;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -13970,6 +16462,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -13979,92 +16472,115 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_968;
-        countingStream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_968, 1);
-        countingStream->write((uint64_t*)&cgen_var_968, 1 * 8);
-        marshal_VkWin32SurfaceCreateInfoKHR(countingStream, (VkWin32SurfaceCreateInfoKHR*)(local_pCreateInfo));
+        uint64_t cgen_var_860;
+        *countPtr += 1 * 8;
+        count_VkWin32SurfaceCreateInfoKHR(featureBits, (VkWin32SurfaceCreateInfoKHR*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_969 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_969);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_970;
-        countingStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_970, 1);
-        countingStream->write((uint64_t*)&cgen_var_970, 8);
+        uint64_t cgen_var_861;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateWin32SurfaceKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateWin32SurfaceKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateWin32SurfaceKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateWin32SurfaceKHR = OP_vkCreateWin32SurfaceKHR;
-    stream->write(&opcode_vkCreateWin32SurfaceKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateWin32SurfaceKHR, sizeof(uint32_t));
-    uint64_t cgen_var_971;
-    stream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_971, 1);
-    stream->write((uint64_t*)&cgen_var_971, 1 * 8);
-    marshal_VkWin32SurfaceCreateInfoKHR(stream, (VkWin32SurfaceCreateInfoKHR*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateWin32SurfaceKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateWin32SurfaceKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_862;
+    *&cgen_var_862 = get_host_u64_VkInstance((*&local_instance));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_862, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkWin32SurfaceCreateInfoKHR(stream, (VkWin32SurfaceCreateInfoKHR*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_972 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_972);
+    uint64_t cgen_var_863 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_863, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_973;
-    stream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_973, 1);
-    stream->write((uint64_t*)&cgen_var_973, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
-    uint64_t cgen_var_974;
-    stream->read((uint64_t*)&cgen_var_974, 8);
-    stream->handleMapping()->mapHandles_u64_VkSurfaceKHR(&cgen_var_974, (VkSurfaceKHR*)pSurface, 1);
+    /* is handle, possibly out */;
+    uint64_t cgen_var_864;
+    *&cgen_var_864 = (uint64_t)((*pSurface));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_864, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    uint64_t cgen_var_865;
+    stream->read((uint64_t*)&cgen_var_865, 8);
+    stream->handleMapping()->mapHandles_u64_VkSurfaceKHR(&cgen_var_865, (VkSurfaceKHR*)pSurface, 1);
     VkResult vkCreateWin32SurfaceKHR_VkResult_return = (VkResult)0;
     stream->read(&vkCreateWin32SurfaceKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateWin32SurfaceKHR");;
     return vkCreateWin32SurfaceKHR_VkResult_return;
 }
 
 VkBool32 VkEncoder::vkGetPhysicalDeviceWin32PresentationSupportKHR(
     VkPhysicalDevice physicalDevice,
-    uint32_t queueFamilyIndex)
+    uint32_t queueFamilyIndex,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceWin32PresentationSupportKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     uint32_t local_queueFamilyIndex;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_queueFamilyIndex = queueFamilyIndex;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_975;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_975, 1);
-        countingStream->write((uint64_t*)&cgen_var_975, 1 * 8);
-        countingStream->write((uint32_t*)&local_queueFamilyIndex, sizeof(uint32_t));
+        uint64_t cgen_var_866;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceWin32PresentationSupportKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceWin32PresentationSupportKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceWin32PresentationSupportKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceWin32PresentationSupportKHR = OP_vkGetPhysicalDeviceWin32PresentationSupportKHR;
-    stream->write(&opcode_vkGetPhysicalDeviceWin32PresentationSupportKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceWin32PresentationSupportKHR, sizeof(uint32_t));
-    uint64_t cgen_var_976;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_976, 1);
-    stream->write((uint64_t*)&cgen_var_976, 1 * 8);
-    stream->write((uint32_t*)&local_queueFamilyIndex, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceWin32PresentationSupportKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceWin32PresentationSupportKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_867;
+    *&cgen_var_867 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_867, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_queueFamilyIndex, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkBool32 vkGetPhysicalDeviceWin32PresentationSupportKHR_VkBool32_return = (VkBool32)0;
     stream->read(&vkGetPhysicalDeviceWin32PresentationSupportKHR_VkBool32_return, sizeof(VkBool32));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceWin32PresentationSupportKHR");;
     return vkGetPhysicalDeviceWin32PresentationSupportKHR_VkBool32_return;
 }
@@ -14077,144 +16593,178 @@
 #ifdef VK_KHR_get_physical_device_properties2
 void VkEncoder::vkGetPhysicalDeviceFeatures2KHR(
     VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceFeatures2* pFeatures)
+    VkPhysicalDeviceFeatures2* pFeatures,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceFeatures2KHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_977;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_977, 1);
-        countingStream->write((uint64_t*)&cgen_var_977, 1 * 8);
-        marshal_VkPhysicalDeviceFeatures2(countingStream, (VkPhysicalDeviceFeatures2*)(pFeatures));
+        uint64_t cgen_var_868;
+        *countPtr += 1 * 8;
+        count_VkPhysicalDeviceFeatures2(featureBits, (VkPhysicalDeviceFeatures2*)(pFeatures), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceFeatures2KHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceFeatures2KHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceFeatures2KHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceFeatures2KHR = OP_vkGetPhysicalDeviceFeatures2KHR;
-    stream->write(&opcode_vkGetPhysicalDeviceFeatures2KHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceFeatures2KHR, sizeof(uint32_t));
-    uint64_t cgen_var_978;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_978, 1);
-    stream->write((uint64_t*)&cgen_var_978, 1 * 8);
-    marshal_VkPhysicalDeviceFeatures2(stream, (VkPhysicalDeviceFeatures2*)(pFeatures));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceFeatures2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceFeatures2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_869;
+    *&cgen_var_869 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_869, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPhysicalDeviceFeatures2(stream, (VkPhysicalDeviceFeatures2*)(pFeatures), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkPhysicalDeviceFeatures2(stream, (VkPhysicalDeviceFeatures2*)(pFeatures));
     if (pFeatures)
     {
         transform_fromhost_VkPhysicalDeviceFeatures2(mImpl->resources(), (VkPhysicalDeviceFeatures2*)(pFeatures));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceFeatures2KHR");;
 }
 
 void VkEncoder::vkGetPhysicalDeviceProperties2KHR(
     VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceProperties2* pProperties)
+    VkPhysicalDeviceProperties2* pProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceProperties2KHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_979;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_979, 1);
-        countingStream->write((uint64_t*)&cgen_var_979, 1 * 8);
-        marshal_VkPhysicalDeviceProperties2(countingStream, (VkPhysicalDeviceProperties2*)(pProperties));
+        uint64_t cgen_var_870;
+        *countPtr += 1 * 8;
+        count_VkPhysicalDeviceProperties2(featureBits, (VkPhysicalDeviceProperties2*)(pProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceProperties2KHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceProperties2KHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceProperties2KHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceProperties2KHR = OP_vkGetPhysicalDeviceProperties2KHR;
-    stream->write(&opcode_vkGetPhysicalDeviceProperties2KHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceProperties2KHR, sizeof(uint32_t));
-    uint64_t cgen_var_980;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_980, 1);
-    stream->write((uint64_t*)&cgen_var_980, 1 * 8);
-    marshal_VkPhysicalDeviceProperties2(stream, (VkPhysicalDeviceProperties2*)(pProperties));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceProperties2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceProperties2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_871;
+    *&cgen_var_871 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_871, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPhysicalDeviceProperties2(stream, (VkPhysicalDeviceProperties2*)(pProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkPhysicalDeviceProperties2(stream, (VkPhysicalDeviceProperties2*)(pProperties));
     if (pProperties)
     {
         transform_fromhost_VkPhysicalDeviceProperties2(mImpl->resources(), (VkPhysicalDeviceProperties2*)(pProperties));
     }
     mImpl->resources()->on_vkGetPhysicalDeviceProperties2KHR(this, physicalDevice, pProperties);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceProperties2KHR");;
 }
 
 void VkEncoder::vkGetPhysicalDeviceFormatProperties2KHR(
     VkPhysicalDevice physicalDevice,
     VkFormat format,
-    VkFormatProperties2* pFormatProperties)
+    VkFormatProperties2* pFormatProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceFormatProperties2KHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkFormat local_format;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_format = format;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_981;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_981, 1);
-        countingStream->write((uint64_t*)&cgen_var_981, 1 * 8);
-        countingStream->write((VkFormat*)&local_format, sizeof(VkFormat));
-        marshal_VkFormatProperties2(countingStream, (VkFormatProperties2*)(pFormatProperties));
+        uint64_t cgen_var_872;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkFormat);
+        count_VkFormatProperties2(featureBits, (VkFormatProperties2*)(pFormatProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceFormatProperties2KHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceFormatProperties2KHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceFormatProperties2KHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceFormatProperties2KHR = OP_vkGetPhysicalDeviceFormatProperties2KHR;
-    stream->write(&opcode_vkGetPhysicalDeviceFormatProperties2KHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceFormatProperties2KHR, sizeof(uint32_t));
-    uint64_t cgen_var_982;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_982, 1);
-    stream->write((uint64_t*)&cgen_var_982, 1 * 8);
-    stream->write((VkFormat*)&local_format, sizeof(VkFormat));
-    marshal_VkFormatProperties2(stream, (VkFormatProperties2*)(pFormatProperties));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceFormatProperties2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceFormatProperties2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_873;
+    *&cgen_var_873 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_873, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkFormat*)&local_format, sizeof(VkFormat));
+    *streamPtrPtr += sizeof(VkFormat);
+    reservedmarshal_VkFormatProperties2(stream, (VkFormatProperties2*)(pFormatProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkFormatProperties2(stream, (VkFormatProperties2*)(pFormatProperties));
     if (pFormatProperties)
     {
         transform_fromhost_VkFormatProperties2(mImpl->resources(), (VkFormatProperties2*)(pFormatProperties));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceFormatProperties2KHR");;
 }
 
 VkResult VkEncoder::vkGetPhysicalDeviceImageFormatProperties2KHR(
     VkPhysicalDevice physicalDevice,
     const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
-    VkImageFormatProperties2* pImageFormatProperties)
+    VkImageFormatProperties2* pImageFormatProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceImageFormatProperties2KHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkPhysicalDeviceImageFormatInfo2* local_pImageFormatInfo;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_pImageFormatInfo = nullptr;
     if (pImageFormatInfo)
@@ -14222,28 +16772,35 @@
         local_pImageFormatInfo = (VkPhysicalDeviceImageFormatInfo2*)pool->alloc(sizeof(const VkPhysicalDeviceImageFormatInfo2));
         deepcopy_VkPhysicalDeviceImageFormatInfo2(pool, pImageFormatInfo, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo));
     }
+    local_doLock = doLock;
     if (local_pImageFormatInfo)
     {
         transform_tohost_VkPhysicalDeviceImageFormatInfo2(mImpl->resources(), (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_983;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_983, 1);
-        countingStream->write((uint64_t*)&cgen_var_983, 1 * 8);
-        marshal_VkPhysicalDeviceImageFormatInfo2(countingStream, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo));
-        marshal_VkImageFormatProperties2(countingStream, (VkImageFormatProperties2*)(pImageFormatProperties));
+        uint64_t cgen_var_874;
+        *countPtr += 1 * 8;
+        count_VkPhysicalDeviceImageFormatInfo2(featureBits, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo), countPtr);
+        count_VkImageFormatProperties2(featureBits, (VkImageFormatProperties2*)(pImageFormatProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceImageFormatProperties2KHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceImageFormatProperties2KHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceImageFormatProperties2KHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceImageFormatProperties2KHR = OP_vkGetPhysicalDeviceImageFormatProperties2KHR;
-    stream->write(&opcode_vkGetPhysicalDeviceImageFormatProperties2KHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceImageFormatProperties2KHR, sizeof(uint32_t));
-    uint64_t cgen_var_984;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_984, 1);
-    stream->write((uint64_t*)&cgen_var_984, 1 * 8);
-    marshal_VkPhysicalDeviceImageFormatInfo2(stream, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo));
-    marshal_VkImageFormatProperties2(stream, (VkImageFormatProperties2*)(pImageFormatProperties));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceImageFormatProperties2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceImageFormatProperties2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_875;
+    *&cgen_var_875 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_875, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPhysicalDeviceImageFormatInfo2(stream, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo), streamPtrPtr);
+    reservedmarshal_VkImageFormatProperties2(stream, (VkImageFormatProperties2*)(pImageFormatProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkImageFormatProperties2(stream, (VkImageFormatProperties2*)(pImageFormatProperties));
     if (pImageFormatProperties)
     {
@@ -14251,9 +16808,13 @@
     }
     VkResult vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceImageFormatProperties2KHR");;
     return vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return;
 }
@@ -14261,65 +16822,75 @@
 void VkEncoder::vkGetPhysicalDeviceQueueFamilyProperties2KHR(
     VkPhysicalDevice physicalDevice,
     uint32_t* pQueueFamilyPropertyCount,
-    VkQueueFamilyProperties2* pQueueFamilyProperties)
+    VkQueueFamilyProperties2* pQueueFamilyProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceQueueFamilyProperties2KHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_985;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_985, 1);
-        countingStream->write((uint64_t*)&cgen_var_985, 1 * 8);
+        uint64_t cgen_var_876;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_986 = (uint64_t)(uintptr_t)pQueueFamilyPropertyCount;
-        countingStream->putBe64(cgen_var_986);
+        *countPtr += 8;
         if (pQueueFamilyPropertyCount)
         {
-            countingStream->write((uint32_t*)pQueueFamilyPropertyCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_987 = (uint64_t)(uintptr_t)pQueueFamilyProperties;
-        countingStream->putBe64(cgen_var_987);
+        *countPtr += 8;
         if (pQueueFamilyProperties)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
             {
-                marshal_VkQueueFamilyProperties2(countingStream, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
+                count_VkQueueFamilyProperties2(featureBits, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceQueueFamilyProperties2KHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceQueueFamilyProperties2KHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceQueueFamilyProperties2KHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceQueueFamilyProperties2KHR = OP_vkGetPhysicalDeviceQueueFamilyProperties2KHR;
-    stream->write(&opcode_vkGetPhysicalDeviceQueueFamilyProperties2KHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceQueueFamilyProperties2KHR, sizeof(uint32_t));
-    uint64_t cgen_var_988;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_988, 1);
-    stream->write((uint64_t*)&cgen_var_988, 1 * 8);
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceQueueFamilyProperties2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceQueueFamilyProperties2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_877;
+    *&cgen_var_877 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_877, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_989 = (uint64_t)(uintptr_t)pQueueFamilyPropertyCount;
-    stream->putBe64(cgen_var_989);
+    uint64_t cgen_var_878 = (uint64_t)(uintptr_t)pQueueFamilyPropertyCount;
+    memcpy((*streamPtrPtr), &cgen_var_878, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pQueueFamilyPropertyCount)
     {
-        stream->write((uint32_t*)pQueueFamilyPropertyCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pQueueFamilyPropertyCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_990 = (uint64_t)(uintptr_t)pQueueFamilyProperties;
-    stream->putBe64(cgen_var_990);
+    uint64_t cgen_var_879 = (uint64_t)(uintptr_t)pQueueFamilyProperties;
+    memcpy((*streamPtrPtr), &cgen_var_879, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pQueueFamilyProperties)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i)
         {
-            marshal_VkQueueFamilyProperties2(stream, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
+            reservedmarshal_VkQueueFamilyProperties2(stream, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pQueueFamilyPropertyCount;
     check_pQueueFamilyPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -14352,50 +16923,65 @@
             transform_fromhost_VkQueueFamilyProperties2(mImpl->resources(), (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
         }
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceQueueFamilyProperties2KHR");;
 }
 
 void VkEncoder::vkGetPhysicalDeviceMemoryProperties2KHR(
     VkPhysicalDevice physicalDevice,
-    VkPhysicalDeviceMemoryProperties2* pMemoryProperties)
+    VkPhysicalDeviceMemoryProperties2* pMemoryProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceMemoryProperties2KHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_993;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_993, 1);
-        countingStream->write((uint64_t*)&cgen_var_993, 1 * 8);
-        marshal_VkPhysicalDeviceMemoryProperties2(countingStream, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
+        uint64_t cgen_var_882;
+        *countPtr += 1 * 8;
+        count_VkPhysicalDeviceMemoryProperties2(featureBits, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceMemoryProperties2KHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceMemoryProperties2KHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceMemoryProperties2KHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceMemoryProperties2KHR = OP_vkGetPhysicalDeviceMemoryProperties2KHR;
-    stream->write(&opcode_vkGetPhysicalDeviceMemoryProperties2KHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceMemoryProperties2KHR, sizeof(uint32_t));
-    uint64_t cgen_var_994;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_994, 1);
-    stream->write((uint64_t*)&cgen_var_994, 1 * 8);
-    marshal_VkPhysicalDeviceMemoryProperties2(stream, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceMemoryProperties2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceMemoryProperties2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_883;
+    *&cgen_var_883 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_883, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPhysicalDeviceMemoryProperties2(stream, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkPhysicalDeviceMemoryProperties2(stream, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
     if (pMemoryProperties)
     {
         transform_fromhost_VkPhysicalDeviceMemoryProperties2(mImpl->resources(), (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
     }
     mImpl->resources()->on_vkGetPhysicalDeviceMemoryProperties2KHR(this, physicalDevice, pMemoryProperties);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceMemoryProperties2KHR");;
 }
 
@@ -14403,17 +16989,17 @@
     VkPhysicalDevice physicalDevice,
     const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo,
     uint32_t* pPropertyCount,
-    VkSparseImageFormatProperties2* pProperties)
+    VkSparseImageFormatProperties2* pProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceSparseImageFormatProperties2KHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkPhysicalDeviceSparseImageFormatInfo2* local_pFormatInfo;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_pFormatInfo = nullptr;
     if (pFormatInfo)
@@ -14421,60 +17007,70 @@
         local_pFormatInfo = (VkPhysicalDeviceSparseImageFormatInfo2*)pool->alloc(sizeof(const VkPhysicalDeviceSparseImageFormatInfo2));
         deepcopy_VkPhysicalDeviceSparseImageFormatInfo2(pool, pFormatInfo, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo));
     }
+    local_doLock = doLock;
     if (local_pFormatInfo)
     {
         transform_tohost_VkPhysicalDeviceSparseImageFormatInfo2(mImpl->resources(), (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_995;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_995, 1);
-        countingStream->write((uint64_t*)&cgen_var_995, 1 * 8);
-        marshal_VkPhysicalDeviceSparseImageFormatInfo2(countingStream, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo));
+        uint64_t cgen_var_884;
+        *countPtr += 1 * 8;
+        count_VkPhysicalDeviceSparseImageFormatInfo2(featureBits, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_996 = (uint64_t)(uintptr_t)pPropertyCount;
-        countingStream->putBe64(cgen_var_996);
+        *countPtr += 8;
         if (pPropertyCount)
         {
-            countingStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_997 = (uint64_t)(uintptr_t)pProperties;
-        countingStream->putBe64(cgen_var_997);
+        *countPtr += 8;
         if (pProperties)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                marshal_VkSparseImageFormatProperties2(countingStream, (VkSparseImageFormatProperties2*)(pProperties + i));
+                count_VkSparseImageFormatProperties2(featureBits, (VkSparseImageFormatProperties2*)(pProperties + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceSparseImageFormatProperties2KHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceSparseImageFormatProperties2KHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceSparseImageFormatProperties2KHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceSparseImageFormatProperties2KHR = OP_vkGetPhysicalDeviceSparseImageFormatProperties2KHR;
-    stream->write(&opcode_vkGetPhysicalDeviceSparseImageFormatProperties2KHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceSparseImageFormatProperties2KHR, sizeof(uint32_t));
-    uint64_t cgen_var_998;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_998, 1);
-    stream->write((uint64_t*)&cgen_var_998, 1 * 8);
-    marshal_VkPhysicalDeviceSparseImageFormatInfo2(stream, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceSparseImageFormatProperties2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceSparseImageFormatProperties2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_885;
+    *&cgen_var_885 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_885, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPhysicalDeviceSparseImageFormatInfo2(stream, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_999 = (uint64_t)(uintptr_t)pPropertyCount;
-    stream->putBe64(cgen_var_999);
+    uint64_t cgen_var_886 = (uint64_t)(uintptr_t)pPropertyCount;
+    memcpy((*streamPtrPtr), &cgen_var_886, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pPropertyCount)
     {
-        stream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pPropertyCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_1000 = (uint64_t)(uintptr_t)pProperties;
-    stream->putBe64(cgen_var_1000);
+    uint64_t cgen_var_887 = (uint64_t)(uintptr_t)pProperties;
+    memcpy((*streamPtrPtr), &cgen_var_887, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pProperties)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            marshal_VkSparseImageFormatProperties2(stream, (VkSparseImageFormatProperties2*)(pProperties + i));
+            reservedmarshal_VkSparseImageFormatProperties2(stream, (VkSparseImageFormatProperties2*)(pProperties + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pPropertyCount;
     check_pPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -14507,9 +17103,13 @@
             transform_fromhost_VkSparseImageFormatProperties2(mImpl->resources(), (VkSparseImageFormatProperties2*)(pProperties + i));
         }
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceSparseImageFormatProperties2KHR");;
 }
 
@@ -14520,86 +17120,113 @@
     uint32_t heapIndex,
     uint32_t localDeviceIndex,
     uint32_t remoteDeviceIndex,
-    VkPeerMemoryFeatureFlags* pPeerMemoryFeatures)
+    VkPeerMemoryFeatureFlags* pPeerMemoryFeatures,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetDeviceGroupPeerMemoryFeaturesKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     uint32_t local_heapIndex;
     uint32_t local_localDeviceIndex;
     uint32_t local_remoteDeviceIndex;
+    uint32_t local_doLock;
     local_device = device;
     local_heapIndex = heapIndex;
     local_localDeviceIndex = localDeviceIndex;
     local_remoteDeviceIndex = remoteDeviceIndex;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1003;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1003, 1);
-        countingStream->write((uint64_t*)&cgen_var_1003, 1 * 8);
-        countingStream->write((uint32_t*)&local_heapIndex, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_localDeviceIndex, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_remoteDeviceIndex, sizeof(uint32_t));
-        countingStream->write((VkPeerMemoryFeatureFlags*)pPeerMemoryFeatures, sizeof(VkPeerMemoryFeatureFlags));
+        uint64_t cgen_var_890;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(VkPeerMemoryFeatureFlags);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetDeviceGroupPeerMemoryFeaturesKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetDeviceGroupPeerMemoryFeaturesKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceGroupPeerMemoryFeaturesKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetDeviceGroupPeerMemoryFeaturesKHR = OP_vkGetDeviceGroupPeerMemoryFeaturesKHR;
-    stream->write(&opcode_vkGetDeviceGroupPeerMemoryFeaturesKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetDeviceGroupPeerMemoryFeaturesKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1004;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1004, 1);
-    stream->write((uint64_t*)&cgen_var_1004, 1 * 8);
-    stream->write((uint32_t*)&local_heapIndex, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_localDeviceIndex, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_remoteDeviceIndex, sizeof(uint32_t));
-    stream->write((VkPeerMemoryFeatureFlags*)pPeerMemoryFeatures, sizeof(VkPeerMemoryFeatureFlags));
+    memcpy(streamPtr, &opcode_vkGetDeviceGroupPeerMemoryFeaturesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetDeviceGroupPeerMemoryFeaturesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_891;
+    *&cgen_var_891 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_891, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_heapIndex, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_localDeviceIndex, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_remoteDeviceIndex, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (VkPeerMemoryFeatureFlags*)pPeerMemoryFeatures, sizeof(VkPeerMemoryFeatureFlags));
+    *streamPtrPtr += sizeof(VkPeerMemoryFeatureFlags);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((VkPeerMemoryFeatureFlags*)pPeerMemoryFeatures, sizeof(VkPeerMemoryFeatureFlags));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetDeviceGroupPeerMemoryFeaturesKHR");;
 }
 
 void VkEncoder::vkCmdSetDeviceMaskKHR(
     VkCommandBuffer commandBuffer,
-    uint32_t deviceMask)
+    uint32_t deviceMask,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdSetDeviceMaskKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     uint32_t local_deviceMask;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_deviceMask = deviceMask;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1005;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1005, 1);
-        countingStream->write((uint64_t*)&cgen_var_1005, 1 * 8);
-        countingStream->write((uint32_t*)&local_deviceMask, sizeof(uint32_t));
+        uint64_t cgen_var_892;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdSetDeviceMaskKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdSetDeviceMaskKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetDeviceMaskKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdSetDeviceMaskKHR = OP_vkCmdSetDeviceMaskKHR;
-    stream->write(&opcode_vkCmdSetDeviceMaskKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdSetDeviceMaskKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1006;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1006, 1);
-    stream->write((uint64_t*)&cgen_var_1006, 1 * 8);
-    stream->write((uint32_t*)&local_deviceMask, sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdSetDeviceMaskKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdSetDeviceMaskKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_893;
+    *&cgen_var_893 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_893, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_deviceMask, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdSetDeviceMaskKHR");;
 }
 
@@ -14610,15 +17237,14 @@
     uint32_t baseGroupZ,
     uint32_t groupCountX,
     uint32_t groupCountY,
-    uint32_t groupCountZ)
+    uint32_t groupCountZ,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdDispatchBaseKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     uint32_t local_baseGroupX;
     uint32_t local_baseGroupY;
@@ -14626,6 +17252,7 @@
     uint32_t local_groupCountX;
     uint32_t local_groupCountY;
     uint32_t local_groupCountZ;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_baseGroupX = baseGroupX;
     local_baseGroupY = baseGroupY;
@@ -14633,35 +17260,52 @@
     local_groupCountX = groupCountX;
     local_groupCountY = groupCountY;
     local_groupCountZ = groupCountZ;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1007;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1007, 1);
-        countingStream->write((uint64_t*)&cgen_var_1007, 1 * 8);
-        countingStream->write((uint32_t*)&local_baseGroupX, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_baseGroupY, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_baseGroupZ, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_groupCountX, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_groupCountY, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_groupCountZ, sizeof(uint32_t));
+        uint64_t cgen_var_894;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdDispatchBaseKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdDispatchBaseKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDispatchBaseKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdDispatchBaseKHR = OP_vkCmdDispatchBaseKHR;
-    stream->write(&opcode_vkCmdDispatchBaseKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdDispatchBaseKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1008;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1008, 1);
-    stream->write((uint64_t*)&cgen_var_1008, 1 * 8);
-    stream->write((uint32_t*)&local_baseGroupX, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_baseGroupY, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_baseGroupZ, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_groupCountX, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_groupCountY, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_groupCountZ, sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdDispatchBaseKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdDispatchBaseKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_895;
+    *&cgen_var_895 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_895, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_baseGroupX, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_baseGroupY, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_baseGroupZ, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_groupCountX, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_groupCountY, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_groupCountZ, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdDispatchBaseKHR");;
 }
 
@@ -14672,46 +17316,58 @@
 void VkEncoder::vkTrimCommandPoolKHR(
     VkDevice device,
     VkCommandPool commandPool,
-    VkCommandPoolTrimFlags flags)
+    VkCommandPoolTrimFlags flags,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkTrimCommandPoolKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkCommandPool local_commandPool;
     VkCommandPoolTrimFlags local_flags;
+    uint32_t local_doLock;
     local_device = device;
     local_commandPool = commandPool;
     local_flags = flags;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1009;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1009, 1);
-        countingStream->write((uint64_t*)&cgen_var_1009, 1 * 8);
-        uint64_t cgen_var_1010;
-        countingStream->handleMapping()->mapHandles_VkCommandPool_u64(&local_commandPool, &cgen_var_1010, 1);
-        countingStream->write((uint64_t*)&cgen_var_1010, 1 * 8);
-        countingStream->write((VkCommandPoolTrimFlags*)&local_flags, sizeof(VkCommandPoolTrimFlags));
+        uint64_t cgen_var_896;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_897;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkCommandPoolTrimFlags);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkTrimCommandPoolKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkTrimCommandPoolKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkTrimCommandPoolKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkTrimCommandPoolKHR = OP_vkTrimCommandPoolKHR;
-    stream->write(&opcode_vkTrimCommandPoolKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkTrimCommandPoolKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1011;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1011, 1);
-    stream->write((uint64_t*)&cgen_var_1011, 1 * 8);
-    uint64_t cgen_var_1012;
-    stream->handleMapping()->mapHandles_VkCommandPool_u64(&local_commandPool, &cgen_var_1012, 1);
-    stream->write((uint64_t*)&cgen_var_1012, 1 * 8);
-    stream->write((VkCommandPoolTrimFlags*)&local_flags, sizeof(VkCommandPoolTrimFlags));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkTrimCommandPoolKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkTrimCommandPoolKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_898;
+    *&cgen_var_898 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_898, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_899;
+    *&cgen_var_899 = get_host_u64_VkCommandPool((*&local_commandPool));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_899, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkCommandPoolTrimFlags*)&local_flags, sizeof(VkCommandPoolTrimFlags));
+    *streamPtrPtr += sizeof(VkCommandPoolTrimFlags);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkTrimCommandPoolKHR");;
 }
 
@@ -14720,65 +17376,75 @@
 VkResult VkEncoder::vkEnumeratePhysicalDeviceGroupsKHR(
     VkInstance instance,
     uint32_t* pPhysicalDeviceGroupCount,
-    VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties)
+    VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkEnumeratePhysicalDeviceGroupsKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkInstance local_instance;
+    uint32_t local_doLock;
     local_instance = instance;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1013;
-        countingStream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_1013, 1);
-        countingStream->write((uint64_t*)&cgen_var_1013, 1 * 8);
+        uint64_t cgen_var_900;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_1014 = (uint64_t)(uintptr_t)pPhysicalDeviceGroupCount;
-        countingStream->putBe64(cgen_var_1014);
+        *countPtr += 8;
         if (pPhysicalDeviceGroupCount)
         {
-            countingStream->write((uint32_t*)pPhysicalDeviceGroupCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_1015 = (uint64_t)(uintptr_t)pPhysicalDeviceGroupProperties;
-        countingStream->putBe64(cgen_var_1015);
+        *countPtr += 8;
         if (pPhysicalDeviceGroupProperties)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i)
             {
-                marshal_VkPhysicalDeviceGroupProperties(countingStream, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i));
+                count_VkPhysicalDeviceGroupProperties(featureBits, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkEnumeratePhysicalDeviceGroupsKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkEnumeratePhysicalDeviceGroupsKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkEnumeratePhysicalDeviceGroupsKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkEnumeratePhysicalDeviceGroupsKHR = OP_vkEnumeratePhysicalDeviceGroupsKHR;
-    stream->write(&opcode_vkEnumeratePhysicalDeviceGroupsKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkEnumeratePhysicalDeviceGroupsKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1016;
-    stream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_1016, 1);
-    stream->write((uint64_t*)&cgen_var_1016, 1 * 8);
+    memcpy(streamPtr, &opcode_vkEnumeratePhysicalDeviceGroupsKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkEnumeratePhysicalDeviceGroupsKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_901;
+    *&cgen_var_901 = get_host_u64_VkInstance((*&local_instance));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_901, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_1017 = (uint64_t)(uintptr_t)pPhysicalDeviceGroupCount;
-    stream->putBe64(cgen_var_1017);
+    uint64_t cgen_var_902 = (uint64_t)(uintptr_t)pPhysicalDeviceGroupCount;
+    memcpy((*streamPtrPtr), &cgen_var_902, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pPhysicalDeviceGroupCount)
     {
-        stream->write((uint32_t*)pPhysicalDeviceGroupCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pPhysicalDeviceGroupCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_1018 = (uint64_t)(uintptr_t)pPhysicalDeviceGroupProperties;
-    stream->putBe64(cgen_var_1018);
+    uint64_t cgen_var_903 = (uint64_t)(uintptr_t)pPhysicalDeviceGroupProperties;
+    memcpy((*streamPtrPtr), &cgen_var_903, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pPhysicalDeviceGroupProperties)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i)
         {
-            marshal_VkPhysicalDeviceGroupProperties(stream, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i));
+            reservedmarshal_VkPhysicalDeviceGroupProperties(stream, (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pPhysicalDeviceGroupCount;
     check_pPhysicalDeviceGroupCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -14813,9 +17479,13 @@
     }
     VkResult vkEnumeratePhysicalDeviceGroupsKHR_VkResult_return = (VkResult)0;
     stream->read(&vkEnumeratePhysicalDeviceGroupsKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkEnumeratePhysicalDeviceGroupsKHR");;
     return vkEnumeratePhysicalDeviceGroupsKHR_VkResult_return;
 }
@@ -14825,17 +17495,17 @@
 void VkEncoder::vkGetPhysicalDeviceExternalBufferPropertiesKHR(
     VkPhysicalDevice physicalDevice,
     const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo,
-    VkExternalBufferProperties* pExternalBufferProperties)
+    VkExternalBufferProperties* pExternalBufferProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceExternalBufferPropertiesKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkPhysicalDeviceExternalBufferInfo* local_pExternalBufferInfo;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_pExternalBufferInfo = nullptr;
     if (pExternalBufferInfo)
@@ -14843,38 +17513,49 @@
         local_pExternalBufferInfo = (VkPhysicalDeviceExternalBufferInfo*)pool->alloc(sizeof(const VkPhysicalDeviceExternalBufferInfo));
         deepcopy_VkPhysicalDeviceExternalBufferInfo(pool, pExternalBufferInfo, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo));
     }
+    local_doLock = doLock;
     if (local_pExternalBufferInfo)
     {
         mImpl->resources()->transformImpl_VkPhysicalDeviceExternalBufferInfo_tohost(local_pExternalBufferInfo, 1);
         transform_tohost_VkPhysicalDeviceExternalBufferInfo(mImpl->resources(), (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1021;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1021, 1);
-        countingStream->write((uint64_t*)&cgen_var_1021, 1 * 8);
-        marshal_VkPhysicalDeviceExternalBufferInfo(countingStream, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo));
-        marshal_VkExternalBufferProperties(countingStream, (VkExternalBufferProperties*)(pExternalBufferProperties));
+        uint64_t cgen_var_906;
+        *countPtr += 1 * 8;
+        count_VkPhysicalDeviceExternalBufferInfo(featureBits, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo), countPtr);
+        count_VkExternalBufferProperties(featureBits, (VkExternalBufferProperties*)(pExternalBufferProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceExternalBufferPropertiesKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceExternalBufferPropertiesKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceExternalBufferPropertiesKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceExternalBufferPropertiesKHR = OP_vkGetPhysicalDeviceExternalBufferPropertiesKHR;
-    stream->write(&opcode_vkGetPhysicalDeviceExternalBufferPropertiesKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceExternalBufferPropertiesKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1022;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1022, 1);
-    stream->write((uint64_t*)&cgen_var_1022, 1 * 8);
-    marshal_VkPhysicalDeviceExternalBufferInfo(stream, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo));
-    marshal_VkExternalBufferProperties(stream, (VkExternalBufferProperties*)(pExternalBufferProperties));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceExternalBufferPropertiesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceExternalBufferPropertiesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_907;
+    *&cgen_var_907 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_907, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPhysicalDeviceExternalBufferInfo(stream, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo), streamPtrPtr);
+    reservedmarshal_VkExternalBufferProperties(stream, (VkExternalBufferProperties*)(pExternalBufferProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkExternalBufferProperties(stream, (VkExternalBufferProperties*)(pExternalBufferProperties));
     if (pExternalBufferProperties)
     {
         mImpl->resources()->transformImpl_VkExternalBufferProperties_fromhost(pExternalBufferProperties, 1);
         transform_fromhost_VkExternalBufferProperties(mImpl->resources(), (VkExternalBufferProperties*)(pExternalBufferProperties));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceExternalBufferPropertiesKHR");;
 }
 
@@ -14885,17 +17566,17 @@
 VkResult VkEncoder::vkGetMemoryWin32HandleKHR(
     VkDevice device,
     const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo,
-    HANDLE* pHandle)
+    HANDLE* pHandle,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetMemoryWin32HandleKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkMemoryGetWin32HandleInfoKHR* local_pGetWin32HandleInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pGetWin32HandleInfo = nullptr;
     if (pGetWin32HandleInfo)
@@ -14903,34 +17584,46 @@
         local_pGetWin32HandleInfo = (VkMemoryGetWin32HandleInfoKHR*)pool->alloc(sizeof(const VkMemoryGetWin32HandleInfoKHR));
         deepcopy_VkMemoryGetWin32HandleInfoKHR(pool, pGetWin32HandleInfo, (VkMemoryGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo));
     }
+    local_doLock = doLock;
     if (local_pGetWin32HandleInfo)
     {
         transform_tohost_VkMemoryGetWin32HandleInfoKHR(mImpl->resources(), (VkMemoryGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1023;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1023, 1);
-        countingStream->write((uint64_t*)&cgen_var_1023, 1 * 8);
-        marshal_VkMemoryGetWin32HandleInfoKHR(countingStream, (VkMemoryGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo));
-        countingStream->write((HANDLE*)pHandle, sizeof(HANDLE));
+        uint64_t cgen_var_908;
+        *countPtr += 1 * 8;
+        count_VkMemoryGetWin32HandleInfoKHR(featureBits, (VkMemoryGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo), countPtr);
+        *countPtr += sizeof(HANDLE);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetMemoryWin32HandleKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetMemoryWin32HandleKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetMemoryWin32HandleKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetMemoryWin32HandleKHR = OP_vkGetMemoryWin32HandleKHR;
-    stream->write(&opcode_vkGetMemoryWin32HandleKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetMemoryWin32HandleKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1024;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1024, 1);
-    stream->write((uint64_t*)&cgen_var_1024, 1 * 8);
-    marshal_VkMemoryGetWin32HandleInfoKHR(stream, (VkMemoryGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo));
-    stream->write((HANDLE*)pHandle, sizeof(HANDLE));
+    memcpy(streamPtr, &opcode_vkGetMemoryWin32HandleKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetMemoryWin32HandleKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_909;
+    *&cgen_var_909 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_909, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkMemoryGetWin32HandleInfoKHR(stream, (VkMemoryGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (HANDLE*)pHandle, sizeof(HANDLE));
+    *streamPtrPtr += sizeof(HANDLE);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((HANDLE*)pHandle, sizeof(HANDLE));
     VkResult vkGetMemoryWin32HandleKHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetMemoryWin32HandleKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetMemoryWin32HandleKHR");;
     return vkGetMemoryWin32HandleKHR_VkResult_return;
 }
@@ -14939,41 +17632,50 @@
     VkDevice device,
     VkExternalMemoryHandleTypeFlagBits handleType,
     HANDLE handle,
-    VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties)
+    VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetMemoryWin32HandlePropertiesKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkExternalMemoryHandleTypeFlagBits local_handleType;
     HANDLE local_handle;
+    uint32_t local_doLock;
     local_device = device;
     local_handleType = handleType;
     local_handle = handle;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1025;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1025, 1);
-        countingStream->write((uint64_t*)&cgen_var_1025, 1 * 8);
-        countingStream->write((VkExternalMemoryHandleTypeFlagBits*)&local_handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
-        countingStream->write((HANDLE*)&local_handle, sizeof(HANDLE));
-        marshal_VkMemoryWin32HandlePropertiesKHR(countingStream, (VkMemoryWin32HandlePropertiesKHR*)(pMemoryWin32HandleProperties));
+        uint64_t cgen_var_910;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkExternalMemoryHandleTypeFlagBits);
+        *countPtr += sizeof(HANDLE);
+        count_VkMemoryWin32HandlePropertiesKHR(featureBits, (VkMemoryWin32HandlePropertiesKHR*)(pMemoryWin32HandleProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetMemoryWin32HandlePropertiesKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetMemoryWin32HandlePropertiesKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetMemoryWin32HandlePropertiesKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetMemoryWin32HandlePropertiesKHR = OP_vkGetMemoryWin32HandlePropertiesKHR;
-    stream->write(&opcode_vkGetMemoryWin32HandlePropertiesKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetMemoryWin32HandlePropertiesKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1026;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1026, 1);
-    stream->write((uint64_t*)&cgen_var_1026, 1 * 8);
-    stream->write((VkExternalMemoryHandleTypeFlagBits*)&local_handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
-    stream->write((HANDLE*)&local_handle, sizeof(HANDLE));
-    marshal_VkMemoryWin32HandlePropertiesKHR(stream, (VkMemoryWin32HandlePropertiesKHR*)(pMemoryWin32HandleProperties));
+    memcpy(streamPtr, &opcode_vkGetMemoryWin32HandlePropertiesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetMemoryWin32HandlePropertiesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_911;
+    *&cgen_var_911 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_911, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkExternalMemoryHandleTypeFlagBits*)&local_handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    *streamPtrPtr += sizeof(VkExternalMemoryHandleTypeFlagBits);
+    memcpy(*streamPtrPtr, (HANDLE*)&local_handle, sizeof(HANDLE));
+    *streamPtrPtr += sizeof(HANDLE);
+    reservedmarshal_VkMemoryWin32HandlePropertiesKHR(stream, (VkMemoryWin32HandlePropertiesKHR*)(pMemoryWin32HandleProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkMemoryWin32HandlePropertiesKHR(stream, (VkMemoryWin32HandlePropertiesKHR*)(pMemoryWin32HandleProperties));
     if (pMemoryWin32HandleProperties)
     {
@@ -14981,9 +17683,13 @@
     }
     VkResult vkGetMemoryWin32HandlePropertiesKHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetMemoryWin32HandlePropertiesKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetMemoryWin32HandlePropertiesKHR");;
     return vkGetMemoryWin32HandlePropertiesKHR_VkResult_return;
 }
@@ -14993,17 +17699,17 @@
 VkResult VkEncoder::vkGetMemoryFdKHR(
     VkDevice device,
     const VkMemoryGetFdInfoKHR* pGetFdInfo,
-    int* pFd)
+    int* pFd,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetMemoryFdKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkMemoryGetFdInfoKHR* local_pGetFdInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pGetFdInfo = nullptr;
     if (pGetFdInfo)
@@ -15011,34 +17717,46 @@
         local_pGetFdInfo = (VkMemoryGetFdInfoKHR*)pool->alloc(sizeof(const VkMemoryGetFdInfoKHR));
         deepcopy_VkMemoryGetFdInfoKHR(pool, pGetFdInfo, (VkMemoryGetFdInfoKHR*)(local_pGetFdInfo));
     }
+    local_doLock = doLock;
     if (local_pGetFdInfo)
     {
         transform_tohost_VkMemoryGetFdInfoKHR(mImpl->resources(), (VkMemoryGetFdInfoKHR*)(local_pGetFdInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1027;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1027, 1);
-        countingStream->write((uint64_t*)&cgen_var_1027, 1 * 8);
-        marshal_VkMemoryGetFdInfoKHR(countingStream, (VkMemoryGetFdInfoKHR*)(local_pGetFdInfo));
-        countingStream->write((int*)pFd, sizeof(int));
+        uint64_t cgen_var_912;
+        *countPtr += 1 * 8;
+        count_VkMemoryGetFdInfoKHR(featureBits, (VkMemoryGetFdInfoKHR*)(local_pGetFdInfo), countPtr);
+        *countPtr += sizeof(int);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetMemoryFdKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetMemoryFdKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetMemoryFdKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetMemoryFdKHR = OP_vkGetMemoryFdKHR;
-    stream->write(&opcode_vkGetMemoryFdKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetMemoryFdKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1028;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1028, 1);
-    stream->write((uint64_t*)&cgen_var_1028, 1 * 8);
-    marshal_VkMemoryGetFdInfoKHR(stream, (VkMemoryGetFdInfoKHR*)(local_pGetFdInfo));
-    stream->write((int*)pFd, sizeof(int));
+    memcpy(streamPtr, &opcode_vkGetMemoryFdKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetMemoryFdKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_913;
+    *&cgen_var_913 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_913, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkMemoryGetFdInfoKHR(stream, (VkMemoryGetFdInfoKHR*)(local_pGetFdInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (int*)pFd, sizeof(int));
+    *streamPtrPtr += sizeof(int);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((int*)pFd, sizeof(int));
     VkResult vkGetMemoryFdKHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetMemoryFdKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetMemoryFdKHR");;
     return vkGetMemoryFdKHR_VkResult_return;
 }
@@ -15047,41 +17765,50 @@
     VkDevice device,
     VkExternalMemoryHandleTypeFlagBits handleType,
     int fd,
-    VkMemoryFdPropertiesKHR* pMemoryFdProperties)
+    VkMemoryFdPropertiesKHR* pMemoryFdProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetMemoryFdPropertiesKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkExternalMemoryHandleTypeFlagBits local_handleType;
     int local_fd;
+    uint32_t local_doLock;
     local_device = device;
     local_handleType = handleType;
     local_fd = fd;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1029;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1029, 1);
-        countingStream->write((uint64_t*)&cgen_var_1029, 1 * 8);
-        countingStream->write((VkExternalMemoryHandleTypeFlagBits*)&local_handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
-        countingStream->write((int*)&local_fd, sizeof(int));
-        marshal_VkMemoryFdPropertiesKHR(countingStream, (VkMemoryFdPropertiesKHR*)(pMemoryFdProperties));
+        uint64_t cgen_var_914;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkExternalMemoryHandleTypeFlagBits);
+        *countPtr += sizeof(int);
+        count_VkMemoryFdPropertiesKHR(featureBits, (VkMemoryFdPropertiesKHR*)(pMemoryFdProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetMemoryFdPropertiesKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetMemoryFdPropertiesKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetMemoryFdPropertiesKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetMemoryFdPropertiesKHR = OP_vkGetMemoryFdPropertiesKHR;
-    stream->write(&opcode_vkGetMemoryFdPropertiesKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetMemoryFdPropertiesKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1030;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1030, 1);
-    stream->write((uint64_t*)&cgen_var_1030, 1 * 8);
-    stream->write((VkExternalMemoryHandleTypeFlagBits*)&local_handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
-    stream->write((int*)&local_fd, sizeof(int));
-    marshal_VkMemoryFdPropertiesKHR(stream, (VkMemoryFdPropertiesKHR*)(pMemoryFdProperties));
+    memcpy(streamPtr, &opcode_vkGetMemoryFdPropertiesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetMemoryFdPropertiesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_915;
+    *&cgen_var_915 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_915, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkExternalMemoryHandleTypeFlagBits*)&local_handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    *streamPtrPtr += sizeof(VkExternalMemoryHandleTypeFlagBits);
+    memcpy(*streamPtrPtr, (int*)&local_fd, sizeof(int));
+    *streamPtrPtr += sizeof(int);
+    reservedmarshal_VkMemoryFdPropertiesKHR(stream, (VkMemoryFdPropertiesKHR*)(pMemoryFdProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkMemoryFdPropertiesKHR(stream, (VkMemoryFdPropertiesKHR*)(pMemoryFdProperties));
     if (pMemoryFdProperties)
     {
@@ -15089,9 +17816,13 @@
     }
     VkResult vkGetMemoryFdPropertiesKHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetMemoryFdPropertiesKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetMemoryFdPropertiesKHR");;
     return vkGetMemoryFdPropertiesKHR_VkResult_return;
 }
@@ -15103,17 +17834,17 @@
 void VkEncoder::vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(
     VkPhysicalDevice physicalDevice,
     const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,
-    VkExternalSemaphoreProperties* pExternalSemaphoreProperties)
+    VkExternalSemaphoreProperties* pExternalSemaphoreProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceExternalSemaphorePropertiesKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkPhysicalDeviceExternalSemaphoreInfo* local_pExternalSemaphoreInfo;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_pExternalSemaphoreInfo = nullptr;
     if (pExternalSemaphoreInfo)
@@ -15121,36 +17852,47 @@
         local_pExternalSemaphoreInfo = (VkPhysicalDeviceExternalSemaphoreInfo*)pool->alloc(sizeof(const VkPhysicalDeviceExternalSemaphoreInfo));
         deepcopy_VkPhysicalDeviceExternalSemaphoreInfo(pool, pExternalSemaphoreInfo, (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo));
     }
+    local_doLock = doLock;
     if (local_pExternalSemaphoreInfo)
     {
         transform_tohost_VkPhysicalDeviceExternalSemaphoreInfo(mImpl->resources(), (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1031;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1031, 1);
-        countingStream->write((uint64_t*)&cgen_var_1031, 1 * 8);
-        marshal_VkPhysicalDeviceExternalSemaphoreInfo(countingStream, (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo));
-        marshal_VkExternalSemaphoreProperties(countingStream, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
+        uint64_t cgen_var_916;
+        *countPtr += 1 * 8;
+        count_VkPhysicalDeviceExternalSemaphoreInfo(featureBits, (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo), countPtr);
+        count_VkExternalSemaphoreProperties(featureBits, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR = OP_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR;
-    stream->write(&opcode_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1032;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1032, 1);
-    stream->write((uint64_t*)&cgen_var_1032, 1 * 8);
-    marshal_VkPhysicalDeviceExternalSemaphoreInfo(stream, (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo));
-    marshal_VkExternalSemaphoreProperties(stream, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_917;
+    *&cgen_var_917 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_917, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPhysicalDeviceExternalSemaphoreInfo(stream, (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo), streamPtrPtr);
+    reservedmarshal_VkExternalSemaphoreProperties(stream, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkExternalSemaphoreProperties(stream, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
     if (pExternalSemaphoreProperties)
     {
         transform_fromhost_VkExternalSemaphoreProperties(mImpl->resources(), (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceExternalSemaphorePropertiesKHR");;
 }
 
@@ -15160,17 +17902,17 @@
 #ifdef VK_KHR_external_semaphore_win32
 VkResult VkEncoder::vkImportSemaphoreWin32HandleKHR(
     VkDevice device,
-    const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo)
+    const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkImportSemaphoreWin32HandleKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkImportSemaphoreWin32HandleInfoKHR* local_pImportSemaphoreWin32HandleInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pImportSemaphoreWin32HandleInfo = nullptr;
     if (pImportSemaphoreWin32HandleInfo)
@@ -15178,31 +17920,42 @@
         local_pImportSemaphoreWin32HandleInfo = (VkImportSemaphoreWin32HandleInfoKHR*)pool->alloc(sizeof(const VkImportSemaphoreWin32HandleInfoKHR));
         deepcopy_VkImportSemaphoreWin32HandleInfoKHR(pool, pImportSemaphoreWin32HandleInfo, (VkImportSemaphoreWin32HandleInfoKHR*)(local_pImportSemaphoreWin32HandleInfo));
     }
+    local_doLock = doLock;
     if (local_pImportSemaphoreWin32HandleInfo)
     {
         transform_tohost_VkImportSemaphoreWin32HandleInfoKHR(mImpl->resources(), (VkImportSemaphoreWin32HandleInfoKHR*)(local_pImportSemaphoreWin32HandleInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1033;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1033, 1);
-        countingStream->write((uint64_t*)&cgen_var_1033, 1 * 8);
-        marshal_VkImportSemaphoreWin32HandleInfoKHR(countingStream, (VkImportSemaphoreWin32HandleInfoKHR*)(local_pImportSemaphoreWin32HandleInfo));
+        uint64_t cgen_var_918;
+        *countPtr += 1 * 8;
+        count_VkImportSemaphoreWin32HandleInfoKHR(featureBits, (VkImportSemaphoreWin32HandleInfoKHR*)(local_pImportSemaphoreWin32HandleInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkImportSemaphoreWin32HandleKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkImportSemaphoreWin32HandleKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkImportSemaphoreWin32HandleKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkImportSemaphoreWin32HandleKHR = OP_vkImportSemaphoreWin32HandleKHR;
-    stream->write(&opcode_vkImportSemaphoreWin32HandleKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkImportSemaphoreWin32HandleKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1034;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1034, 1);
-    stream->write((uint64_t*)&cgen_var_1034, 1 * 8);
-    marshal_VkImportSemaphoreWin32HandleInfoKHR(stream, (VkImportSemaphoreWin32HandleInfoKHR*)(local_pImportSemaphoreWin32HandleInfo));
+    memcpy(streamPtr, &opcode_vkImportSemaphoreWin32HandleKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkImportSemaphoreWin32HandleKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_919;
+    *&cgen_var_919 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_919, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkImportSemaphoreWin32HandleInfoKHR(stream, (VkImportSemaphoreWin32HandleInfoKHR*)(local_pImportSemaphoreWin32HandleInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkImportSemaphoreWin32HandleKHR_VkResult_return = (VkResult)0;
     stream->read(&vkImportSemaphoreWin32HandleKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkImportSemaphoreWin32HandleKHR");;
     return vkImportSemaphoreWin32HandleKHR_VkResult_return;
 }
@@ -15210,17 +17963,17 @@
 VkResult VkEncoder::vkGetSemaphoreWin32HandleKHR(
     VkDevice device,
     const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo,
-    HANDLE* pHandle)
+    HANDLE* pHandle,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetSemaphoreWin32HandleKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkSemaphoreGetWin32HandleInfoKHR* local_pGetWin32HandleInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pGetWin32HandleInfo = nullptr;
     if (pGetWin32HandleInfo)
@@ -15228,34 +17981,46 @@
         local_pGetWin32HandleInfo = (VkSemaphoreGetWin32HandleInfoKHR*)pool->alloc(sizeof(const VkSemaphoreGetWin32HandleInfoKHR));
         deepcopy_VkSemaphoreGetWin32HandleInfoKHR(pool, pGetWin32HandleInfo, (VkSemaphoreGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo));
     }
+    local_doLock = doLock;
     if (local_pGetWin32HandleInfo)
     {
         transform_tohost_VkSemaphoreGetWin32HandleInfoKHR(mImpl->resources(), (VkSemaphoreGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1035;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1035, 1);
-        countingStream->write((uint64_t*)&cgen_var_1035, 1 * 8);
-        marshal_VkSemaphoreGetWin32HandleInfoKHR(countingStream, (VkSemaphoreGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo));
-        countingStream->write((HANDLE*)pHandle, sizeof(HANDLE));
+        uint64_t cgen_var_920;
+        *countPtr += 1 * 8;
+        count_VkSemaphoreGetWin32HandleInfoKHR(featureBits, (VkSemaphoreGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo), countPtr);
+        *countPtr += sizeof(HANDLE);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetSemaphoreWin32HandleKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetSemaphoreWin32HandleKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetSemaphoreWin32HandleKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetSemaphoreWin32HandleKHR = OP_vkGetSemaphoreWin32HandleKHR;
-    stream->write(&opcode_vkGetSemaphoreWin32HandleKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetSemaphoreWin32HandleKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1036;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1036, 1);
-    stream->write((uint64_t*)&cgen_var_1036, 1 * 8);
-    marshal_VkSemaphoreGetWin32HandleInfoKHR(stream, (VkSemaphoreGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo));
-    stream->write((HANDLE*)pHandle, sizeof(HANDLE));
+    memcpy(streamPtr, &opcode_vkGetSemaphoreWin32HandleKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetSemaphoreWin32HandleKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_921;
+    *&cgen_var_921 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_921, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkSemaphoreGetWin32HandleInfoKHR(stream, (VkSemaphoreGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (HANDLE*)pHandle, sizeof(HANDLE));
+    *streamPtrPtr += sizeof(HANDLE);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((HANDLE*)pHandle, sizeof(HANDLE));
     VkResult vkGetSemaphoreWin32HandleKHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetSemaphoreWin32HandleKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetSemaphoreWin32HandleKHR");;
     return vkGetSemaphoreWin32HandleKHR_VkResult_return;
 }
@@ -15264,17 +18029,17 @@
 #ifdef VK_KHR_external_semaphore_fd
 VkResult VkEncoder::vkImportSemaphoreFdKHR(
     VkDevice device,
-    const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo)
+    const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkImportSemaphoreFdKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkImportSemaphoreFdInfoKHR* local_pImportSemaphoreFdInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pImportSemaphoreFdInfo = nullptr;
     if (pImportSemaphoreFdInfo)
@@ -15282,31 +18047,42 @@
         local_pImportSemaphoreFdInfo = (VkImportSemaphoreFdInfoKHR*)pool->alloc(sizeof(const VkImportSemaphoreFdInfoKHR));
         deepcopy_VkImportSemaphoreFdInfoKHR(pool, pImportSemaphoreFdInfo, (VkImportSemaphoreFdInfoKHR*)(local_pImportSemaphoreFdInfo));
     }
+    local_doLock = doLock;
     if (local_pImportSemaphoreFdInfo)
     {
         transform_tohost_VkImportSemaphoreFdInfoKHR(mImpl->resources(), (VkImportSemaphoreFdInfoKHR*)(local_pImportSemaphoreFdInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1037;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1037, 1);
-        countingStream->write((uint64_t*)&cgen_var_1037, 1 * 8);
-        marshal_VkImportSemaphoreFdInfoKHR(countingStream, (VkImportSemaphoreFdInfoKHR*)(local_pImportSemaphoreFdInfo));
+        uint64_t cgen_var_922;
+        *countPtr += 1 * 8;
+        count_VkImportSemaphoreFdInfoKHR(featureBits, (VkImportSemaphoreFdInfoKHR*)(local_pImportSemaphoreFdInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkImportSemaphoreFdKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkImportSemaphoreFdKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkImportSemaphoreFdKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkImportSemaphoreFdKHR = OP_vkImportSemaphoreFdKHR;
-    stream->write(&opcode_vkImportSemaphoreFdKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkImportSemaphoreFdKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1038;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1038, 1);
-    stream->write((uint64_t*)&cgen_var_1038, 1 * 8);
-    marshal_VkImportSemaphoreFdInfoKHR(stream, (VkImportSemaphoreFdInfoKHR*)(local_pImportSemaphoreFdInfo));
+    memcpy(streamPtr, &opcode_vkImportSemaphoreFdKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkImportSemaphoreFdKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_923;
+    *&cgen_var_923 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_923, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkImportSemaphoreFdInfoKHR(stream, (VkImportSemaphoreFdInfoKHR*)(local_pImportSemaphoreFdInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkImportSemaphoreFdKHR_VkResult_return = (VkResult)0;
     stream->read(&vkImportSemaphoreFdKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkImportSemaphoreFdKHR");;
     return vkImportSemaphoreFdKHR_VkResult_return;
 }
@@ -15314,17 +18090,17 @@
 VkResult VkEncoder::vkGetSemaphoreFdKHR(
     VkDevice device,
     const VkSemaphoreGetFdInfoKHR* pGetFdInfo,
-    int* pFd)
+    int* pFd,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetSemaphoreFdKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkSemaphoreGetFdInfoKHR* local_pGetFdInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pGetFdInfo = nullptr;
     if (pGetFdInfo)
@@ -15332,34 +18108,46 @@
         local_pGetFdInfo = (VkSemaphoreGetFdInfoKHR*)pool->alloc(sizeof(const VkSemaphoreGetFdInfoKHR));
         deepcopy_VkSemaphoreGetFdInfoKHR(pool, pGetFdInfo, (VkSemaphoreGetFdInfoKHR*)(local_pGetFdInfo));
     }
+    local_doLock = doLock;
     if (local_pGetFdInfo)
     {
         transform_tohost_VkSemaphoreGetFdInfoKHR(mImpl->resources(), (VkSemaphoreGetFdInfoKHR*)(local_pGetFdInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1039;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1039, 1);
-        countingStream->write((uint64_t*)&cgen_var_1039, 1 * 8);
-        marshal_VkSemaphoreGetFdInfoKHR(countingStream, (VkSemaphoreGetFdInfoKHR*)(local_pGetFdInfo));
-        countingStream->write((int*)pFd, sizeof(int));
+        uint64_t cgen_var_924;
+        *countPtr += 1 * 8;
+        count_VkSemaphoreGetFdInfoKHR(featureBits, (VkSemaphoreGetFdInfoKHR*)(local_pGetFdInfo), countPtr);
+        *countPtr += sizeof(int);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetSemaphoreFdKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetSemaphoreFdKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetSemaphoreFdKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetSemaphoreFdKHR = OP_vkGetSemaphoreFdKHR;
-    stream->write(&opcode_vkGetSemaphoreFdKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetSemaphoreFdKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1040;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1040, 1);
-    stream->write((uint64_t*)&cgen_var_1040, 1 * 8);
-    marshal_VkSemaphoreGetFdInfoKHR(stream, (VkSemaphoreGetFdInfoKHR*)(local_pGetFdInfo));
-    stream->write((int*)pFd, sizeof(int));
+    memcpy(streamPtr, &opcode_vkGetSemaphoreFdKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetSemaphoreFdKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_925;
+    *&cgen_var_925 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_925, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkSemaphoreGetFdInfoKHR(stream, (VkSemaphoreGetFdInfoKHR*)(local_pGetFdInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (int*)pFd, sizeof(int));
+    *streamPtrPtr += sizeof(int);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((int*)pFd, sizeof(int));
     VkResult vkGetSemaphoreFdKHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetSemaphoreFdKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetSemaphoreFdKHR");;
     return vkGetSemaphoreFdKHR_VkResult_return;
 }
@@ -15372,21 +18160,21 @@
     VkPipelineLayout layout,
     uint32_t set,
     uint32_t descriptorWriteCount,
-    const VkWriteDescriptorSet* pDescriptorWrites)
+    const VkWriteDescriptorSet* pDescriptorWrites,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdPushDescriptorSetKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkPipelineBindPoint local_pipelineBindPoint;
     VkPipelineLayout local_layout;
     uint32_t local_set;
     uint32_t local_descriptorWriteCount;
     VkWriteDescriptorSet* local_pDescriptorWrites;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_pipelineBindPoint = pipelineBindPoint;
     local_layout = layout;
@@ -15401,6 +18189,7 @@
             deepcopy_VkWriteDescriptorSet(pool, pDescriptorWrites + i, (VkWriteDescriptorSet*)(local_pDescriptorWrites + i));
         }
     }
+    local_doLock = doLock;
     if (local_pDescriptorWrites)
     {
         for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i)
@@ -15408,43 +18197,56 @@
             transform_tohost_VkWriteDescriptorSet(mImpl->resources(), (VkWriteDescriptorSet*)(local_pDescriptorWrites + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1041;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1041, 1);
-        countingStream->write((uint64_t*)&cgen_var_1041, 1 * 8);
-        countingStream->write((VkPipelineBindPoint*)&local_pipelineBindPoint, sizeof(VkPipelineBindPoint));
-        uint64_t cgen_var_1042;
-        countingStream->handleMapping()->mapHandles_VkPipelineLayout_u64(&local_layout, &cgen_var_1042, 1);
-        countingStream->write((uint64_t*)&cgen_var_1042, 1 * 8);
-        countingStream->write((uint32_t*)&local_set, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_descriptorWriteCount, sizeof(uint32_t));
+        uint64_t cgen_var_926;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkPipelineBindPoint);
+        uint64_t cgen_var_927;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i)
         {
-            marshal_VkWriteDescriptorSet(countingStream, (VkWriteDescriptorSet*)(local_pDescriptorWrites + i));
+            count_VkWriteDescriptorSet(featureBits, (VkWriteDescriptorSet*)(local_pDescriptorWrites + i), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdPushDescriptorSetKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdPushDescriptorSetKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdPushDescriptorSetKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdPushDescriptorSetKHR = OP_vkCmdPushDescriptorSetKHR;
-    stream->write(&opcode_vkCmdPushDescriptorSetKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdPushDescriptorSetKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1043;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1043, 1);
-    stream->write((uint64_t*)&cgen_var_1043, 1 * 8);
-    stream->write((VkPipelineBindPoint*)&local_pipelineBindPoint, sizeof(VkPipelineBindPoint));
-    uint64_t cgen_var_1044;
-    stream->handleMapping()->mapHandles_VkPipelineLayout_u64(&local_layout, &cgen_var_1044, 1);
-    stream->write((uint64_t*)&cgen_var_1044, 1 * 8);
-    stream->write((uint32_t*)&local_set, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_descriptorWriteCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkCmdPushDescriptorSetKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdPushDescriptorSetKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_928;
+    *&cgen_var_928 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_928, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkPipelineBindPoint*)&local_pipelineBindPoint, sizeof(VkPipelineBindPoint));
+    *streamPtrPtr += sizeof(VkPipelineBindPoint);
+    uint64_t cgen_var_929;
+    *&cgen_var_929 = get_host_u64_VkPipelineLayout((*&local_layout));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_929, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_set, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_descriptorWriteCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i)
     {
-        marshal_VkWriteDescriptorSet(stream, (VkWriteDescriptorSet*)(local_pDescriptorWrites + i));
+        reservedmarshal_VkWriteDescriptorSet(stream, (VkWriteDescriptorSet*)(local_pDescriptorWrites + i), streamPtrPtr);
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdPushDescriptorSetKHR");;
 }
 
@@ -15453,20 +18255,20 @@
     VkDescriptorUpdateTemplate descriptorUpdateTemplate,
     VkPipelineLayout layout,
     uint32_t set,
-    const void* pData)
+    const void* pData,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdPushDescriptorSetWithTemplateKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkDescriptorUpdateTemplate local_descriptorUpdateTemplate;
     VkPipelineLayout local_layout;
     uint32_t local_set;
     void* local_pData;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_descriptorUpdateTemplate = descriptorUpdateTemplate;
     local_layout = layout;
@@ -15476,51 +18278,65 @@
     {
         local_pData = (void*)pool->dupArray(pData, sizeof(const uint8_t));
     }
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1045;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1045, 1);
-        countingStream->write((uint64_t*)&cgen_var_1045, 1 * 8);
-        uint64_t cgen_var_1046;
-        countingStream->handleMapping()->mapHandles_VkDescriptorUpdateTemplate_u64(&local_descriptorUpdateTemplate, &cgen_var_1046, 1);
-        countingStream->write((uint64_t*)&cgen_var_1046, 1 * 8);
-        uint64_t cgen_var_1047;
-        countingStream->handleMapping()->mapHandles_VkPipelineLayout_u64(&local_layout, &cgen_var_1047, 1);
-        countingStream->write((uint64_t*)&cgen_var_1047, 1 * 8);
-        countingStream->write((uint32_t*)&local_set, sizeof(uint32_t));
+        uint64_t cgen_var_930;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_931;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_932;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         // WARNING PTR CHECK
-        uint64_t cgen_var_1048 = (uint64_t)(uintptr_t)local_pData;
-        countingStream->putBe64(cgen_var_1048);
+        *countPtr += 8;
         if (local_pData)
         {
-            countingStream->write((void*)local_pData, sizeof(uint8_t));
+            *countPtr += sizeof(uint8_t);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdPushDescriptorSetWithTemplateKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdPushDescriptorSetWithTemplateKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdPushDescriptorSetWithTemplateKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdPushDescriptorSetWithTemplateKHR = OP_vkCmdPushDescriptorSetWithTemplateKHR;
-    stream->write(&opcode_vkCmdPushDescriptorSetWithTemplateKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdPushDescriptorSetWithTemplateKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1049;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1049, 1);
-    stream->write((uint64_t*)&cgen_var_1049, 1 * 8);
-    uint64_t cgen_var_1050;
-    stream->handleMapping()->mapHandles_VkDescriptorUpdateTemplate_u64(&local_descriptorUpdateTemplate, &cgen_var_1050, 1);
-    stream->write((uint64_t*)&cgen_var_1050, 1 * 8);
-    uint64_t cgen_var_1051;
-    stream->handleMapping()->mapHandles_VkPipelineLayout_u64(&local_layout, &cgen_var_1051, 1);
-    stream->write((uint64_t*)&cgen_var_1051, 1 * 8);
-    stream->write((uint32_t*)&local_set, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkCmdPushDescriptorSetWithTemplateKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdPushDescriptorSetWithTemplateKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_933;
+    *&cgen_var_933 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_933, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_934;
+    *&cgen_var_934 = get_host_u64_VkDescriptorUpdateTemplate((*&local_descriptorUpdateTemplate));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_934, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_935;
+    *&cgen_var_935 = get_host_u64_VkPipelineLayout((*&local_layout));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_935, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_set, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
-    uint64_t cgen_var_1052 = (uint64_t)(uintptr_t)local_pData;
-    stream->putBe64(cgen_var_1052);
+    uint64_t cgen_var_936 = (uint64_t)(uintptr_t)local_pData;
+    memcpy((*streamPtrPtr), &cgen_var_936, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pData)
     {
-        stream->write((void*)local_pData, sizeof(uint8_t));
+        memcpy(*streamPtrPtr, (void*)local_pData, sizeof(uint8_t));
+        *streamPtrPtr += sizeof(uint8_t);
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdPushDescriptorSetWithTemplateKHR");;
 }
 
@@ -15534,18 +18350,18 @@
     VkDevice device,
     const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate)
+    VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateDescriptorUpdateTemplateKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDescriptorUpdateTemplateCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -15559,6 +18375,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -15568,55 +18385,66 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1053;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1053, 1);
-        countingStream->write((uint64_t*)&cgen_var_1053, 1 * 8);
-        marshal_VkDescriptorUpdateTemplateCreateInfo(countingStream, (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_937;
+        *countPtr += 1 * 8;
+        count_VkDescriptorUpdateTemplateCreateInfo(featureBits, (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_1054 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_1054);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_1055;
-        countingStream->handleMapping()->mapHandles_VkDescriptorUpdateTemplate_u64(pDescriptorUpdateTemplate, &cgen_var_1055, 1);
-        countingStream->write((uint64_t*)&cgen_var_1055, 8);
+        uint64_t cgen_var_938;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateDescriptorUpdateTemplateKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateDescriptorUpdateTemplateKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateDescriptorUpdateTemplateKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateDescriptorUpdateTemplateKHR = OP_vkCreateDescriptorUpdateTemplateKHR;
-    stream->write(&opcode_vkCreateDescriptorUpdateTemplateKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateDescriptorUpdateTemplateKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1056;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1056, 1);
-    stream->write((uint64_t*)&cgen_var_1056, 1 * 8);
-    marshal_VkDescriptorUpdateTemplateCreateInfo(stream, (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateDescriptorUpdateTemplateKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateDescriptorUpdateTemplateKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_939;
+    *&cgen_var_939 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_939, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDescriptorUpdateTemplateCreateInfo(stream, (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_1057 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_1057);
+    uint64_t cgen_var_940 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_940, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_1058;
-    stream->handleMapping()->mapHandles_VkDescriptorUpdateTemplate_u64(pDescriptorUpdateTemplate, &cgen_var_1058, 1);
-    stream->write((uint64_t*)&cgen_var_1058, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_941;
+    *&cgen_var_941 = (uint64_t)((*pDescriptorUpdateTemplate));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_941, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_1059;
-    stream->read((uint64_t*)&cgen_var_1059, 8);
-    stream->handleMapping()->mapHandles_u64_VkDescriptorUpdateTemplate(&cgen_var_1059, (VkDescriptorUpdateTemplate*)pDescriptorUpdateTemplate, 1);
+    uint64_t cgen_var_942;
+    stream->read((uint64_t*)&cgen_var_942, 8);
+    stream->handleMapping()->mapHandles_u64_VkDescriptorUpdateTemplate(&cgen_var_942, (VkDescriptorUpdateTemplate*)pDescriptorUpdateTemplate, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateDescriptorUpdateTemplateKHR_VkResult_return = (VkResult)0;
     stream->read(&vkCreateDescriptorUpdateTemplateKHR_VkResult_return, sizeof(VkResult));
     mImpl->resources()->on_vkCreateDescriptorUpdateTemplateKHR(this, vkCreateDescriptorUpdateTemplateKHR_VkResult_return, device, pCreateInfo, pAllocator, pDescriptorUpdateTemplate);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateDescriptorUpdateTemplateKHR");;
     return vkCreateDescriptorUpdateTemplateKHR_VkResult_return;
 }
@@ -15624,18 +18452,18 @@
 void VkEncoder::vkDestroyDescriptorUpdateTemplateKHR(
     VkDevice device,
     VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyDescriptorUpdateTemplateKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDescriptorUpdateTemplate local_descriptorUpdateTemplate;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_descriptorUpdateTemplate = descriptorUpdateTemplate;
     local_pAllocator = nullptr;
@@ -15644,49 +18472,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1060;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1060, 1);
-        countingStream->write((uint64_t*)&cgen_var_1060, 1 * 8);
-        uint64_t cgen_var_1061;
-        countingStream->handleMapping()->mapHandles_VkDescriptorUpdateTemplate_u64(&local_descriptorUpdateTemplate, &cgen_var_1061, 1);
-        countingStream->write((uint64_t*)&cgen_var_1061, 1 * 8);
+        uint64_t cgen_var_943;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_944;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_1062 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_1062);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyDescriptorUpdateTemplateKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyDescriptorUpdateTemplateKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyDescriptorUpdateTemplateKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyDescriptorUpdateTemplateKHR = OP_vkDestroyDescriptorUpdateTemplateKHR;
-    stream->write(&opcode_vkDestroyDescriptorUpdateTemplateKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyDescriptorUpdateTemplateKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1063;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1063, 1);
-    stream->write((uint64_t*)&cgen_var_1063, 1 * 8);
-    uint64_t cgen_var_1064;
-    stream->handleMapping()->mapHandles_VkDescriptorUpdateTemplate_u64(&local_descriptorUpdateTemplate, &cgen_var_1064, 1);
-    stream->write((uint64_t*)&cgen_var_1064, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyDescriptorUpdateTemplateKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyDescriptorUpdateTemplateKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_945;
+    *&cgen_var_945 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_945, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_946;
+    *&cgen_var_946 = get_host_u64_VkDescriptorUpdateTemplate((*&local_descriptorUpdateTemplate));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_946, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_1065 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_1065);
+    uint64_t cgen_var_947 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_947, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkDescriptorUpdateTemplate((VkDescriptorUpdateTemplate*)&descriptorUpdateTemplate);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyDescriptorUpdateTemplateKHR");;
 }
 
@@ -15694,19 +18534,19 @@
     VkDevice device,
     VkDescriptorSet descriptorSet,
     VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-    const void* pData)
+    const void* pData,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkUpdateDescriptorSetWithTemplateKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDescriptorSet local_descriptorSet;
     VkDescriptorUpdateTemplate local_descriptorUpdateTemplate;
     void* local_pData;
+    uint32_t local_doLock;
     local_device = device;
     local_descriptorSet = descriptorSet;
     local_descriptorUpdateTemplate = descriptorUpdateTemplate;
@@ -15715,49 +18555,62 @@
     {
         local_pData = (void*)pool->dupArray(pData, sizeof(const uint8_t));
     }
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1066;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1066, 1);
-        countingStream->write((uint64_t*)&cgen_var_1066, 1 * 8);
-        uint64_t cgen_var_1067;
-        countingStream->handleMapping()->mapHandles_VkDescriptorSet_u64(&local_descriptorSet, &cgen_var_1067, 1);
-        countingStream->write((uint64_t*)&cgen_var_1067, 1 * 8);
-        uint64_t cgen_var_1068;
-        countingStream->handleMapping()->mapHandles_VkDescriptorUpdateTemplate_u64(&local_descriptorUpdateTemplate, &cgen_var_1068, 1);
-        countingStream->write((uint64_t*)&cgen_var_1068, 1 * 8);
+        uint64_t cgen_var_948;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_949;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_950;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_1069 = (uint64_t)(uintptr_t)local_pData;
-        countingStream->putBe64(cgen_var_1069);
+        *countPtr += 8;
         if (local_pData)
         {
-            countingStream->write((void*)local_pData, sizeof(uint8_t));
+            *countPtr += sizeof(uint8_t);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkUpdateDescriptorSetWithTemplateKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkUpdateDescriptorSetWithTemplateKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkUpdateDescriptorSetWithTemplateKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkUpdateDescriptorSetWithTemplateKHR = OP_vkUpdateDescriptorSetWithTemplateKHR;
-    stream->write(&opcode_vkUpdateDescriptorSetWithTemplateKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkUpdateDescriptorSetWithTemplateKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1070;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1070, 1);
-    stream->write((uint64_t*)&cgen_var_1070, 1 * 8);
-    uint64_t cgen_var_1071;
-    stream->handleMapping()->mapHandles_VkDescriptorSet_u64(&local_descriptorSet, &cgen_var_1071, 1);
-    stream->write((uint64_t*)&cgen_var_1071, 1 * 8);
-    uint64_t cgen_var_1072;
-    stream->handleMapping()->mapHandles_VkDescriptorUpdateTemplate_u64(&local_descriptorUpdateTemplate, &cgen_var_1072, 1);
-    stream->write((uint64_t*)&cgen_var_1072, 1 * 8);
+    memcpy(streamPtr, &opcode_vkUpdateDescriptorSetWithTemplateKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkUpdateDescriptorSetWithTemplateKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_951;
+    *&cgen_var_951 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_951, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_952;
+    *&cgen_var_952 = get_host_u64_VkDescriptorSet((*&local_descriptorSet));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_952, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_953;
+    *&cgen_var_953 = get_host_u64_VkDescriptorUpdateTemplate((*&local_descriptorUpdateTemplate));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_953, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_1073 = (uint64_t)(uintptr_t)local_pData;
-    stream->putBe64(cgen_var_1073);
+    uint64_t cgen_var_954 = (uint64_t)(uintptr_t)local_pData;
+    memcpy((*streamPtrPtr), &cgen_var_954, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pData)
     {
-        stream->write((void*)local_pData, sizeof(uint8_t));
+        memcpy(*streamPtrPtr, (void*)local_pData, sizeof(uint8_t));
+        *streamPtrPtr += sizeof(uint8_t);
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkUpdateDescriptorSetWithTemplateKHR");;
 }
 
@@ -15767,18 +18620,18 @@
     VkDevice device,
     const VkRenderPassCreateInfo2KHR* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkRenderPass* pRenderPass)
+    VkRenderPass* pRenderPass,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateRenderPass2KHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkRenderPassCreateInfo2KHR* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -15792,6 +18645,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -15801,52 +18655,63 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1074;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1074, 1);
-        countingStream->write((uint64_t*)&cgen_var_1074, 1 * 8);
-        marshal_VkRenderPassCreateInfo2KHR(countingStream, (VkRenderPassCreateInfo2KHR*)(local_pCreateInfo));
+        uint64_t cgen_var_955;
+        *countPtr += 1 * 8;
+        count_VkRenderPassCreateInfo2KHR(featureBits, (VkRenderPassCreateInfo2KHR*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_1075 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_1075);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_1076;
-        countingStream->handleMapping()->mapHandles_VkRenderPass_u64(pRenderPass, &cgen_var_1076, 1);
-        countingStream->write((uint64_t*)&cgen_var_1076, 8);
+        uint64_t cgen_var_956;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateRenderPass2KHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateRenderPass2KHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateRenderPass2KHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateRenderPass2KHR = OP_vkCreateRenderPass2KHR;
-    stream->write(&opcode_vkCreateRenderPass2KHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateRenderPass2KHR, sizeof(uint32_t));
-    uint64_t cgen_var_1077;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1077, 1);
-    stream->write((uint64_t*)&cgen_var_1077, 1 * 8);
-    marshal_VkRenderPassCreateInfo2KHR(stream, (VkRenderPassCreateInfo2KHR*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateRenderPass2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateRenderPass2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_957;
+    *&cgen_var_957 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_957, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkRenderPassCreateInfo2KHR(stream, (VkRenderPassCreateInfo2KHR*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_1078 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_1078);
+    uint64_t cgen_var_958 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_958, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_1079;
-    stream->handleMapping()->mapHandles_VkRenderPass_u64(pRenderPass, &cgen_var_1079, 1);
-    stream->write((uint64_t*)&cgen_var_1079, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
-    uint64_t cgen_var_1080;
-    stream->read((uint64_t*)&cgen_var_1080, 8);
-    stream->handleMapping()->mapHandles_u64_VkRenderPass(&cgen_var_1080, (VkRenderPass*)pRenderPass, 1);
+    /* is handle, possibly out */;
+    uint64_t cgen_var_959;
+    *&cgen_var_959 = (uint64_t)((*pRenderPass));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_959, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    uint64_t cgen_var_960;
+    stream->read((uint64_t*)&cgen_var_960, 8);
+    stream->handleMapping()->mapHandles_u64_VkRenderPass(&cgen_var_960, (VkRenderPass*)pRenderPass, 1);
     VkResult vkCreateRenderPass2KHR_VkResult_return = (VkResult)0;
     stream->read(&vkCreateRenderPass2KHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateRenderPass2KHR");;
     return vkCreateRenderPass2KHR_VkResult_return;
 }
@@ -15854,18 +18719,18 @@
 void VkEncoder::vkCmdBeginRenderPass2KHR(
     VkCommandBuffer commandBuffer,
     const VkRenderPassBeginInfo* pRenderPassBegin,
-    const VkSubpassBeginInfoKHR* pSubpassBeginInfo)
+    const VkSubpassBeginInfoKHR* pSubpassBeginInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdBeginRenderPass2KHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkRenderPassBeginInfo* local_pRenderPassBegin;
     VkSubpassBeginInfoKHR* local_pSubpassBeginInfo;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_pRenderPassBegin = nullptr;
     if (pRenderPassBegin)
@@ -15879,6 +18744,7 @@
         local_pSubpassBeginInfo = (VkSubpassBeginInfoKHR*)pool->alloc(sizeof(const VkSubpassBeginInfoKHR));
         deepcopy_VkSubpassBeginInfoKHR(pool, pSubpassBeginInfo, (VkSubpassBeginInfoKHR*)(local_pSubpassBeginInfo));
     }
+    local_doLock = doLock;
     if (local_pRenderPassBegin)
     {
         transform_tohost_VkRenderPassBeginInfo(mImpl->resources(), (VkRenderPassBeginInfo*)(local_pRenderPassBegin));
@@ -15887,45 +18753,55 @@
     {
         transform_tohost_VkSubpassBeginInfoKHR(mImpl->resources(), (VkSubpassBeginInfoKHR*)(local_pSubpassBeginInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1081;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1081, 1);
-        countingStream->write((uint64_t*)&cgen_var_1081, 1 * 8);
-        marshal_VkRenderPassBeginInfo(countingStream, (VkRenderPassBeginInfo*)(local_pRenderPassBegin));
-        marshal_VkSubpassBeginInfoKHR(countingStream, (VkSubpassBeginInfoKHR*)(local_pSubpassBeginInfo));
+        uint64_t cgen_var_961;
+        *countPtr += 1 * 8;
+        count_VkRenderPassBeginInfo(featureBits, (VkRenderPassBeginInfo*)(local_pRenderPassBegin), countPtr);
+        count_VkSubpassBeginInfoKHR(featureBits, (VkSubpassBeginInfoKHR*)(local_pSubpassBeginInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdBeginRenderPass2KHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdBeginRenderPass2KHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBeginRenderPass2KHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdBeginRenderPass2KHR = OP_vkCmdBeginRenderPass2KHR;
-    stream->write(&opcode_vkCmdBeginRenderPass2KHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdBeginRenderPass2KHR, sizeof(uint32_t));
-    uint64_t cgen_var_1082;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1082, 1);
-    stream->write((uint64_t*)&cgen_var_1082, 1 * 8);
-    marshal_VkRenderPassBeginInfo(stream, (VkRenderPassBeginInfo*)(local_pRenderPassBegin));
-    marshal_VkSubpassBeginInfoKHR(stream, (VkSubpassBeginInfoKHR*)(local_pSubpassBeginInfo));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdBeginRenderPass2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdBeginRenderPass2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_962;
+    *&cgen_var_962 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_962, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkRenderPassBeginInfo(stream, (VkRenderPassBeginInfo*)(local_pRenderPassBegin), streamPtrPtr);
+    reservedmarshal_VkSubpassBeginInfoKHR(stream, (VkSubpassBeginInfoKHR*)(local_pSubpassBeginInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdBeginRenderPass2KHR");;
 }
 
 void VkEncoder::vkCmdNextSubpass2KHR(
     VkCommandBuffer commandBuffer,
     const VkSubpassBeginInfoKHR* pSubpassBeginInfo,
-    const VkSubpassEndInfoKHR* pSubpassEndInfo)
+    const VkSubpassEndInfoKHR* pSubpassEndInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdNextSubpass2KHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkSubpassBeginInfoKHR* local_pSubpassBeginInfo;
     VkSubpassEndInfoKHR* local_pSubpassEndInfo;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_pSubpassBeginInfo = nullptr;
     if (pSubpassBeginInfo)
@@ -15939,6 +18815,7 @@
         local_pSubpassEndInfo = (VkSubpassEndInfoKHR*)pool->alloc(sizeof(const VkSubpassEndInfoKHR));
         deepcopy_VkSubpassEndInfoKHR(pool, pSubpassEndInfo, (VkSubpassEndInfoKHR*)(local_pSubpassEndInfo));
     }
+    local_doLock = doLock;
     if (local_pSubpassBeginInfo)
     {
         transform_tohost_VkSubpassBeginInfoKHR(mImpl->resources(), (VkSubpassBeginInfoKHR*)(local_pSubpassBeginInfo));
@@ -15947,43 +18824,53 @@
     {
         transform_tohost_VkSubpassEndInfoKHR(mImpl->resources(), (VkSubpassEndInfoKHR*)(local_pSubpassEndInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1083;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1083, 1);
-        countingStream->write((uint64_t*)&cgen_var_1083, 1 * 8);
-        marshal_VkSubpassBeginInfoKHR(countingStream, (VkSubpassBeginInfoKHR*)(local_pSubpassBeginInfo));
-        marshal_VkSubpassEndInfoKHR(countingStream, (VkSubpassEndInfoKHR*)(local_pSubpassEndInfo));
+        uint64_t cgen_var_963;
+        *countPtr += 1 * 8;
+        count_VkSubpassBeginInfoKHR(featureBits, (VkSubpassBeginInfoKHR*)(local_pSubpassBeginInfo), countPtr);
+        count_VkSubpassEndInfoKHR(featureBits, (VkSubpassEndInfoKHR*)(local_pSubpassEndInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdNextSubpass2KHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdNextSubpass2KHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdNextSubpass2KHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdNextSubpass2KHR = OP_vkCmdNextSubpass2KHR;
-    stream->write(&opcode_vkCmdNextSubpass2KHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdNextSubpass2KHR, sizeof(uint32_t));
-    uint64_t cgen_var_1084;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1084, 1);
-    stream->write((uint64_t*)&cgen_var_1084, 1 * 8);
-    marshal_VkSubpassBeginInfoKHR(stream, (VkSubpassBeginInfoKHR*)(local_pSubpassBeginInfo));
-    marshal_VkSubpassEndInfoKHR(stream, (VkSubpassEndInfoKHR*)(local_pSubpassEndInfo));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdNextSubpass2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdNextSubpass2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_964;
+    *&cgen_var_964 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_964, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkSubpassBeginInfoKHR(stream, (VkSubpassBeginInfoKHR*)(local_pSubpassBeginInfo), streamPtrPtr);
+    reservedmarshal_VkSubpassEndInfoKHR(stream, (VkSubpassEndInfoKHR*)(local_pSubpassEndInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdNextSubpass2KHR");;
 }
 
 void VkEncoder::vkCmdEndRenderPass2KHR(
     VkCommandBuffer commandBuffer,
-    const VkSubpassEndInfoKHR* pSubpassEndInfo)
+    const VkSubpassEndInfoKHR* pSubpassEndInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdEndRenderPass2KHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkSubpassEndInfoKHR* local_pSubpassEndInfo;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_pSubpassEndInfo = nullptr;
     if (pSubpassEndInfo)
@@ -15991,29 +18878,40 @@
         local_pSubpassEndInfo = (VkSubpassEndInfoKHR*)pool->alloc(sizeof(const VkSubpassEndInfoKHR));
         deepcopy_VkSubpassEndInfoKHR(pool, pSubpassEndInfo, (VkSubpassEndInfoKHR*)(local_pSubpassEndInfo));
     }
+    local_doLock = doLock;
     if (local_pSubpassEndInfo)
     {
         transform_tohost_VkSubpassEndInfoKHR(mImpl->resources(), (VkSubpassEndInfoKHR*)(local_pSubpassEndInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1085;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1085, 1);
-        countingStream->write((uint64_t*)&cgen_var_1085, 1 * 8);
-        marshal_VkSubpassEndInfoKHR(countingStream, (VkSubpassEndInfoKHR*)(local_pSubpassEndInfo));
+        uint64_t cgen_var_965;
+        *countPtr += 1 * 8;
+        count_VkSubpassEndInfoKHR(featureBits, (VkSubpassEndInfoKHR*)(local_pSubpassEndInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdEndRenderPass2KHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdEndRenderPass2KHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdEndRenderPass2KHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdEndRenderPass2KHR = OP_vkCmdEndRenderPass2KHR;
-    stream->write(&opcode_vkCmdEndRenderPass2KHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdEndRenderPass2KHR, sizeof(uint32_t));
-    uint64_t cgen_var_1086;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1086, 1);
-    stream->write((uint64_t*)&cgen_var_1086, 1 * 8);
-    marshal_VkSubpassEndInfoKHR(stream, (VkSubpassEndInfoKHR*)(local_pSubpassEndInfo));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdEndRenderPass2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdEndRenderPass2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_966;
+    *&cgen_var_966 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_966, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkSubpassEndInfoKHR(stream, (VkSubpassEndInfoKHR*)(local_pSubpassEndInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdEndRenderPass2KHR");;
 }
 
@@ -16021,44 +18919,55 @@
 #ifdef VK_KHR_shared_presentable_image
 VkResult VkEncoder::vkGetSwapchainStatusKHR(
     VkDevice device,
-    VkSwapchainKHR swapchain)
+    VkSwapchainKHR swapchain,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetSwapchainStatusKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkSwapchainKHR local_swapchain;
+    uint32_t local_doLock;
     local_device = device;
     local_swapchain = swapchain;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1087;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1087, 1);
-        countingStream->write((uint64_t*)&cgen_var_1087, 1 * 8);
-        uint64_t cgen_var_1088;
-        countingStream->handleMapping()->mapHandles_VkSwapchainKHR_u64(&local_swapchain, &cgen_var_1088, 1);
-        countingStream->write((uint64_t*)&cgen_var_1088, 1 * 8);
+        uint64_t cgen_var_967;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_968;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetSwapchainStatusKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetSwapchainStatusKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetSwapchainStatusKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetSwapchainStatusKHR = OP_vkGetSwapchainStatusKHR;
-    stream->write(&opcode_vkGetSwapchainStatusKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetSwapchainStatusKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1089;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1089, 1);
-    stream->write((uint64_t*)&cgen_var_1089, 1 * 8);
-    uint64_t cgen_var_1090;
-    stream->handleMapping()->mapHandles_VkSwapchainKHR_u64(&local_swapchain, &cgen_var_1090, 1);
-    stream->write((uint64_t*)&cgen_var_1090, 1 * 8);
+    memcpy(streamPtr, &opcode_vkGetSwapchainStatusKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetSwapchainStatusKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_969;
+    *&cgen_var_969 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_969, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_970;
+    *&cgen_var_970 = get_host_u64_VkSwapchainKHR((*&local_swapchain));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_970, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkGetSwapchainStatusKHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetSwapchainStatusKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetSwapchainStatusKHR");;
     return vkGetSwapchainStatusKHR_VkResult_return;
 }
@@ -16068,17 +18977,17 @@
 void VkEncoder::vkGetPhysicalDeviceExternalFencePropertiesKHR(
     VkPhysicalDevice physicalDevice,
     const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo,
-    VkExternalFenceProperties* pExternalFenceProperties)
+    VkExternalFenceProperties* pExternalFenceProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceExternalFencePropertiesKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkPhysicalDeviceExternalFenceInfo* local_pExternalFenceInfo;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_pExternalFenceInfo = nullptr;
     if (pExternalFenceInfo)
@@ -16086,36 +18995,47 @@
         local_pExternalFenceInfo = (VkPhysicalDeviceExternalFenceInfo*)pool->alloc(sizeof(const VkPhysicalDeviceExternalFenceInfo));
         deepcopy_VkPhysicalDeviceExternalFenceInfo(pool, pExternalFenceInfo, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo));
     }
+    local_doLock = doLock;
     if (local_pExternalFenceInfo)
     {
         transform_tohost_VkPhysicalDeviceExternalFenceInfo(mImpl->resources(), (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1091;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1091, 1);
-        countingStream->write((uint64_t*)&cgen_var_1091, 1 * 8);
-        marshal_VkPhysicalDeviceExternalFenceInfo(countingStream, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo));
-        marshal_VkExternalFenceProperties(countingStream, (VkExternalFenceProperties*)(pExternalFenceProperties));
+        uint64_t cgen_var_971;
+        *countPtr += 1 * 8;
+        count_VkPhysicalDeviceExternalFenceInfo(featureBits, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo), countPtr);
+        count_VkExternalFenceProperties(featureBits, (VkExternalFenceProperties*)(pExternalFenceProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceExternalFencePropertiesKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceExternalFencePropertiesKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceExternalFencePropertiesKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceExternalFencePropertiesKHR = OP_vkGetPhysicalDeviceExternalFencePropertiesKHR;
-    stream->write(&opcode_vkGetPhysicalDeviceExternalFencePropertiesKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceExternalFencePropertiesKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1092;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1092, 1);
-    stream->write((uint64_t*)&cgen_var_1092, 1 * 8);
-    marshal_VkPhysicalDeviceExternalFenceInfo(stream, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo));
-    marshal_VkExternalFenceProperties(stream, (VkExternalFenceProperties*)(pExternalFenceProperties));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceExternalFencePropertiesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceExternalFencePropertiesKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_972;
+    *&cgen_var_972 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_972, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPhysicalDeviceExternalFenceInfo(stream, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo), streamPtrPtr);
+    reservedmarshal_VkExternalFenceProperties(stream, (VkExternalFenceProperties*)(pExternalFenceProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkExternalFenceProperties(stream, (VkExternalFenceProperties*)(pExternalFenceProperties));
     if (pExternalFenceProperties)
     {
         transform_fromhost_VkExternalFenceProperties(mImpl->resources(), (VkExternalFenceProperties*)(pExternalFenceProperties));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceExternalFencePropertiesKHR");;
 }
 
@@ -16125,17 +19045,17 @@
 #ifdef VK_KHR_external_fence_win32
 VkResult VkEncoder::vkImportFenceWin32HandleKHR(
     VkDevice device,
-    const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo)
+    const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkImportFenceWin32HandleKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkImportFenceWin32HandleInfoKHR* local_pImportFenceWin32HandleInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pImportFenceWin32HandleInfo = nullptr;
     if (pImportFenceWin32HandleInfo)
@@ -16143,31 +19063,42 @@
         local_pImportFenceWin32HandleInfo = (VkImportFenceWin32HandleInfoKHR*)pool->alloc(sizeof(const VkImportFenceWin32HandleInfoKHR));
         deepcopy_VkImportFenceWin32HandleInfoKHR(pool, pImportFenceWin32HandleInfo, (VkImportFenceWin32HandleInfoKHR*)(local_pImportFenceWin32HandleInfo));
     }
+    local_doLock = doLock;
     if (local_pImportFenceWin32HandleInfo)
     {
         transform_tohost_VkImportFenceWin32HandleInfoKHR(mImpl->resources(), (VkImportFenceWin32HandleInfoKHR*)(local_pImportFenceWin32HandleInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1093;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1093, 1);
-        countingStream->write((uint64_t*)&cgen_var_1093, 1 * 8);
-        marshal_VkImportFenceWin32HandleInfoKHR(countingStream, (VkImportFenceWin32HandleInfoKHR*)(local_pImportFenceWin32HandleInfo));
+        uint64_t cgen_var_973;
+        *countPtr += 1 * 8;
+        count_VkImportFenceWin32HandleInfoKHR(featureBits, (VkImportFenceWin32HandleInfoKHR*)(local_pImportFenceWin32HandleInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkImportFenceWin32HandleKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkImportFenceWin32HandleKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkImportFenceWin32HandleKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkImportFenceWin32HandleKHR = OP_vkImportFenceWin32HandleKHR;
-    stream->write(&opcode_vkImportFenceWin32HandleKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkImportFenceWin32HandleKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1094;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1094, 1);
-    stream->write((uint64_t*)&cgen_var_1094, 1 * 8);
-    marshal_VkImportFenceWin32HandleInfoKHR(stream, (VkImportFenceWin32HandleInfoKHR*)(local_pImportFenceWin32HandleInfo));
+    memcpy(streamPtr, &opcode_vkImportFenceWin32HandleKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkImportFenceWin32HandleKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_974;
+    *&cgen_var_974 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_974, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkImportFenceWin32HandleInfoKHR(stream, (VkImportFenceWin32HandleInfoKHR*)(local_pImportFenceWin32HandleInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkImportFenceWin32HandleKHR_VkResult_return = (VkResult)0;
     stream->read(&vkImportFenceWin32HandleKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkImportFenceWin32HandleKHR");;
     return vkImportFenceWin32HandleKHR_VkResult_return;
 }
@@ -16175,17 +19106,17 @@
 VkResult VkEncoder::vkGetFenceWin32HandleKHR(
     VkDevice device,
     const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo,
-    HANDLE* pHandle)
+    HANDLE* pHandle,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetFenceWin32HandleKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkFenceGetWin32HandleInfoKHR* local_pGetWin32HandleInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pGetWin32HandleInfo = nullptr;
     if (pGetWin32HandleInfo)
@@ -16193,34 +19124,46 @@
         local_pGetWin32HandleInfo = (VkFenceGetWin32HandleInfoKHR*)pool->alloc(sizeof(const VkFenceGetWin32HandleInfoKHR));
         deepcopy_VkFenceGetWin32HandleInfoKHR(pool, pGetWin32HandleInfo, (VkFenceGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo));
     }
+    local_doLock = doLock;
     if (local_pGetWin32HandleInfo)
     {
         transform_tohost_VkFenceGetWin32HandleInfoKHR(mImpl->resources(), (VkFenceGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1095;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1095, 1);
-        countingStream->write((uint64_t*)&cgen_var_1095, 1 * 8);
-        marshal_VkFenceGetWin32HandleInfoKHR(countingStream, (VkFenceGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo));
-        countingStream->write((HANDLE*)pHandle, sizeof(HANDLE));
+        uint64_t cgen_var_975;
+        *countPtr += 1 * 8;
+        count_VkFenceGetWin32HandleInfoKHR(featureBits, (VkFenceGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo), countPtr);
+        *countPtr += sizeof(HANDLE);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetFenceWin32HandleKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetFenceWin32HandleKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetFenceWin32HandleKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetFenceWin32HandleKHR = OP_vkGetFenceWin32HandleKHR;
-    stream->write(&opcode_vkGetFenceWin32HandleKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetFenceWin32HandleKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1096;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1096, 1);
-    stream->write((uint64_t*)&cgen_var_1096, 1 * 8);
-    marshal_VkFenceGetWin32HandleInfoKHR(stream, (VkFenceGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo));
-    stream->write((HANDLE*)pHandle, sizeof(HANDLE));
+    memcpy(streamPtr, &opcode_vkGetFenceWin32HandleKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetFenceWin32HandleKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_976;
+    *&cgen_var_976 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_976, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkFenceGetWin32HandleInfoKHR(stream, (VkFenceGetWin32HandleInfoKHR*)(local_pGetWin32HandleInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (HANDLE*)pHandle, sizeof(HANDLE));
+    *streamPtrPtr += sizeof(HANDLE);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((HANDLE*)pHandle, sizeof(HANDLE));
     VkResult vkGetFenceWin32HandleKHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetFenceWin32HandleKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetFenceWin32HandleKHR");;
     return vkGetFenceWin32HandleKHR_VkResult_return;
 }
@@ -16229,17 +19172,17 @@
 #ifdef VK_KHR_external_fence_fd
 VkResult VkEncoder::vkImportFenceFdKHR(
     VkDevice device,
-    const VkImportFenceFdInfoKHR* pImportFenceFdInfo)
+    const VkImportFenceFdInfoKHR* pImportFenceFdInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkImportFenceFdKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkImportFenceFdInfoKHR* local_pImportFenceFdInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pImportFenceFdInfo = nullptr;
     if (pImportFenceFdInfo)
@@ -16247,31 +19190,42 @@
         local_pImportFenceFdInfo = (VkImportFenceFdInfoKHR*)pool->alloc(sizeof(const VkImportFenceFdInfoKHR));
         deepcopy_VkImportFenceFdInfoKHR(pool, pImportFenceFdInfo, (VkImportFenceFdInfoKHR*)(local_pImportFenceFdInfo));
     }
+    local_doLock = doLock;
     if (local_pImportFenceFdInfo)
     {
         transform_tohost_VkImportFenceFdInfoKHR(mImpl->resources(), (VkImportFenceFdInfoKHR*)(local_pImportFenceFdInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1097;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1097, 1);
-        countingStream->write((uint64_t*)&cgen_var_1097, 1 * 8);
-        marshal_VkImportFenceFdInfoKHR(countingStream, (VkImportFenceFdInfoKHR*)(local_pImportFenceFdInfo));
+        uint64_t cgen_var_977;
+        *countPtr += 1 * 8;
+        count_VkImportFenceFdInfoKHR(featureBits, (VkImportFenceFdInfoKHR*)(local_pImportFenceFdInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkImportFenceFdKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkImportFenceFdKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkImportFenceFdKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkImportFenceFdKHR = OP_vkImportFenceFdKHR;
-    stream->write(&opcode_vkImportFenceFdKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkImportFenceFdKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1098;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1098, 1);
-    stream->write((uint64_t*)&cgen_var_1098, 1 * 8);
-    marshal_VkImportFenceFdInfoKHR(stream, (VkImportFenceFdInfoKHR*)(local_pImportFenceFdInfo));
+    memcpy(streamPtr, &opcode_vkImportFenceFdKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkImportFenceFdKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_978;
+    *&cgen_var_978 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_978, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkImportFenceFdInfoKHR(stream, (VkImportFenceFdInfoKHR*)(local_pImportFenceFdInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkImportFenceFdKHR_VkResult_return = (VkResult)0;
     stream->read(&vkImportFenceFdKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkImportFenceFdKHR");;
     return vkImportFenceFdKHR_VkResult_return;
 }
@@ -16279,17 +19233,17 @@
 VkResult VkEncoder::vkGetFenceFdKHR(
     VkDevice device,
     const VkFenceGetFdInfoKHR* pGetFdInfo,
-    int* pFd)
+    int* pFd,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetFenceFdKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkFenceGetFdInfoKHR* local_pGetFdInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pGetFdInfo = nullptr;
     if (pGetFdInfo)
@@ -16297,34 +19251,46 @@
         local_pGetFdInfo = (VkFenceGetFdInfoKHR*)pool->alloc(sizeof(const VkFenceGetFdInfoKHR));
         deepcopy_VkFenceGetFdInfoKHR(pool, pGetFdInfo, (VkFenceGetFdInfoKHR*)(local_pGetFdInfo));
     }
+    local_doLock = doLock;
     if (local_pGetFdInfo)
     {
         transform_tohost_VkFenceGetFdInfoKHR(mImpl->resources(), (VkFenceGetFdInfoKHR*)(local_pGetFdInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1099;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1099, 1);
-        countingStream->write((uint64_t*)&cgen_var_1099, 1 * 8);
-        marshal_VkFenceGetFdInfoKHR(countingStream, (VkFenceGetFdInfoKHR*)(local_pGetFdInfo));
-        countingStream->write((int*)pFd, sizeof(int));
+        uint64_t cgen_var_979;
+        *countPtr += 1 * 8;
+        count_VkFenceGetFdInfoKHR(featureBits, (VkFenceGetFdInfoKHR*)(local_pGetFdInfo), countPtr);
+        *countPtr += sizeof(int);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetFenceFdKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetFenceFdKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetFenceFdKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetFenceFdKHR = OP_vkGetFenceFdKHR;
-    stream->write(&opcode_vkGetFenceFdKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetFenceFdKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1100;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1100, 1);
-    stream->write((uint64_t*)&cgen_var_1100, 1 * 8);
-    marshal_VkFenceGetFdInfoKHR(stream, (VkFenceGetFdInfoKHR*)(local_pGetFdInfo));
-    stream->write((int*)pFd, sizeof(int));
+    memcpy(streamPtr, &opcode_vkGetFenceFdKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetFenceFdKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_980;
+    *&cgen_var_980 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_980, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkFenceGetFdInfoKHR(stream, (VkFenceGetFdInfoKHR*)(local_pGetFdInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (int*)pFd, sizeof(int));
+    *streamPtrPtr += sizeof(int);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((int*)pFd, sizeof(int));
     VkResult vkGetFenceFdKHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetFenceFdKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetFenceFdKHR");;
     return vkGetFenceFdKHR_VkResult_return;
 }
@@ -16336,17 +19302,17 @@
 VkResult VkEncoder::vkGetPhysicalDeviceSurfaceCapabilities2KHR(
     VkPhysicalDevice physicalDevice,
     const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
-    VkSurfaceCapabilities2KHR* pSurfaceCapabilities)
+    VkSurfaceCapabilities2KHR* pSurfaceCapabilities,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceSurfaceCapabilities2KHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkPhysicalDeviceSurfaceInfo2KHR* local_pSurfaceInfo;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_pSurfaceInfo = nullptr;
     if (pSurfaceInfo)
@@ -16354,28 +19320,35 @@
         local_pSurfaceInfo = (VkPhysicalDeviceSurfaceInfo2KHR*)pool->alloc(sizeof(const VkPhysicalDeviceSurfaceInfo2KHR));
         deepcopy_VkPhysicalDeviceSurfaceInfo2KHR(pool, pSurfaceInfo, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo));
     }
+    local_doLock = doLock;
     if (local_pSurfaceInfo)
     {
         transform_tohost_VkPhysicalDeviceSurfaceInfo2KHR(mImpl->resources(), (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1101;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1101, 1);
-        countingStream->write((uint64_t*)&cgen_var_1101, 1 * 8);
-        marshal_VkPhysicalDeviceSurfaceInfo2KHR(countingStream, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo));
-        marshal_VkSurfaceCapabilities2KHR(countingStream, (VkSurfaceCapabilities2KHR*)(pSurfaceCapabilities));
+        uint64_t cgen_var_981;
+        *countPtr += 1 * 8;
+        count_VkPhysicalDeviceSurfaceInfo2KHR(featureBits, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo), countPtr);
+        count_VkSurfaceCapabilities2KHR(featureBits, (VkSurfaceCapabilities2KHR*)(pSurfaceCapabilities), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceSurfaceCapabilities2KHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceSurfaceCapabilities2KHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceSurfaceCapabilities2KHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceSurfaceCapabilities2KHR = OP_vkGetPhysicalDeviceSurfaceCapabilities2KHR;
-    stream->write(&opcode_vkGetPhysicalDeviceSurfaceCapabilities2KHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceSurfaceCapabilities2KHR, sizeof(uint32_t));
-    uint64_t cgen_var_1102;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1102, 1);
-    stream->write((uint64_t*)&cgen_var_1102, 1 * 8);
-    marshal_VkPhysicalDeviceSurfaceInfo2KHR(stream, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo));
-    marshal_VkSurfaceCapabilities2KHR(stream, (VkSurfaceCapabilities2KHR*)(pSurfaceCapabilities));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceSurfaceCapabilities2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceSurfaceCapabilities2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_982;
+    *&cgen_var_982 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_982, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPhysicalDeviceSurfaceInfo2KHR(stream, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo), streamPtrPtr);
+    reservedmarshal_VkSurfaceCapabilities2KHR(stream, (VkSurfaceCapabilities2KHR*)(pSurfaceCapabilities), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkSurfaceCapabilities2KHR(stream, (VkSurfaceCapabilities2KHR*)(pSurfaceCapabilities));
     if (pSurfaceCapabilities)
     {
@@ -16383,9 +19356,13 @@
     }
     VkResult vkGetPhysicalDeviceSurfaceCapabilities2KHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetPhysicalDeviceSurfaceCapabilities2KHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceSurfaceCapabilities2KHR");;
     return vkGetPhysicalDeviceSurfaceCapabilities2KHR_VkResult_return;
 }
@@ -16394,17 +19371,17 @@
     VkPhysicalDevice physicalDevice,
     const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
     uint32_t* pSurfaceFormatCount,
-    VkSurfaceFormat2KHR* pSurfaceFormats)
+    VkSurfaceFormat2KHR* pSurfaceFormats,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceSurfaceFormats2KHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkPhysicalDeviceSurfaceInfo2KHR* local_pSurfaceInfo;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_pSurfaceInfo = nullptr;
     if (pSurfaceInfo)
@@ -16412,60 +19389,70 @@
         local_pSurfaceInfo = (VkPhysicalDeviceSurfaceInfo2KHR*)pool->alloc(sizeof(const VkPhysicalDeviceSurfaceInfo2KHR));
         deepcopy_VkPhysicalDeviceSurfaceInfo2KHR(pool, pSurfaceInfo, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo));
     }
+    local_doLock = doLock;
     if (local_pSurfaceInfo)
     {
         transform_tohost_VkPhysicalDeviceSurfaceInfo2KHR(mImpl->resources(), (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1103;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1103, 1);
-        countingStream->write((uint64_t*)&cgen_var_1103, 1 * 8);
-        marshal_VkPhysicalDeviceSurfaceInfo2KHR(countingStream, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo));
+        uint64_t cgen_var_983;
+        *countPtr += 1 * 8;
+        count_VkPhysicalDeviceSurfaceInfo2KHR(featureBits, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_1104 = (uint64_t)(uintptr_t)pSurfaceFormatCount;
-        countingStream->putBe64(cgen_var_1104);
+        *countPtr += 8;
         if (pSurfaceFormatCount)
         {
-            countingStream->write((uint32_t*)pSurfaceFormatCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_1105 = (uint64_t)(uintptr_t)pSurfaceFormats;
-        countingStream->putBe64(cgen_var_1105);
+        *countPtr += 8;
         if (pSurfaceFormats)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i)
             {
-                marshal_VkSurfaceFormat2KHR(countingStream, (VkSurfaceFormat2KHR*)(pSurfaceFormats + i));
+                count_VkSurfaceFormat2KHR(featureBits, (VkSurfaceFormat2KHR*)(pSurfaceFormats + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceSurfaceFormats2KHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceSurfaceFormats2KHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceSurfaceFormats2KHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceSurfaceFormats2KHR = OP_vkGetPhysicalDeviceSurfaceFormats2KHR;
-    stream->write(&opcode_vkGetPhysicalDeviceSurfaceFormats2KHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceSurfaceFormats2KHR, sizeof(uint32_t));
-    uint64_t cgen_var_1106;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1106, 1);
-    stream->write((uint64_t*)&cgen_var_1106, 1 * 8);
-    marshal_VkPhysicalDeviceSurfaceInfo2KHR(stream, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceSurfaceFormats2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceSurfaceFormats2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_984;
+    *&cgen_var_984 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_984, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkPhysicalDeviceSurfaceInfo2KHR(stream, (VkPhysicalDeviceSurfaceInfo2KHR*)(local_pSurfaceInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_1107 = (uint64_t)(uintptr_t)pSurfaceFormatCount;
-    stream->putBe64(cgen_var_1107);
+    uint64_t cgen_var_985 = (uint64_t)(uintptr_t)pSurfaceFormatCount;
+    memcpy((*streamPtrPtr), &cgen_var_985, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pSurfaceFormatCount)
     {
-        stream->write((uint32_t*)pSurfaceFormatCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pSurfaceFormatCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_1108 = (uint64_t)(uintptr_t)pSurfaceFormats;
-    stream->putBe64(cgen_var_1108);
+    uint64_t cgen_var_986 = (uint64_t)(uintptr_t)pSurfaceFormats;
+    memcpy((*streamPtrPtr), &cgen_var_986, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pSurfaceFormats)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pSurfaceFormatCount)); ++i)
         {
-            marshal_VkSurfaceFormat2KHR(stream, (VkSurfaceFormat2KHR*)(pSurfaceFormats + i));
+            reservedmarshal_VkSurfaceFormat2KHR(stream, (VkSurfaceFormat2KHR*)(pSurfaceFormats + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pSurfaceFormatCount;
     check_pSurfaceFormatCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -16500,9 +19487,13 @@
     }
     VkResult vkGetPhysicalDeviceSurfaceFormats2KHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetPhysicalDeviceSurfaceFormats2KHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceSurfaceFormats2KHR");;
     return vkGetPhysicalDeviceSurfaceFormats2KHR_VkResult_return;
 }
@@ -16514,65 +19505,75 @@
 VkResult VkEncoder::vkGetPhysicalDeviceDisplayProperties2KHR(
     VkPhysicalDevice physicalDevice,
     uint32_t* pPropertyCount,
-    VkDisplayProperties2KHR* pProperties)
+    VkDisplayProperties2KHR* pProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceDisplayProperties2KHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1111;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1111, 1);
-        countingStream->write((uint64_t*)&cgen_var_1111, 1 * 8);
+        uint64_t cgen_var_989;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_1112 = (uint64_t)(uintptr_t)pPropertyCount;
-        countingStream->putBe64(cgen_var_1112);
+        *countPtr += 8;
         if (pPropertyCount)
         {
-            countingStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_1113 = (uint64_t)(uintptr_t)pProperties;
-        countingStream->putBe64(cgen_var_1113);
+        *countPtr += 8;
         if (pProperties)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                marshal_VkDisplayProperties2KHR(countingStream, (VkDisplayProperties2KHR*)(pProperties + i));
+                count_VkDisplayProperties2KHR(featureBits, (VkDisplayProperties2KHR*)(pProperties + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceDisplayProperties2KHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceDisplayProperties2KHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceDisplayProperties2KHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceDisplayProperties2KHR = OP_vkGetPhysicalDeviceDisplayProperties2KHR;
-    stream->write(&opcode_vkGetPhysicalDeviceDisplayProperties2KHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceDisplayProperties2KHR, sizeof(uint32_t));
-    uint64_t cgen_var_1114;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1114, 1);
-    stream->write((uint64_t*)&cgen_var_1114, 1 * 8);
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceDisplayProperties2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceDisplayProperties2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_990;
+    *&cgen_var_990 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_990, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_1115 = (uint64_t)(uintptr_t)pPropertyCount;
-    stream->putBe64(cgen_var_1115);
+    uint64_t cgen_var_991 = (uint64_t)(uintptr_t)pPropertyCount;
+    memcpy((*streamPtrPtr), &cgen_var_991, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pPropertyCount)
     {
-        stream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pPropertyCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_1116 = (uint64_t)(uintptr_t)pProperties;
-    stream->putBe64(cgen_var_1116);
+    uint64_t cgen_var_992 = (uint64_t)(uintptr_t)pProperties;
+    memcpy((*streamPtrPtr), &cgen_var_992, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pProperties)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            marshal_VkDisplayProperties2KHR(stream, (VkDisplayProperties2KHR*)(pProperties + i));
+            reservedmarshal_VkDisplayProperties2KHR(stream, (VkDisplayProperties2KHR*)(pProperties + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pPropertyCount;
     check_pPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -16607,9 +19608,13 @@
     }
     VkResult vkGetPhysicalDeviceDisplayProperties2KHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetPhysicalDeviceDisplayProperties2KHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceDisplayProperties2KHR");;
     return vkGetPhysicalDeviceDisplayProperties2KHR_VkResult_return;
 }
@@ -16617,65 +19622,75 @@
 VkResult VkEncoder::vkGetPhysicalDeviceDisplayPlaneProperties2KHR(
     VkPhysicalDevice physicalDevice,
     uint32_t* pPropertyCount,
-    VkDisplayPlaneProperties2KHR* pProperties)
+    VkDisplayPlaneProperties2KHR* pProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceDisplayPlaneProperties2KHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1119;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1119, 1);
-        countingStream->write((uint64_t*)&cgen_var_1119, 1 * 8);
+        uint64_t cgen_var_995;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_1120 = (uint64_t)(uintptr_t)pPropertyCount;
-        countingStream->putBe64(cgen_var_1120);
+        *countPtr += 8;
         if (pPropertyCount)
         {
-            countingStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_1121 = (uint64_t)(uintptr_t)pProperties;
-        countingStream->putBe64(cgen_var_1121);
+        *countPtr += 8;
         if (pProperties)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                marshal_VkDisplayPlaneProperties2KHR(countingStream, (VkDisplayPlaneProperties2KHR*)(pProperties + i));
+                count_VkDisplayPlaneProperties2KHR(featureBits, (VkDisplayPlaneProperties2KHR*)(pProperties + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceDisplayPlaneProperties2KHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceDisplayPlaneProperties2KHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceDisplayPlaneProperties2KHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceDisplayPlaneProperties2KHR = OP_vkGetPhysicalDeviceDisplayPlaneProperties2KHR;
-    stream->write(&opcode_vkGetPhysicalDeviceDisplayPlaneProperties2KHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceDisplayPlaneProperties2KHR, sizeof(uint32_t));
-    uint64_t cgen_var_1122;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1122, 1);
-    stream->write((uint64_t*)&cgen_var_1122, 1 * 8);
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceDisplayPlaneProperties2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceDisplayPlaneProperties2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_996;
+    *&cgen_var_996 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_996, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_1123 = (uint64_t)(uintptr_t)pPropertyCount;
-    stream->putBe64(cgen_var_1123);
+    uint64_t cgen_var_997 = (uint64_t)(uintptr_t)pPropertyCount;
+    memcpy((*streamPtrPtr), &cgen_var_997, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pPropertyCount)
     {
-        stream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pPropertyCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_1124 = (uint64_t)(uintptr_t)pProperties;
-    stream->putBe64(cgen_var_1124);
+    uint64_t cgen_var_998 = (uint64_t)(uintptr_t)pProperties;
+    memcpy((*streamPtrPtr), &cgen_var_998, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pProperties)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            marshal_VkDisplayPlaneProperties2KHR(stream, (VkDisplayPlaneProperties2KHR*)(pProperties + i));
+            reservedmarshal_VkDisplayPlaneProperties2KHR(stream, (VkDisplayPlaneProperties2KHR*)(pProperties + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pPropertyCount;
     check_pPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -16710,9 +19725,13 @@
     }
     VkResult vkGetPhysicalDeviceDisplayPlaneProperties2KHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetPhysicalDeviceDisplayPlaneProperties2KHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceDisplayPlaneProperties2KHR");;
     return vkGetPhysicalDeviceDisplayPlaneProperties2KHR_VkResult_return;
 }
@@ -16721,73 +19740,83 @@
     VkPhysicalDevice physicalDevice,
     VkDisplayKHR display,
     uint32_t* pPropertyCount,
-    VkDisplayModeProperties2KHR* pProperties)
+    VkDisplayModeProperties2KHR* pProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetDisplayModeProperties2KHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkDisplayKHR local_display;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_display = display;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1127;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1127, 1);
-        countingStream->write((uint64_t*)&cgen_var_1127, 1 * 8);
-        uint64_t cgen_var_1128;
-        countingStream->handleMapping()->mapHandles_VkDisplayKHR_u64(&local_display, &cgen_var_1128, 1);
-        countingStream->write((uint64_t*)&cgen_var_1128, 1 * 8);
+        uint64_t cgen_var_1001;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1002;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_1129 = (uint64_t)(uintptr_t)pPropertyCount;
-        countingStream->putBe64(cgen_var_1129);
+        *countPtr += 8;
         if (pPropertyCount)
         {
-            countingStream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_1130 = (uint64_t)(uintptr_t)pProperties;
-        countingStream->putBe64(cgen_var_1130);
+        *countPtr += 8;
         if (pProperties)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
             {
-                marshal_VkDisplayModeProperties2KHR(countingStream, (VkDisplayModeProperties2KHR*)(pProperties + i));
+                count_VkDisplayModeProperties2KHR(featureBits, (VkDisplayModeProperties2KHR*)(pProperties + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetDisplayModeProperties2KHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetDisplayModeProperties2KHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetDisplayModeProperties2KHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetDisplayModeProperties2KHR = OP_vkGetDisplayModeProperties2KHR;
-    stream->write(&opcode_vkGetDisplayModeProperties2KHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetDisplayModeProperties2KHR, sizeof(uint32_t));
-    uint64_t cgen_var_1131;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1131, 1);
-    stream->write((uint64_t*)&cgen_var_1131, 1 * 8);
-    uint64_t cgen_var_1132;
-    stream->handleMapping()->mapHandles_VkDisplayKHR_u64(&local_display, &cgen_var_1132, 1);
-    stream->write((uint64_t*)&cgen_var_1132, 1 * 8);
+    memcpy(streamPtr, &opcode_vkGetDisplayModeProperties2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetDisplayModeProperties2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1003;
+    *&cgen_var_1003 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1003, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1004;
+    *&cgen_var_1004 = get_host_u64_VkDisplayKHR((*&local_display));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1004, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_1133 = (uint64_t)(uintptr_t)pPropertyCount;
-    stream->putBe64(cgen_var_1133);
+    uint64_t cgen_var_1005 = (uint64_t)(uintptr_t)pPropertyCount;
+    memcpy((*streamPtrPtr), &cgen_var_1005, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pPropertyCount)
     {
-        stream->write((uint32_t*)pPropertyCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pPropertyCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_1134 = (uint64_t)(uintptr_t)pProperties;
-    stream->putBe64(cgen_var_1134);
+    uint64_t cgen_var_1006 = (uint64_t)(uintptr_t)pProperties;
+    memcpy((*streamPtrPtr), &cgen_var_1006, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pProperties)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i)
         {
-            marshal_VkDisplayModeProperties2KHR(stream, (VkDisplayModeProperties2KHR*)(pProperties + i));
+            reservedmarshal_VkDisplayModeProperties2KHR(stream, (VkDisplayModeProperties2KHR*)(pProperties + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pPropertyCount;
     check_pPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -16822,9 +19851,13 @@
     }
     VkResult vkGetDisplayModeProperties2KHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetDisplayModeProperties2KHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetDisplayModeProperties2KHR");;
     return vkGetDisplayModeProperties2KHR_VkResult_return;
 }
@@ -16832,17 +19865,17 @@
 VkResult VkEncoder::vkGetDisplayPlaneCapabilities2KHR(
     VkPhysicalDevice physicalDevice,
     const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo,
-    VkDisplayPlaneCapabilities2KHR* pCapabilities)
+    VkDisplayPlaneCapabilities2KHR* pCapabilities,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetDisplayPlaneCapabilities2KHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkDisplayPlaneInfo2KHR* local_pDisplayPlaneInfo;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_pDisplayPlaneInfo = nullptr;
     if (pDisplayPlaneInfo)
@@ -16850,28 +19883,35 @@
         local_pDisplayPlaneInfo = (VkDisplayPlaneInfo2KHR*)pool->alloc(sizeof(const VkDisplayPlaneInfo2KHR));
         deepcopy_VkDisplayPlaneInfo2KHR(pool, pDisplayPlaneInfo, (VkDisplayPlaneInfo2KHR*)(local_pDisplayPlaneInfo));
     }
+    local_doLock = doLock;
     if (local_pDisplayPlaneInfo)
     {
         transform_tohost_VkDisplayPlaneInfo2KHR(mImpl->resources(), (VkDisplayPlaneInfo2KHR*)(local_pDisplayPlaneInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1137;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1137, 1);
-        countingStream->write((uint64_t*)&cgen_var_1137, 1 * 8);
-        marshal_VkDisplayPlaneInfo2KHR(countingStream, (VkDisplayPlaneInfo2KHR*)(local_pDisplayPlaneInfo));
-        marshal_VkDisplayPlaneCapabilities2KHR(countingStream, (VkDisplayPlaneCapabilities2KHR*)(pCapabilities));
+        uint64_t cgen_var_1009;
+        *countPtr += 1 * 8;
+        count_VkDisplayPlaneInfo2KHR(featureBits, (VkDisplayPlaneInfo2KHR*)(local_pDisplayPlaneInfo), countPtr);
+        count_VkDisplayPlaneCapabilities2KHR(featureBits, (VkDisplayPlaneCapabilities2KHR*)(pCapabilities), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetDisplayPlaneCapabilities2KHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetDisplayPlaneCapabilities2KHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetDisplayPlaneCapabilities2KHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetDisplayPlaneCapabilities2KHR = OP_vkGetDisplayPlaneCapabilities2KHR;
-    stream->write(&opcode_vkGetDisplayPlaneCapabilities2KHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetDisplayPlaneCapabilities2KHR, sizeof(uint32_t));
-    uint64_t cgen_var_1138;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1138, 1);
-    stream->write((uint64_t*)&cgen_var_1138, 1 * 8);
-    marshal_VkDisplayPlaneInfo2KHR(stream, (VkDisplayPlaneInfo2KHR*)(local_pDisplayPlaneInfo));
-    marshal_VkDisplayPlaneCapabilities2KHR(stream, (VkDisplayPlaneCapabilities2KHR*)(pCapabilities));
+    memcpy(streamPtr, &opcode_vkGetDisplayPlaneCapabilities2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetDisplayPlaneCapabilities2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1010;
+    *&cgen_var_1010 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1010, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDisplayPlaneInfo2KHR(stream, (VkDisplayPlaneInfo2KHR*)(local_pDisplayPlaneInfo), streamPtrPtr);
+    reservedmarshal_VkDisplayPlaneCapabilities2KHR(stream, (VkDisplayPlaneCapabilities2KHR*)(pCapabilities), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkDisplayPlaneCapabilities2KHR(stream, (VkDisplayPlaneCapabilities2KHR*)(pCapabilities));
     if (pCapabilities)
     {
@@ -16879,9 +19919,13 @@
     }
     VkResult vkGetDisplayPlaneCapabilities2KHR_VkResult_return = (VkResult)0;
     stream->read(&vkGetDisplayPlaneCapabilities2KHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetDisplayPlaneCapabilities2KHR");;
     return vkGetDisplayPlaneCapabilities2KHR_VkResult_return;
 }
@@ -16897,17 +19941,17 @@
 void VkEncoder::vkGetImageMemoryRequirements2KHR(
     VkDevice device,
     const VkImageMemoryRequirementsInfo2* pInfo,
-    VkMemoryRequirements2* pMemoryRequirements)
+    VkMemoryRequirements2* pMemoryRequirements,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetImageMemoryRequirements2KHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkImageMemoryRequirementsInfo2* local_pInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pInfo = nullptr;
     if (pInfo)
@@ -16915,53 +19959,64 @@
         local_pInfo = (VkImageMemoryRequirementsInfo2*)pool->alloc(sizeof(const VkImageMemoryRequirementsInfo2));
         deepcopy_VkImageMemoryRequirementsInfo2(pool, pInfo, (VkImageMemoryRequirementsInfo2*)(local_pInfo));
     }
+    local_doLock = doLock;
     if (local_pInfo)
     {
         transform_tohost_VkImageMemoryRequirementsInfo2(mImpl->resources(), (VkImageMemoryRequirementsInfo2*)(local_pInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1139;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1139, 1);
-        countingStream->write((uint64_t*)&cgen_var_1139, 1 * 8);
-        marshal_VkImageMemoryRequirementsInfo2(countingStream, (VkImageMemoryRequirementsInfo2*)(local_pInfo));
-        marshal_VkMemoryRequirements2(countingStream, (VkMemoryRequirements2*)(pMemoryRequirements));
+        uint64_t cgen_var_1011;
+        *countPtr += 1 * 8;
+        count_VkImageMemoryRequirementsInfo2(featureBits, (VkImageMemoryRequirementsInfo2*)(local_pInfo), countPtr);
+        count_VkMemoryRequirements2(featureBits, (VkMemoryRequirements2*)(pMemoryRequirements), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetImageMemoryRequirements2KHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetImageMemoryRequirements2KHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageMemoryRequirements2KHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetImageMemoryRequirements2KHR = OP_vkGetImageMemoryRequirements2KHR;
-    stream->write(&opcode_vkGetImageMemoryRequirements2KHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetImageMemoryRequirements2KHR, sizeof(uint32_t));
-    uint64_t cgen_var_1140;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1140, 1);
-    stream->write((uint64_t*)&cgen_var_1140, 1 * 8);
-    marshal_VkImageMemoryRequirementsInfo2(stream, (VkImageMemoryRequirementsInfo2*)(local_pInfo));
-    marshal_VkMemoryRequirements2(stream, (VkMemoryRequirements2*)(pMemoryRequirements));
+    memcpy(streamPtr, &opcode_vkGetImageMemoryRequirements2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetImageMemoryRequirements2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1012;
+    *&cgen_var_1012 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1012, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkImageMemoryRequirementsInfo2(stream, (VkImageMemoryRequirementsInfo2*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkMemoryRequirements2(stream, (VkMemoryRequirements2*)(pMemoryRequirements), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkMemoryRequirements2(stream, (VkMemoryRequirements2*)(pMemoryRequirements));
     if (pMemoryRequirements)
     {
         transform_fromhost_VkMemoryRequirements2(mImpl->resources(), (VkMemoryRequirements2*)(pMemoryRequirements));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetImageMemoryRequirements2KHR");;
 }
 
 void VkEncoder::vkGetBufferMemoryRequirements2KHR(
     VkDevice device,
     const VkBufferMemoryRequirementsInfo2* pInfo,
-    VkMemoryRequirements2* pMemoryRequirements)
+    VkMemoryRequirements2* pMemoryRequirements,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetBufferMemoryRequirements2KHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkBufferMemoryRequirementsInfo2* local_pInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pInfo = nullptr;
     if (pInfo)
@@ -16969,36 +20024,47 @@
         local_pInfo = (VkBufferMemoryRequirementsInfo2*)pool->alloc(sizeof(const VkBufferMemoryRequirementsInfo2));
         deepcopy_VkBufferMemoryRequirementsInfo2(pool, pInfo, (VkBufferMemoryRequirementsInfo2*)(local_pInfo));
     }
+    local_doLock = doLock;
     if (local_pInfo)
     {
         transform_tohost_VkBufferMemoryRequirementsInfo2(mImpl->resources(), (VkBufferMemoryRequirementsInfo2*)(local_pInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1141;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1141, 1);
-        countingStream->write((uint64_t*)&cgen_var_1141, 1 * 8);
-        marshal_VkBufferMemoryRequirementsInfo2(countingStream, (VkBufferMemoryRequirementsInfo2*)(local_pInfo));
-        marshal_VkMemoryRequirements2(countingStream, (VkMemoryRequirements2*)(pMemoryRequirements));
+        uint64_t cgen_var_1013;
+        *countPtr += 1 * 8;
+        count_VkBufferMemoryRequirementsInfo2(featureBits, (VkBufferMemoryRequirementsInfo2*)(local_pInfo), countPtr);
+        count_VkMemoryRequirements2(featureBits, (VkMemoryRequirements2*)(pMemoryRequirements), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetBufferMemoryRequirements2KHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetBufferMemoryRequirements2KHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetBufferMemoryRequirements2KHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetBufferMemoryRequirements2KHR = OP_vkGetBufferMemoryRequirements2KHR;
-    stream->write(&opcode_vkGetBufferMemoryRequirements2KHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetBufferMemoryRequirements2KHR, sizeof(uint32_t));
-    uint64_t cgen_var_1142;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1142, 1);
-    stream->write((uint64_t*)&cgen_var_1142, 1 * 8);
-    marshal_VkBufferMemoryRequirementsInfo2(stream, (VkBufferMemoryRequirementsInfo2*)(local_pInfo));
-    marshal_VkMemoryRequirements2(stream, (VkMemoryRequirements2*)(pMemoryRequirements));
+    memcpy(streamPtr, &opcode_vkGetBufferMemoryRequirements2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetBufferMemoryRequirements2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1014;
+    *&cgen_var_1014 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1014, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkBufferMemoryRequirementsInfo2(stream, (VkBufferMemoryRequirementsInfo2*)(local_pInfo), streamPtrPtr);
+    reservedmarshal_VkMemoryRequirements2(stream, (VkMemoryRequirements2*)(pMemoryRequirements), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkMemoryRequirements2(stream, (VkMemoryRequirements2*)(pMemoryRequirements));
     if (pMemoryRequirements)
     {
         transform_fromhost_VkMemoryRequirements2(mImpl->resources(), (VkMemoryRequirements2*)(pMemoryRequirements));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetBufferMemoryRequirements2KHR");;
 }
 
@@ -17006,17 +20072,17 @@
     VkDevice device,
     const VkImageSparseMemoryRequirementsInfo2* pInfo,
     uint32_t* pSparseMemoryRequirementCount,
-    VkSparseImageMemoryRequirements2* pSparseMemoryRequirements)
+    VkSparseImageMemoryRequirements2* pSparseMemoryRequirements,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetImageSparseMemoryRequirements2KHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkImageSparseMemoryRequirementsInfo2* local_pInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pInfo = nullptr;
     if (pInfo)
@@ -17024,60 +20090,70 @@
         local_pInfo = (VkImageSparseMemoryRequirementsInfo2*)pool->alloc(sizeof(const VkImageSparseMemoryRequirementsInfo2));
         deepcopy_VkImageSparseMemoryRequirementsInfo2(pool, pInfo, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo));
     }
+    local_doLock = doLock;
     if (local_pInfo)
     {
         transform_tohost_VkImageSparseMemoryRequirementsInfo2(mImpl->resources(), (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1143;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1143, 1);
-        countingStream->write((uint64_t*)&cgen_var_1143, 1 * 8);
-        marshal_VkImageSparseMemoryRequirementsInfo2(countingStream, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo));
+        uint64_t cgen_var_1015;
+        *countPtr += 1 * 8;
+        count_VkImageSparseMemoryRequirementsInfo2(featureBits, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_1144 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
-        countingStream->putBe64(cgen_var_1144);
+        *countPtr += 8;
         if (pSparseMemoryRequirementCount)
         {
-            countingStream->write((uint32_t*)pSparseMemoryRequirementCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_1145 = (uint64_t)(uintptr_t)pSparseMemoryRequirements;
-        countingStream->putBe64(cgen_var_1145);
+        *countPtr += 8;
         if (pSparseMemoryRequirements)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
             {
-                marshal_VkSparseImageMemoryRequirements2(countingStream, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
+                count_VkSparseImageMemoryRequirements2(featureBits, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetImageSparseMemoryRequirements2KHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetImageSparseMemoryRequirements2KHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageSparseMemoryRequirements2KHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetImageSparseMemoryRequirements2KHR = OP_vkGetImageSparseMemoryRequirements2KHR;
-    stream->write(&opcode_vkGetImageSparseMemoryRequirements2KHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetImageSparseMemoryRequirements2KHR, sizeof(uint32_t));
-    uint64_t cgen_var_1146;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1146, 1);
-    stream->write((uint64_t*)&cgen_var_1146, 1 * 8);
-    marshal_VkImageSparseMemoryRequirementsInfo2(stream, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo));
+    memcpy(streamPtr, &opcode_vkGetImageSparseMemoryRequirements2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetImageSparseMemoryRequirements2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1016;
+    *&cgen_var_1016 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1016, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkImageSparseMemoryRequirementsInfo2(stream, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_1147 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
-    stream->putBe64(cgen_var_1147);
+    uint64_t cgen_var_1017 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
+    memcpy((*streamPtrPtr), &cgen_var_1017, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pSparseMemoryRequirementCount)
     {
-        stream->write((uint32_t*)pSparseMemoryRequirementCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pSparseMemoryRequirementCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_1148 = (uint64_t)(uintptr_t)pSparseMemoryRequirements;
-    stream->putBe64(cgen_var_1148);
+    uint64_t cgen_var_1018 = (uint64_t)(uintptr_t)pSparseMemoryRequirements;
+    memcpy((*streamPtrPtr), &cgen_var_1018, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pSparseMemoryRequirements)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i)
         {
-            marshal_VkSparseImageMemoryRequirements2(stream, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
+            reservedmarshal_VkSparseImageMemoryRequirements2(stream, (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pSparseMemoryRequirementCount;
     check_pSparseMemoryRequirementCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -17110,9 +20186,13 @@
             transform_fromhost_VkSparseImageMemoryRequirements2(mImpl->resources(), (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
         }
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetImageSparseMemoryRequirements2KHR");;
 }
 
@@ -17124,18 +20204,18 @@
     VkDevice device,
     const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkSamplerYcbcrConversion* pYcbcrConversion)
+    VkSamplerYcbcrConversion* pYcbcrConversion,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateSamplerYcbcrConversionKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkSamplerYcbcrConversionCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -17149,6 +20229,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -17158,54 +20239,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1151;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1151, 1);
-        countingStream->write((uint64_t*)&cgen_var_1151, 1 * 8);
-        marshal_VkSamplerYcbcrConversionCreateInfo(countingStream, (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_1021;
+        *countPtr += 1 * 8;
+        count_VkSamplerYcbcrConversionCreateInfo(featureBits, (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_1152 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_1152);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_1153;
-        countingStream->handleMapping()->mapHandles_VkSamplerYcbcrConversion_u64(pYcbcrConversion, &cgen_var_1153, 1);
-        countingStream->write((uint64_t*)&cgen_var_1153, 8);
+        uint64_t cgen_var_1022;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateSamplerYcbcrConversionKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateSamplerYcbcrConversionKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateSamplerYcbcrConversionKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateSamplerYcbcrConversionKHR = OP_vkCreateSamplerYcbcrConversionKHR;
-    stream->write(&opcode_vkCreateSamplerYcbcrConversionKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateSamplerYcbcrConversionKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1154;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1154, 1);
-    stream->write((uint64_t*)&cgen_var_1154, 1 * 8);
-    marshal_VkSamplerYcbcrConversionCreateInfo(stream, (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateSamplerYcbcrConversionKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateSamplerYcbcrConversionKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1023;
+    *&cgen_var_1023 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1023, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkSamplerYcbcrConversionCreateInfo(stream, (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_1155 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_1155);
+    uint64_t cgen_var_1024 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_1024, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_1156;
-    stream->handleMapping()->mapHandles_VkSamplerYcbcrConversion_u64(pYcbcrConversion, &cgen_var_1156, 1);
-    stream->write((uint64_t*)&cgen_var_1156, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_1025;
+    *&cgen_var_1025 = (uint64_t)((*pYcbcrConversion));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1025, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_1157;
-    stream->read((uint64_t*)&cgen_var_1157, 8);
-    stream->handleMapping()->mapHandles_u64_VkSamplerYcbcrConversion(&cgen_var_1157, (VkSamplerYcbcrConversion*)pYcbcrConversion, 1);
+    uint64_t cgen_var_1026;
+    stream->read((uint64_t*)&cgen_var_1026, 8);
+    stream->handleMapping()->mapHandles_u64_VkSamplerYcbcrConversion(&cgen_var_1026, (VkSamplerYcbcrConversion*)pYcbcrConversion, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateSamplerYcbcrConversionKHR_VkResult_return = (VkResult)0;
     stream->read(&vkCreateSamplerYcbcrConversionKHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateSamplerYcbcrConversionKHR");;
     return vkCreateSamplerYcbcrConversionKHR_VkResult_return;
 }
@@ -17213,18 +20305,18 @@
 void VkEncoder::vkDestroySamplerYcbcrConversionKHR(
     VkDevice device,
     VkSamplerYcbcrConversion ycbcrConversion,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroySamplerYcbcrConversionKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkSamplerYcbcrConversion local_ycbcrConversion;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_ycbcrConversion = ycbcrConversion;
     local_pAllocator = nullptr;
@@ -17233,49 +20325,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1158;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1158, 1);
-        countingStream->write((uint64_t*)&cgen_var_1158, 1 * 8);
-        uint64_t cgen_var_1159;
-        countingStream->handleMapping()->mapHandles_VkSamplerYcbcrConversion_u64(&local_ycbcrConversion, &cgen_var_1159, 1);
-        countingStream->write((uint64_t*)&cgen_var_1159, 1 * 8);
+        uint64_t cgen_var_1027;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1028;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_1160 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_1160);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroySamplerYcbcrConversionKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroySamplerYcbcrConversionKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroySamplerYcbcrConversionKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroySamplerYcbcrConversionKHR = OP_vkDestroySamplerYcbcrConversionKHR;
-    stream->write(&opcode_vkDestroySamplerYcbcrConversionKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroySamplerYcbcrConversionKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1161;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1161, 1);
-    stream->write((uint64_t*)&cgen_var_1161, 1 * 8);
-    uint64_t cgen_var_1162;
-    stream->handleMapping()->mapHandles_VkSamplerYcbcrConversion_u64(&local_ycbcrConversion, &cgen_var_1162, 1);
-    stream->write((uint64_t*)&cgen_var_1162, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroySamplerYcbcrConversionKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroySamplerYcbcrConversionKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1029;
+    *&cgen_var_1029 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1029, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1030;
+    *&cgen_var_1030 = get_host_u64_VkSamplerYcbcrConversion((*&local_ycbcrConversion));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1030, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_1163 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_1163);
+    uint64_t cgen_var_1031 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_1031, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkSamplerYcbcrConversion((VkSamplerYcbcrConversion*)&ycbcrConversion);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroySamplerYcbcrConversionKHR");;
 }
 
@@ -17284,18 +20388,18 @@
 VkResult VkEncoder::vkBindBufferMemory2KHR(
     VkDevice device,
     uint32_t bindInfoCount,
-    const VkBindBufferMemoryInfo* pBindInfos)
+    const VkBindBufferMemoryInfo* pBindInfos,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkBindBufferMemory2KHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     uint32_t local_bindInfoCount;
     VkBindBufferMemoryInfo* local_pBindInfos;
+    uint32_t local_doLock;
     local_device = device;
     local_bindInfoCount = bindInfoCount;
     local_pBindInfos = nullptr;
@@ -17307,6 +20411,7 @@
             deepcopy_VkBindBufferMemoryInfo(pool, pBindInfos + i, (VkBindBufferMemoryInfo*)(local_pBindInfos + i));
         }
     }
+    local_doLock = doLock;
     if (local_pBindInfos)
     {
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
@@ -17314,35 +20419,46 @@
             transform_tohost_VkBindBufferMemoryInfo(mImpl->resources(), (VkBindBufferMemoryInfo*)(local_pBindInfos + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1164;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1164, 1);
-        countingStream->write((uint64_t*)&cgen_var_1164, 1 * 8);
-        countingStream->write((uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
+        uint64_t cgen_var_1032;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
         {
-            marshal_VkBindBufferMemoryInfo(countingStream, (VkBindBufferMemoryInfo*)(local_pBindInfos + i));
+            count_VkBindBufferMemoryInfo(featureBits, (VkBindBufferMemoryInfo*)(local_pBindInfos + i), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkBindBufferMemory2KHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkBindBufferMemory2KHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkBindBufferMemory2KHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkBindBufferMemory2KHR = OP_vkBindBufferMemory2KHR;
-    stream->write(&opcode_vkBindBufferMemory2KHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkBindBufferMemory2KHR, sizeof(uint32_t));
-    uint64_t cgen_var_1165;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1165, 1);
-    stream->write((uint64_t*)&cgen_var_1165, 1 * 8);
-    stream->write((uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkBindBufferMemory2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkBindBufferMemory2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1033;
+    *&cgen_var_1033 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1033, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
     {
-        marshal_VkBindBufferMemoryInfo(stream, (VkBindBufferMemoryInfo*)(local_pBindInfos + i));
+        reservedmarshal_VkBindBufferMemoryInfo(stream, (VkBindBufferMemoryInfo*)(local_pBindInfos + i), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkBindBufferMemory2KHR_VkResult_return = (VkResult)0;
     stream->read(&vkBindBufferMemory2KHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkBindBufferMemory2KHR");;
     return vkBindBufferMemory2KHR_VkResult_return;
 }
@@ -17350,18 +20466,18 @@
 VkResult VkEncoder::vkBindImageMemory2KHR(
     VkDevice device,
     uint32_t bindInfoCount,
-    const VkBindImageMemoryInfo* pBindInfos)
+    const VkBindImageMemoryInfo* pBindInfos,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkBindImageMemory2KHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     uint32_t local_bindInfoCount;
     VkBindImageMemoryInfo* local_pBindInfos;
+    uint32_t local_doLock;
     local_device = device;
     local_bindInfoCount = bindInfoCount;
     local_pBindInfos = nullptr;
@@ -17373,6 +20489,7 @@
             deepcopy_VkBindImageMemoryInfo(pool, pBindInfos + i, (VkBindImageMemoryInfo*)(local_pBindInfos + i));
         }
     }
+    local_doLock = doLock;
     if (local_pBindInfos)
     {
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
@@ -17380,35 +20497,46 @@
             transform_tohost_VkBindImageMemoryInfo(mImpl->resources(), (VkBindImageMemoryInfo*)(local_pBindInfos + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1166;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1166, 1);
-        countingStream->write((uint64_t*)&cgen_var_1166, 1 * 8);
-        countingStream->write((uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
+        uint64_t cgen_var_1034;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
         {
-            marshal_VkBindImageMemoryInfo(countingStream, (VkBindImageMemoryInfo*)(local_pBindInfos + i));
+            count_VkBindImageMemoryInfo(featureBits, (VkBindImageMemoryInfo*)(local_pBindInfos + i), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkBindImageMemory2KHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkBindImageMemory2KHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkBindImageMemory2KHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkBindImageMemory2KHR = OP_vkBindImageMemory2KHR;
-    stream->write(&opcode_vkBindImageMemory2KHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkBindImageMemory2KHR, sizeof(uint32_t));
-    uint64_t cgen_var_1167;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1167, 1);
-    stream->write((uint64_t*)&cgen_var_1167, 1 * 8);
-    stream->write((uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkBindImageMemory2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkBindImageMemory2KHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1035;
+    *&cgen_var_1035 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1035, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
     {
-        marshal_VkBindImageMemoryInfo(stream, (VkBindImageMemoryInfo*)(local_pBindInfos + i));
+        reservedmarshal_VkBindImageMemoryInfo(stream, (VkBindImageMemoryInfo*)(local_pBindInfos + i), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkBindImageMemory2KHR_VkResult_return = (VkResult)0;
     stream->read(&vkBindImageMemory2KHR_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkBindImageMemory2KHR");;
     return vkBindImageMemory2KHR_VkResult_return;
 }
@@ -17418,17 +20546,17 @@
 void VkEncoder::vkGetDescriptorSetLayoutSupportKHR(
     VkDevice device,
     const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
-    VkDescriptorSetLayoutSupport* pSupport)
+    VkDescriptorSetLayoutSupport* pSupport,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetDescriptorSetLayoutSupportKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDescriptorSetLayoutCreateInfo* local_pCreateInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -17436,36 +20564,47 @@
         local_pCreateInfo = (VkDescriptorSetLayoutCreateInfo*)pool->alloc(sizeof(const VkDescriptorSetLayoutCreateInfo));
         deepcopy_VkDescriptorSetLayoutCreateInfo(pool, pCreateInfo, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo));
     }
+    local_doLock = doLock;
     if (local_pCreateInfo)
     {
         transform_tohost_VkDescriptorSetLayoutCreateInfo(mImpl->resources(), (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1168;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1168, 1);
-        countingStream->write((uint64_t*)&cgen_var_1168, 1 * 8);
-        marshal_VkDescriptorSetLayoutCreateInfo(countingStream, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo));
-        marshal_VkDescriptorSetLayoutSupport(countingStream, (VkDescriptorSetLayoutSupport*)(pSupport));
+        uint64_t cgen_var_1036;
+        *countPtr += 1 * 8;
+        count_VkDescriptorSetLayoutCreateInfo(featureBits, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo), countPtr);
+        count_VkDescriptorSetLayoutSupport(featureBits, (VkDescriptorSetLayoutSupport*)(pSupport), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetDescriptorSetLayoutSupportKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetDescriptorSetLayoutSupportKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetDescriptorSetLayoutSupportKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetDescriptorSetLayoutSupportKHR = OP_vkGetDescriptorSetLayoutSupportKHR;
-    stream->write(&opcode_vkGetDescriptorSetLayoutSupportKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetDescriptorSetLayoutSupportKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1169;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1169, 1);
-    stream->write((uint64_t*)&cgen_var_1169, 1 * 8);
-    marshal_VkDescriptorSetLayoutCreateInfo(stream, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo));
-    marshal_VkDescriptorSetLayoutSupport(stream, (VkDescriptorSetLayoutSupport*)(pSupport));
+    memcpy(streamPtr, &opcode_vkGetDescriptorSetLayoutSupportKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetDescriptorSetLayoutSupportKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1037;
+    *&cgen_var_1037 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1037, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDescriptorSetLayoutCreateInfo(stream, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo), streamPtrPtr);
+    reservedmarshal_VkDescriptorSetLayoutSupport(stream, (VkDescriptorSetLayoutSupport*)(pSupport), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkDescriptorSetLayoutSupport(stream, (VkDescriptorSetLayoutSupport*)(pSupport));
     if (pSupport)
     {
         transform_fromhost_VkDescriptorSetLayoutSupport(mImpl->resources(), (VkDescriptorSetLayoutSupport*)(pSupport));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetDescriptorSetLayoutSupportKHR");;
 }
 
@@ -17478,15 +20617,14 @@
     VkBuffer countBuffer,
     VkDeviceSize countBufferOffset,
     uint32_t maxDrawCount,
-    uint32_t stride)
+    uint32_t stride,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdDrawIndirectCountKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkBuffer local_buffer;
     VkDeviceSize local_offset;
@@ -17494,6 +20632,7 @@
     VkDeviceSize local_countBufferOffset;
     uint32_t local_maxDrawCount;
     uint32_t local_stride;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_buffer = buffer;
     local_offset = offset;
@@ -17501,43 +20640,58 @@
     local_countBufferOffset = countBufferOffset;
     local_maxDrawCount = maxDrawCount;
     local_stride = stride;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1170;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1170, 1);
-        countingStream->write((uint64_t*)&cgen_var_1170, 1 * 8);
-        uint64_t cgen_var_1171;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_1171, 1);
-        countingStream->write((uint64_t*)&cgen_var_1171, 1 * 8);
-        countingStream->write((VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
-        uint64_t cgen_var_1172;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_countBuffer, &cgen_var_1172, 1);
-        countingStream->write((uint64_t*)&cgen_var_1172, 1 * 8);
-        countingStream->write((VkDeviceSize*)&local_countBufferOffset, sizeof(VkDeviceSize));
-        countingStream->write((uint32_t*)&local_maxDrawCount, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_stride, sizeof(uint32_t));
+        uint64_t cgen_var_1038;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1039;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkDeviceSize);
+        uint64_t cgen_var_1040;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkDeviceSize);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdDrawIndirectCountKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdDrawIndirectCountKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDrawIndirectCountKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdDrawIndirectCountKHR = OP_vkCmdDrawIndirectCountKHR;
-    stream->write(&opcode_vkCmdDrawIndirectCountKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdDrawIndirectCountKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1173;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1173, 1);
-    stream->write((uint64_t*)&cgen_var_1173, 1 * 8);
-    uint64_t cgen_var_1174;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_1174, 1);
-    stream->write((uint64_t*)&cgen_var_1174, 1 * 8);
-    stream->write((VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
-    uint64_t cgen_var_1175;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_countBuffer, &cgen_var_1175, 1);
-    stream->write((uint64_t*)&cgen_var_1175, 1 * 8);
-    stream->write((VkDeviceSize*)&local_countBufferOffset, sizeof(VkDeviceSize));
-    stream->write((uint32_t*)&local_maxDrawCount, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_stride, sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdDrawIndirectCountKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdDrawIndirectCountKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1041;
+    *&cgen_var_1041 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1041, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1042;
+    *&cgen_var_1042 = get_host_u64_VkBuffer((*&local_buffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1042, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    uint64_t cgen_var_1043;
+    *&cgen_var_1043 = get_host_u64_VkBuffer((*&local_countBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1043, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkDeviceSize*)&local_countBufferOffset, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_maxDrawCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_stride, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdDrawIndirectCountKHR");;
 }
 
@@ -17548,15 +20702,14 @@
     VkBuffer countBuffer,
     VkDeviceSize countBufferOffset,
     uint32_t maxDrawCount,
-    uint32_t stride)
+    uint32_t stride,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdDrawIndexedIndirectCountKHR");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkBuffer local_buffer;
     VkDeviceSize local_offset;
@@ -17564,6 +20717,7 @@
     VkDeviceSize local_countBufferOffset;
     uint32_t local_maxDrawCount;
     uint32_t local_stride;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_buffer = buffer;
     local_offset = offset;
@@ -17571,43 +20725,58 @@
     local_countBufferOffset = countBufferOffset;
     local_maxDrawCount = maxDrawCount;
     local_stride = stride;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1176;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1176, 1);
-        countingStream->write((uint64_t*)&cgen_var_1176, 1 * 8);
-        uint64_t cgen_var_1177;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_1177, 1);
-        countingStream->write((uint64_t*)&cgen_var_1177, 1 * 8);
-        countingStream->write((VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
-        uint64_t cgen_var_1178;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_countBuffer, &cgen_var_1178, 1);
-        countingStream->write((uint64_t*)&cgen_var_1178, 1 * 8);
-        countingStream->write((VkDeviceSize*)&local_countBufferOffset, sizeof(VkDeviceSize));
-        countingStream->write((uint32_t*)&local_maxDrawCount, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_stride, sizeof(uint32_t));
+        uint64_t cgen_var_1044;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1045;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkDeviceSize);
+        uint64_t cgen_var_1046;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkDeviceSize);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdDrawIndexedIndirectCountKHR = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdDrawIndexedIndirectCountKHR = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDrawIndexedIndirectCountKHR);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdDrawIndexedIndirectCountKHR = OP_vkCmdDrawIndexedIndirectCountKHR;
-    stream->write(&opcode_vkCmdDrawIndexedIndirectCountKHR, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdDrawIndexedIndirectCountKHR, sizeof(uint32_t));
-    uint64_t cgen_var_1179;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1179, 1);
-    stream->write((uint64_t*)&cgen_var_1179, 1 * 8);
-    uint64_t cgen_var_1180;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_1180, 1);
-    stream->write((uint64_t*)&cgen_var_1180, 1 * 8);
-    stream->write((VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
-    uint64_t cgen_var_1181;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_countBuffer, &cgen_var_1181, 1);
-    stream->write((uint64_t*)&cgen_var_1181, 1 * 8);
-    stream->write((VkDeviceSize*)&local_countBufferOffset, sizeof(VkDeviceSize));
-    stream->write((uint32_t*)&local_maxDrawCount, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_stride, sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdDrawIndexedIndirectCountKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdDrawIndexedIndirectCountKHR, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1047;
+    *&cgen_var_1047 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1047, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1048;
+    *&cgen_var_1048 = get_host_u64_VkBuffer((*&local_buffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1048, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    uint64_t cgen_var_1049;
+    *&cgen_var_1049 = get_host_u64_VkBuffer((*&local_countBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1049, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkDeviceSize*)&local_countBufferOffset, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_maxDrawCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_stride, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdDrawIndexedIndirectCountKHR");;
 }
 
@@ -17621,47 +20790,61 @@
     VkDevice device,
     VkFormat format,
     VkImageUsageFlags imageUsage,
-    int* grallocUsage)
+    int* grallocUsage,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetSwapchainGrallocUsageANDROID");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkFormat local_format;
     VkImageUsageFlags local_imageUsage;
+    uint32_t local_doLock;
     local_device = device;
     local_format = format;
     local_imageUsage = imageUsage;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1182;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1182, 1);
-        countingStream->write((uint64_t*)&cgen_var_1182, 1 * 8);
-        countingStream->write((VkFormat*)&local_format, sizeof(VkFormat));
-        countingStream->write((VkImageUsageFlags*)&local_imageUsage, sizeof(VkImageUsageFlags));
-        countingStream->write((int*)grallocUsage, sizeof(int));
+        uint64_t cgen_var_1050;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkFormat);
+        *countPtr += sizeof(VkImageUsageFlags);
+        *countPtr += sizeof(int);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetSwapchainGrallocUsageANDROID = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetSwapchainGrallocUsageANDROID = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetSwapchainGrallocUsageANDROID);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetSwapchainGrallocUsageANDROID = OP_vkGetSwapchainGrallocUsageANDROID;
-    stream->write(&opcode_vkGetSwapchainGrallocUsageANDROID, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetSwapchainGrallocUsageANDROID, sizeof(uint32_t));
-    uint64_t cgen_var_1183;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1183, 1);
-    stream->write((uint64_t*)&cgen_var_1183, 1 * 8);
-    stream->write((VkFormat*)&local_format, sizeof(VkFormat));
-    stream->write((VkImageUsageFlags*)&local_imageUsage, sizeof(VkImageUsageFlags));
-    stream->write((int*)grallocUsage, sizeof(int));
+    memcpy(streamPtr, &opcode_vkGetSwapchainGrallocUsageANDROID, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetSwapchainGrallocUsageANDROID, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1051;
+    *&cgen_var_1051 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1051, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkFormat*)&local_format, sizeof(VkFormat));
+    *streamPtrPtr += sizeof(VkFormat);
+    memcpy(*streamPtrPtr, (VkImageUsageFlags*)&local_imageUsage, sizeof(VkImageUsageFlags));
+    *streamPtrPtr += sizeof(VkImageUsageFlags);
+    memcpy(*streamPtrPtr, (int*)grallocUsage, sizeof(int));
+    *streamPtrPtr += sizeof(int);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((int*)grallocUsage, sizeof(int));
     VkResult vkGetSwapchainGrallocUsageANDROID_VkResult_return = (VkResult)0;
     stream->read(&vkGetSwapchainGrallocUsageANDROID_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetSwapchainGrallocUsageANDROID");;
     return vkGetSwapchainGrallocUsageANDROID_VkResult_return;
 }
@@ -17671,65 +20854,77 @@
     VkImage image,
     int nativeFenceFd,
     VkSemaphore semaphore,
-    VkFence fence)
+    VkFence fence,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkAcquireImageANDROID");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkImage local_image;
     int local_nativeFenceFd;
     VkSemaphore local_semaphore;
     VkFence local_fence;
+    uint32_t local_doLock;
     local_device = device;
     local_image = image;
     local_nativeFenceFd = nativeFenceFd;
     local_semaphore = semaphore;
     local_fence = fence;
+    local_doLock = doLock;
     mImpl->resources()->unwrap_vkAcquireImageANDROID_nativeFenceFd(nativeFenceFd, &local_nativeFenceFd);
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1184;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1184, 1);
-        countingStream->write((uint64_t*)&cgen_var_1184, 1 * 8);
-        uint64_t cgen_var_1185;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_1185, 1);
-        countingStream->write((uint64_t*)&cgen_var_1185, 1 * 8);
-        countingStream->write((int*)&local_nativeFenceFd, sizeof(int));
-        uint64_t cgen_var_1186;
-        countingStream->handleMapping()->mapHandles_VkSemaphore_u64(&local_semaphore, &cgen_var_1186, 1);
-        countingStream->write((uint64_t*)&cgen_var_1186, 1 * 8);
-        uint64_t cgen_var_1187;
-        countingStream->handleMapping()->mapHandles_VkFence_u64(&local_fence, &cgen_var_1187, 1);
-        countingStream->write((uint64_t*)&cgen_var_1187, 1 * 8);
+        uint64_t cgen_var_1052;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1053;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(int);
+        uint64_t cgen_var_1054;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1055;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkAcquireImageANDROID = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkAcquireImageANDROID = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkAcquireImageANDROID);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkAcquireImageANDROID = OP_vkAcquireImageANDROID;
-    stream->write(&opcode_vkAcquireImageANDROID, sizeof(uint32_t));
-    stream->write(&packetSize_vkAcquireImageANDROID, sizeof(uint32_t));
-    uint64_t cgen_var_1188;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1188, 1);
-    stream->write((uint64_t*)&cgen_var_1188, 1 * 8);
-    uint64_t cgen_var_1189;
-    stream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_1189, 1);
-    stream->write((uint64_t*)&cgen_var_1189, 1 * 8);
-    stream->write((int*)&local_nativeFenceFd, sizeof(int));
-    uint64_t cgen_var_1190;
-    stream->handleMapping()->mapHandles_VkSemaphore_u64(&local_semaphore, &cgen_var_1190, 1);
-    stream->write((uint64_t*)&cgen_var_1190, 1 * 8);
-    uint64_t cgen_var_1191;
-    stream->handleMapping()->mapHandles_VkFence_u64(&local_fence, &cgen_var_1191, 1);
-    stream->write((uint64_t*)&cgen_var_1191, 1 * 8);
+    memcpy(streamPtr, &opcode_vkAcquireImageANDROID, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkAcquireImageANDROID, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1056;
+    *&cgen_var_1056 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1056, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1057;
+    *&cgen_var_1057 = get_host_u64_VkImage((*&local_image));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1057, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (int*)&local_nativeFenceFd, sizeof(int));
+    *streamPtrPtr += sizeof(int);
+    uint64_t cgen_var_1058;
+    *&cgen_var_1058 = get_host_u64_VkSemaphore((*&local_semaphore));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1058, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1059;
+    *&cgen_var_1059 = get_host_u64_VkFence((*&local_fence));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1059, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkAcquireImageANDROID_VkResult_return = (VkResult)0;
     stream->read(&vkAcquireImageANDROID_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkAcquireImageANDROID");;
     return vkAcquireImageANDROID_VkResult_return;
 }
@@ -17739,19 +20934,19 @@
     uint32_t waitSemaphoreCount,
     const VkSemaphore* pWaitSemaphores,
     VkImage image,
-    int* pNativeFenceFd)
+    int* pNativeFenceFd,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkQueueSignalReleaseImageANDROID");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkQueue local_queue;
     uint32_t local_waitSemaphoreCount;
     VkSemaphore* local_pWaitSemaphores;
     VkImage local_image;
+    uint32_t local_doLock;
     local_queue = queue;
     local_waitSemaphoreCount = waitSemaphoreCount;
     local_pWaitSemaphores = nullptr;
@@ -17760,63 +20955,78 @@
         local_pWaitSemaphores = (VkSemaphore*)pool->dupArray(pWaitSemaphores, ((waitSemaphoreCount)) * sizeof(const VkSemaphore));
     }
     local_image = image;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1192;
-        countingStream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1192, 1);
-        countingStream->write((uint64_t*)&cgen_var_1192, 1 * 8);
-        countingStream->write((uint32_t*)&local_waitSemaphoreCount, sizeof(uint32_t));
+        uint64_t cgen_var_1060;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         // WARNING PTR CHECK
-        uint64_t cgen_var_1193 = (uint64_t)(uintptr_t)local_pWaitSemaphores;
-        countingStream->putBe64(cgen_var_1193);
+        *countPtr += 8;
         if (local_pWaitSemaphores)
         {
             if (((waitSemaphoreCount)))
             {
-                uint64_t* cgen_var_1194;
-                countingStream->alloc((void**)&cgen_var_1194, ((waitSemaphoreCount)) * 8);
-                countingStream->handleMapping()->mapHandles_VkSemaphore_u64(local_pWaitSemaphores, cgen_var_1194, ((waitSemaphoreCount)));
-                countingStream->write((uint64_t*)cgen_var_1194, ((waitSemaphoreCount)) * 8);
+                *countPtr += ((waitSemaphoreCount)) * 8;
             }
         }
-        uint64_t cgen_var_1195;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_1195, 1);
-        countingStream->write((uint64_t*)&cgen_var_1195, 1 * 8);
-        countingStream->write((int*)pNativeFenceFd, sizeof(int));
+        uint64_t cgen_var_1062;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(int);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkQueueSignalReleaseImageANDROID = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkQueueSignalReleaseImageANDROID = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkQueueSignalReleaseImageANDROID);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkQueueSignalReleaseImageANDROID = OP_vkQueueSignalReleaseImageANDROID;
-    stream->write(&opcode_vkQueueSignalReleaseImageANDROID, sizeof(uint32_t));
-    stream->write(&packetSize_vkQueueSignalReleaseImageANDROID, sizeof(uint32_t));
-    uint64_t cgen_var_1196;
-    stream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1196, 1);
-    stream->write((uint64_t*)&cgen_var_1196, 1 * 8);
-    stream->write((uint32_t*)&local_waitSemaphoreCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkQueueSignalReleaseImageANDROID, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkQueueSignalReleaseImageANDROID, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1063;
+    *&cgen_var_1063 = get_host_u64_VkQueue((*&local_queue));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1063, 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_1197 = (uint64_t)(uintptr_t)local_pWaitSemaphores;
-    stream->putBe64(cgen_var_1197);
+    uint64_t cgen_var_1064 = (uint64_t)(uintptr_t)local_pWaitSemaphores;
+    memcpy((*streamPtrPtr), &cgen_var_1064, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pWaitSemaphores)
     {
         if (((waitSemaphoreCount)))
         {
-            uint64_t* cgen_var_1198;
-            stream->alloc((void**)&cgen_var_1198, ((waitSemaphoreCount)) * 8);
-            stream->handleMapping()->mapHandles_VkSemaphore_u64(local_pWaitSemaphores, cgen_var_1198, ((waitSemaphoreCount)));
-            stream->write((uint64_t*)cgen_var_1198, ((waitSemaphoreCount)) * 8);
+            uint64_t* cgen_var_1065;
+            stream->alloc((void**)&cgen_var_1065, ((waitSemaphoreCount)) * 8);
+            for (uint32_t k = 0; k < ((waitSemaphoreCount)); ++k)
+            {
+                cgen_var_1065[k] = get_host_u64_VkSemaphore(local_pWaitSemaphores[k]);
+            }
+            memcpy(*streamPtrPtr, (uint64_t*)cgen_var_1065, ((waitSemaphoreCount)) * 8);
+            *streamPtrPtr += ((waitSemaphoreCount)) * 8;
         }
     }
-    uint64_t cgen_var_1199;
-    stream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_1199, 1);
-    stream->write((uint64_t*)&cgen_var_1199, 1 * 8);
-    stream->write((int*)pNativeFenceFd, sizeof(int));
+    uint64_t cgen_var_1066;
+    *&cgen_var_1066 = get_host_u64_VkImage((*&local_image));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1066, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (int*)pNativeFenceFd, sizeof(int));
+    *streamPtrPtr += sizeof(int);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((int*)pNativeFenceFd, sizeof(int));
     VkResult vkQueueSignalReleaseImageANDROID_VkResult_return = (VkResult)0;
     stream->read(&vkQueueSignalReleaseImageANDROID_VkResult_return, sizeof(VkResult));
     stream->flush();
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkQueueSignalReleaseImageANDROID");;
     return vkQueueSignalReleaseImageANDROID_VkResult_return;
 }
@@ -17827,18 +21037,18 @@
     VkInstance instance,
     const VkDebugReportCallbackCreateInfoEXT* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkDebugReportCallbackEXT* pCallback)
+    VkDebugReportCallbackEXT* pCallback,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateDebugReportCallbackEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkInstance local_instance;
     VkDebugReportCallbackCreateInfoEXT* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_instance = instance;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -17852,6 +21062,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -17861,54 +21072,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1200;
-        countingStream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_1200, 1);
-        countingStream->write((uint64_t*)&cgen_var_1200, 1 * 8);
-        marshal_VkDebugReportCallbackCreateInfoEXT(countingStream, (VkDebugReportCallbackCreateInfoEXT*)(local_pCreateInfo));
+        uint64_t cgen_var_1067;
+        *countPtr += 1 * 8;
+        count_VkDebugReportCallbackCreateInfoEXT(featureBits, (VkDebugReportCallbackCreateInfoEXT*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_1201 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_1201);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_1202;
-        countingStream->handleMapping()->mapHandles_VkDebugReportCallbackEXT_u64(pCallback, &cgen_var_1202, 1);
-        countingStream->write((uint64_t*)&cgen_var_1202, 8);
+        uint64_t cgen_var_1068;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateDebugReportCallbackEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateDebugReportCallbackEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateDebugReportCallbackEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateDebugReportCallbackEXT = OP_vkCreateDebugReportCallbackEXT;
-    stream->write(&opcode_vkCreateDebugReportCallbackEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateDebugReportCallbackEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1203;
-    stream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_1203, 1);
-    stream->write((uint64_t*)&cgen_var_1203, 1 * 8);
-    marshal_VkDebugReportCallbackCreateInfoEXT(stream, (VkDebugReportCallbackCreateInfoEXT*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateDebugReportCallbackEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateDebugReportCallbackEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1069;
+    *&cgen_var_1069 = get_host_u64_VkInstance((*&local_instance));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1069, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDebugReportCallbackCreateInfoEXT(stream, (VkDebugReportCallbackCreateInfoEXT*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_1204 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_1204);
+    uint64_t cgen_var_1070 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_1070, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_1205;
-    stream->handleMapping()->mapHandles_VkDebugReportCallbackEXT_u64(pCallback, &cgen_var_1205, 1);
-    stream->write((uint64_t*)&cgen_var_1205, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_1071;
+    *&cgen_var_1071 = (uint64_t)((*pCallback));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1071, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_1206;
-    stream->read((uint64_t*)&cgen_var_1206, 8);
-    stream->handleMapping()->mapHandles_u64_VkDebugReportCallbackEXT(&cgen_var_1206, (VkDebugReportCallbackEXT*)pCallback, 1);
+    uint64_t cgen_var_1072;
+    stream->read((uint64_t*)&cgen_var_1072, 8);
+    stream->handleMapping()->mapHandles_u64_VkDebugReportCallbackEXT(&cgen_var_1072, (VkDebugReportCallbackEXT*)pCallback, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateDebugReportCallbackEXT_VkResult_return = (VkResult)0;
     stream->read(&vkCreateDebugReportCallbackEXT_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateDebugReportCallbackEXT");;
     return vkCreateDebugReportCallbackEXT_VkResult_return;
 }
@@ -17916,18 +21138,18 @@
 void VkEncoder::vkDestroyDebugReportCallbackEXT(
     VkInstance instance,
     VkDebugReportCallbackEXT callback,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyDebugReportCallbackEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkInstance local_instance;
     VkDebugReportCallbackEXT local_callback;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_instance = instance;
     local_callback = callback;
     local_pAllocator = nullptr;
@@ -17936,49 +21158,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1207;
-        countingStream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_1207, 1);
-        countingStream->write((uint64_t*)&cgen_var_1207, 1 * 8);
-        uint64_t cgen_var_1208;
-        countingStream->handleMapping()->mapHandles_VkDebugReportCallbackEXT_u64(&local_callback, &cgen_var_1208, 1);
-        countingStream->write((uint64_t*)&cgen_var_1208, 1 * 8);
+        uint64_t cgen_var_1073;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1074;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_1209 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_1209);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyDebugReportCallbackEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyDebugReportCallbackEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyDebugReportCallbackEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyDebugReportCallbackEXT = OP_vkDestroyDebugReportCallbackEXT;
-    stream->write(&opcode_vkDestroyDebugReportCallbackEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyDebugReportCallbackEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1210;
-    stream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_1210, 1);
-    stream->write((uint64_t*)&cgen_var_1210, 1 * 8);
-    uint64_t cgen_var_1211;
-    stream->handleMapping()->mapHandles_VkDebugReportCallbackEXT_u64(&local_callback, &cgen_var_1211, 1);
-    stream->write((uint64_t*)&cgen_var_1211, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyDebugReportCallbackEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyDebugReportCallbackEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1075;
+    *&cgen_var_1075 = get_host_u64_VkInstance((*&local_instance));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1075, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1076;
+    *&cgen_var_1076 = get_host_u64_VkDebugReportCallbackEXT((*&local_callback));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1076, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_1212 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_1212);
+    uint64_t cgen_var_1077 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_1077, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkDebugReportCallbackEXT((VkDebugReportCallbackEXT*)&callback);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyDebugReportCallbackEXT");;
 }
 
@@ -17990,15 +21224,14 @@
     size_t location,
     int32_t messageCode,
     const char* pLayerPrefix,
-    const char* pMessage)
+    const char* pMessage,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDebugReportMessageEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkInstance local_instance;
     VkDebugReportFlagsEXT local_flags;
     VkDebugReportObjectTypeEXT local_objectType;
@@ -18007,6 +21240,7 @@
     int32_t local_messageCode;
     char* local_pLayerPrefix;
     char* local_pMessage;
+    uint32_t local_doLock;
     local_instance = instance;
     local_flags = flags;
     local_objectType = objectType;
@@ -18023,39 +21257,69 @@
     {
         local_pMessage = pool->strDup(pMessage);
     }
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1213;
-        countingStream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_1213, 1);
-        countingStream->write((uint64_t*)&cgen_var_1213, 1 * 8);
-        countingStream->write((VkDebugReportFlagsEXT*)&local_flags, sizeof(VkDebugReportFlagsEXT));
-        countingStream->write((VkDebugReportObjectTypeEXT*)&local_objectType, sizeof(VkDebugReportObjectTypeEXT));
-        countingStream->write((uint64_t*)&local_object, sizeof(uint64_t));
-        uint64_t cgen_var_1214 = (uint64_t)local_location;
-        countingStream->putBe64(cgen_var_1214);
-        countingStream->write((int32_t*)&local_messageCode, sizeof(int32_t));
-        countingStream->putString(local_pLayerPrefix);
-        countingStream->putString(local_pMessage);
+        uint64_t cgen_var_1078;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkDebugReportFlagsEXT);
+        *countPtr += sizeof(VkDebugReportObjectTypeEXT);
+        *countPtr += sizeof(uint64_t);
+        *countPtr += 8;
+        *countPtr += sizeof(int32_t);
+        *countPtr += sizeof(uint32_t) + (local_pLayerPrefix ? strlen(local_pLayerPrefix) : 0);
+        *countPtr += sizeof(uint32_t) + (local_pMessage ? strlen(local_pMessage) : 0);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDebugReportMessageEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDebugReportMessageEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDebugReportMessageEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDebugReportMessageEXT = OP_vkDebugReportMessageEXT;
-    stream->write(&opcode_vkDebugReportMessageEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkDebugReportMessageEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1215;
-    stream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_1215, 1);
-    stream->write((uint64_t*)&cgen_var_1215, 1 * 8);
-    stream->write((VkDebugReportFlagsEXT*)&local_flags, sizeof(VkDebugReportFlagsEXT));
-    stream->write((VkDebugReportObjectTypeEXT*)&local_objectType, sizeof(VkDebugReportObjectTypeEXT));
-    stream->write((uint64_t*)&local_object, sizeof(uint64_t));
-    uint64_t cgen_var_1216 = (uint64_t)local_location;
-    stream->putBe64(cgen_var_1216);
-    stream->write((int32_t*)&local_messageCode, sizeof(int32_t));
-    stream->putString(local_pLayerPrefix);
-    stream->putString(local_pMessage);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkDebugReportMessageEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDebugReportMessageEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1079;
+    *&cgen_var_1079 = get_host_u64_VkInstance((*&local_instance));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1079, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkDebugReportFlagsEXT*)&local_flags, sizeof(VkDebugReportFlagsEXT));
+    *streamPtrPtr += sizeof(VkDebugReportFlagsEXT);
+    memcpy(*streamPtrPtr, (VkDebugReportObjectTypeEXT*)&local_objectType, sizeof(VkDebugReportObjectTypeEXT));
+    *streamPtrPtr += sizeof(VkDebugReportObjectTypeEXT);
+    memcpy(*streamPtrPtr, (uint64_t*)&local_object, sizeof(uint64_t));
+    *streamPtrPtr += sizeof(uint64_t);
+    uint64_t cgen_var_1080 = (uint64_t)local_location;
+    memcpy((*streamPtrPtr), &cgen_var_1080, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
+    memcpy(*streamPtrPtr, (int32_t*)&local_messageCode, sizeof(int32_t));
+    *streamPtrPtr += sizeof(int32_t);
+    {
+        uint32_t l = local_pLayerPrefix ? strlen(local_pLayerPrefix): 0;
+        memcpy(*streamPtrPtr, (uint32_t*)&l, sizeof(uint32_t));
+        android::base::Stream::toBe32((uint8_t*)*streamPtrPtr);
+        *streamPtrPtr += sizeof(uint32_t);
+        memcpy(*streamPtrPtr, (char*)local_pLayerPrefix, l);
+        *streamPtrPtr += l;
+    }
+    {
+        uint32_t l = local_pMessage ? strlen(local_pMessage): 0;
+        memcpy(*streamPtrPtr, (uint32_t*)&l, sizeof(uint32_t));
+        android::base::Stream::toBe32((uint8_t*)*streamPtrPtr);
+        *streamPtrPtr += sizeof(uint32_t);
+        memcpy(*streamPtrPtr, (char*)local_pMessage, l);
+        *streamPtrPtr += l;
+    }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDebugReportMessageEXT");;
 }
 
@@ -18075,17 +21339,17 @@
 #ifdef VK_EXT_debug_marker
 VkResult VkEncoder::vkDebugMarkerSetObjectTagEXT(
     VkDevice device,
-    const VkDebugMarkerObjectTagInfoEXT* pTagInfo)
+    const VkDebugMarkerObjectTagInfoEXT* pTagInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDebugMarkerSetObjectTagEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDebugMarkerObjectTagInfoEXT* local_pTagInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pTagInfo = nullptr;
     if (pTagInfo)
@@ -18093,48 +21357,59 @@
         local_pTagInfo = (VkDebugMarkerObjectTagInfoEXT*)pool->alloc(sizeof(const VkDebugMarkerObjectTagInfoEXT));
         deepcopy_VkDebugMarkerObjectTagInfoEXT(pool, pTagInfo, (VkDebugMarkerObjectTagInfoEXT*)(local_pTagInfo));
     }
+    local_doLock = doLock;
     if (local_pTagInfo)
     {
         transform_tohost_VkDebugMarkerObjectTagInfoEXT(mImpl->resources(), (VkDebugMarkerObjectTagInfoEXT*)(local_pTagInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1217;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1217, 1);
-        countingStream->write((uint64_t*)&cgen_var_1217, 1 * 8);
-        marshal_VkDebugMarkerObjectTagInfoEXT(countingStream, (VkDebugMarkerObjectTagInfoEXT*)(local_pTagInfo));
+        uint64_t cgen_var_1081;
+        *countPtr += 1 * 8;
+        count_VkDebugMarkerObjectTagInfoEXT(featureBits, (VkDebugMarkerObjectTagInfoEXT*)(local_pTagInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDebugMarkerSetObjectTagEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDebugMarkerSetObjectTagEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDebugMarkerSetObjectTagEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDebugMarkerSetObjectTagEXT = OP_vkDebugMarkerSetObjectTagEXT;
-    stream->write(&opcode_vkDebugMarkerSetObjectTagEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkDebugMarkerSetObjectTagEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1218;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1218, 1);
-    stream->write((uint64_t*)&cgen_var_1218, 1 * 8);
-    marshal_VkDebugMarkerObjectTagInfoEXT(stream, (VkDebugMarkerObjectTagInfoEXT*)(local_pTagInfo));
+    memcpy(streamPtr, &opcode_vkDebugMarkerSetObjectTagEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDebugMarkerSetObjectTagEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1082;
+    *&cgen_var_1082 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1082, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDebugMarkerObjectTagInfoEXT(stream, (VkDebugMarkerObjectTagInfoEXT*)(local_pTagInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkDebugMarkerSetObjectTagEXT_VkResult_return = (VkResult)0;
     stream->read(&vkDebugMarkerSetObjectTagEXT_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDebugMarkerSetObjectTagEXT");;
     return vkDebugMarkerSetObjectTagEXT_VkResult_return;
 }
 
 VkResult VkEncoder::vkDebugMarkerSetObjectNameEXT(
     VkDevice device,
-    const VkDebugMarkerObjectNameInfoEXT* pNameInfo)
+    const VkDebugMarkerObjectNameInfoEXT* pNameInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDebugMarkerSetObjectNameEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDebugMarkerObjectNameInfoEXT* local_pNameInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pNameInfo = nullptr;
     if (pNameInfo)
@@ -18142,48 +21417,59 @@
         local_pNameInfo = (VkDebugMarkerObjectNameInfoEXT*)pool->alloc(sizeof(const VkDebugMarkerObjectNameInfoEXT));
         deepcopy_VkDebugMarkerObjectNameInfoEXT(pool, pNameInfo, (VkDebugMarkerObjectNameInfoEXT*)(local_pNameInfo));
     }
+    local_doLock = doLock;
     if (local_pNameInfo)
     {
         transform_tohost_VkDebugMarkerObjectNameInfoEXT(mImpl->resources(), (VkDebugMarkerObjectNameInfoEXT*)(local_pNameInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1219;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1219, 1);
-        countingStream->write((uint64_t*)&cgen_var_1219, 1 * 8);
-        marshal_VkDebugMarkerObjectNameInfoEXT(countingStream, (VkDebugMarkerObjectNameInfoEXT*)(local_pNameInfo));
+        uint64_t cgen_var_1083;
+        *countPtr += 1 * 8;
+        count_VkDebugMarkerObjectNameInfoEXT(featureBits, (VkDebugMarkerObjectNameInfoEXT*)(local_pNameInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDebugMarkerSetObjectNameEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDebugMarkerSetObjectNameEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDebugMarkerSetObjectNameEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDebugMarkerSetObjectNameEXT = OP_vkDebugMarkerSetObjectNameEXT;
-    stream->write(&opcode_vkDebugMarkerSetObjectNameEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkDebugMarkerSetObjectNameEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1220;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1220, 1);
-    stream->write((uint64_t*)&cgen_var_1220, 1 * 8);
-    marshal_VkDebugMarkerObjectNameInfoEXT(stream, (VkDebugMarkerObjectNameInfoEXT*)(local_pNameInfo));
+    memcpy(streamPtr, &opcode_vkDebugMarkerSetObjectNameEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDebugMarkerSetObjectNameEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1084;
+    *&cgen_var_1084 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1084, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDebugMarkerObjectNameInfoEXT(stream, (VkDebugMarkerObjectNameInfoEXT*)(local_pNameInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkDebugMarkerSetObjectNameEXT_VkResult_return = (VkResult)0;
     stream->read(&vkDebugMarkerSetObjectNameEXT_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDebugMarkerSetObjectNameEXT");;
     return vkDebugMarkerSetObjectNameEXT_VkResult_return;
 }
 
 void VkEncoder::vkCmdDebugMarkerBeginEXT(
     VkCommandBuffer commandBuffer,
-    const VkDebugMarkerMarkerInfoEXT* pMarkerInfo)
+    const VkDebugMarkerMarkerInfoEXT* pMarkerInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdDebugMarkerBeginEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkDebugMarkerMarkerInfoEXT* local_pMarkerInfo;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_pMarkerInfo = nullptr;
     if (pMarkerInfo)
@@ -18191,77 +21477,99 @@
         local_pMarkerInfo = (VkDebugMarkerMarkerInfoEXT*)pool->alloc(sizeof(const VkDebugMarkerMarkerInfoEXT));
         deepcopy_VkDebugMarkerMarkerInfoEXT(pool, pMarkerInfo, (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo));
     }
+    local_doLock = doLock;
     if (local_pMarkerInfo)
     {
         transform_tohost_VkDebugMarkerMarkerInfoEXT(mImpl->resources(), (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1221;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1221, 1);
-        countingStream->write((uint64_t*)&cgen_var_1221, 1 * 8);
-        marshal_VkDebugMarkerMarkerInfoEXT(countingStream, (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo));
+        uint64_t cgen_var_1085;
+        *countPtr += 1 * 8;
+        count_VkDebugMarkerMarkerInfoEXT(featureBits, (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdDebugMarkerBeginEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdDebugMarkerBeginEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDebugMarkerBeginEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdDebugMarkerBeginEXT = OP_vkCmdDebugMarkerBeginEXT;
-    stream->write(&opcode_vkCmdDebugMarkerBeginEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdDebugMarkerBeginEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1222;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1222, 1);
-    stream->write((uint64_t*)&cgen_var_1222, 1 * 8);
-    marshal_VkDebugMarkerMarkerInfoEXT(stream, (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdDebugMarkerBeginEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdDebugMarkerBeginEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1086;
+    *&cgen_var_1086 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1086, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDebugMarkerMarkerInfoEXT(stream, (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdDebugMarkerBeginEXT");;
 }
 
 void VkEncoder::vkCmdDebugMarkerEndEXT(
-    VkCommandBuffer commandBuffer)
+    VkCommandBuffer commandBuffer,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdDebugMarkerEndEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1223;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1223, 1);
-        countingStream->write((uint64_t*)&cgen_var_1223, 1 * 8);
+        uint64_t cgen_var_1087;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdDebugMarkerEndEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdDebugMarkerEndEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDebugMarkerEndEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdDebugMarkerEndEXT = OP_vkCmdDebugMarkerEndEXT;
-    stream->write(&opcode_vkCmdDebugMarkerEndEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdDebugMarkerEndEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1224;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1224, 1);
-    stream->write((uint64_t*)&cgen_var_1224, 1 * 8);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdDebugMarkerEndEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdDebugMarkerEndEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1088;
+    *&cgen_var_1088 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1088, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdDebugMarkerEndEXT");;
 }
 
 void VkEncoder::vkCmdDebugMarkerInsertEXT(
     VkCommandBuffer commandBuffer,
-    const VkDebugMarkerMarkerInfoEXT* pMarkerInfo)
+    const VkDebugMarkerMarkerInfoEXT* pMarkerInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdDebugMarkerInsertEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkDebugMarkerMarkerInfoEXT* local_pMarkerInfo;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_pMarkerInfo = nullptr;
     if (pMarkerInfo)
@@ -18269,29 +21577,40 @@
         local_pMarkerInfo = (VkDebugMarkerMarkerInfoEXT*)pool->alloc(sizeof(const VkDebugMarkerMarkerInfoEXT));
         deepcopy_VkDebugMarkerMarkerInfoEXT(pool, pMarkerInfo, (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo));
     }
+    local_doLock = doLock;
     if (local_pMarkerInfo)
     {
         transform_tohost_VkDebugMarkerMarkerInfoEXT(mImpl->resources(), (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1225;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1225, 1);
-        countingStream->write((uint64_t*)&cgen_var_1225, 1 * 8);
-        marshal_VkDebugMarkerMarkerInfoEXT(countingStream, (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo));
+        uint64_t cgen_var_1089;
+        *countPtr += 1 * 8;
+        count_VkDebugMarkerMarkerInfoEXT(featureBits, (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdDebugMarkerInsertEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdDebugMarkerInsertEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDebugMarkerInsertEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdDebugMarkerInsertEXT = OP_vkCmdDebugMarkerInsertEXT;
-    stream->write(&opcode_vkCmdDebugMarkerInsertEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdDebugMarkerInsertEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1226;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1226, 1);
-    stream->write((uint64_t*)&cgen_var_1226, 1 * 8);
-    marshal_VkDebugMarkerMarkerInfoEXT(stream, (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdDebugMarkerInsertEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdDebugMarkerInsertEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1090;
+    *&cgen_var_1090 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1090, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDebugMarkerMarkerInfoEXT(stream, (VkDebugMarkerMarkerInfoEXT*)(local_pMarkerInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdDebugMarkerInsertEXT");;
 }
 
@@ -18308,15 +21627,14 @@
     VkBuffer countBuffer,
     VkDeviceSize countBufferOffset,
     uint32_t maxDrawCount,
-    uint32_t stride)
+    uint32_t stride,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdDrawIndirectCountAMD");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkBuffer local_buffer;
     VkDeviceSize local_offset;
@@ -18324,6 +21642,7 @@
     VkDeviceSize local_countBufferOffset;
     uint32_t local_maxDrawCount;
     uint32_t local_stride;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_buffer = buffer;
     local_offset = offset;
@@ -18331,43 +21650,58 @@
     local_countBufferOffset = countBufferOffset;
     local_maxDrawCount = maxDrawCount;
     local_stride = stride;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1227;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1227, 1);
-        countingStream->write((uint64_t*)&cgen_var_1227, 1 * 8);
-        uint64_t cgen_var_1228;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_1228, 1);
-        countingStream->write((uint64_t*)&cgen_var_1228, 1 * 8);
-        countingStream->write((VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
-        uint64_t cgen_var_1229;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_countBuffer, &cgen_var_1229, 1);
-        countingStream->write((uint64_t*)&cgen_var_1229, 1 * 8);
-        countingStream->write((VkDeviceSize*)&local_countBufferOffset, sizeof(VkDeviceSize));
-        countingStream->write((uint32_t*)&local_maxDrawCount, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_stride, sizeof(uint32_t));
+        uint64_t cgen_var_1091;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1092;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkDeviceSize);
+        uint64_t cgen_var_1093;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkDeviceSize);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdDrawIndirectCountAMD = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdDrawIndirectCountAMD = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDrawIndirectCountAMD);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdDrawIndirectCountAMD = OP_vkCmdDrawIndirectCountAMD;
-    stream->write(&opcode_vkCmdDrawIndirectCountAMD, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdDrawIndirectCountAMD, sizeof(uint32_t));
-    uint64_t cgen_var_1230;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1230, 1);
-    stream->write((uint64_t*)&cgen_var_1230, 1 * 8);
-    uint64_t cgen_var_1231;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_1231, 1);
-    stream->write((uint64_t*)&cgen_var_1231, 1 * 8);
-    stream->write((VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
-    uint64_t cgen_var_1232;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_countBuffer, &cgen_var_1232, 1);
-    stream->write((uint64_t*)&cgen_var_1232, 1 * 8);
-    stream->write((VkDeviceSize*)&local_countBufferOffset, sizeof(VkDeviceSize));
-    stream->write((uint32_t*)&local_maxDrawCount, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_stride, sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdDrawIndirectCountAMD, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdDrawIndirectCountAMD, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1094;
+    *&cgen_var_1094 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1094, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1095;
+    *&cgen_var_1095 = get_host_u64_VkBuffer((*&local_buffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1095, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    uint64_t cgen_var_1096;
+    *&cgen_var_1096 = get_host_u64_VkBuffer((*&local_countBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1096, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkDeviceSize*)&local_countBufferOffset, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_maxDrawCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_stride, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdDrawIndirectCountAMD");;
 }
 
@@ -18378,15 +21712,14 @@
     VkBuffer countBuffer,
     VkDeviceSize countBufferOffset,
     uint32_t maxDrawCount,
-    uint32_t stride)
+    uint32_t stride,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdDrawIndexedIndirectCountAMD");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkBuffer local_buffer;
     VkDeviceSize local_offset;
@@ -18394,6 +21727,7 @@
     VkDeviceSize local_countBufferOffset;
     uint32_t local_maxDrawCount;
     uint32_t local_stride;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_buffer = buffer;
     local_offset = offset;
@@ -18401,43 +21735,58 @@
     local_countBufferOffset = countBufferOffset;
     local_maxDrawCount = maxDrawCount;
     local_stride = stride;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1233;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1233, 1);
-        countingStream->write((uint64_t*)&cgen_var_1233, 1 * 8);
-        uint64_t cgen_var_1234;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_1234, 1);
-        countingStream->write((uint64_t*)&cgen_var_1234, 1 * 8);
-        countingStream->write((VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
-        uint64_t cgen_var_1235;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_countBuffer, &cgen_var_1235, 1);
-        countingStream->write((uint64_t*)&cgen_var_1235, 1 * 8);
-        countingStream->write((VkDeviceSize*)&local_countBufferOffset, sizeof(VkDeviceSize));
-        countingStream->write((uint32_t*)&local_maxDrawCount, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_stride, sizeof(uint32_t));
+        uint64_t cgen_var_1097;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1098;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkDeviceSize);
+        uint64_t cgen_var_1099;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkDeviceSize);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdDrawIndexedIndirectCountAMD = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdDrawIndexedIndirectCountAMD = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDrawIndexedIndirectCountAMD);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdDrawIndexedIndirectCountAMD = OP_vkCmdDrawIndexedIndirectCountAMD;
-    stream->write(&opcode_vkCmdDrawIndexedIndirectCountAMD, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdDrawIndexedIndirectCountAMD, sizeof(uint32_t));
-    uint64_t cgen_var_1236;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1236, 1);
-    stream->write((uint64_t*)&cgen_var_1236, 1 * 8);
-    uint64_t cgen_var_1237;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_1237, 1);
-    stream->write((uint64_t*)&cgen_var_1237, 1 * 8);
-    stream->write((VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
-    uint64_t cgen_var_1238;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_countBuffer, &cgen_var_1238, 1);
-    stream->write((uint64_t*)&cgen_var_1238, 1 * 8);
-    stream->write((VkDeviceSize*)&local_countBufferOffset, sizeof(VkDeviceSize));
-    stream->write((uint32_t*)&local_maxDrawCount, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_stride, sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdDrawIndexedIndirectCountAMD, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdDrawIndexedIndirectCountAMD, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1100;
+    *&cgen_var_1100 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1100, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1101;
+    *&cgen_var_1101 = get_host_u64_VkBuffer((*&local_buffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1101, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    uint64_t cgen_var_1102;
+    *&cgen_var_1102 = get_host_u64_VkBuffer((*&local_countBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1102, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkDeviceSize*)&local_countBufferOffset, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_maxDrawCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_stride, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdDrawIndexedIndirectCountAMD");;
 }
 
@@ -18457,77 +21806,90 @@
     VkShaderStageFlagBits shaderStage,
     VkShaderInfoTypeAMD infoType,
     size_t* pInfoSize,
-    void* pInfo)
+    void* pInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetShaderInfoAMD");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkPipeline local_pipeline;
     VkShaderStageFlagBits local_shaderStage;
     VkShaderInfoTypeAMD local_infoType;
+    uint32_t local_doLock;
     local_device = device;
     local_pipeline = pipeline;
     local_shaderStage = shaderStage;
     local_infoType = infoType;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1239;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1239, 1);
-        countingStream->write((uint64_t*)&cgen_var_1239, 1 * 8);
-        uint64_t cgen_var_1240;
-        countingStream->handleMapping()->mapHandles_VkPipeline_u64(&local_pipeline, &cgen_var_1240, 1);
-        countingStream->write((uint64_t*)&cgen_var_1240, 1 * 8);
-        countingStream->write((VkShaderStageFlagBits*)&local_shaderStage, sizeof(VkShaderStageFlagBits));
-        countingStream->write((VkShaderInfoTypeAMD*)&local_infoType, sizeof(VkShaderInfoTypeAMD));
+        uint64_t cgen_var_1103;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1104;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkShaderStageFlagBits);
+        *countPtr += sizeof(VkShaderInfoTypeAMD);
         // WARNING PTR CHECK
-        uint64_t cgen_var_1241 = (uint64_t)(uintptr_t)pInfoSize;
-        countingStream->putBe64(cgen_var_1241);
+        *countPtr += 8;
         if (pInfoSize)
         {
-            uint64_t cgen_var_1242 = (uint64_t)(*pInfoSize);
-            countingStream->putBe64(cgen_var_1242);
+            *countPtr += 8;
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_1243 = (uint64_t)(uintptr_t)pInfo;
-        countingStream->putBe64(cgen_var_1243);
+        *countPtr += 8;
         if (pInfo)
         {
-            countingStream->write((void*)pInfo, (*(pInfoSize)) * sizeof(uint8_t));
+            *countPtr += (*(pInfoSize)) * sizeof(uint8_t);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetShaderInfoAMD = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetShaderInfoAMD = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetShaderInfoAMD);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetShaderInfoAMD = OP_vkGetShaderInfoAMD;
-    stream->write(&opcode_vkGetShaderInfoAMD, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetShaderInfoAMD, sizeof(uint32_t));
-    uint64_t cgen_var_1244;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1244, 1);
-    stream->write((uint64_t*)&cgen_var_1244, 1 * 8);
-    uint64_t cgen_var_1245;
-    stream->handleMapping()->mapHandles_VkPipeline_u64(&local_pipeline, &cgen_var_1245, 1);
-    stream->write((uint64_t*)&cgen_var_1245, 1 * 8);
-    stream->write((VkShaderStageFlagBits*)&local_shaderStage, sizeof(VkShaderStageFlagBits));
-    stream->write((VkShaderInfoTypeAMD*)&local_infoType, sizeof(VkShaderInfoTypeAMD));
+    memcpy(streamPtr, &opcode_vkGetShaderInfoAMD, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetShaderInfoAMD, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1105;
+    *&cgen_var_1105 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1105, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1106;
+    *&cgen_var_1106 = get_host_u64_VkPipeline((*&local_pipeline));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1106, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkShaderStageFlagBits*)&local_shaderStage, sizeof(VkShaderStageFlagBits));
+    *streamPtrPtr += sizeof(VkShaderStageFlagBits);
+    memcpy(*streamPtrPtr, (VkShaderInfoTypeAMD*)&local_infoType, sizeof(VkShaderInfoTypeAMD));
+    *streamPtrPtr += sizeof(VkShaderInfoTypeAMD);
     // WARNING PTR CHECK
-    uint64_t cgen_var_1246 = (uint64_t)(uintptr_t)pInfoSize;
-    stream->putBe64(cgen_var_1246);
+    uint64_t cgen_var_1107 = (uint64_t)(uintptr_t)pInfoSize;
+    memcpy((*streamPtrPtr), &cgen_var_1107, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pInfoSize)
     {
-        uint64_t cgen_var_1247 = (uint64_t)(*pInfoSize);
-        stream->putBe64(cgen_var_1247);
+        uint64_t cgen_var_1108 = (uint64_t)(*pInfoSize);
+        memcpy((*streamPtrPtr), &cgen_var_1108, 8);
+        android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+        *streamPtrPtr += 8;
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_1248 = (uint64_t)(uintptr_t)pInfo;
-    stream->putBe64(cgen_var_1248);
+    uint64_t cgen_var_1109 = (uint64_t)(uintptr_t)pInfo;
+    memcpy((*streamPtrPtr), &cgen_var_1109, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pInfo)
     {
-        stream->write((void*)pInfo, (*(pInfoSize)) * sizeof(uint8_t));
+        memcpy(*streamPtrPtr, (void*)pInfo, (*(pInfoSize)) * sizeof(uint8_t));
+        *streamPtrPtr += (*(pInfoSize)) * sizeof(uint8_t);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     size_t* check_pInfoSize;
     check_pInfoSize = (size_t*)(uintptr_t)stream->getBe64();
@@ -18552,9 +21914,13 @@
     }
     VkResult vkGetShaderInfoAMD_VkResult_return = (VkResult)0;
     stream->read(&vkGetShaderInfoAMD_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetShaderInfoAMD");;
     return vkGetShaderInfoAMD_VkResult_return;
 }
@@ -18573,15 +21939,14 @@
     VkImageUsageFlags usage,
     VkImageCreateFlags flags,
     VkExternalMemoryHandleTypeFlagsNV externalHandleType,
-    VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties)
+    VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceExternalImageFormatPropertiesNV");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkFormat local_format;
     VkImageType local_type;
@@ -18589,6 +21954,7 @@
     VkImageUsageFlags local_usage;
     VkImageCreateFlags local_flags;
     VkExternalMemoryHandleTypeFlagsNV local_externalHandleType;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_format = format;
     local_type = type;
@@ -18596,34 +21962,47 @@
     local_usage = usage;
     local_flags = flags;
     local_externalHandleType = externalHandleType;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1252;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1252, 1);
-        countingStream->write((uint64_t*)&cgen_var_1252, 1 * 8);
-        countingStream->write((VkFormat*)&local_format, sizeof(VkFormat));
-        countingStream->write((VkImageType*)&local_type, sizeof(VkImageType));
-        countingStream->write((VkImageTiling*)&local_tiling, sizeof(VkImageTiling));
-        countingStream->write((VkImageUsageFlags*)&local_usage, sizeof(VkImageUsageFlags));
-        countingStream->write((VkImageCreateFlags*)&local_flags, sizeof(VkImageCreateFlags));
-        countingStream->write((VkExternalMemoryHandleTypeFlagsNV*)&local_externalHandleType, sizeof(VkExternalMemoryHandleTypeFlagsNV));
-        marshal_VkExternalImageFormatPropertiesNV(countingStream, (VkExternalImageFormatPropertiesNV*)(pExternalImageFormatProperties));
+        uint64_t cgen_var_1113;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkFormat);
+        *countPtr += sizeof(VkImageType);
+        *countPtr += sizeof(VkImageTiling);
+        *countPtr += sizeof(VkImageUsageFlags);
+        *countPtr += sizeof(VkImageCreateFlags);
+        *countPtr += sizeof(VkExternalMemoryHandleTypeFlagsNV);
+        count_VkExternalImageFormatPropertiesNV(featureBits, (VkExternalImageFormatPropertiesNV*)(pExternalImageFormatProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceExternalImageFormatPropertiesNV = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceExternalImageFormatPropertiesNV = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceExternalImageFormatPropertiesNV);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceExternalImageFormatPropertiesNV = OP_vkGetPhysicalDeviceExternalImageFormatPropertiesNV;
-    stream->write(&opcode_vkGetPhysicalDeviceExternalImageFormatPropertiesNV, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceExternalImageFormatPropertiesNV, sizeof(uint32_t));
-    uint64_t cgen_var_1253;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1253, 1);
-    stream->write((uint64_t*)&cgen_var_1253, 1 * 8);
-    stream->write((VkFormat*)&local_format, sizeof(VkFormat));
-    stream->write((VkImageType*)&local_type, sizeof(VkImageType));
-    stream->write((VkImageTiling*)&local_tiling, sizeof(VkImageTiling));
-    stream->write((VkImageUsageFlags*)&local_usage, sizeof(VkImageUsageFlags));
-    stream->write((VkImageCreateFlags*)&local_flags, sizeof(VkImageCreateFlags));
-    stream->write((VkExternalMemoryHandleTypeFlagsNV*)&local_externalHandleType, sizeof(VkExternalMemoryHandleTypeFlagsNV));
-    marshal_VkExternalImageFormatPropertiesNV(stream, (VkExternalImageFormatPropertiesNV*)(pExternalImageFormatProperties));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceExternalImageFormatPropertiesNV, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceExternalImageFormatPropertiesNV, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1114;
+    *&cgen_var_1114 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1114, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkFormat*)&local_format, sizeof(VkFormat));
+    *streamPtrPtr += sizeof(VkFormat);
+    memcpy(*streamPtrPtr, (VkImageType*)&local_type, sizeof(VkImageType));
+    *streamPtrPtr += sizeof(VkImageType);
+    memcpy(*streamPtrPtr, (VkImageTiling*)&local_tiling, sizeof(VkImageTiling));
+    *streamPtrPtr += sizeof(VkImageTiling);
+    memcpy(*streamPtrPtr, (VkImageUsageFlags*)&local_usage, sizeof(VkImageUsageFlags));
+    *streamPtrPtr += sizeof(VkImageUsageFlags);
+    memcpy(*streamPtrPtr, (VkImageCreateFlags*)&local_flags, sizeof(VkImageCreateFlags));
+    *streamPtrPtr += sizeof(VkImageCreateFlags);
+    memcpy(*streamPtrPtr, (VkExternalMemoryHandleTypeFlagsNV*)&local_externalHandleType, sizeof(VkExternalMemoryHandleTypeFlagsNV));
+    *streamPtrPtr += sizeof(VkExternalMemoryHandleTypeFlagsNV);
+    reservedmarshal_VkExternalImageFormatPropertiesNV(stream, (VkExternalImageFormatPropertiesNV*)(pExternalImageFormatProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkExternalImageFormatPropertiesNV(stream, (VkExternalImageFormatPropertiesNV*)(pExternalImageFormatProperties));
     if (pExternalImageFormatProperties)
     {
@@ -18631,9 +22010,13 @@
     }
     VkResult vkGetPhysicalDeviceExternalImageFormatPropertiesNV_VkResult_return = (VkResult)0;
     stream->read(&vkGetPhysicalDeviceExternalImageFormatPropertiesNV_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceExternalImageFormatPropertiesNV");;
     return vkGetPhysicalDeviceExternalImageFormatPropertiesNV_VkResult_return;
 }
@@ -18646,52 +22029,65 @@
     VkDevice device,
     VkDeviceMemory memory,
     VkExternalMemoryHandleTypeFlagsNV handleType,
-    HANDLE* pHandle)
+    HANDLE* pHandle,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetMemoryWin32HandleNV");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDeviceMemory local_memory;
     VkExternalMemoryHandleTypeFlagsNV local_handleType;
+    uint32_t local_doLock;
     local_device = device;
     local_memory = memory;
     local_handleType = handleType;
+    local_doLock = doLock;
     mImpl->resources()->deviceMemoryTransform_tohost((VkDeviceMemory*)&local_memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1254;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1254, 1);
-        countingStream->write((uint64_t*)&cgen_var_1254, 1 * 8);
-        uint64_t cgen_var_1255;
-        countingStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&local_memory, &cgen_var_1255, 1);
-        countingStream->write((uint64_t*)&cgen_var_1255, 1 * 8);
-        countingStream->write((VkExternalMemoryHandleTypeFlagsNV*)&local_handleType, sizeof(VkExternalMemoryHandleTypeFlagsNV));
-        countingStream->write((HANDLE*)pHandle, sizeof(HANDLE));
+        uint64_t cgen_var_1115;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1116;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkExternalMemoryHandleTypeFlagsNV);
+        *countPtr += sizeof(HANDLE);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetMemoryWin32HandleNV = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetMemoryWin32HandleNV = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetMemoryWin32HandleNV);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetMemoryWin32HandleNV = OP_vkGetMemoryWin32HandleNV;
-    stream->write(&opcode_vkGetMemoryWin32HandleNV, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetMemoryWin32HandleNV, sizeof(uint32_t));
-    uint64_t cgen_var_1256;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1256, 1);
-    stream->write((uint64_t*)&cgen_var_1256, 1 * 8);
-    uint64_t cgen_var_1257;
-    stream->handleMapping()->mapHandles_VkDeviceMemory_u64(&local_memory, &cgen_var_1257, 1);
-    stream->write((uint64_t*)&cgen_var_1257, 1 * 8);
-    stream->write((VkExternalMemoryHandleTypeFlagsNV*)&local_handleType, sizeof(VkExternalMemoryHandleTypeFlagsNV));
-    stream->write((HANDLE*)pHandle, sizeof(HANDLE));
+    memcpy(streamPtr, &opcode_vkGetMemoryWin32HandleNV, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetMemoryWin32HandleNV, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1117;
+    *&cgen_var_1117 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1117, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1118;
+    *&cgen_var_1118 = get_host_u64_VkDeviceMemory((*&local_memory));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1118, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkExternalMemoryHandleTypeFlagsNV*)&local_handleType, sizeof(VkExternalMemoryHandleTypeFlagsNV));
+    *streamPtrPtr += sizeof(VkExternalMemoryHandleTypeFlagsNV);
+    memcpy(*streamPtrPtr, (HANDLE*)pHandle, sizeof(HANDLE));
+    *streamPtrPtr += sizeof(HANDLE);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((HANDLE*)pHandle, sizeof(HANDLE));
     VkResult vkGetMemoryWin32HandleNV_VkResult_return = (VkResult)0;
     stream->read(&vkGetMemoryWin32HandleNV_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetMemoryWin32HandleNV");;
     return vkGetMemoryWin32HandleNV_VkResult_return;
 }
@@ -18706,18 +22102,18 @@
     VkInstance instance,
     const VkViSurfaceCreateInfoNN* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
+    VkSurfaceKHR* pSurface,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateViSurfaceNN");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkInstance local_instance;
     VkViSurfaceCreateInfoNN* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_instance = instance;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -18731,6 +22127,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -18740,52 +22137,63 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1258;
-        countingStream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_1258, 1);
-        countingStream->write((uint64_t*)&cgen_var_1258, 1 * 8);
-        marshal_VkViSurfaceCreateInfoNN(countingStream, (VkViSurfaceCreateInfoNN*)(local_pCreateInfo));
+        uint64_t cgen_var_1119;
+        *countPtr += 1 * 8;
+        count_VkViSurfaceCreateInfoNN(featureBits, (VkViSurfaceCreateInfoNN*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_1259 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_1259);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_1260;
-        countingStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_1260, 1);
-        countingStream->write((uint64_t*)&cgen_var_1260, 8);
+        uint64_t cgen_var_1120;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateViSurfaceNN = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateViSurfaceNN = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateViSurfaceNN);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateViSurfaceNN = OP_vkCreateViSurfaceNN;
-    stream->write(&opcode_vkCreateViSurfaceNN, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateViSurfaceNN, sizeof(uint32_t));
-    uint64_t cgen_var_1261;
-    stream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_1261, 1);
-    stream->write((uint64_t*)&cgen_var_1261, 1 * 8);
-    marshal_VkViSurfaceCreateInfoNN(stream, (VkViSurfaceCreateInfoNN*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateViSurfaceNN, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateViSurfaceNN, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1121;
+    *&cgen_var_1121 = get_host_u64_VkInstance((*&local_instance));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1121, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkViSurfaceCreateInfoNN(stream, (VkViSurfaceCreateInfoNN*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_1262 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_1262);
+    uint64_t cgen_var_1122 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_1122, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_1263;
-    stream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_1263, 1);
-    stream->write((uint64_t*)&cgen_var_1263, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
-    uint64_t cgen_var_1264;
-    stream->read((uint64_t*)&cgen_var_1264, 8);
-    stream->handleMapping()->mapHandles_u64_VkSurfaceKHR(&cgen_var_1264, (VkSurfaceKHR*)pSurface, 1);
+    /* is handle, possibly out */;
+    uint64_t cgen_var_1123;
+    *&cgen_var_1123 = (uint64_t)((*pSurface));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1123, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1124;
+    stream->read((uint64_t*)&cgen_var_1124, 8);
+    stream->handleMapping()->mapHandles_u64_VkSurfaceKHR(&cgen_var_1124, (VkSurfaceKHR*)pSurface, 1);
     VkResult vkCreateViSurfaceNN_VkResult_return = (VkResult)0;
     stream->read(&vkCreateViSurfaceNN_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateViSurfaceNN");;
     return vkCreateViSurfaceNN_VkResult_return;
 }
@@ -18798,17 +22206,17 @@
 #ifdef VK_EXT_conditional_rendering
 void VkEncoder::vkCmdBeginConditionalRenderingEXT(
     VkCommandBuffer commandBuffer,
-    const VkConditionalRenderingBeginInfoEXT* pConditionalRenderingBegin)
+    const VkConditionalRenderingBeginInfoEXT* pConditionalRenderingBegin,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdBeginConditionalRenderingEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkConditionalRenderingBeginInfoEXT* local_pConditionalRenderingBegin;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_pConditionalRenderingBegin = nullptr;
     if (pConditionalRenderingBegin)
@@ -18816,61 +22224,83 @@
         local_pConditionalRenderingBegin = (VkConditionalRenderingBeginInfoEXT*)pool->alloc(sizeof(const VkConditionalRenderingBeginInfoEXT));
         deepcopy_VkConditionalRenderingBeginInfoEXT(pool, pConditionalRenderingBegin, (VkConditionalRenderingBeginInfoEXT*)(local_pConditionalRenderingBegin));
     }
+    local_doLock = doLock;
     if (local_pConditionalRenderingBegin)
     {
         transform_tohost_VkConditionalRenderingBeginInfoEXT(mImpl->resources(), (VkConditionalRenderingBeginInfoEXT*)(local_pConditionalRenderingBegin));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1265;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1265, 1);
-        countingStream->write((uint64_t*)&cgen_var_1265, 1 * 8);
-        marshal_VkConditionalRenderingBeginInfoEXT(countingStream, (VkConditionalRenderingBeginInfoEXT*)(local_pConditionalRenderingBegin));
+        uint64_t cgen_var_1125;
+        *countPtr += 1 * 8;
+        count_VkConditionalRenderingBeginInfoEXT(featureBits, (VkConditionalRenderingBeginInfoEXT*)(local_pConditionalRenderingBegin), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdBeginConditionalRenderingEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdBeginConditionalRenderingEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBeginConditionalRenderingEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdBeginConditionalRenderingEXT = OP_vkCmdBeginConditionalRenderingEXT;
-    stream->write(&opcode_vkCmdBeginConditionalRenderingEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdBeginConditionalRenderingEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1266;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1266, 1);
-    stream->write((uint64_t*)&cgen_var_1266, 1 * 8);
-    marshal_VkConditionalRenderingBeginInfoEXT(stream, (VkConditionalRenderingBeginInfoEXT*)(local_pConditionalRenderingBegin));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdBeginConditionalRenderingEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdBeginConditionalRenderingEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1126;
+    *&cgen_var_1126 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1126, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkConditionalRenderingBeginInfoEXT(stream, (VkConditionalRenderingBeginInfoEXT*)(local_pConditionalRenderingBegin), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdBeginConditionalRenderingEXT");;
 }
 
 void VkEncoder::vkCmdEndConditionalRenderingEXT(
-    VkCommandBuffer commandBuffer)
+    VkCommandBuffer commandBuffer,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdEndConditionalRenderingEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1267;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1267, 1);
-        countingStream->write((uint64_t*)&cgen_var_1267, 1 * 8);
+        uint64_t cgen_var_1127;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdEndConditionalRenderingEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdEndConditionalRenderingEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdEndConditionalRenderingEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdEndConditionalRenderingEXT = OP_vkCmdEndConditionalRenderingEXT;
-    stream->write(&opcode_vkCmdEndConditionalRenderingEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdEndConditionalRenderingEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1268;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1268, 1);
-    stream->write((uint64_t*)&cgen_var_1268, 1 * 8);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdEndConditionalRenderingEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdEndConditionalRenderingEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1128;
+    *&cgen_var_1128 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1128, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdEndConditionalRenderingEXT");;
 }
 
@@ -18878,17 +22308,17 @@
 #ifdef VK_NVX_device_generated_commands
 void VkEncoder::vkCmdProcessCommandsNVX(
     VkCommandBuffer commandBuffer,
-    const VkCmdProcessCommandsInfoNVX* pProcessCommandsInfo)
+    const VkCmdProcessCommandsInfoNVX* pProcessCommandsInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdProcessCommandsNVX");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkCmdProcessCommandsInfoNVX* local_pProcessCommandsInfo;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_pProcessCommandsInfo = nullptr;
     if (pProcessCommandsInfo)
@@ -18896,45 +22326,56 @@
         local_pProcessCommandsInfo = (VkCmdProcessCommandsInfoNVX*)pool->alloc(sizeof(const VkCmdProcessCommandsInfoNVX));
         deepcopy_VkCmdProcessCommandsInfoNVX(pool, pProcessCommandsInfo, (VkCmdProcessCommandsInfoNVX*)(local_pProcessCommandsInfo));
     }
+    local_doLock = doLock;
     if (local_pProcessCommandsInfo)
     {
         transform_tohost_VkCmdProcessCommandsInfoNVX(mImpl->resources(), (VkCmdProcessCommandsInfoNVX*)(local_pProcessCommandsInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1269;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1269, 1);
-        countingStream->write((uint64_t*)&cgen_var_1269, 1 * 8);
-        marshal_VkCmdProcessCommandsInfoNVX(countingStream, (VkCmdProcessCommandsInfoNVX*)(local_pProcessCommandsInfo));
+        uint64_t cgen_var_1129;
+        *countPtr += 1 * 8;
+        count_VkCmdProcessCommandsInfoNVX(featureBits, (VkCmdProcessCommandsInfoNVX*)(local_pProcessCommandsInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdProcessCommandsNVX = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdProcessCommandsNVX = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdProcessCommandsNVX);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdProcessCommandsNVX = OP_vkCmdProcessCommandsNVX;
-    stream->write(&opcode_vkCmdProcessCommandsNVX, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdProcessCommandsNVX, sizeof(uint32_t));
-    uint64_t cgen_var_1270;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1270, 1);
-    stream->write((uint64_t*)&cgen_var_1270, 1 * 8);
-    marshal_VkCmdProcessCommandsInfoNVX(stream, (VkCmdProcessCommandsInfoNVX*)(local_pProcessCommandsInfo));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdProcessCommandsNVX, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdProcessCommandsNVX, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1130;
+    *&cgen_var_1130 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1130, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkCmdProcessCommandsInfoNVX(stream, (VkCmdProcessCommandsInfoNVX*)(local_pProcessCommandsInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdProcessCommandsNVX");;
 }
 
 void VkEncoder::vkCmdReserveSpaceForCommandsNVX(
     VkCommandBuffer commandBuffer,
-    const VkCmdReserveSpaceForCommandsInfoNVX* pReserveSpaceInfo)
+    const VkCmdReserveSpaceForCommandsInfoNVX* pReserveSpaceInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdReserveSpaceForCommandsNVX");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkCmdReserveSpaceForCommandsInfoNVX* local_pReserveSpaceInfo;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_pReserveSpaceInfo = nullptr;
     if (pReserveSpaceInfo)
@@ -18942,29 +22383,40 @@
         local_pReserveSpaceInfo = (VkCmdReserveSpaceForCommandsInfoNVX*)pool->alloc(sizeof(const VkCmdReserveSpaceForCommandsInfoNVX));
         deepcopy_VkCmdReserveSpaceForCommandsInfoNVX(pool, pReserveSpaceInfo, (VkCmdReserveSpaceForCommandsInfoNVX*)(local_pReserveSpaceInfo));
     }
+    local_doLock = doLock;
     if (local_pReserveSpaceInfo)
     {
         transform_tohost_VkCmdReserveSpaceForCommandsInfoNVX(mImpl->resources(), (VkCmdReserveSpaceForCommandsInfoNVX*)(local_pReserveSpaceInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1271;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1271, 1);
-        countingStream->write((uint64_t*)&cgen_var_1271, 1 * 8);
-        marshal_VkCmdReserveSpaceForCommandsInfoNVX(countingStream, (VkCmdReserveSpaceForCommandsInfoNVX*)(local_pReserveSpaceInfo));
+        uint64_t cgen_var_1131;
+        *countPtr += 1 * 8;
+        count_VkCmdReserveSpaceForCommandsInfoNVX(featureBits, (VkCmdReserveSpaceForCommandsInfoNVX*)(local_pReserveSpaceInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdReserveSpaceForCommandsNVX = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdReserveSpaceForCommandsNVX = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdReserveSpaceForCommandsNVX);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdReserveSpaceForCommandsNVX = OP_vkCmdReserveSpaceForCommandsNVX;
-    stream->write(&opcode_vkCmdReserveSpaceForCommandsNVX, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdReserveSpaceForCommandsNVX, sizeof(uint32_t));
-    uint64_t cgen_var_1272;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1272, 1);
-    stream->write((uint64_t*)&cgen_var_1272, 1 * 8);
-    marshal_VkCmdReserveSpaceForCommandsInfoNVX(stream, (VkCmdReserveSpaceForCommandsInfoNVX*)(local_pReserveSpaceInfo));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdReserveSpaceForCommandsNVX, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdReserveSpaceForCommandsNVX, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1132;
+    *&cgen_var_1132 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1132, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkCmdReserveSpaceForCommandsInfoNVX(stream, (VkCmdReserveSpaceForCommandsInfoNVX*)(local_pReserveSpaceInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdReserveSpaceForCommandsNVX");;
 }
 
@@ -18972,18 +22424,18 @@
     VkDevice device,
     const VkIndirectCommandsLayoutCreateInfoNVX* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkIndirectCommandsLayoutNVX* pIndirectCommandsLayout)
+    VkIndirectCommandsLayoutNVX* pIndirectCommandsLayout,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateIndirectCommandsLayoutNVX");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkIndirectCommandsLayoutCreateInfoNVX* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -18997,6 +22449,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -19006,54 +22459,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1273;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1273, 1);
-        countingStream->write((uint64_t*)&cgen_var_1273, 1 * 8);
-        marshal_VkIndirectCommandsLayoutCreateInfoNVX(countingStream, (VkIndirectCommandsLayoutCreateInfoNVX*)(local_pCreateInfo));
+        uint64_t cgen_var_1133;
+        *countPtr += 1 * 8;
+        count_VkIndirectCommandsLayoutCreateInfoNVX(featureBits, (VkIndirectCommandsLayoutCreateInfoNVX*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_1274 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_1274);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_1275;
-        countingStream->handleMapping()->mapHandles_VkIndirectCommandsLayoutNVX_u64(pIndirectCommandsLayout, &cgen_var_1275, 1);
-        countingStream->write((uint64_t*)&cgen_var_1275, 8);
+        uint64_t cgen_var_1134;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateIndirectCommandsLayoutNVX = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateIndirectCommandsLayoutNVX = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateIndirectCommandsLayoutNVX);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateIndirectCommandsLayoutNVX = OP_vkCreateIndirectCommandsLayoutNVX;
-    stream->write(&opcode_vkCreateIndirectCommandsLayoutNVX, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateIndirectCommandsLayoutNVX, sizeof(uint32_t));
-    uint64_t cgen_var_1276;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1276, 1);
-    stream->write((uint64_t*)&cgen_var_1276, 1 * 8);
-    marshal_VkIndirectCommandsLayoutCreateInfoNVX(stream, (VkIndirectCommandsLayoutCreateInfoNVX*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateIndirectCommandsLayoutNVX, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateIndirectCommandsLayoutNVX, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1135;
+    *&cgen_var_1135 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1135, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkIndirectCommandsLayoutCreateInfoNVX(stream, (VkIndirectCommandsLayoutCreateInfoNVX*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_1277 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_1277);
+    uint64_t cgen_var_1136 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_1136, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_1278;
-    stream->handleMapping()->mapHandles_VkIndirectCommandsLayoutNVX_u64(pIndirectCommandsLayout, &cgen_var_1278, 1);
-    stream->write((uint64_t*)&cgen_var_1278, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_1137;
+    *&cgen_var_1137 = (uint64_t)((*pIndirectCommandsLayout));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1137, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_1279;
-    stream->read((uint64_t*)&cgen_var_1279, 8);
-    stream->handleMapping()->mapHandles_u64_VkIndirectCommandsLayoutNVX(&cgen_var_1279, (VkIndirectCommandsLayoutNVX*)pIndirectCommandsLayout, 1);
+    uint64_t cgen_var_1138;
+    stream->read((uint64_t*)&cgen_var_1138, 8);
+    stream->handleMapping()->mapHandles_u64_VkIndirectCommandsLayoutNVX(&cgen_var_1138, (VkIndirectCommandsLayoutNVX*)pIndirectCommandsLayout, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateIndirectCommandsLayoutNVX_VkResult_return = (VkResult)0;
     stream->read(&vkCreateIndirectCommandsLayoutNVX_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateIndirectCommandsLayoutNVX");;
     return vkCreateIndirectCommandsLayoutNVX_VkResult_return;
 }
@@ -19061,18 +22525,18 @@
 void VkEncoder::vkDestroyIndirectCommandsLayoutNVX(
     VkDevice device,
     VkIndirectCommandsLayoutNVX indirectCommandsLayout,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyIndirectCommandsLayoutNVX");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkIndirectCommandsLayoutNVX local_indirectCommandsLayout;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_indirectCommandsLayout = indirectCommandsLayout;
     local_pAllocator = nullptr;
@@ -19081,49 +22545,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1280;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1280, 1);
-        countingStream->write((uint64_t*)&cgen_var_1280, 1 * 8);
-        uint64_t cgen_var_1281;
-        countingStream->handleMapping()->mapHandles_VkIndirectCommandsLayoutNVX_u64(&local_indirectCommandsLayout, &cgen_var_1281, 1);
-        countingStream->write((uint64_t*)&cgen_var_1281, 1 * 8);
+        uint64_t cgen_var_1139;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1140;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_1282 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_1282);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyIndirectCommandsLayoutNVX = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyIndirectCommandsLayoutNVX = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyIndirectCommandsLayoutNVX);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyIndirectCommandsLayoutNVX = OP_vkDestroyIndirectCommandsLayoutNVX;
-    stream->write(&opcode_vkDestroyIndirectCommandsLayoutNVX, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyIndirectCommandsLayoutNVX, sizeof(uint32_t));
-    uint64_t cgen_var_1283;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1283, 1);
-    stream->write((uint64_t*)&cgen_var_1283, 1 * 8);
-    uint64_t cgen_var_1284;
-    stream->handleMapping()->mapHandles_VkIndirectCommandsLayoutNVX_u64(&local_indirectCommandsLayout, &cgen_var_1284, 1);
-    stream->write((uint64_t*)&cgen_var_1284, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyIndirectCommandsLayoutNVX, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyIndirectCommandsLayoutNVX, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1141;
+    *&cgen_var_1141 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1141, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1142;
+    *&cgen_var_1142 = get_host_u64_VkIndirectCommandsLayoutNVX((*&local_indirectCommandsLayout));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1142, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_1285 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_1285);
+    uint64_t cgen_var_1143 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_1143, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkIndirectCommandsLayoutNVX((VkIndirectCommandsLayoutNVX*)&indirectCommandsLayout);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyIndirectCommandsLayoutNVX");;
 }
 
@@ -19131,18 +22607,18 @@
     VkDevice device,
     const VkObjectTableCreateInfoNVX* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkObjectTableNVX* pObjectTable)
+    VkObjectTableNVX* pObjectTable,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateObjectTableNVX");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkObjectTableCreateInfoNVX* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -19156,6 +22632,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -19165,54 +22642,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1286;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1286, 1);
-        countingStream->write((uint64_t*)&cgen_var_1286, 1 * 8);
-        marshal_VkObjectTableCreateInfoNVX(countingStream, (VkObjectTableCreateInfoNVX*)(local_pCreateInfo));
+        uint64_t cgen_var_1144;
+        *countPtr += 1 * 8;
+        count_VkObjectTableCreateInfoNVX(featureBits, (VkObjectTableCreateInfoNVX*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_1287 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_1287);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_1288;
-        countingStream->handleMapping()->mapHandles_VkObjectTableNVX_u64(pObjectTable, &cgen_var_1288, 1);
-        countingStream->write((uint64_t*)&cgen_var_1288, 8);
+        uint64_t cgen_var_1145;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateObjectTableNVX = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateObjectTableNVX = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateObjectTableNVX);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateObjectTableNVX = OP_vkCreateObjectTableNVX;
-    stream->write(&opcode_vkCreateObjectTableNVX, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateObjectTableNVX, sizeof(uint32_t));
-    uint64_t cgen_var_1289;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1289, 1);
-    stream->write((uint64_t*)&cgen_var_1289, 1 * 8);
-    marshal_VkObjectTableCreateInfoNVX(stream, (VkObjectTableCreateInfoNVX*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateObjectTableNVX, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateObjectTableNVX, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1146;
+    *&cgen_var_1146 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1146, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkObjectTableCreateInfoNVX(stream, (VkObjectTableCreateInfoNVX*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_1290 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_1290);
+    uint64_t cgen_var_1147 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_1147, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_1291;
-    stream->handleMapping()->mapHandles_VkObjectTableNVX_u64(pObjectTable, &cgen_var_1291, 1);
-    stream->write((uint64_t*)&cgen_var_1291, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_1148;
+    *&cgen_var_1148 = (uint64_t)((*pObjectTable));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1148, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_1292;
-    stream->read((uint64_t*)&cgen_var_1292, 8);
-    stream->handleMapping()->mapHandles_u64_VkObjectTableNVX(&cgen_var_1292, (VkObjectTableNVX*)pObjectTable, 1);
+    uint64_t cgen_var_1149;
+    stream->read((uint64_t*)&cgen_var_1149, 8);
+    stream->handleMapping()->mapHandles_u64_VkObjectTableNVX(&cgen_var_1149, (VkObjectTableNVX*)pObjectTable, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateObjectTableNVX_VkResult_return = (VkResult)0;
     stream->read(&vkCreateObjectTableNVX_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateObjectTableNVX");;
     return vkCreateObjectTableNVX_VkResult_return;
 }
@@ -19220,18 +22708,18 @@
 void VkEncoder::vkDestroyObjectTableNVX(
     VkDevice device,
     VkObjectTableNVX objectTable,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyObjectTableNVX");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkObjectTableNVX local_objectTable;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_objectTable = objectTable;
     local_pAllocator = nullptr;
@@ -19240,49 +22728,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1293;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1293, 1);
-        countingStream->write((uint64_t*)&cgen_var_1293, 1 * 8);
-        uint64_t cgen_var_1294;
-        countingStream->handleMapping()->mapHandles_VkObjectTableNVX_u64(&local_objectTable, &cgen_var_1294, 1);
-        countingStream->write((uint64_t*)&cgen_var_1294, 1 * 8);
+        uint64_t cgen_var_1150;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1151;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_1295 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_1295);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyObjectTableNVX = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyObjectTableNVX = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyObjectTableNVX);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyObjectTableNVX = OP_vkDestroyObjectTableNVX;
-    stream->write(&opcode_vkDestroyObjectTableNVX, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyObjectTableNVX, sizeof(uint32_t));
-    uint64_t cgen_var_1296;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1296, 1);
-    stream->write((uint64_t*)&cgen_var_1296, 1 * 8);
-    uint64_t cgen_var_1297;
-    stream->handleMapping()->mapHandles_VkObjectTableNVX_u64(&local_objectTable, &cgen_var_1297, 1);
-    stream->write((uint64_t*)&cgen_var_1297, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyObjectTableNVX, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyObjectTableNVX, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1152;
+    *&cgen_var_1152 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1152, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1153;
+    *&cgen_var_1153 = get_host_u64_VkObjectTableNVX((*&local_objectTable));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1153, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_1298 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_1298);
+    uint64_t cgen_var_1154 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_1154, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkObjectTableNVX((VkObjectTableNVX*)&objectTable);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyObjectTableNVX");;
 }
 
@@ -19291,20 +22791,20 @@
     VkObjectTableNVX objectTable,
     uint32_t objectCount,
     const VkObjectTableEntryNVX* const* ppObjectTableEntries,
-    const uint32_t* pObjectIndices)
+    const uint32_t* pObjectIndices,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkRegisterObjectsNVX");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkObjectTableNVX local_objectTable;
     uint32_t local_objectCount;
     VkObjectTableEntryNVX** local_ppObjectTableEntries;
     uint32_t* local_pObjectIndices;
+    uint32_t local_doLock;
     local_device = device;
     local_objectTable = objectTable;
     local_objectCount = objectCount;
@@ -19314,38 +22814,51 @@
     {
         local_pObjectIndices = (uint32_t*)pool->dupArray(pObjectIndices, ((objectCount)) * sizeof(const uint32_t));
     }
+    local_doLock = doLock;
     (void)local_ppObjectTableEntries;
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1299;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1299, 1);
-        countingStream->write((uint64_t*)&cgen_var_1299, 1 * 8);
-        uint64_t cgen_var_1300;
-        countingStream->handleMapping()->mapHandles_VkObjectTableNVX_u64(&local_objectTable, &cgen_var_1300, 1);
-        countingStream->write((uint64_t*)&cgen_var_1300, 1 * 8);
-        countingStream->write((uint32_t*)&local_objectCount, sizeof(uint32_t));
+        uint64_t cgen_var_1155;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1156;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         (void)local_ppObjectTableEntries;
-        countingStream->write((uint32_t*)local_pObjectIndices, ((objectCount)) * sizeof(uint32_t));
+        *countPtr += ((objectCount)) * sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkRegisterObjectsNVX = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkRegisterObjectsNVX = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkRegisterObjectsNVX);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkRegisterObjectsNVX = OP_vkRegisterObjectsNVX;
-    stream->write(&opcode_vkRegisterObjectsNVX, sizeof(uint32_t));
-    stream->write(&packetSize_vkRegisterObjectsNVX, sizeof(uint32_t));
-    uint64_t cgen_var_1301;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1301, 1);
-    stream->write((uint64_t*)&cgen_var_1301, 1 * 8);
-    uint64_t cgen_var_1302;
-    stream->handleMapping()->mapHandles_VkObjectTableNVX_u64(&local_objectTable, &cgen_var_1302, 1);
-    stream->write((uint64_t*)&cgen_var_1302, 1 * 8);
-    stream->write((uint32_t*)&local_objectCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkRegisterObjectsNVX, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkRegisterObjectsNVX, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1157;
+    *&cgen_var_1157 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1157, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1158;
+    *&cgen_var_1158 = get_host_u64_VkObjectTableNVX((*&local_objectTable));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1158, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_objectCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     (void)local_ppObjectTableEntries;
-    stream->write((uint32_t*)local_pObjectIndices, ((objectCount)) * sizeof(uint32_t));
+    memcpy(*streamPtrPtr, (uint32_t*)local_pObjectIndices, ((objectCount)) * sizeof(uint32_t));
+    *streamPtrPtr += ((objectCount)) * sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkRegisterObjectsNVX_VkResult_return = (VkResult)0;
     stream->read(&vkRegisterObjectsNVX_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkRegisterObjectsNVX");;
     return vkRegisterObjectsNVX_VkResult_return;
 }
@@ -19355,20 +22868,20 @@
     VkObjectTableNVX objectTable,
     uint32_t objectCount,
     const VkObjectEntryTypeNVX* pObjectEntryTypes,
-    const uint32_t* pObjectIndices)
+    const uint32_t* pObjectIndices,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkUnregisterObjectsNVX");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkObjectTableNVX local_objectTable;
     uint32_t local_objectCount;
     VkObjectEntryTypeNVX* local_pObjectEntryTypes;
     uint32_t* local_pObjectIndices;
+    uint32_t local_doLock;
     local_device = device;
     local_objectTable = objectTable;
     local_objectCount = objectCount;
@@ -19382,37 +22895,51 @@
     {
         local_pObjectIndices = (uint32_t*)pool->dupArray(pObjectIndices, ((objectCount)) * sizeof(const uint32_t));
     }
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1303;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1303, 1);
-        countingStream->write((uint64_t*)&cgen_var_1303, 1 * 8);
-        uint64_t cgen_var_1304;
-        countingStream->handleMapping()->mapHandles_VkObjectTableNVX_u64(&local_objectTable, &cgen_var_1304, 1);
-        countingStream->write((uint64_t*)&cgen_var_1304, 1 * 8);
-        countingStream->write((uint32_t*)&local_objectCount, sizeof(uint32_t));
-        countingStream->write((VkObjectEntryTypeNVX*)local_pObjectEntryTypes, ((objectCount)) * sizeof(VkObjectEntryTypeNVX));
-        countingStream->write((uint32_t*)local_pObjectIndices, ((objectCount)) * sizeof(uint32_t));
+        uint64_t cgen_var_1159;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1160;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += ((objectCount)) * sizeof(VkObjectEntryTypeNVX);
+        *countPtr += ((objectCount)) * sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkUnregisterObjectsNVX = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkUnregisterObjectsNVX = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkUnregisterObjectsNVX);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkUnregisterObjectsNVX = OP_vkUnregisterObjectsNVX;
-    stream->write(&opcode_vkUnregisterObjectsNVX, sizeof(uint32_t));
-    stream->write(&packetSize_vkUnregisterObjectsNVX, sizeof(uint32_t));
-    uint64_t cgen_var_1305;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1305, 1);
-    stream->write((uint64_t*)&cgen_var_1305, 1 * 8);
-    uint64_t cgen_var_1306;
-    stream->handleMapping()->mapHandles_VkObjectTableNVX_u64(&local_objectTable, &cgen_var_1306, 1);
-    stream->write((uint64_t*)&cgen_var_1306, 1 * 8);
-    stream->write((uint32_t*)&local_objectCount, sizeof(uint32_t));
-    stream->write((VkObjectEntryTypeNVX*)local_pObjectEntryTypes, ((objectCount)) * sizeof(VkObjectEntryTypeNVX));
-    stream->write((uint32_t*)local_pObjectIndices, ((objectCount)) * sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkUnregisterObjectsNVX, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkUnregisterObjectsNVX, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1161;
+    *&cgen_var_1161 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1161, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1162;
+    *&cgen_var_1162 = get_host_u64_VkObjectTableNVX((*&local_objectTable));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1162, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_objectCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (VkObjectEntryTypeNVX*)local_pObjectEntryTypes, ((objectCount)) * sizeof(VkObjectEntryTypeNVX));
+    *streamPtrPtr += ((objectCount)) * sizeof(VkObjectEntryTypeNVX);
+    memcpy(*streamPtrPtr, (uint32_t*)local_pObjectIndices, ((objectCount)) * sizeof(uint32_t));
+    *streamPtrPtr += ((objectCount)) * sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkUnregisterObjectsNVX_VkResult_return = (VkResult)0;
     stream->read(&vkUnregisterObjectsNVX_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkUnregisterObjectsNVX");;
     return vkUnregisterObjectsNVX_VkResult_return;
 }
@@ -19420,35 +22947,42 @@
 void VkEncoder::vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX(
     VkPhysicalDevice physicalDevice,
     VkDeviceGeneratedCommandsFeaturesNVX* pFeatures,
-    VkDeviceGeneratedCommandsLimitsNVX* pLimits)
+    VkDeviceGeneratedCommandsLimitsNVX* pLimits,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1307;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1307, 1);
-        countingStream->write((uint64_t*)&cgen_var_1307, 1 * 8);
-        marshal_VkDeviceGeneratedCommandsFeaturesNVX(countingStream, (VkDeviceGeneratedCommandsFeaturesNVX*)(pFeatures));
-        marshal_VkDeviceGeneratedCommandsLimitsNVX(countingStream, (VkDeviceGeneratedCommandsLimitsNVX*)(pLimits));
+        uint64_t cgen_var_1163;
+        *countPtr += 1 * 8;
+        count_VkDeviceGeneratedCommandsFeaturesNVX(featureBits, (VkDeviceGeneratedCommandsFeaturesNVX*)(pFeatures), countPtr);
+        count_VkDeviceGeneratedCommandsLimitsNVX(featureBits, (VkDeviceGeneratedCommandsLimitsNVX*)(pLimits), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX = OP_vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX;
-    stream->write(&opcode_vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX, sizeof(uint32_t));
-    uint64_t cgen_var_1308;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1308, 1);
-    stream->write((uint64_t*)&cgen_var_1308, 1 * 8);
-    marshal_VkDeviceGeneratedCommandsFeaturesNVX(stream, (VkDeviceGeneratedCommandsFeaturesNVX*)(pFeatures));
-    marshal_VkDeviceGeneratedCommandsLimitsNVX(stream, (VkDeviceGeneratedCommandsLimitsNVX*)(pLimits));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1164;
+    *&cgen_var_1164 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1164, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDeviceGeneratedCommandsFeaturesNVX(stream, (VkDeviceGeneratedCommandsFeaturesNVX*)(pFeatures), streamPtrPtr);
+    reservedmarshal_VkDeviceGeneratedCommandsLimitsNVX(stream, (VkDeviceGeneratedCommandsLimitsNVX*)(pLimits), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkDeviceGeneratedCommandsFeaturesNVX(stream, (VkDeviceGeneratedCommandsFeaturesNVX*)(pFeatures));
     if (pFeatures)
     {
@@ -19459,9 +22993,13 @@
     {
         transform_fromhost_VkDeviceGeneratedCommandsLimitsNVX(mImpl->resources(), (VkDeviceGeneratedCommandsLimitsNVX*)(pLimits));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX");;
 }
 
@@ -19471,19 +23009,19 @@
     VkCommandBuffer commandBuffer,
     uint32_t firstViewport,
     uint32_t viewportCount,
-    const VkViewportWScalingNV* pViewportWScalings)
+    const VkViewportWScalingNV* pViewportWScalings,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdSetViewportWScalingNV");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     uint32_t local_firstViewport;
     uint32_t local_viewportCount;
     VkViewportWScalingNV* local_pViewportWScalings;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_firstViewport = firstViewport;
     local_viewportCount = viewportCount;
@@ -19496,6 +23034,7 @@
             deepcopy_VkViewportWScalingNV(pool, pViewportWScalings + i, (VkViewportWScalingNV*)(local_pViewportWScalings + i));
         }
     }
+    local_doLock = doLock;
     if (local_pViewportWScalings)
     {
         for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
@@ -19503,35 +23042,47 @@
             transform_tohost_VkViewportWScalingNV(mImpl->resources(), (VkViewportWScalingNV*)(local_pViewportWScalings + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1309;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1309, 1);
-        countingStream->write((uint64_t*)&cgen_var_1309, 1 * 8);
-        countingStream->write((uint32_t*)&local_firstViewport, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_viewportCount, sizeof(uint32_t));
+        uint64_t cgen_var_1165;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
         {
-            marshal_VkViewportWScalingNV(countingStream, (VkViewportWScalingNV*)(local_pViewportWScalings + i));
+            count_VkViewportWScalingNV(featureBits, (VkViewportWScalingNV*)(local_pViewportWScalings + i), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdSetViewportWScalingNV = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdSetViewportWScalingNV = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetViewportWScalingNV);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdSetViewportWScalingNV = OP_vkCmdSetViewportWScalingNV;
-    stream->write(&opcode_vkCmdSetViewportWScalingNV, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdSetViewportWScalingNV, sizeof(uint32_t));
-    uint64_t cgen_var_1310;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1310, 1);
-    stream->write((uint64_t*)&cgen_var_1310, 1 * 8);
-    stream->write((uint32_t*)&local_firstViewport, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_viewportCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkCmdSetViewportWScalingNV, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdSetViewportWScalingNV, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1166;
+    *&cgen_var_1166 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1166, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_firstViewport, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_viewportCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i)
     {
-        marshal_VkViewportWScalingNV(stream, (VkViewportWScalingNV*)(local_pViewportWScalings + i));
+        reservedmarshal_VkViewportWScalingNV(stream, (VkViewportWScalingNV*)(local_pViewportWScalings + i), streamPtrPtr);
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdSetViewportWScalingNV");;
 }
 
@@ -19539,44 +23090,55 @@
 #ifdef VK_EXT_direct_mode_display
 VkResult VkEncoder::vkReleaseDisplayEXT(
     VkPhysicalDevice physicalDevice,
-    VkDisplayKHR display)
+    VkDisplayKHR display,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkReleaseDisplayEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkDisplayKHR local_display;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_display = display;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1311;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1311, 1);
-        countingStream->write((uint64_t*)&cgen_var_1311, 1 * 8);
-        uint64_t cgen_var_1312;
-        countingStream->handleMapping()->mapHandles_VkDisplayKHR_u64(&local_display, &cgen_var_1312, 1);
-        countingStream->write((uint64_t*)&cgen_var_1312, 1 * 8);
+        uint64_t cgen_var_1167;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1168;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkReleaseDisplayEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkReleaseDisplayEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkReleaseDisplayEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkReleaseDisplayEXT = OP_vkReleaseDisplayEXT;
-    stream->write(&opcode_vkReleaseDisplayEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkReleaseDisplayEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1313;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1313, 1);
-    stream->write((uint64_t*)&cgen_var_1313, 1 * 8);
-    uint64_t cgen_var_1314;
-    stream->handleMapping()->mapHandles_VkDisplayKHR_u64(&local_display, &cgen_var_1314, 1);
-    stream->write((uint64_t*)&cgen_var_1314, 1 * 8);
+    memcpy(streamPtr, &opcode_vkReleaseDisplayEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkReleaseDisplayEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1169;
+    *&cgen_var_1169 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1169, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1170;
+    *&cgen_var_1170 = get_host_u64_VkDisplayKHR((*&local_display));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1170, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkReleaseDisplayEXT_VkResult_return = (VkResult)0;
     stream->read(&vkReleaseDisplayEXT_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkReleaseDisplayEXT");;
     return vkReleaseDisplayEXT_VkResult_return;
 }
@@ -19586,47 +23148,59 @@
 VkResult VkEncoder::vkAcquireXlibDisplayEXT(
     VkPhysicalDevice physicalDevice,
     Display* dpy,
-    VkDisplayKHR display)
+    VkDisplayKHR display,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkAcquireXlibDisplayEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkDisplayKHR local_display;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_display = display;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1315;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1315, 1);
-        countingStream->write((uint64_t*)&cgen_var_1315, 1 * 8);
-        countingStream->write((Display*)dpy, sizeof(Display));
-        uint64_t cgen_var_1316;
-        countingStream->handleMapping()->mapHandles_VkDisplayKHR_u64(&local_display, &cgen_var_1316, 1);
-        countingStream->write((uint64_t*)&cgen_var_1316, 1 * 8);
+        uint64_t cgen_var_1171;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(Display);
+        uint64_t cgen_var_1172;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkAcquireXlibDisplayEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkAcquireXlibDisplayEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkAcquireXlibDisplayEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkAcquireXlibDisplayEXT = OP_vkAcquireXlibDisplayEXT;
-    stream->write(&opcode_vkAcquireXlibDisplayEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkAcquireXlibDisplayEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1317;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1317, 1);
-    stream->write((uint64_t*)&cgen_var_1317, 1 * 8);
-    stream->write((Display*)dpy, sizeof(Display));
-    uint64_t cgen_var_1318;
-    stream->handleMapping()->mapHandles_VkDisplayKHR_u64(&local_display, &cgen_var_1318, 1);
-    stream->write((uint64_t*)&cgen_var_1318, 1 * 8);
+    memcpy(streamPtr, &opcode_vkAcquireXlibDisplayEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkAcquireXlibDisplayEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1173;
+    *&cgen_var_1173 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1173, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (Display*)dpy, sizeof(Display));
+    *streamPtrPtr += sizeof(Display);
+    uint64_t cgen_var_1174;
+    *&cgen_var_1174 = get_host_u64_VkDisplayKHR((*&local_display));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1174, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((Display*)dpy, sizeof(Display));
     VkResult vkAcquireXlibDisplayEXT_VkResult_return = (VkResult)0;
     stream->read(&vkAcquireXlibDisplayEXT_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkAcquireXlibDisplayEXT");;
     return vkAcquireXlibDisplayEXT_VkResult_return;
 }
@@ -19635,54 +23209,67 @@
     VkPhysicalDevice physicalDevice,
     Display* dpy,
     RROutput rrOutput,
-    VkDisplayKHR* pDisplay)
+    VkDisplayKHR* pDisplay,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetRandROutputDisplayEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     RROutput local_rrOutput;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_rrOutput = rrOutput;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1319;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1319, 1);
-        countingStream->write((uint64_t*)&cgen_var_1319, 1 * 8);
-        countingStream->write((Display*)dpy, sizeof(Display));
-        countingStream->write((RROutput*)&local_rrOutput, sizeof(RROutput));
-        uint64_t cgen_var_1320;
-        countingStream->handleMapping()->mapHandles_VkDisplayKHR_u64(pDisplay, &cgen_var_1320, 1);
-        countingStream->write((uint64_t*)&cgen_var_1320, 8);
+        uint64_t cgen_var_1175;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(Display);
+        *countPtr += sizeof(RROutput);
+        uint64_t cgen_var_1176;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetRandROutputDisplayEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetRandROutputDisplayEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetRandROutputDisplayEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetRandROutputDisplayEXT = OP_vkGetRandROutputDisplayEXT;
-    stream->write(&opcode_vkGetRandROutputDisplayEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetRandROutputDisplayEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1321;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1321, 1);
-    stream->write((uint64_t*)&cgen_var_1321, 1 * 8);
-    stream->write((Display*)dpy, sizeof(Display));
-    stream->write((RROutput*)&local_rrOutput, sizeof(RROutput));
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_1322;
-    stream->handleMapping()->mapHandles_VkDisplayKHR_u64(pDisplay, &cgen_var_1322, 1);
-    stream->write((uint64_t*)&cgen_var_1322, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    memcpy(streamPtr, &opcode_vkGetRandROutputDisplayEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetRandROutputDisplayEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1177;
+    *&cgen_var_1177 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1177, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (Display*)dpy, sizeof(Display));
+    *streamPtrPtr += sizeof(Display);
+    memcpy(*streamPtrPtr, (RROutput*)&local_rrOutput, sizeof(RROutput));
+    *streamPtrPtr += sizeof(RROutput);
+    /* is handle, possibly out */;
+    uint64_t cgen_var_1178;
+    *&cgen_var_1178 = (uint64_t)((*pDisplay));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1178, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((Display*)dpy, sizeof(Display));
-    uint64_t cgen_var_1323;
-    stream->read((uint64_t*)&cgen_var_1323, 8);
-    stream->handleMapping()->mapHandles_u64_VkDisplayKHR(&cgen_var_1323, (VkDisplayKHR*)pDisplay, 1);
+    uint64_t cgen_var_1179;
+    stream->read((uint64_t*)&cgen_var_1179, 8);
+    stream->handleMapping()->mapHandles_u64_VkDisplayKHR(&cgen_var_1179, (VkDisplayKHR*)pDisplay, 1);
     VkResult vkGetRandROutputDisplayEXT_VkResult_return = (VkResult)0;
     stream->read(&vkGetRandROutputDisplayEXT_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetRandROutputDisplayEXT");;
     return vkGetRandROutputDisplayEXT_VkResult_return;
 }
@@ -19692,41 +23279,48 @@
 VkResult VkEncoder::vkGetPhysicalDeviceSurfaceCapabilities2EXT(
     VkPhysicalDevice physicalDevice,
     VkSurfaceKHR surface,
-    VkSurfaceCapabilities2EXT* pSurfaceCapabilities)
+    VkSurfaceCapabilities2EXT* pSurfaceCapabilities,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceSurfaceCapabilities2EXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkSurfaceKHR local_surface;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_surface = surface;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1324;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1324, 1);
-        countingStream->write((uint64_t*)&cgen_var_1324, 1 * 8);
-        uint64_t cgen_var_1325;
-        countingStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(&local_surface, &cgen_var_1325, 1);
-        countingStream->write((uint64_t*)&cgen_var_1325, 1 * 8);
-        marshal_VkSurfaceCapabilities2EXT(countingStream, (VkSurfaceCapabilities2EXT*)(pSurfaceCapabilities));
+        uint64_t cgen_var_1180;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1181;
+        *countPtr += 1 * 8;
+        count_VkSurfaceCapabilities2EXT(featureBits, (VkSurfaceCapabilities2EXT*)(pSurfaceCapabilities), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceSurfaceCapabilities2EXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceSurfaceCapabilities2EXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceSurfaceCapabilities2EXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceSurfaceCapabilities2EXT = OP_vkGetPhysicalDeviceSurfaceCapabilities2EXT;
-    stream->write(&opcode_vkGetPhysicalDeviceSurfaceCapabilities2EXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceSurfaceCapabilities2EXT, sizeof(uint32_t));
-    uint64_t cgen_var_1326;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1326, 1);
-    stream->write((uint64_t*)&cgen_var_1326, 1 * 8);
-    uint64_t cgen_var_1327;
-    stream->handleMapping()->mapHandles_VkSurfaceKHR_u64(&local_surface, &cgen_var_1327, 1);
-    stream->write((uint64_t*)&cgen_var_1327, 1 * 8);
-    marshal_VkSurfaceCapabilities2EXT(stream, (VkSurfaceCapabilities2EXT*)(pSurfaceCapabilities));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceSurfaceCapabilities2EXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceSurfaceCapabilities2EXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1182;
+    *&cgen_var_1182 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1182, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1183;
+    *&cgen_var_1183 = get_host_u64_VkSurfaceKHR((*&local_surface));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1183, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkSurfaceCapabilities2EXT(stream, (VkSurfaceCapabilities2EXT*)(pSurfaceCapabilities), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkSurfaceCapabilities2EXT(stream, (VkSurfaceCapabilities2EXT*)(pSurfaceCapabilities));
     if (pSurfaceCapabilities)
     {
@@ -19734,9 +23328,13 @@
     }
     VkResult vkGetPhysicalDeviceSurfaceCapabilities2EXT_VkResult_return = (VkResult)0;
     stream->read(&vkGetPhysicalDeviceSurfaceCapabilities2EXT_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceSurfaceCapabilities2EXT");;
     return vkGetPhysicalDeviceSurfaceCapabilities2EXT_VkResult_return;
 }
@@ -19746,18 +23344,18 @@
 VkResult VkEncoder::vkDisplayPowerControlEXT(
     VkDevice device,
     VkDisplayKHR display,
-    const VkDisplayPowerInfoEXT* pDisplayPowerInfo)
+    const VkDisplayPowerInfoEXT* pDisplayPowerInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDisplayPowerControlEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDisplayKHR local_display;
     VkDisplayPowerInfoEXT* local_pDisplayPowerInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_display = display;
     local_pDisplayPowerInfo = nullptr;
@@ -19766,37 +23364,48 @@
         local_pDisplayPowerInfo = (VkDisplayPowerInfoEXT*)pool->alloc(sizeof(const VkDisplayPowerInfoEXT));
         deepcopy_VkDisplayPowerInfoEXT(pool, pDisplayPowerInfo, (VkDisplayPowerInfoEXT*)(local_pDisplayPowerInfo));
     }
+    local_doLock = doLock;
     if (local_pDisplayPowerInfo)
     {
         transform_tohost_VkDisplayPowerInfoEXT(mImpl->resources(), (VkDisplayPowerInfoEXT*)(local_pDisplayPowerInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1328;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1328, 1);
-        countingStream->write((uint64_t*)&cgen_var_1328, 1 * 8);
-        uint64_t cgen_var_1329;
-        countingStream->handleMapping()->mapHandles_VkDisplayKHR_u64(&local_display, &cgen_var_1329, 1);
-        countingStream->write((uint64_t*)&cgen_var_1329, 1 * 8);
-        marshal_VkDisplayPowerInfoEXT(countingStream, (VkDisplayPowerInfoEXT*)(local_pDisplayPowerInfo));
+        uint64_t cgen_var_1184;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1185;
+        *countPtr += 1 * 8;
+        count_VkDisplayPowerInfoEXT(featureBits, (VkDisplayPowerInfoEXT*)(local_pDisplayPowerInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDisplayPowerControlEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDisplayPowerControlEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDisplayPowerControlEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDisplayPowerControlEXT = OP_vkDisplayPowerControlEXT;
-    stream->write(&opcode_vkDisplayPowerControlEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkDisplayPowerControlEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1330;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1330, 1);
-    stream->write((uint64_t*)&cgen_var_1330, 1 * 8);
-    uint64_t cgen_var_1331;
-    stream->handleMapping()->mapHandles_VkDisplayKHR_u64(&local_display, &cgen_var_1331, 1);
-    stream->write((uint64_t*)&cgen_var_1331, 1 * 8);
-    marshal_VkDisplayPowerInfoEXT(stream, (VkDisplayPowerInfoEXT*)(local_pDisplayPowerInfo));
+    memcpy(streamPtr, &opcode_vkDisplayPowerControlEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDisplayPowerControlEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1186;
+    *&cgen_var_1186 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1186, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1187;
+    *&cgen_var_1187 = get_host_u64_VkDisplayKHR((*&local_display));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1187, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDisplayPowerInfoEXT(stream, (VkDisplayPowerInfoEXT*)(local_pDisplayPowerInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkDisplayPowerControlEXT_VkResult_return = (VkResult)0;
     stream->read(&vkDisplayPowerControlEXT_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDisplayPowerControlEXT");;
     return vkDisplayPowerControlEXT_VkResult_return;
 }
@@ -19805,18 +23414,18 @@
     VkDevice device,
     const VkDeviceEventInfoEXT* pDeviceEventInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkFence* pFence)
+    VkFence* pFence,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkRegisterDeviceEventEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDeviceEventInfoEXT* local_pDeviceEventInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pDeviceEventInfo = nullptr;
     if (pDeviceEventInfo)
@@ -19830,6 +23439,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pDeviceEventInfo)
     {
@@ -19839,52 +23449,63 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1332;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1332, 1);
-        countingStream->write((uint64_t*)&cgen_var_1332, 1 * 8);
-        marshal_VkDeviceEventInfoEXT(countingStream, (VkDeviceEventInfoEXT*)(local_pDeviceEventInfo));
+        uint64_t cgen_var_1188;
+        *countPtr += 1 * 8;
+        count_VkDeviceEventInfoEXT(featureBits, (VkDeviceEventInfoEXT*)(local_pDeviceEventInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_1333 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_1333);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_1334;
-        countingStream->handleMapping()->mapHandles_VkFence_u64(pFence, &cgen_var_1334, 1);
-        countingStream->write((uint64_t*)&cgen_var_1334, 8);
+        uint64_t cgen_var_1189;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkRegisterDeviceEventEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkRegisterDeviceEventEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkRegisterDeviceEventEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkRegisterDeviceEventEXT = OP_vkRegisterDeviceEventEXT;
-    stream->write(&opcode_vkRegisterDeviceEventEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkRegisterDeviceEventEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1335;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1335, 1);
-    stream->write((uint64_t*)&cgen_var_1335, 1 * 8);
-    marshal_VkDeviceEventInfoEXT(stream, (VkDeviceEventInfoEXT*)(local_pDeviceEventInfo));
+    memcpy(streamPtr, &opcode_vkRegisterDeviceEventEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkRegisterDeviceEventEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1190;
+    *&cgen_var_1190 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1190, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDeviceEventInfoEXT(stream, (VkDeviceEventInfoEXT*)(local_pDeviceEventInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_1336 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_1336);
+    uint64_t cgen_var_1191 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_1191, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_1337;
-    stream->handleMapping()->mapHandles_VkFence_u64(pFence, &cgen_var_1337, 1);
-    stream->write((uint64_t*)&cgen_var_1337, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
-    uint64_t cgen_var_1338;
-    stream->read((uint64_t*)&cgen_var_1338, 8);
-    stream->handleMapping()->mapHandles_u64_VkFence(&cgen_var_1338, (VkFence*)pFence, 1);
+    /* is handle, possibly out */;
+    uint64_t cgen_var_1192;
+    *&cgen_var_1192 = (uint64_t)((*pFence));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1192, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1193;
+    stream->read((uint64_t*)&cgen_var_1193, 8);
+    stream->handleMapping()->mapHandles_u64_VkFence(&cgen_var_1193, (VkFence*)pFence, 1);
     VkResult vkRegisterDeviceEventEXT_VkResult_return = (VkResult)0;
     stream->read(&vkRegisterDeviceEventEXT_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkRegisterDeviceEventEXT");;
     return vkRegisterDeviceEventEXT_VkResult_return;
 }
@@ -19894,19 +23515,19 @@
     VkDisplayKHR display,
     const VkDisplayEventInfoEXT* pDisplayEventInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkFence* pFence)
+    VkFence* pFence,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkRegisterDisplayEventEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDisplayKHR local_display;
     VkDisplayEventInfoEXT* local_pDisplayEventInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_display = display;
     local_pDisplayEventInfo = nullptr;
@@ -19921,6 +23542,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pDisplayEventInfo)
     {
@@ -19930,58 +23552,69 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1339;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1339, 1);
-        countingStream->write((uint64_t*)&cgen_var_1339, 1 * 8);
-        uint64_t cgen_var_1340;
-        countingStream->handleMapping()->mapHandles_VkDisplayKHR_u64(&local_display, &cgen_var_1340, 1);
-        countingStream->write((uint64_t*)&cgen_var_1340, 1 * 8);
-        marshal_VkDisplayEventInfoEXT(countingStream, (VkDisplayEventInfoEXT*)(local_pDisplayEventInfo));
+        uint64_t cgen_var_1194;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1195;
+        *countPtr += 1 * 8;
+        count_VkDisplayEventInfoEXT(featureBits, (VkDisplayEventInfoEXT*)(local_pDisplayEventInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_1341 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_1341);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_1342;
-        countingStream->handleMapping()->mapHandles_VkFence_u64(pFence, &cgen_var_1342, 1);
-        countingStream->write((uint64_t*)&cgen_var_1342, 8);
+        uint64_t cgen_var_1196;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkRegisterDisplayEventEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkRegisterDisplayEventEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkRegisterDisplayEventEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkRegisterDisplayEventEXT = OP_vkRegisterDisplayEventEXT;
-    stream->write(&opcode_vkRegisterDisplayEventEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkRegisterDisplayEventEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1343;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1343, 1);
-    stream->write((uint64_t*)&cgen_var_1343, 1 * 8);
-    uint64_t cgen_var_1344;
-    stream->handleMapping()->mapHandles_VkDisplayKHR_u64(&local_display, &cgen_var_1344, 1);
-    stream->write((uint64_t*)&cgen_var_1344, 1 * 8);
-    marshal_VkDisplayEventInfoEXT(stream, (VkDisplayEventInfoEXT*)(local_pDisplayEventInfo));
+    memcpy(streamPtr, &opcode_vkRegisterDisplayEventEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkRegisterDisplayEventEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1197;
+    *&cgen_var_1197 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1197, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1198;
+    *&cgen_var_1198 = get_host_u64_VkDisplayKHR((*&local_display));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1198, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDisplayEventInfoEXT(stream, (VkDisplayEventInfoEXT*)(local_pDisplayEventInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_1345 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_1345);
+    uint64_t cgen_var_1199 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_1199, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_1346;
-    stream->handleMapping()->mapHandles_VkFence_u64(pFence, &cgen_var_1346, 1);
-    stream->write((uint64_t*)&cgen_var_1346, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
-    uint64_t cgen_var_1347;
-    stream->read((uint64_t*)&cgen_var_1347, 8);
-    stream->handleMapping()->mapHandles_u64_VkFence(&cgen_var_1347, (VkFence*)pFence, 1);
+    /* is handle, possibly out */;
+    uint64_t cgen_var_1200;
+    *&cgen_var_1200 = (uint64_t)((*pFence));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1200, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1201;
+    stream->read((uint64_t*)&cgen_var_1201, 8);
+    stream->handleMapping()->mapHandles_u64_VkFence(&cgen_var_1201, (VkFence*)pFence, 1);
     VkResult vkRegisterDisplayEventEXT_VkResult_return = (VkResult)0;
     stream->read(&vkRegisterDisplayEventEXT_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkRegisterDisplayEventEXT");;
     return vkRegisterDisplayEventEXT_VkResult_return;
 }
@@ -19990,51 +23623,64 @@
     VkDevice device,
     VkSwapchainKHR swapchain,
     VkSurfaceCounterFlagBitsEXT counter,
-    uint64_t* pCounterValue)
+    uint64_t* pCounterValue,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetSwapchainCounterEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkSwapchainKHR local_swapchain;
     VkSurfaceCounterFlagBitsEXT local_counter;
+    uint32_t local_doLock;
     local_device = device;
     local_swapchain = swapchain;
     local_counter = counter;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1348;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1348, 1);
-        countingStream->write((uint64_t*)&cgen_var_1348, 1 * 8);
-        uint64_t cgen_var_1349;
-        countingStream->handleMapping()->mapHandles_VkSwapchainKHR_u64(&local_swapchain, &cgen_var_1349, 1);
-        countingStream->write((uint64_t*)&cgen_var_1349, 1 * 8);
-        countingStream->write((VkSurfaceCounterFlagBitsEXT*)&local_counter, sizeof(VkSurfaceCounterFlagBitsEXT));
-        countingStream->write((uint64_t*)pCounterValue, sizeof(uint64_t));
+        uint64_t cgen_var_1202;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1203;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkSurfaceCounterFlagBitsEXT);
+        *countPtr += sizeof(uint64_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetSwapchainCounterEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetSwapchainCounterEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetSwapchainCounterEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetSwapchainCounterEXT = OP_vkGetSwapchainCounterEXT;
-    stream->write(&opcode_vkGetSwapchainCounterEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetSwapchainCounterEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1350;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1350, 1);
-    stream->write((uint64_t*)&cgen_var_1350, 1 * 8);
-    uint64_t cgen_var_1351;
-    stream->handleMapping()->mapHandles_VkSwapchainKHR_u64(&local_swapchain, &cgen_var_1351, 1);
-    stream->write((uint64_t*)&cgen_var_1351, 1 * 8);
-    stream->write((VkSurfaceCounterFlagBitsEXT*)&local_counter, sizeof(VkSurfaceCounterFlagBitsEXT));
-    stream->write((uint64_t*)pCounterValue, sizeof(uint64_t));
+    memcpy(streamPtr, &opcode_vkGetSwapchainCounterEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetSwapchainCounterEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1204;
+    *&cgen_var_1204 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1204, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1205;
+    *&cgen_var_1205 = get_host_u64_VkSwapchainKHR((*&local_swapchain));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1205, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkSurfaceCounterFlagBitsEXT*)&local_counter, sizeof(VkSurfaceCounterFlagBitsEXT));
+    *streamPtrPtr += sizeof(VkSurfaceCounterFlagBitsEXT);
+    memcpy(*streamPtrPtr, (uint64_t*)pCounterValue, sizeof(uint64_t));
+    *streamPtrPtr += sizeof(uint64_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((uint64_t*)pCounterValue, sizeof(uint64_t));
     VkResult vkGetSwapchainCounterEXT_VkResult_return = (VkResult)0;
     stream->read(&vkGetSwapchainCounterEXT_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetSwapchainCounterEXT");;
     return vkGetSwapchainCounterEXT_VkResult_return;
 }
@@ -20044,41 +23690,48 @@
 VkResult VkEncoder::vkGetRefreshCycleDurationGOOGLE(
     VkDevice device,
     VkSwapchainKHR swapchain,
-    VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties)
+    VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetRefreshCycleDurationGOOGLE");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkSwapchainKHR local_swapchain;
+    uint32_t local_doLock;
     local_device = device;
     local_swapchain = swapchain;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1352;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1352, 1);
-        countingStream->write((uint64_t*)&cgen_var_1352, 1 * 8);
-        uint64_t cgen_var_1353;
-        countingStream->handleMapping()->mapHandles_VkSwapchainKHR_u64(&local_swapchain, &cgen_var_1353, 1);
-        countingStream->write((uint64_t*)&cgen_var_1353, 1 * 8);
-        marshal_VkRefreshCycleDurationGOOGLE(countingStream, (VkRefreshCycleDurationGOOGLE*)(pDisplayTimingProperties));
+        uint64_t cgen_var_1206;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1207;
+        *countPtr += 1 * 8;
+        count_VkRefreshCycleDurationGOOGLE(featureBits, (VkRefreshCycleDurationGOOGLE*)(pDisplayTimingProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetRefreshCycleDurationGOOGLE = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetRefreshCycleDurationGOOGLE = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetRefreshCycleDurationGOOGLE);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetRefreshCycleDurationGOOGLE = OP_vkGetRefreshCycleDurationGOOGLE;
-    stream->write(&opcode_vkGetRefreshCycleDurationGOOGLE, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetRefreshCycleDurationGOOGLE, sizeof(uint32_t));
-    uint64_t cgen_var_1354;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1354, 1);
-    stream->write((uint64_t*)&cgen_var_1354, 1 * 8);
-    uint64_t cgen_var_1355;
-    stream->handleMapping()->mapHandles_VkSwapchainKHR_u64(&local_swapchain, &cgen_var_1355, 1);
-    stream->write((uint64_t*)&cgen_var_1355, 1 * 8);
-    marshal_VkRefreshCycleDurationGOOGLE(stream, (VkRefreshCycleDurationGOOGLE*)(pDisplayTimingProperties));
+    memcpy(streamPtr, &opcode_vkGetRefreshCycleDurationGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetRefreshCycleDurationGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1208;
+    *&cgen_var_1208 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1208, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1209;
+    *&cgen_var_1209 = get_host_u64_VkSwapchainKHR((*&local_swapchain));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1209, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkRefreshCycleDurationGOOGLE(stream, (VkRefreshCycleDurationGOOGLE*)(pDisplayTimingProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkRefreshCycleDurationGOOGLE(stream, (VkRefreshCycleDurationGOOGLE*)(pDisplayTimingProperties));
     if (pDisplayTimingProperties)
     {
@@ -20086,9 +23739,13 @@
     }
     VkResult vkGetRefreshCycleDurationGOOGLE_VkResult_return = (VkResult)0;
     stream->read(&vkGetRefreshCycleDurationGOOGLE_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetRefreshCycleDurationGOOGLE");;
     return vkGetRefreshCycleDurationGOOGLE_VkResult_return;
 }
@@ -20097,73 +23754,83 @@
     VkDevice device,
     VkSwapchainKHR swapchain,
     uint32_t* pPresentationTimingCount,
-    VkPastPresentationTimingGOOGLE* pPresentationTimings)
+    VkPastPresentationTimingGOOGLE* pPresentationTimings,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPastPresentationTimingGOOGLE");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkSwapchainKHR local_swapchain;
+    uint32_t local_doLock;
     local_device = device;
     local_swapchain = swapchain;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1356;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1356, 1);
-        countingStream->write((uint64_t*)&cgen_var_1356, 1 * 8);
-        uint64_t cgen_var_1357;
-        countingStream->handleMapping()->mapHandles_VkSwapchainKHR_u64(&local_swapchain, &cgen_var_1357, 1);
-        countingStream->write((uint64_t*)&cgen_var_1357, 1 * 8);
+        uint64_t cgen_var_1210;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1211;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_1358 = (uint64_t)(uintptr_t)pPresentationTimingCount;
-        countingStream->putBe64(cgen_var_1358);
+        *countPtr += 8;
         if (pPresentationTimingCount)
         {
-            countingStream->write((uint32_t*)pPresentationTimingCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_1359 = (uint64_t)(uintptr_t)pPresentationTimings;
-        countingStream->putBe64(cgen_var_1359);
+        *countPtr += 8;
         if (pPresentationTimings)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pPresentationTimingCount)); ++i)
             {
-                marshal_VkPastPresentationTimingGOOGLE(countingStream, (VkPastPresentationTimingGOOGLE*)(pPresentationTimings + i));
+                count_VkPastPresentationTimingGOOGLE(featureBits, (VkPastPresentationTimingGOOGLE*)(pPresentationTimings + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPastPresentationTimingGOOGLE = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPastPresentationTimingGOOGLE = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPastPresentationTimingGOOGLE);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPastPresentationTimingGOOGLE = OP_vkGetPastPresentationTimingGOOGLE;
-    stream->write(&opcode_vkGetPastPresentationTimingGOOGLE, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPastPresentationTimingGOOGLE, sizeof(uint32_t));
-    uint64_t cgen_var_1360;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1360, 1);
-    stream->write((uint64_t*)&cgen_var_1360, 1 * 8);
-    uint64_t cgen_var_1361;
-    stream->handleMapping()->mapHandles_VkSwapchainKHR_u64(&local_swapchain, &cgen_var_1361, 1);
-    stream->write((uint64_t*)&cgen_var_1361, 1 * 8);
+    memcpy(streamPtr, &opcode_vkGetPastPresentationTimingGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPastPresentationTimingGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1212;
+    *&cgen_var_1212 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1212, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1213;
+    *&cgen_var_1213 = get_host_u64_VkSwapchainKHR((*&local_swapchain));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1213, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_1362 = (uint64_t)(uintptr_t)pPresentationTimingCount;
-    stream->putBe64(cgen_var_1362);
+    uint64_t cgen_var_1214 = (uint64_t)(uintptr_t)pPresentationTimingCount;
+    memcpy((*streamPtrPtr), &cgen_var_1214, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pPresentationTimingCount)
     {
-        stream->write((uint32_t*)pPresentationTimingCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pPresentationTimingCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_1363 = (uint64_t)(uintptr_t)pPresentationTimings;
-    stream->putBe64(cgen_var_1363);
+    uint64_t cgen_var_1215 = (uint64_t)(uintptr_t)pPresentationTimings;
+    memcpy((*streamPtrPtr), &cgen_var_1215, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pPresentationTimings)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pPresentationTimingCount)); ++i)
         {
-            marshal_VkPastPresentationTimingGOOGLE(stream, (VkPastPresentationTimingGOOGLE*)(pPresentationTimings + i));
+            reservedmarshal_VkPastPresentationTimingGOOGLE(stream, (VkPastPresentationTimingGOOGLE*)(pPresentationTimings + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pPresentationTimingCount;
     check_pPresentationTimingCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -20198,9 +23865,13 @@
     }
     VkResult vkGetPastPresentationTimingGOOGLE_VkResult_return = (VkResult)0;
     stream->read(&vkGetPastPresentationTimingGOOGLE_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPastPresentationTimingGOOGLE");;
     return vkGetPastPresentationTimingGOOGLE_VkResult_return;
 }
@@ -20221,19 +23892,19 @@
     VkCommandBuffer commandBuffer,
     uint32_t firstDiscardRectangle,
     uint32_t discardRectangleCount,
-    const VkRect2D* pDiscardRectangles)
+    const VkRect2D* pDiscardRectangles,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdSetDiscardRectangleEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     uint32_t local_firstDiscardRectangle;
     uint32_t local_discardRectangleCount;
     VkRect2D* local_pDiscardRectangles;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_firstDiscardRectangle = firstDiscardRectangle;
     local_discardRectangleCount = discardRectangleCount;
@@ -20246,6 +23917,7 @@
             deepcopy_VkRect2D(pool, pDiscardRectangles + i, (VkRect2D*)(local_pDiscardRectangles + i));
         }
     }
+    local_doLock = doLock;
     if (local_pDiscardRectangles)
     {
         for (uint32_t i = 0; i < (uint32_t)((discardRectangleCount)); ++i)
@@ -20253,35 +23925,47 @@
             transform_tohost_VkRect2D(mImpl->resources(), (VkRect2D*)(local_pDiscardRectangles + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1366;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1366, 1);
-        countingStream->write((uint64_t*)&cgen_var_1366, 1 * 8);
-        countingStream->write((uint32_t*)&local_firstDiscardRectangle, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_discardRectangleCount, sizeof(uint32_t));
+        uint64_t cgen_var_1218;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((discardRectangleCount)); ++i)
         {
-            marshal_VkRect2D(countingStream, (VkRect2D*)(local_pDiscardRectangles + i));
+            count_VkRect2D(featureBits, (VkRect2D*)(local_pDiscardRectangles + i), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdSetDiscardRectangleEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdSetDiscardRectangleEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetDiscardRectangleEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdSetDiscardRectangleEXT = OP_vkCmdSetDiscardRectangleEXT;
-    stream->write(&opcode_vkCmdSetDiscardRectangleEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdSetDiscardRectangleEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1367;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1367, 1);
-    stream->write((uint64_t*)&cgen_var_1367, 1 * 8);
-    stream->write((uint32_t*)&local_firstDiscardRectangle, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_discardRectangleCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkCmdSetDiscardRectangleEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdSetDiscardRectangleEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1219;
+    *&cgen_var_1219 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1219, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_firstDiscardRectangle, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_discardRectangleCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((discardRectangleCount)); ++i)
     {
-        marshal_VkRect2D(stream, (VkRect2D*)(local_pDiscardRectangles + i));
+        reservedmarshal_VkRect2D(stream, (VkRect2D*)(local_pDiscardRectangles + i), streamPtrPtr);
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdSetDiscardRectangleEXT");;
 }
 
@@ -20295,19 +23979,19 @@
     VkDevice device,
     uint32_t swapchainCount,
     const VkSwapchainKHR* pSwapchains,
-    const VkHdrMetadataEXT* pMetadata)
+    const VkHdrMetadataEXT* pMetadata,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkSetHdrMetadataEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     uint32_t local_swapchainCount;
     VkSwapchainKHR* local_pSwapchains;
     VkHdrMetadataEXT* local_pMetadata;
+    uint32_t local_doLock;
     local_device = device;
     local_swapchainCount = swapchainCount;
     local_pSwapchains = nullptr;
@@ -20324,6 +24008,7 @@
             deepcopy_VkHdrMetadataEXT(pool, pMetadata + i, (VkHdrMetadataEXT*)(local_pMetadata + i));
         }
     }
+    local_doLock = doLock;
     if (local_pMetadata)
     {
         for (uint32_t i = 0; i < (uint32_t)((swapchainCount)); ++i)
@@ -20331,47 +24016,59 @@
             transform_tohost_VkHdrMetadataEXT(mImpl->resources(), (VkHdrMetadataEXT*)(local_pMetadata + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1368;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1368, 1);
-        countingStream->write((uint64_t*)&cgen_var_1368, 1 * 8);
-        countingStream->write((uint32_t*)&local_swapchainCount, sizeof(uint32_t));
+        uint64_t cgen_var_1220;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         if (((swapchainCount)))
         {
-            uint64_t* cgen_var_1369;
-            countingStream->alloc((void**)&cgen_var_1369, ((swapchainCount)) * 8);
-            countingStream->handleMapping()->mapHandles_VkSwapchainKHR_u64(local_pSwapchains, cgen_var_1369, ((swapchainCount)));
-            countingStream->write((uint64_t*)cgen_var_1369, ((swapchainCount)) * 8);
+            *countPtr += ((swapchainCount)) * 8;
         }
         for (uint32_t i = 0; i < (uint32_t)((swapchainCount)); ++i)
         {
-            marshal_VkHdrMetadataEXT(countingStream, (VkHdrMetadataEXT*)(local_pMetadata + i));
+            count_VkHdrMetadataEXT(featureBits, (VkHdrMetadataEXT*)(local_pMetadata + i), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkSetHdrMetadataEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkSetHdrMetadataEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkSetHdrMetadataEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkSetHdrMetadataEXT = OP_vkSetHdrMetadataEXT;
-    stream->write(&opcode_vkSetHdrMetadataEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkSetHdrMetadataEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1370;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1370, 1);
-    stream->write((uint64_t*)&cgen_var_1370, 1 * 8);
-    stream->write((uint32_t*)&local_swapchainCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkSetHdrMetadataEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkSetHdrMetadataEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1222;
+    *&cgen_var_1222 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1222, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_swapchainCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     if (((swapchainCount)))
     {
-        uint64_t* cgen_var_1371;
-        stream->alloc((void**)&cgen_var_1371, ((swapchainCount)) * 8);
-        stream->handleMapping()->mapHandles_VkSwapchainKHR_u64(local_pSwapchains, cgen_var_1371, ((swapchainCount)));
-        stream->write((uint64_t*)cgen_var_1371, ((swapchainCount)) * 8);
+        uint64_t* cgen_var_1223;
+        stream->alloc((void**)&cgen_var_1223, ((swapchainCount)) * 8);
+        for (uint32_t k = 0; k < ((swapchainCount)); ++k)
+        {
+            cgen_var_1223[k] = get_host_u64_VkSwapchainKHR(local_pSwapchains[k]);
+        }
+        memcpy(*streamPtrPtr, (uint64_t*)cgen_var_1223, ((swapchainCount)) * 8);
+        *streamPtrPtr += ((swapchainCount)) * 8;
     }
     for (uint32_t i = 0; i < (uint32_t)((swapchainCount)); ++i)
     {
-        marshal_VkHdrMetadataEXT(stream, (VkHdrMetadataEXT*)(local_pMetadata + i));
+        reservedmarshal_VkHdrMetadataEXT(stream, (VkHdrMetadataEXT*)(local_pMetadata + i), streamPtrPtr);
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkSetHdrMetadataEXT");;
 }
 
@@ -20381,18 +24078,18 @@
     VkInstance instance,
     const VkIOSSurfaceCreateInfoMVK* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
+    VkSurfaceKHR* pSurface,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateIOSSurfaceMVK");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkInstance local_instance;
     VkIOSSurfaceCreateInfoMVK* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_instance = instance;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -20406,6 +24103,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -20415,52 +24113,63 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1372;
-        countingStream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_1372, 1);
-        countingStream->write((uint64_t*)&cgen_var_1372, 1 * 8);
-        marshal_VkIOSSurfaceCreateInfoMVK(countingStream, (VkIOSSurfaceCreateInfoMVK*)(local_pCreateInfo));
+        uint64_t cgen_var_1224;
+        *countPtr += 1 * 8;
+        count_VkIOSSurfaceCreateInfoMVK(featureBits, (VkIOSSurfaceCreateInfoMVK*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_1373 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_1373);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_1374;
-        countingStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_1374, 1);
-        countingStream->write((uint64_t*)&cgen_var_1374, 8);
+        uint64_t cgen_var_1225;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateIOSSurfaceMVK = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateIOSSurfaceMVK = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateIOSSurfaceMVK);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateIOSSurfaceMVK = OP_vkCreateIOSSurfaceMVK;
-    stream->write(&opcode_vkCreateIOSSurfaceMVK, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateIOSSurfaceMVK, sizeof(uint32_t));
-    uint64_t cgen_var_1375;
-    stream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_1375, 1);
-    stream->write((uint64_t*)&cgen_var_1375, 1 * 8);
-    marshal_VkIOSSurfaceCreateInfoMVK(stream, (VkIOSSurfaceCreateInfoMVK*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateIOSSurfaceMVK, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateIOSSurfaceMVK, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1226;
+    *&cgen_var_1226 = get_host_u64_VkInstance((*&local_instance));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1226, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkIOSSurfaceCreateInfoMVK(stream, (VkIOSSurfaceCreateInfoMVK*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_1376 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_1376);
+    uint64_t cgen_var_1227 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_1227, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_1377;
-    stream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_1377, 1);
-    stream->write((uint64_t*)&cgen_var_1377, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
-    uint64_t cgen_var_1378;
-    stream->read((uint64_t*)&cgen_var_1378, 8);
-    stream->handleMapping()->mapHandles_u64_VkSurfaceKHR(&cgen_var_1378, (VkSurfaceKHR*)pSurface, 1);
+    /* is handle, possibly out */;
+    uint64_t cgen_var_1228;
+    *&cgen_var_1228 = (uint64_t)((*pSurface));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1228, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1229;
+    stream->read((uint64_t*)&cgen_var_1229, 8);
+    stream->handleMapping()->mapHandles_u64_VkSurfaceKHR(&cgen_var_1229, (VkSurfaceKHR*)pSurface, 1);
     VkResult vkCreateIOSSurfaceMVK_VkResult_return = (VkResult)0;
     stream->read(&vkCreateIOSSurfaceMVK_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateIOSSurfaceMVK");;
     return vkCreateIOSSurfaceMVK_VkResult_return;
 }
@@ -20471,18 +24180,18 @@
     VkInstance instance,
     const VkMacOSSurfaceCreateInfoMVK* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkSurfaceKHR* pSurface)
+    VkSurfaceKHR* pSurface,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateMacOSSurfaceMVK");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkInstance local_instance;
     VkMacOSSurfaceCreateInfoMVK* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_instance = instance;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -20496,6 +24205,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -20505,52 +24215,63 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1379;
-        countingStream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_1379, 1);
-        countingStream->write((uint64_t*)&cgen_var_1379, 1 * 8);
-        marshal_VkMacOSSurfaceCreateInfoMVK(countingStream, (VkMacOSSurfaceCreateInfoMVK*)(local_pCreateInfo));
+        uint64_t cgen_var_1230;
+        *countPtr += 1 * 8;
+        count_VkMacOSSurfaceCreateInfoMVK(featureBits, (VkMacOSSurfaceCreateInfoMVK*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_1380 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_1380);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_1381;
-        countingStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_1381, 1);
-        countingStream->write((uint64_t*)&cgen_var_1381, 8);
+        uint64_t cgen_var_1231;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateMacOSSurfaceMVK = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateMacOSSurfaceMVK = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateMacOSSurfaceMVK);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateMacOSSurfaceMVK = OP_vkCreateMacOSSurfaceMVK;
-    stream->write(&opcode_vkCreateMacOSSurfaceMVK, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateMacOSSurfaceMVK, sizeof(uint32_t));
-    uint64_t cgen_var_1382;
-    stream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_1382, 1);
-    stream->write((uint64_t*)&cgen_var_1382, 1 * 8);
-    marshal_VkMacOSSurfaceCreateInfoMVK(stream, (VkMacOSSurfaceCreateInfoMVK*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateMacOSSurfaceMVK, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateMacOSSurfaceMVK, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1232;
+    *&cgen_var_1232 = get_host_u64_VkInstance((*&local_instance));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1232, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkMacOSSurfaceCreateInfoMVK(stream, (VkMacOSSurfaceCreateInfoMVK*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_1383 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_1383);
+    uint64_t cgen_var_1233 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_1233, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_1384;
-    stream->handleMapping()->mapHandles_VkSurfaceKHR_u64(pSurface, &cgen_var_1384, 1);
-    stream->write((uint64_t*)&cgen_var_1384, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
-    uint64_t cgen_var_1385;
-    stream->read((uint64_t*)&cgen_var_1385, 8);
-    stream->handleMapping()->mapHandles_u64_VkSurfaceKHR(&cgen_var_1385, (VkSurfaceKHR*)pSurface, 1);
+    /* is handle, possibly out */;
+    uint64_t cgen_var_1234;
+    *&cgen_var_1234 = (uint64_t)((*pSurface));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1234, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1235;
+    stream->read((uint64_t*)&cgen_var_1235, 8);
+    stream->handleMapping()->mapHandles_u64_VkSurfaceKHR(&cgen_var_1235, (VkSurfaceKHR*)pSurface, 1);
     VkResult vkCreateMacOSSurfaceMVK_VkResult_return = (VkResult)0;
     stream->read(&vkCreateMacOSSurfaceMVK_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateMacOSSurfaceMVK");;
     return vkCreateMacOSSurfaceMVK_VkResult_return;
 }
@@ -20563,17 +24284,17 @@
 #ifdef VK_EXT_debug_utils
 VkResult VkEncoder::vkSetDebugUtilsObjectNameEXT(
     VkDevice device,
-    const VkDebugUtilsObjectNameInfoEXT* pNameInfo)
+    const VkDebugUtilsObjectNameInfoEXT* pNameInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkSetDebugUtilsObjectNameEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDebugUtilsObjectNameInfoEXT* local_pNameInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pNameInfo = nullptr;
     if (pNameInfo)
@@ -20581,48 +24302,59 @@
         local_pNameInfo = (VkDebugUtilsObjectNameInfoEXT*)pool->alloc(sizeof(const VkDebugUtilsObjectNameInfoEXT));
         deepcopy_VkDebugUtilsObjectNameInfoEXT(pool, pNameInfo, (VkDebugUtilsObjectNameInfoEXT*)(local_pNameInfo));
     }
+    local_doLock = doLock;
     if (local_pNameInfo)
     {
         transform_tohost_VkDebugUtilsObjectNameInfoEXT(mImpl->resources(), (VkDebugUtilsObjectNameInfoEXT*)(local_pNameInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1386;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1386, 1);
-        countingStream->write((uint64_t*)&cgen_var_1386, 1 * 8);
-        marshal_VkDebugUtilsObjectNameInfoEXT(countingStream, (VkDebugUtilsObjectNameInfoEXT*)(local_pNameInfo));
+        uint64_t cgen_var_1236;
+        *countPtr += 1 * 8;
+        count_VkDebugUtilsObjectNameInfoEXT(featureBits, (VkDebugUtilsObjectNameInfoEXT*)(local_pNameInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkSetDebugUtilsObjectNameEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkSetDebugUtilsObjectNameEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkSetDebugUtilsObjectNameEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkSetDebugUtilsObjectNameEXT = OP_vkSetDebugUtilsObjectNameEXT;
-    stream->write(&opcode_vkSetDebugUtilsObjectNameEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkSetDebugUtilsObjectNameEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1387;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1387, 1);
-    stream->write((uint64_t*)&cgen_var_1387, 1 * 8);
-    marshal_VkDebugUtilsObjectNameInfoEXT(stream, (VkDebugUtilsObjectNameInfoEXT*)(local_pNameInfo));
+    memcpy(streamPtr, &opcode_vkSetDebugUtilsObjectNameEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkSetDebugUtilsObjectNameEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1237;
+    *&cgen_var_1237 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1237, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDebugUtilsObjectNameInfoEXT(stream, (VkDebugUtilsObjectNameInfoEXT*)(local_pNameInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkSetDebugUtilsObjectNameEXT_VkResult_return = (VkResult)0;
     stream->read(&vkSetDebugUtilsObjectNameEXT_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkSetDebugUtilsObjectNameEXT");;
     return vkSetDebugUtilsObjectNameEXT_VkResult_return;
 }
 
 VkResult VkEncoder::vkSetDebugUtilsObjectTagEXT(
     VkDevice device,
-    const VkDebugUtilsObjectTagInfoEXT* pTagInfo)
+    const VkDebugUtilsObjectTagInfoEXT* pTagInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkSetDebugUtilsObjectTagEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDebugUtilsObjectTagInfoEXT* local_pTagInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pTagInfo = nullptr;
     if (pTagInfo)
@@ -20630,48 +24362,59 @@
         local_pTagInfo = (VkDebugUtilsObjectTagInfoEXT*)pool->alloc(sizeof(const VkDebugUtilsObjectTagInfoEXT));
         deepcopy_VkDebugUtilsObjectTagInfoEXT(pool, pTagInfo, (VkDebugUtilsObjectTagInfoEXT*)(local_pTagInfo));
     }
+    local_doLock = doLock;
     if (local_pTagInfo)
     {
         transform_tohost_VkDebugUtilsObjectTagInfoEXT(mImpl->resources(), (VkDebugUtilsObjectTagInfoEXT*)(local_pTagInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1388;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1388, 1);
-        countingStream->write((uint64_t*)&cgen_var_1388, 1 * 8);
-        marshal_VkDebugUtilsObjectTagInfoEXT(countingStream, (VkDebugUtilsObjectTagInfoEXT*)(local_pTagInfo));
+        uint64_t cgen_var_1238;
+        *countPtr += 1 * 8;
+        count_VkDebugUtilsObjectTagInfoEXT(featureBits, (VkDebugUtilsObjectTagInfoEXT*)(local_pTagInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkSetDebugUtilsObjectTagEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkSetDebugUtilsObjectTagEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkSetDebugUtilsObjectTagEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkSetDebugUtilsObjectTagEXT = OP_vkSetDebugUtilsObjectTagEXT;
-    stream->write(&opcode_vkSetDebugUtilsObjectTagEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkSetDebugUtilsObjectTagEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1389;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1389, 1);
-    stream->write((uint64_t*)&cgen_var_1389, 1 * 8);
-    marshal_VkDebugUtilsObjectTagInfoEXT(stream, (VkDebugUtilsObjectTagInfoEXT*)(local_pTagInfo));
+    memcpy(streamPtr, &opcode_vkSetDebugUtilsObjectTagEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkSetDebugUtilsObjectTagEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1239;
+    *&cgen_var_1239 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1239, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDebugUtilsObjectTagInfoEXT(stream, (VkDebugUtilsObjectTagInfoEXT*)(local_pTagInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkSetDebugUtilsObjectTagEXT_VkResult_return = (VkResult)0;
     stream->read(&vkSetDebugUtilsObjectTagEXT_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkSetDebugUtilsObjectTagEXT");;
     return vkSetDebugUtilsObjectTagEXT_VkResult_return;
 }
 
 void VkEncoder::vkQueueBeginDebugUtilsLabelEXT(
     VkQueue queue,
-    const VkDebugUtilsLabelEXT* pLabelInfo)
+    const VkDebugUtilsLabelEXT* pLabelInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkQueueBeginDebugUtilsLabelEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkQueue local_queue;
     VkDebugUtilsLabelEXT* local_pLabelInfo;
+    uint32_t local_doLock;
     local_queue = queue;
     local_pLabelInfo = nullptr;
     if (pLabelInfo)
@@ -20679,77 +24422,99 @@
         local_pLabelInfo = (VkDebugUtilsLabelEXT*)pool->alloc(sizeof(const VkDebugUtilsLabelEXT));
         deepcopy_VkDebugUtilsLabelEXT(pool, pLabelInfo, (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
     }
+    local_doLock = doLock;
     if (local_pLabelInfo)
     {
         transform_tohost_VkDebugUtilsLabelEXT(mImpl->resources(), (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1390;
-        countingStream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1390, 1);
-        countingStream->write((uint64_t*)&cgen_var_1390, 1 * 8);
-        marshal_VkDebugUtilsLabelEXT(countingStream, (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
+        uint64_t cgen_var_1240;
+        *countPtr += 1 * 8;
+        count_VkDebugUtilsLabelEXT(featureBits, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkQueueBeginDebugUtilsLabelEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkQueueBeginDebugUtilsLabelEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkQueueBeginDebugUtilsLabelEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkQueueBeginDebugUtilsLabelEXT = OP_vkQueueBeginDebugUtilsLabelEXT;
-    stream->write(&opcode_vkQueueBeginDebugUtilsLabelEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkQueueBeginDebugUtilsLabelEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1391;
-    stream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1391, 1);
-    stream->write((uint64_t*)&cgen_var_1391, 1 * 8);
-    marshal_VkDebugUtilsLabelEXT(stream, (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkQueueBeginDebugUtilsLabelEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkQueueBeginDebugUtilsLabelEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1241;
+    *&cgen_var_1241 = get_host_u64_VkQueue((*&local_queue));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1241, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDebugUtilsLabelEXT(stream, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkQueueBeginDebugUtilsLabelEXT");;
 }
 
 void VkEncoder::vkQueueEndDebugUtilsLabelEXT(
-    VkQueue queue)
+    VkQueue queue,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkQueueEndDebugUtilsLabelEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkQueue local_queue;
+    uint32_t local_doLock;
     local_queue = queue;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1392;
-        countingStream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1392, 1);
-        countingStream->write((uint64_t*)&cgen_var_1392, 1 * 8);
+        uint64_t cgen_var_1242;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkQueueEndDebugUtilsLabelEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkQueueEndDebugUtilsLabelEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkQueueEndDebugUtilsLabelEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkQueueEndDebugUtilsLabelEXT = OP_vkQueueEndDebugUtilsLabelEXT;
-    stream->write(&opcode_vkQueueEndDebugUtilsLabelEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkQueueEndDebugUtilsLabelEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1393;
-    stream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1393, 1);
-    stream->write((uint64_t*)&cgen_var_1393, 1 * 8);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkQueueEndDebugUtilsLabelEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkQueueEndDebugUtilsLabelEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1243;
+    *&cgen_var_1243 = get_host_u64_VkQueue((*&local_queue));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1243, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkQueueEndDebugUtilsLabelEXT");;
 }
 
 void VkEncoder::vkQueueInsertDebugUtilsLabelEXT(
     VkQueue queue,
-    const VkDebugUtilsLabelEXT* pLabelInfo)
+    const VkDebugUtilsLabelEXT* pLabelInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkQueueInsertDebugUtilsLabelEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkQueue local_queue;
     VkDebugUtilsLabelEXT* local_pLabelInfo;
+    uint32_t local_doLock;
     local_queue = queue;
     local_pLabelInfo = nullptr;
     if (pLabelInfo)
@@ -20757,45 +24522,56 @@
         local_pLabelInfo = (VkDebugUtilsLabelEXT*)pool->alloc(sizeof(const VkDebugUtilsLabelEXT));
         deepcopy_VkDebugUtilsLabelEXT(pool, pLabelInfo, (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
     }
+    local_doLock = doLock;
     if (local_pLabelInfo)
     {
         transform_tohost_VkDebugUtilsLabelEXT(mImpl->resources(), (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1394;
-        countingStream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1394, 1);
-        countingStream->write((uint64_t*)&cgen_var_1394, 1 * 8);
-        marshal_VkDebugUtilsLabelEXT(countingStream, (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
+        uint64_t cgen_var_1244;
+        *countPtr += 1 * 8;
+        count_VkDebugUtilsLabelEXT(featureBits, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkQueueInsertDebugUtilsLabelEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkQueueInsertDebugUtilsLabelEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkQueueInsertDebugUtilsLabelEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkQueueInsertDebugUtilsLabelEXT = OP_vkQueueInsertDebugUtilsLabelEXT;
-    stream->write(&opcode_vkQueueInsertDebugUtilsLabelEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkQueueInsertDebugUtilsLabelEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1395;
-    stream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1395, 1);
-    stream->write((uint64_t*)&cgen_var_1395, 1 * 8);
-    marshal_VkDebugUtilsLabelEXT(stream, (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkQueueInsertDebugUtilsLabelEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkQueueInsertDebugUtilsLabelEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1245;
+    *&cgen_var_1245 = get_host_u64_VkQueue((*&local_queue));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1245, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDebugUtilsLabelEXT(stream, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkQueueInsertDebugUtilsLabelEXT");;
 }
 
 void VkEncoder::vkCmdBeginDebugUtilsLabelEXT(
     VkCommandBuffer commandBuffer,
-    const VkDebugUtilsLabelEXT* pLabelInfo)
+    const VkDebugUtilsLabelEXT* pLabelInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdBeginDebugUtilsLabelEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkDebugUtilsLabelEXT* local_pLabelInfo;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_pLabelInfo = nullptr;
     if (pLabelInfo)
@@ -20803,77 +24579,99 @@
         local_pLabelInfo = (VkDebugUtilsLabelEXT*)pool->alloc(sizeof(const VkDebugUtilsLabelEXT));
         deepcopy_VkDebugUtilsLabelEXT(pool, pLabelInfo, (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
     }
+    local_doLock = doLock;
     if (local_pLabelInfo)
     {
         transform_tohost_VkDebugUtilsLabelEXT(mImpl->resources(), (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1396;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1396, 1);
-        countingStream->write((uint64_t*)&cgen_var_1396, 1 * 8);
-        marshal_VkDebugUtilsLabelEXT(countingStream, (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
+        uint64_t cgen_var_1246;
+        *countPtr += 1 * 8;
+        count_VkDebugUtilsLabelEXT(featureBits, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdBeginDebugUtilsLabelEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdBeginDebugUtilsLabelEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBeginDebugUtilsLabelEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdBeginDebugUtilsLabelEXT = OP_vkCmdBeginDebugUtilsLabelEXT;
-    stream->write(&opcode_vkCmdBeginDebugUtilsLabelEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdBeginDebugUtilsLabelEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1397;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1397, 1);
-    stream->write((uint64_t*)&cgen_var_1397, 1 * 8);
-    marshal_VkDebugUtilsLabelEXT(stream, (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdBeginDebugUtilsLabelEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdBeginDebugUtilsLabelEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1247;
+    *&cgen_var_1247 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1247, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDebugUtilsLabelEXT(stream, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdBeginDebugUtilsLabelEXT");;
 }
 
 void VkEncoder::vkCmdEndDebugUtilsLabelEXT(
-    VkCommandBuffer commandBuffer)
+    VkCommandBuffer commandBuffer,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdEndDebugUtilsLabelEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1398;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1398, 1);
-        countingStream->write((uint64_t*)&cgen_var_1398, 1 * 8);
+        uint64_t cgen_var_1248;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdEndDebugUtilsLabelEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdEndDebugUtilsLabelEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdEndDebugUtilsLabelEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdEndDebugUtilsLabelEXT = OP_vkCmdEndDebugUtilsLabelEXT;
-    stream->write(&opcode_vkCmdEndDebugUtilsLabelEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdEndDebugUtilsLabelEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1399;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1399, 1);
-    stream->write((uint64_t*)&cgen_var_1399, 1 * 8);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdEndDebugUtilsLabelEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdEndDebugUtilsLabelEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1249;
+    *&cgen_var_1249 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1249, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdEndDebugUtilsLabelEXT");;
 }
 
 void VkEncoder::vkCmdInsertDebugUtilsLabelEXT(
     VkCommandBuffer commandBuffer,
-    const VkDebugUtilsLabelEXT* pLabelInfo)
+    const VkDebugUtilsLabelEXT* pLabelInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdInsertDebugUtilsLabelEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkDebugUtilsLabelEXT* local_pLabelInfo;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_pLabelInfo = nullptr;
     if (pLabelInfo)
@@ -20881,29 +24679,40 @@
         local_pLabelInfo = (VkDebugUtilsLabelEXT*)pool->alloc(sizeof(const VkDebugUtilsLabelEXT));
         deepcopy_VkDebugUtilsLabelEXT(pool, pLabelInfo, (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
     }
+    local_doLock = doLock;
     if (local_pLabelInfo)
     {
         transform_tohost_VkDebugUtilsLabelEXT(mImpl->resources(), (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1400;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1400, 1);
-        countingStream->write((uint64_t*)&cgen_var_1400, 1 * 8);
-        marshal_VkDebugUtilsLabelEXT(countingStream, (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
+        uint64_t cgen_var_1250;
+        *countPtr += 1 * 8;
+        count_VkDebugUtilsLabelEXT(featureBits, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdInsertDebugUtilsLabelEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdInsertDebugUtilsLabelEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdInsertDebugUtilsLabelEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdInsertDebugUtilsLabelEXT = OP_vkCmdInsertDebugUtilsLabelEXT;
-    stream->write(&opcode_vkCmdInsertDebugUtilsLabelEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdInsertDebugUtilsLabelEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1401;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1401, 1);
-    stream->write((uint64_t*)&cgen_var_1401, 1 * 8);
-    marshal_VkDebugUtilsLabelEXT(stream, (VkDebugUtilsLabelEXT*)(local_pLabelInfo));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdInsertDebugUtilsLabelEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdInsertDebugUtilsLabelEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1251;
+    *&cgen_var_1251 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1251, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDebugUtilsLabelEXT(stream, (VkDebugUtilsLabelEXT*)(local_pLabelInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdInsertDebugUtilsLabelEXT");;
 }
 
@@ -20911,18 +24720,18 @@
     VkInstance instance,
     const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkDebugUtilsMessengerEXT* pMessenger)
+    VkDebugUtilsMessengerEXT* pMessenger,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateDebugUtilsMessengerEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkInstance local_instance;
     VkDebugUtilsMessengerCreateInfoEXT* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_instance = instance;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -20936,6 +24745,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -20945,54 +24755,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1402;
-        countingStream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_1402, 1);
-        countingStream->write((uint64_t*)&cgen_var_1402, 1 * 8);
-        marshal_VkDebugUtilsMessengerCreateInfoEXT(countingStream, (VkDebugUtilsMessengerCreateInfoEXT*)(local_pCreateInfo));
+        uint64_t cgen_var_1252;
+        *countPtr += 1 * 8;
+        count_VkDebugUtilsMessengerCreateInfoEXT(featureBits, (VkDebugUtilsMessengerCreateInfoEXT*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_1403 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_1403);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_1404;
-        countingStream->handleMapping()->mapHandles_VkDebugUtilsMessengerEXT_u64(pMessenger, &cgen_var_1404, 1);
-        countingStream->write((uint64_t*)&cgen_var_1404, 8);
+        uint64_t cgen_var_1253;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateDebugUtilsMessengerEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateDebugUtilsMessengerEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateDebugUtilsMessengerEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateDebugUtilsMessengerEXT = OP_vkCreateDebugUtilsMessengerEXT;
-    stream->write(&opcode_vkCreateDebugUtilsMessengerEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateDebugUtilsMessengerEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1405;
-    stream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_1405, 1);
-    stream->write((uint64_t*)&cgen_var_1405, 1 * 8);
-    marshal_VkDebugUtilsMessengerCreateInfoEXT(stream, (VkDebugUtilsMessengerCreateInfoEXT*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateDebugUtilsMessengerEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateDebugUtilsMessengerEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1254;
+    *&cgen_var_1254 = get_host_u64_VkInstance((*&local_instance));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1254, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkDebugUtilsMessengerCreateInfoEXT(stream, (VkDebugUtilsMessengerCreateInfoEXT*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_1406 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_1406);
+    uint64_t cgen_var_1255 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_1255, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_1407;
-    stream->handleMapping()->mapHandles_VkDebugUtilsMessengerEXT_u64(pMessenger, &cgen_var_1407, 1);
-    stream->write((uint64_t*)&cgen_var_1407, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_1256;
+    *&cgen_var_1256 = (uint64_t)((*pMessenger));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1256, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_1408;
-    stream->read((uint64_t*)&cgen_var_1408, 8);
-    stream->handleMapping()->mapHandles_u64_VkDebugUtilsMessengerEXT(&cgen_var_1408, (VkDebugUtilsMessengerEXT*)pMessenger, 1);
+    uint64_t cgen_var_1257;
+    stream->read((uint64_t*)&cgen_var_1257, 8);
+    stream->handleMapping()->mapHandles_u64_VkDebugUtilsMessengerEXT(&cgen_var_1257, (VkDebugUtilsMessengerEXT*)pMessenger, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateDebugUtilsMessengerEXT_VkResult_return = (VkResult)0;
     stream->read(&vkCreateDebugUtilsMessengerEXT_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateDebugUtilsMessengerEXT");;
     return vkCreateDebugUtilsMessengerEXT_VkResult_return;
 }
@@ -21000,18 +24821,18 @@
 void VkEncoder::vkDestroyDebugUtilsMessengerEXT(
     VkInstance instance,
     VkDebugUtilsMessengerEXT messenger,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyDebugUtilsMessengerEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkInstance local_instance;
     VkDebugUtilsMessengerEXT local_messenger;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_instance = instance;
     local_messenger = messenger;
     local_pAllocator = nullptr;
@@ -21020,49 +24841,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1409;
-        countingStream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_1409, 1);
-        countingStream->write((uint64_t*)&cgen_var_1409, 1 * 8);
-        uint64_t cgen_var_1410;
-        countingStream->handleMapping()->mapHandles_VkDebugUtilsMessengerEXT_u64(&local_messenger, &cgen_var_1410, 1);
-        countingStream->write((uint64_t*)&cgen_var_1410, 1 * 8);
+        uint64_t cgen_var_1258;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1259;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_1411 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_1411);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyDebugUtilsMessengerEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyDebugUtilsMessengerEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyDebugUtilsMessengerEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyDebugUtilsMessengerEXT = OP_vkDestroyDebugUtilsMessengerEXT;
-    stream->write(&opcode_vkDestroyDebugUtilsMessengerEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyDebugUtilsMessengerEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1412;
-    stream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_1412, 1);
-    stream->write((uint64_t*)&cgen_var_1412, 1 * 8);
-    uint64_t cgen_var_1413;
-    stream->handleMapping()->mapHandles_VkDebugUtilsMessengerEXT_u64(&local_messenger, &cgen_var_1413, 1);
-    stream->write((uint64_t*)&cgen_var_1413, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyDebugUtilsMessengerEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyDebugUtilsMessengerEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1260;
+    *&cgen_var_1260 = get_host_u64_VkInstance((*&local_instance));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1260, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1261;
+    *&cgen_var_1261 = get_host_u64_VkDebugUtilsMessengerEXT((*&local_messenger));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1261, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_1414 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_1414);
+    uint64_t cgen_var_1262 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_1262, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkDebugUtilsMessengerEXT((VkDebugUtilsMessengerEXT*)&messenger);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyDebugUtilsMessengerEXT");;
 }
 
@@ -21070,19 +24903,19 @@
     VkInstance instance,
     VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
     VkDebugUtilsMessageTypeFlagsEXT messageTypes,
-    const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData)
+    const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkSubmitDebugUtilsMessageEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkInstance local_instance;
     VkDebugUtilsMessageSeverityFlagBitsEXT local_messageSeverity;
     VkDebugUtilsMessageTypeFlagsEXT local_messageTypes;
     VkDebugUtilsMessengerCallbackDataEXT* local_pCallbackData;
+    uint32_t local_doLock;
     local_instance = instance;
     local_messageSeverity = messageSeverity;
     local_messageTypes = messageTypes;
@@ -21092,33 +24925,46 @@
         local_pCallbackData = (VkDebugUtilsMessengerCallbackDataEXT*)pool->alloc(sizeof(const VkDebugUtilsMessengerCallbackDataEXT));
         deepcopy_VkDebugUtilsMessengerCallbackDataEXT(pool, pCallbackData, (VkDebugUtilsMessengerCallbackDataEXT*)(local_pCallbackData));
     }
+    local_doLock = doLock;
     if (local_pCallbackData)
     {
         transform_tohost_VkDebugUtilsMessengerCallbackDataEXT(mImpl->resources(), (VkDebugUtilsMessengerCallbackDataEXT*)(local_pCallbackData));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1415;
-        countingStream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_1415, 1);
-        countingStream->write((uint64_t*)&cgen_var_1415, 1 * 8);
-        countingStream->write((VkDebugUtilsMessageSeverityFlagBitsEXT*)&local_messageSeverity, sizeof(VkDebugUtilsMessageSeverityFlagBitsEXT));
-        countingStream->write((VkDebugUtilsMessageTypeFlagsEXT*)&local_messageTypes, sizeof(VkDebugUtilsMessageTypeFlagsEXT));
-        marshal_VkDebugUtilsMessengerCallbackDataEXT(countingStream, (VkDebugUtilsMessengerCallbackDataEXT*)(local_pCallbackData));
+        uint64_t cgen_var_1263;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkDebugUtilsMessageSeverityFlagBitsEXT);
+        *countPtr += sizeof(VkDebugUtilsMessageTypeFlagsEXT);
+        count_VkDebugUtilsMessengerCallbackDataEXT(featureBits, (VkDebugUtilsMessengerCallbackDataEXT*)(local_pCallbackData), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkSubmitDebugUtilsMessageEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkSubmitDebugUtilsMessageEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkSubmitDebugUtilsMessageEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkSubmitDebugUtilsMessageEXT = OP_vkSubmitDebugUtilsMessageEXT;
-    stream->write(&opcode_vkSubmitDebugUtilsMessageEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkSubmitDebugUtilsMessageEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1416;
-    stream->handleMapping()->mapHandles_VkInstance_u64(&local_instance, &cgen_var_1416, 1);
-    stream->write((uint64_t*)&cgen_var_1416, 1 * 8);
-    stream->write((VkDebugUtilsMessageSeverityFlagBitsEXT*)&local_messageSeverity, sizeof(VkDebugUtilsMessageSeverityFlagBitsEXT));
-    stream->write((VkDebugUtilsMessageTypeFlagsEXT*)&local_messageTypes, sizeof(VkDebugUtilsMessageTypeFlagsEXT));
-    marshal_VkDebugUtilsMessengerCallbackDataEXT(stream, (VkDebugUtilsMessengerCallbackDataEXT*)(local_pCallbackData));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkSubmitDebugUtilsMessageEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkSubmitDebugUtilsMessageEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1264;
+    *&cgen_var_1264 = get_host_u64_VkInstance((*&local_instance));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1264, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkDebugUtilsMessageSeverityFlagBitsEXT*)&local_messageSeverity, sizeof(VkDebugUtilsMessageSeverityFlagBitsEXT));
+    *streamPtrPtr += sizeof(VkDebugUtilsMessageSeverityFlagBitsEXT);
+    memcpy(*streamPtrPtr, (VkDebugUtilsMessageTypeFlagsEXT*)&local_messageTypes, sizeof(VkDebugUtilsMessageTypeFlagsEXT));
+    *streamPtrPtr += sizeof(VkDebugUtilsMessageTypeFlagsEXT);
+    reservedmarshal_VkDebugUtilsMessengerCallbackDataEXT(stream, (VkDebugUtilsMessengerCallbackDataEXT*)(local_pCallbackData), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkSubmitDebugUtilsMessageEXT");;
 }
 
@@ -21127,41 +24973,49 @@
 VkResult VkEncoder::vkGetAndroidHardwareBufferPropertiesANDROID(
     VkDevice device,
     const AHardwareBuffer* buffer,
-    VkAndroidHardwareBufferPropertiesANDROID* pProperties)
+    VkAndroidHardwareBufferPropertiesANDROID* pProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetAndroidHardwareBufferPropertiesANDROID");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     AHardwareBuffer* local_buffer;
+    uint32_t local_doLock;
     local_device = device;
     local_buffer = nullptr;
     if (buffer)
     {
         local_buffer = (AHardwareBuffer*)pool->dupArray(buffer, sizeof(const AHardwareBuffer));
     }
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1417;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1417, 1);
-        countingStream->write((uint64_t*)&cgen_var_1417, 1 * 8);
-        countingStream->write((AHardwareBuffer*)local_buffer, sizeof(AHardwareBuffer));
-        marshal_VkAndroidHardwareBufferPropertiesANDROID(countingStream, (VkAndroidHardwareBufferPropertiesANDROID*)(pProperties));
+        uint64_t cgen_var_1265;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(AHardwareBuffer);
+        count_VkAndroidHardwareBufferPropertiesANDROID(featureBits, (VkAndroidHardwareBufferPropertiesANDROID*)(pProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetAndroidHardwareBufferPropertiesANDROID = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetAndroidHardwareBufferPropertiesANDROID = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetAndroidHardwareBufferPropertiesANDROID);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetAndroidHardwareBufferPropertiesANDROID = OP_vkGetAndroidHardwareBufferPropertiesANDROID;
-    stream->write(&opcode_vkGetAndroidHardwareBufferPropertiesANDROID, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetAndroidHardwareBufferPropertiesANDROID, sizeof(uint32_t));
-    uint64_t cgen_var_1418;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1418, 1);
-    stream->write((uint64_t*)&cgen_var_1418, 1 * 8);
-    stream->write((AHardwareBuffer*)local_buffer, sizeof(AHardwareBuffer));
-    marshal_VkAndroidHardwareBufferPropertiesANDROID(stream, (VkAndroidHardwareBufferPropertiesANDROID*)(pProperties));
+    memcpy(streamPtr, &opcode_vkGetAndroidHardwareBufferPropertiesANDROID, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetAndroidHardwareBufferPropertiesANDROID, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1266;
+    *&cgen_var_1266 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1266, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (AHardwareBuffer*)local_buffer, sizeof(AHardwareBuffer));
+    *streamPtrPtr += sizeof(AHardwareBuffer);
+    reservedmarshal_VkAndroidHardwareBufferPropertiesANDROID(stream, (VkAndroidHardwareBufferPropertiesANDROID*)(pProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkAndroidHardwareBufferPropertiesANDROID(stream, (VkAndroidHardwareBufferPropertiesANDROID*)(pProperties));
     if (pProperties)
     {
@@ -21169,9 +25023,13 @@
     }
     VkResult vkGetAndroidHardwareBufferPropertiesANDROID_VkResult_return = (VkResult)0;
     stream->read(&vkGetAndroidHardwareBufferPropertiesANDROID_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetAndroidHardwareBufferPropertiesANDROID");;
     return vkGetAndroidHardwareBufferPropertiesANDROID_VkResult_return;
 }
@@ -21179,17 +25037,17 @@
 VkResult VkEncoder::vkGetMemoryAndroidHardwareBufferANDROID(
     VkDevice device,
     const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo,
-    AHardwareBuffer** pBuffer)
+    AHardwareBuffer** pBuffer,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetMemoryAndroidHardwareBufferANDROID");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkMemoryGetAndroidHardwareBufferInfoANDROID* local_pInfo;
+    uint32_t local_doLock;
     local_device = device;
     local_pInfo = nullptr;
     if (pInfo)
@@ -21197,34 +25055,46 @@
         local_pInfo = (VkMemoryGetAndroidHardwareBufferInfoANDROID*)pool->alloc(sizeof(const VkMemoryGetAndroidHardwareBufferInfoANDROID));
         deepcopy_VkMemoryGetAndroidHardwareBufferInfoANDROID(pool, pInfo, (VkMemoryGetAndroidHardwareBufferInfoANDROID*)(local_pInfo));
     }
+    local_doLock = doLock;
     if (local_pInfo)
     {
         transform_tohost_VkMemoryGetAndroidHardwareBufferInfoANDROID(mImpl->resources(), (VkMemoryGetAndroidHardwareBufferInfoANDROID*)(local_pInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1419;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1419, 1);
-        countingStream->write((uint64_t*)&cgen_var_1419, 1 * 8);
-        marshal_VkMemoryGetAndroidHardwareBufferInfoANDROID(countingStream, (VkMemoryGetAndroidHardwareBufferInfoANDROID*)(local_pInfo));
-        countingStream->write((AHardwareBuffer**)pBuffer, sizeof(AHardwareBuffer*));
+        uint64_t cgen_var_1267;
+        *countPtr += 1 * 8;
+        count_VkMemoryGetAndroidHardwareBufferInfoANDROID(featureBits, (VkMemoryGetAndroidHardwareBufferInfoANDROID*)(local_pInfo), countPtr);
+        *countPtr += sizeof(AHardwareBuffer*);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetMemoryAndroidHardwareBufferANDROID = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetMemoryAndroidHardwareBufferANDROID = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetMemoryAndroidHardwareBufferANDROID);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetMemoryAndroidHardwareBufferANDROID = OP_vkGetMemoryAndroidHardwareBufferANDROID;
-    stream->write(&opcode_vkGetMemoryAndroidHardwareBufferANDROID, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetMemoryAndroidHardwareBufferANDROID, sizeof(uint32_t));
-    uint64_t cgen_var_1420;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1420, 1);
-    stream->write((uint64_t*)&cgen_var_1420, 1 * 8);
-    marshal_VkMemoryGetAndroidHardwareBufferInfoANDROID(stream, (VkMemoryGetAndroidHardwareBufferInfoANDROID*)(local_pInfo));
-    stream->write((AHardwareBuffer**)pBuffer, sizeof(AHardwareBuffer*));
+    memcpy(streamPtr, &opcode_vkGetMemoryAndroidHardwareBufferANDROID, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetMemoryAndroidHardwareBufferANDROID, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1268;
+    *&cgen_var_1268 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1268, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkMemoryGetAndroidHardwareBufferInfoANDROID(stream, (VkMemoryGetAndroidHardwareBufferInfoANDROID*)(local_pInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (AHardwareBuffer**)pBuffer, sizeof(AHardwareBuffer*));
+    *streamPtrPtr += sizeof(AHardwareBuffer*);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((AHardwareBuffer**)pBuffer, sizeof(AHardwareBuffer*));
     VkResult vkGetMemoryAndroidHardwareBufferANDROID_VkResult_return = (VkResult)0;
     stream->read(&vkGetMemoryAndroidHardwareBufferANDROID_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetMemoryAndroidHardwareBufferANDROID");;
     return vkGetMemoryAndroidHardwareBufferANDROID_VkResult_return;
 }
@@ -21243,17 +25113,17 @@
 #ifdef VK_EXT_sample_locations
 void VkEncoder::vkCmdSetSampleLocationsEXT(
     VkCommandBuffer commandBuffer,
-    const VkSampleLocationsInfoEXT* pSampleLocationsInfo)
+    const VkSampleLocationsInfoEXT* pSampleLocationsInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdSetSampleLocationsEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkSampleLocationsInfoEXT* local_pSampleLocationsInfo;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_pSampleLocationsInfo = nullptr;
     if (pSampleLocationsInfo)
@@ -21261,74 +25131,97 @@
         local_pSampleLocationsInfo = (VkSampleLocationsInfoEXT*)pool->alloc(sizeof(const VkSampleLocationsInfoEXT));
         deepcopy_VkSampleLocationsInfoEXT(pool, pSampleLocationsInfo, (VkSampleLocationsInfoEXT*)(local_pSampleLocationsInfo));
     }
+    local_doLock = doLock;
     if (local_pSampleLocationsInfo)
     {
         transform_tohost_VkSampleLocationsInfoEXT(mImpl->resources(), (VkSampleLocationsInfoEXT*)(local_pSampleLocationsInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1421;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1421, 1);
-        countingStream->write((uint64_t*)&cgen_var_1421, 1 * 8);
-        marshal_VkSampleLocationsInfoEXT(countingStream, (VkSampleLocationsInfoEXT*)(local_pSampleLocationsInfo));
+        uint64_t cgen_var_1269;
+        *countPtr += 1 * 8;
+        count_VkSampleLocationsInfoEXT(featureBits, (VkSampleLocationsInfoEXT*)(local_pSampleLocationsInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdSetSampleLocationsEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdSetSampleLocationsEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetSampleLocationsEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdSetSampleLocationsEXT = OP_vkCmdSetSampleLocationsEXT;
-    stream->write(&opcode_vkCmdSetSampleLocationsEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdSetSampleLocationsEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1422;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1422, 1);
-    stream->write((uint64_t*)&cgen_var_1422, 1 * 8);
-    marshal_VkSampleLocationsInfoEXT(stream, (VkSampleLocationsInfoEXT*)(local_pSampleLocationsInfo));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdSetSampleLocationsEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdSetSampleLocationsEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1270;
+    *&cgen_var_1270 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1270, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkSampleLocationsInfoEXT(stream, (VkSampleLocationsInfoEXT*)(local_pSampleLocationsInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdSetSampleLocationsEXT");;
 }
 
 void VkEncoder::vkGetPhysicalDeviceMultisamplePropertiesEXT(
     VkPhysicalDevice physicalDevice,
     VkSampleCountFlagBits samples,
-    VkMultisamplePropertiesEXT* pMultisampleProperties)
+    VkMultisamplePropertiesEXT* pMultisampleProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetPhysicalDeviceMultisamplePropertiesEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
     VkSampleCountFlagBits local_samples;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
     local_samples = samples;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1423;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1423, 1);
-        countingStream->write((uint64_t*)&cgen_var_1423, 1 * 8);
-        countingStream->write((VkSampleCountFlagBits*)&local_samples, sizeof(VkSampleCountFlagBits));
-        marshal_VkMultisamplePropertiesEXT(countingStream, (VkMultisamplePropertiesEXT*)(pMultisampleProperties));
+        uint64_t cgen_var_1271;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkSampleCountFlagBits);
+        count_VkMultisamplePropertiesEXT(featureBits, (VkMultisamplePropertiesEXT*)(pMultisampleProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetPhysicalDeviceMultisamplePropertiesEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetPhysicalDeviceMultisamplePropertiesEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceMultisamplePropertiesEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetPhysicalDeviceMultisamplePropertiesEXT = OP_vkGetPhysicalDeviceMultisamplePropertiesEXT;
-    stream->write(&opcode_vkGetPhysicalDeviceMultisamplePropertiesEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetPhysicalDeviceMultisamplePropertiesEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1424;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1424, 1);
-    stream->write((uint64_t*)&cgen_var_1424, 1 * 8);
-    stream->write((VkSampleCountFlagBits*)&local_samples, sizeof(VkSampleCountFlagBits));
-    marshal_VkMultisamplePropertiesEXT(stream, (VkMultisamplePropertiesEXT*)(pMultisampleProperties));
+    memcpy(streamPtr, &opcode_vkGetPhysicalDeviceMultisamplePropertiesEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceMultisamplePropertiesEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1272;
+    *&cgen_var_1272 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1272, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkSampleCountFlagBits*)&local_samples, sizeof(VkSampleCountFlagBits));
+    *streamPtrPtr += sizeof(VkSampleCountFlagBits);
+    reservedmarshal_VkMultisamplePropertiesEXT(stream, (VkMultisamplePropertiesEXT*)(pMultisampleProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkMultisamplePropertiesEXT(stream, (VkMultisamplePropertiesEXT*)(pMultisampleProperties));
     if (pMultisampleProperties)
     {
         transform_fromhost_VkMultisamplePropertiesEXT(mImpl->resources(), (VkMultisamplePropertiesEXT*)(pMultisampleProperties));
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetPhysicalDeviceMultisamplePropertiesEXT");;
 }
 
@@ -21348,18 +25241,18 @@
     VkDevice device,
     const VkValidationCacheCreateInfoEXT* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
-    VkValidationCacheEXT* pValidationCache)
+    VkValidationCacheEXT* pValidationCache,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateValidationCacheEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkValidationCacheCreateInfoEXT* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -21373,6 +25266,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -21382,54 +25276,65 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1425;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1425, 1);
-        countingStream->write((uint64_t*)&cgen_var_1425, 1 * 8);
-        marshal_VkValidationCacheCreateInfoEXT(countingStream, (VkValidationCacheCreateInfoEXT*)(local_pCreateInfo));
+        uint64_t cgen_var_1273;
+        *countPtr += 1 * 8;
+        count_VkValidationCacheCreateInfoEXT(featureBits, (VkValidationCacheCreateInfoEXT*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_1426 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_1426);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_1427;
-        countingStream->handleMapping()->mapHandles_VkValidationCacheEXT_u64(pValidationCache, &cgen_var_1427, 1);
-        countingStream->write((uint64_t*)&cgen_var_1427, 8);
+        uint64_t cgen_var_1274;
+        *countPtr += 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateValidationCacheEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateValidationCacheEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateValidationCacheEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateValidationCacheEXT = OP_vkCreateValidationCacheEXT;
-    stream->write(&opcode_vkCreateValidationCacheEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateValidationCacheEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1428;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1428, 1);
-    stream->write((uint64_t*)&cgen_var_1428, 1 * 8);
-    marshal_VkValidationCacheCreateInfoEXT(stream, (VkValidationCacheCreateInfoEXT*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateValidationCacheEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateValidationCacheEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1275;
+    *&cgen_var_1275 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1275, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkValidationCacheCreateInfoEXT(stream, (VkValidationCacheCreateInfoEXT*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_1429 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_1429);
+    uint64_t cgen_var_1276 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_1276, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_1430;
-    stream->handleMapping()->mapHandles_VkValidationCacheEXT_u64(pValidationCache, &cgen_var_1430, 1);
-    stream->write((uint64_t*)&cgen_var_1430, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
+    /* is handle, possibly out */;
+    uint64_t cgen_var_1277;
+    *&cgen_var_1277 = (uint64_t)((*pValidationCache));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1277, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_1431;
-    stream->read((uint64_t*)&cgen_var_1431, 8);
-    stream->handleMapping()->mapHandles_u64_VkValidationCacheEXT(&cgen_var_1431, (VkValidationCacheEXT*)pValidationCache, 1);
+    uint64_t cgen_var_1278;
+    stream->read((uint64_t*)&cgen_var_1278, 8);
+    stream->handleMapping()->mapHandles_u64_VkValidationCacheEXT(&cgen_var_1278, (VkValidationCacheEXT*)pValidationCache, 1);
     stream->unsetHandleMapping();
     VkResult vkCreateValidationCacheEXT_VkResult_return = (VkResult)0;
     stream->read(&vkCreateValidationCacheEXT_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateValidationCacheEXT");;
     return vkCreateValidationCacheEXT_VkResult_return;
 }
@@ -21437,18 +25342,18 @@
 void VkEncoder::vkDestroyValidationCacheEXT(
     VkDevice device,
     VkValidationCacheEXT validationCache,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkDestroyValidationCacheEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkValidationCacheEXT local_validationCache;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_validationCache = validationCache;
     local_pAllocator = nullptr;
@@ -21457,49 +25362,61 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pAllocator)
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1432;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1432, 1);
-        countingStream->write((uint64_t*)&cgen_var_1432, 1 * 8);
-        uint64_t cgen_var_1433;
-        countingStream->handleMapping()->mapHandles_VkValidationCacheEXT_u64(&local_validationCache, &cgen_var_1433, 1);
-        countingStream->write((uint64_t*)&cgen_var_1433, 1 * 8);
+        uint64_t cgen_var_1279;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1280;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_1434 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_1434);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkDestroyValidationCacheEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkDestroyValidationCacheEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyValidationCacheEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkDestroyValidationCacheEXT = OP_vkDestroyValidationCacheEXT;
-    stream->write(&opcode_vkDestroyValidationCacheEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkDestroyValidationCacheEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1435;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1435, 1);
-    stream->write((uint64_t*)&cgen_var_1435, 1 * 8);
-    uint64_t cgen_var_1436;
-    stream->handleMapping()->mapHandles_VkValidationCacheEXT_u64(&local_validationCache, &cgen_var_1436, 1);
-    stream->write((uint64_t*)&cgen_var_1436, 1 * 8);
+    memcpy(streamPtr, &opcode_vkDestroyValidationCacheEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkDestroyValidationCacheEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1281;
+    *&cgen_var_1281 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1281, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1282;
+    *&cgen_var_1282 = get_host_u64_VkValidationCacheEXT((*&local_validationCache));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1282, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_1437 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_1437);
+    uint64_t cgen_var_1283 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_1283, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     resources->destroyMapping()->mapHandles_VkValidationCacheEXT((VkValidationCacheEXT*)&validationCache);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkDestroyValidationCacheEXT");;
 }
 
@@ -21507,19 +25424,19 @@
     VkDevice device,
     VkValidationCacheEXT dstCache,
     uint32_t srcCacheCount,
-    const VkValidationCacheEXT* pSrcCaches)
+    const VkValidationCacheEXT* pSrcCaches,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkMergeValidationCachesEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkValidationCacheEXT local_dstCache;
     uint32_t local_srcCacheCount;
     VkValidationCacheEXT* local_pSrcCaches;
+    uint32_t local_doLock;
     local_device = device;
     local_dstCache = dstCache;
     local_srcCacheCount = srcCacheCount;
@@ -21528,47 +25445,60 @@
     {
         local_pSrcCaches = (VkValidationCacheEXT*)pool->dupArray(pSrcCaches, ((srcCacheCount)) * sizeof(const VkValidationCacheEXT));
     }
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1438;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1438, 1);
-        countingStream->write((uint64_t*)&cgen_var_1438, 1 * 8);
-        uint64_t cgen_var_1439;
-        countingStream->handleMapping()->mapHandles_VkValidationCacheEXT_u64(&local_dstCache, &cgen_var_1439, 1);
-        countingStream->write((uint64_t*)&cgen_var_1439, 1 * 8);
-        countingStream->write((uint32_t*)&local_srcCacheCount, sizeof(uint32_t));
+        uint64_t cgen_var_1284;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1285;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         if (((srcCacheCount)))
         {
-            uint64_t* cgen_var_1440;
-            countingStream->alloc((void**)&cgen_var_1440, ((srcCacheCount)) * 8);
-            countingStream->handleMapping()->mapHandles_VkValidationCacheEXT_u64(local_pSrcCaches, cgen_var_1440, ((srcCacheCount)));
-            countingStream->write((uint64_t*)cgen_var_1440, ((srcCacheCount)) * 8);
+            *countPtr += ((srcCacheCount)) * 8;
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkMergeValidationCachesEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkMergeValidationCachesEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkMergeValidationCachesEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkMergeValidationCachesEXT = OP_vkMergeValidationCachesEXT;
-    stream->write(&opcode_vkMergeValidationCachesEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkMergeValidationCachesEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1441;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1441, 1);
-    stream->write((uint64_t*)&cgen_var_1441, 1 * 8);
-    uint64_t cgen_var_1442;
-    stream->handleMapping()->mapHandles_VkValidationCacheEXT_u64(&local_dstCache, &cgen_var_1442, 1);
-    stream->write((uint64_t*)&cgen_var_1442, 1 * 8);
-    stream->write((uint32_t*)&local_srcCacheCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkMergeValidationCachesEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkMergeValidationCachesEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1287;
+    *&cgen_var_1287 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1287, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1288;
+    *&cgen_var_1288 = get_host_u64_VkValidationCacheEXT((*&local_dstCache));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1288, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_srcCacheCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     if (((srcCacheCount)))
     {
-        uint64_t* cgen_var_1443;
-        stream->alloc((void**)&cgen_var_1443, ((srcCacheCount)) * 8);
-        stream->handleMapping()->mapHandles_VkValidationCacheEXT_u64(local_pSrcCaches, cgen_var_1443, ((srcCacheCount)));
-        stream->write((uint64_t*)cgen_var_1443, ((srcCacheCount)) * 8);
+        uint64_t* cgen_var_1289;
+        stream->alloc((void**)&cgen_var_1289, ((srcCacheCount)) * 8);
+        for (uint32_t k = 0; k < ((srcCacheCount)); ++k)
+        {
+            cgen_var_1289[k] = get_host_u64_VkValidationCacheEXT(local_pSrcCaches[k]);
+        }
+        memcpy(*streamPtrPtr, (uint64_t*)cgen_var_1289, ((srcCacheCount)) * 8);
+        *streamPtrPtr += ((srcCacheCount)) * 8;
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkMergeValidationCachesEXT_VkResult_return = (VkResult)0;
     stream->read(&vkMergeValidationCachesEXT_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkMergeValidationCachesEXT");;
     return vkMergeValidationCachesEXT_VkResult_return;
 }
@@ -21577,69 +25507,80 @@
     VkDevice device,
     VkValidationCacheEXT validationCache,
     size_t* pDataSize,
-    void* pData)
+    void* pData,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetValidationCacheDataEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkValidationCacheEXT local_validationCache;
+    uint32_t local_doLock;
     local_device = device;
     local_validationCache = validationCache;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1444;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1444, 1);
-        countingStream->write((uint64_t*)&cgen_var_1444, 1 * 8);
-        uint64_t cgen_var_1445;
-        countingStream->handleMapping()->mapHandles_VkValidationCacheEXT_u64(&local_validationCache, &cgen_var_1445, 1);
-        countingStream->write((uint64_t*)&cgen_var_1445, 1 * 8);
+        uint64_t cgen_var_1290;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1291;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_1446 = (uint64_t)(uintptr_t)pDataSize;
-        countingStream->putBe64(cgen_var_1446);
+        *countPtr += 8;
         if (pDataSize)
         {
-            uint64_t cgen_var_1447 = (uint64_t)(*pDataSize);
-            countingStream->putBe64(cgen_var_1447);
+            *countPtr += 8;
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_1448 = (uint64_t)(uintptr_t)pData;
-        countingStream->putBe64(cgen_var_1448);
+        *countPtr += 8;
         if (pData)
         {
-            countingStream->write((void*)pData, (*(pDataSize)) * sizeof(uint8_t));
+            *countPtr += (*(pDataSize)) * sizeof(uint8_t);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetValidationCacheDataEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetValidationCacheDataEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetValidationCacheDataEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetValidationCacheDataEXT = OP_vkGetValidationCacheDataEXT;
-    stream->write(&opcode_vkGetValidationCacheDataEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetValidationCacheDataEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1449;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1449, 1);
-    stream->write((uint64_t*)&cgen_var_1449, 1 * 8);
-    uint64_t cgen_var_1450;
-    stream->handleMapping()->mapHandles_VkValidationCacheEXT_u64(&local_validationCache, &cgen_var_1450, 1);
-    stream->write((uint64_t*)&cgen_var_1450, 1 * 8);
+    memcpy(streamPtr, &opcode_vkGetValidationCacheDataEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetValidationCacheDataEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1292;
+    *&cgen_var_1292 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1292, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1293;
+    *&cgen_var_1293 = get_host_u64_VkValidationCacheEXT((*&local_validationCache));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1293, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_1451 = (uint64_t)(uintptr_t)pDataSize;
-    stream->putBe64(cgen_var_1451);
+    uint64_t cgen_var_1294 = (uint64_t)(uintptr_t)pDataSize;
+    memcpy((*streamPtrPtr), &cgen_var_1294, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pDataSize)
     {
-        uint64_t cgen_var_1452 = (uint64_t)(*pDataSize);
-        stream->putBe64(cgen_var_1452);
+        uint64_t cgen_var_1295 = (uint64_t)(*pDataSize);
+        memcpy((*streamPtrPtr), &cgen_var_1295, 8);
+        android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+        *streamPtrPtr += 8;
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_1453 = (uint64_t)(uintptr_t)pData;
-    stream->putBe64(cgen_var_1453);
+    uint64_t cgen_var_1296 = (uint64_t)(uintptr_t)pData;
+    memcpy((*streamPtrPtr), &cgen_var_1296, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pData)
     {
-        stream->write((void*)pData, (*(pDataSize)) * sizeof(uint8_t));
+        memcpy(*streamPtrPtr, (void*)pData, (*(pDataSize)) * sizeof(uint8_t));
+        *streamPtrPtr += (*(pDataSize)) * sizeof(uint8_t);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     size_t* check_pDataSize;
     check_pDataSize = (size_t*)(uintptr_t)stream->getBe64();
@@ -21664,9 +25605,13 @@
     }
     VkResult vkGetValidationCacheDataEXT_VkResult_return = (VkResult)0;
     stream->read(&vkGetValidationCacheDataEXT_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetValidationCacheDataEXT");;
     return vkGetValidationCacheDataEXT_VkResult_return;
 }
@@ -21683,18 +25628,18 @@
     VkDevice device,
     VkExternalMemoryHandleTypeFlagBits handleType,
     const void* pHostPointer,
-    VkMemoryHostPointerPropertiesEXT* pMemoryHostPointerProperties)
+    VkMemoryHostPointerPropertiesEXT* pMemoryHostPointerProperties,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetMemoryHostPointerPropertiesEXT");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkExternalMemoryHandleTypeFlagBits local_handleType;
     void* local_pHostPointer;
+    uint32_t local_doLock;
     local_device = device;
     local_handleType = handleType;
     local_pHostPointer = nullptr;
@@ -21702,38 +25647,48 @@
     {
         local_pHostPointer = (void*)pool->dupArray(pHostPointer, sizeof(const uint8_t));
     }
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1457;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1457, 1);
-        countingStream->write((uint64_t*)&cgen_var_1457, 1 * 8);
-        countingStream->write((VkExternalMemoryHandleTypeFlagBits*)&local_handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+        uint64_t cgen_var_1300;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkExternalMemoryHandleTypeFlagBits);
         // WARNING PTR CHECK
-        uint64_t cgen_var_1458 = (uint64_t)(uintptr_t)local_pHostPointer;
-        countingStream->putBe64(cgen_var_1458);
+        *countPtr += 8;
         if (local_pHostPointer)
         {
-            countingStream->write((void*)local_pHostPointer, sizeof(uint8_t));
+            *countPtr += sizeof(uint8_t);
         }
-        marshal_VkMemoryHostPointerPropertiesEXT(countingStream, (VkMemoryHostPointerPropertiesEXT*)(pMemoryHostPointerProperties));
+        count_VkMemoryHostPointerPropertiesEXT(featureBits, (VkMemoryHostPointerPropertiesEXT*)(pMemoryHostPointerProperties), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetMemoryHostPointerPropertiesEXT = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetMemoryHostPointerPropertiesEXT = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetMemoryHostPointerPropertiesEXT);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetMemoryHostPointerPropertiesEXT = OP_vkGetMemoryHostPointerPropertiesEXT;
-    stream->write(&opcode_vkGetMemoryHostPointerPropertiesEXT, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetMemoryHostPointerPropertiesEXT, sizeof(uint32_t));
-    uint64_t cgen_var_1459;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1459, 1);
-    stream->write((uint64_t*)&cgen_var_1459, 1 * 8);
-    stream->write((VkExternalMemoryHandleTypeFlagBits*)&local_handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    memcpy(streamPtr, &opcode_vkGetMemoryHostPointerPropertiesEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetMemoryHostPointerPropertiesEXT, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1301;
+    *&cgen_var_1301 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1301, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkExternalMemoryHandleTypeFlagBits*)&local_handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    *streamPtrPtr += sizeof(VkExternalMemoryHandleTypeFlagBits);
     // WARNING PTR CHECK
-    uint64_t cgen_var_1460 = (uint64_t)(uintptr_t)local_pHostPointer;
-    stream->putBe64(cgen_var_1460);
+    uint64_t cgen_var_1302 = (uint64_t)(uintptr_t)local_pHostPointer;
+    memcpy((*streamPtrPtr), &cgen_var_1302, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pHostPointer)
     {
-        stream->write((void*)local_pHostPointer, sizeof(uint8_t));
+        memcpy(*streamPtrPtr, (void*)local_pHostPointer, sizeof(uint8_t));
+        *streamPtrPtr += sizeof(uint8_t);
     }
-    marshal_VkMemoryHostPointerPropertiesEXT(stream, (VkMemoryHostPointerPropertiesEXT*)(pMemoryHostPointerProperties));
+    reservedmarshal_VkMemoryHostPointerPropertiesEXT(stream, (VkMemoryHostPointerPropertiesEXT*)(pMemoryHostPointerProperties), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     unmarshal_VkMemoryHostPointerPropertiesEXT(stream, (VkMemoryHostPointerPropertiesEXT*)(pMemoryHostPointerProperties));
     if (pMemoryHostPointerProperties)
     {
@@ -21741,9 +25696,13 @@
     }
     VkResult vkGetMemoryHostPointerPropertiesEXT_VkResult_return = (VkResult)0;
     stream->read(&vkGetMemoryHostPointerPropertiesEXT_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetMemoryHostPointerPropertiesEXT");;
     return vkGetMemoryHostPointerPropertiesEXT_VkResult_return;
 }
@@ -21755,54 +25714,68 @@
     VkPipelineStageFlagBits pipelineStage,
     VkBuffer dstBuffer,
     VkDeviceSize dstOffset,
-    uint32_t marker)
+    uint32_t marker,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdWriteBufferMarkerAMD");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkPipelineStageFlagBits local_pipelineStage;
     VkBuffer local_dstBuffer;
     VkDeviceSize local_dstOffset;
     uint32_t local_marker;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_pipelineStage = pipelineStage;
     local_dstBuffer = dstBuffer;
     local_dstOffset = dstOffset;
     local_marker = marker;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1461;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1461, 1);
-        countingStream->write((uint64_t*)&cgen_var_1461, 1 * 8);
-        countingStream->write((VkPipelineStageFlagBits*)&local_pipelineStage, sizeof(VkPipelineStageFlagBits));
-        uint64_t cgen_var_1462;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_dstBuffer, &cgen_var_1462, 1);
-        countingStream->write((uint64_t*)&cgen_var_1462, 1 * 8);
-        countingStream->write((VkDeviceSize*)&local_dstOffset, sizeof(VkDeviceSize));
-        countingStream->write((uint32_t*)&local_marker, sizeof(uint32_t));
+        uint64_t cgen_var_1303;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkPipelineStageFlagBits);
+        uint64_t cgen_var_1304;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkDeviceSize);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdWriteBufferMarkerAMD = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdWriteBufferMarkerAMD = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdWriteBufferMarkerAMD);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdWriteBufferMarkerAMD = OP_vkCmdWriteBufferMarkerAMD;
-    stream->write(&opcode_vkCmdWriteBufferMarkerAMD, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdWriteBufferMarkerAMD, sizeof(uint32_t));
-    uint64_t cgen_var_1463;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1463, 1);
-    stream->write((uint64_t*)&cgen_var_1463, 1 * 8);
-    stream->write((VkPipelineStageFlagBits*)&local_pipelineStage, sizeof(VkPipelineStageFlagBits));
-    uint64_t cgen_var_1464;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_dstBuffer, &cgen_var_1464, 1);
-    stream->write((uint64_t*)&cgen_var_1464, 1 * 8);
-    stream->write((VkDeviceSize*)&local_dstOffset, sizeof(VkDeviceSize));
-    stream->write((uint32_t*)&local_marker, sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCmdWriteBufferMarkerAMD, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdWriteBufferMarkerAMD, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1305;
+    *&cgen_var_1305 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1305, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkPipelineStageFlagBits*)&local_pipelineStage, sizeof(VkPipelineStageFlagBits));
+    *streamPtrPtr += sizeof(VkPipelineStageFlagBits);
+    uint64_t cgen_var_1306;
+    *&cgen_var_1306 = get_host_u64_VkBuffer((*&local_dstBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1306, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkDeviceSize*)&local_dstOffset, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_marker, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdWriteBufferMarkerAMD");;
 }
 
@@ -21816,119 +25789,142 @@
 #ifdef VK_NV_device_diagnostic_checkpoints
 void VkEncoder::vkCmdSetCheckpointNV(
     VkCommandBuffer commandBuffer,
-    const void* pCheckpointMarker)
+    const void* pCheckpointMarker,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCmdSetCheckpointNV");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     void* local_pCheckpointMarker;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_pCheckpointMarker = nullptr;
     if (pCheckpointMarker)
     {
         local_pCheckpointMarker = (void*)pool->dupArray(pCheckpointMarker, sizeof(const uint8_t));
     }
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1465;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1465, 1);
-        countingStream->write((uint64_t*)&cgen_var_1465, 1 * 8);
+        uint64_t cgen_var_1307;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_1466 = (uint64_t)(uintptr_t)local_pCheckpointMarker;
-        countingStream->putBe64(cgen_var_1466);
+        *countPtr += 8;
         if (local_pCheckpointMarker)
         {
-            countingStream->write((void*)local_pCheckpointMarker, sizeof(uint8_t));
+            *countPtr += sizeof(uint8_t);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCmdSetCheckpointNV = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCmdSetCheckpointNV = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetCheckpointNV);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCmdSetCheckpointNV = OP_vkCmdSetCheckpointNV;
-    stream->write(&opcode_vkCmdSetCheckpointNV, sizeof(uint32_t));
-    stream->write(&packetSize_vkCmdSetCheckpointNV, sizeof(uint32_t));
-    uint64_t cgen_var_1467;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1467, 1);
-    stream->write((uint64_t*)&cgen_var_1467, 1 * 8);
+    memcpy(streamPtr, &opcode_vkCmdSetCheckpointNV, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCmdSetCheckpointNV, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1308;
+    *&cgen_var_1308 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1308, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_1468 = (uint64_t)(uintptr_t)local_pCheckpointMarker;
-    stream->putBe64(cgen_var_1468);
+    uint64_t cgen_var_1309 = (uint64_t)(uintptr_t)local_pCheckpointMarker;
+    memcpy((*streamPtrPtr), &cgen_var_1309, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pCheckpointMarker)
     {
-        stream->write((void*)local_pCheckpointMarker, sizeof(uint8_t));
+        memcpy(*streamPtrPtr, (void*)local_pCheckpointMarker, sizeof(uint8_t));
+        *streamPtrPtr += sizeof(uint8_t);
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCmdSetCheckpointNV");;
 }
 
 void VkEncoder::vkGetQueueCheckpointDataNV(
     VkQueue queue,
     uint32_t* pCheckpointDataCount,
-    VkCheckpointDataNV* pCheckpointData)
+    VkCheckpointDataNV* pCheckpointData,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetQueueCheckpointDataNV");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkQueue local_queue;
+    uint32_t local_doLock;
     local_queue = queue;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1469;
-        countingStream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1469, 1);
-        countingStream->write((uint64_t*)&cgen_var_1469, 1 * 8);
+        uint64_t cgen_var_1310;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_1470 = (uint64_t)(uintptr_t)pCheckpointDataCount;
-        countingStream->putBe64(cgen_var_1470);
+        *countPtr += 8;
         if (pCheckpointDataCount)
         {
-            countingStream->write((uint32_t*)pCheckpointDataCount, sizeof(uint32_t));
+            *countPtr += sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_1471 = (uint64_t)(uintptr_t)pCheckpointData;
-        countingStream->putBe64(cgen_var_1471);
+        *countPtr += 8;
         if (pCheckpointData)
         {
             for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i)
             {
-                marshal_VkCheckpointDataNV(countingStream, (VkCheckpointDataNV*)(pCheckpointData + i));
+                count_VkCheckpointDataNV(featureBits, (VkCheckpointDataNV*)(pCheckpointData + i), countPtr);
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetQueueCheckpointDataNV = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetQueueCheckpointDataNV = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetQueueCheckpointDataNV);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetQueueCheckpointDataNV = OP_vkGetQueueCheckpointDataNV;
-    stream->write(&opcode_vkGetQueueCheckpointDataNV, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetQueueCheckpointDataNV, sizeof(uint32_t));
-    uint64_t cgen_var_1472;
-    stream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1472, 1);
-    stream->write((uint64_t*)&cgen_var_1472, 1 * 8);
+    memcpy(streamPtr, &opcode_vkGetQueueCheckpointDataNV, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetQueueCheckpointDataNV, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1311;
+    *&cgen_var_1311 = get_host_u64_VkQueue((*&local_queue));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1311, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_1473 = (uint64_t)(uintptr_t)pCheckpointDataCount;
-    stream->putBe64(cgen_var_1473);
+    uint64_t cgen_var_1312 = (uint64_t)(uintptr_t)pCheckpointDataCount;
+    memcpy((*streamPtrPtr), &cgen_var_1312, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pCheckpointDataCount)
     {
-        stream->write((uint32_t*)pCheckpointDataCount, sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)pCheckpointDataCount, sizeof(uint32_t));
+        *streamPtrPtr += sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_1474 = (uint64_t)(uintptr_t)pCheckpointData;
-    stream->putBe64(cgen_var_1474);
+    uint64_t cgen_var_1313 = (uint64_t)(uintptr_t)pCheckpointData;
+    memcpy((*streamPtrPtr), &cgen_var_1313, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pCheckpointData)
     {
         for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i)
         {
-            marshal_VkCheckpointDataNV(stream, (VkCheckpointDataNV*)(pCheckpointData + i));
+            reservedmarshal_VkCheckpointDataNV(stream, (VkCheckpointDataNV*)(pCheckpointData + i), streamPtrPtr);
         }
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint32_t* check_pCheckpointDataCount;
     check_pCheckpointDataCount = (uint32_t*)(uintptr_t)stream->getBe64();
@@ -21961,9 +25957,13 @@
             transform_fromhost_VkCheckpointDataNV(mImpl->resources(), (VkCheckpointDataNV*)(pCheckpointData + i));
         }
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetQueueCheckpointDataNV");;
 }
 
@@ -21972,55 +25972,64 @@
 VkResult VkEncoder::vkMapMemoryIntoAddressSpaceGOOGLE(
     VkDevice device,
     VkDeviceMemory memory,
-    uint64_t* pAddress)
+    uint64_t* pAddress,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkMapMemoryIntoAddressSpaceGOOGLE");
     mImpl->resources()->on_vkMapMemoryIntoAddressSpaceGOOGLE_pre(this, VK_SUCCESS, device, memory, pAddress);
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDeviceMemory local_memory;
+    uint32_t local_doLock;
     local_device = device;
     local_memory = memory;
+    local_doLock = doLock;
     mImpl->resources()->deviceMemoryTransform_tohost((VkDeviceMemory*)&local_memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1477;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1477, 1);
-        countingStream->write((uint64_t*)&cgen_var_1477, 1 * 8);
-        uint64_t cgen_var_1478;
-        countingStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&local_memory, &cgen_var_1478, 1);
-        countingStream->write((uint64_t*)&cgen_var_1478, 1 * 8);
+        uint64_t cgen_var_1316;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1317;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_1479 = (uint64_t)(uintptr_t)pAddress;
-        countingStream->putBe64(cgen_var_1479);
+        *countPtr += 8;
         if (pAddress)
         {
-            countingStream->write((uint64_t*)pAddress, sizeof(uint64_t));
+            *countPtr += sizeof(uint64_t);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkMapMemoryIntoAddressSpaceGOOGLE = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkMapMemoryIntoAddressSpaceGOOGLE = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkMapMemoryIntoAddressSpaceGOOGLE);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkMapMemoryIntoAddressSpaceGOOGLE = OP_vkMapMemoryIntoAddressSpaceGOOGLE;
-    stream->write(&opcode_vkMapMemoryIntoAddressSpaceGOOGLE, sizeof(uint32_t));
-    stream->write(&packetSize_vkMapMemoryIntoAddressSpaceGOOGLE, sizeof(uint32_t));
-    uint64_t cgen_var_1480;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1480, 1);
-    stream->write((uint64_t*)&cgen_var_1480, 1 * 8);
-    uint64_t cgen_var_1481;
-    stream->handleMapping()->mapHandles_VkDeviceMemory_u64(&local_memory, &cgen_var_1481, 1);
-    stream->write((uint64_t*)&cgen_var_1481, 1 * 8);
+    memcpy(streamPtr, &opcode_vkMapMemoryIntoAddressSpaceGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkMapMemoryIntoAddressSpaceGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1318;
+    *&cgen_var_1318 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1318, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1319;
+    *&cgen_var_1319 = get_host_u64_VkDeviceMemory((*&local_memory));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1319, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_1482 = (uint64_t)(uintptr_t)pAddress;
-    stream->putBe64(cgen_var_1482);
+    uint64_t cgen_var_1320 = (uint64_t)(uintptr_t)pAddress;
+    memcpy((*streamPtrPtr), &cgen_var_1320, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pAddress)
     {
-        stream->write((uint64_t*)pAddress, sizeof(uint64_t));
+        memcpy(*streamPtrPtr, (uint64_t*)pAddress, sizeof(uint64_t));
+        *streamPtrPtr += sizeof(uint64_t);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint64_t* check_pAddress;
     check_pAddress = (uint64_t*)(uintptr_t)stream->getBe64();
@@ -22035,9 +26044,13 @@
     VkResult vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return = (VkResult)0;
     stream->read(&vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return, sizeof(VkResult));
     mImpl->resources()->on_vkMapMemoryIntoAddressSpaceGOOGLE(this, vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return, device, memory, pAddress);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkMapMemoryIntoAddressSpaceGOOGLE");;
     return vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return;
 }
@@ -22047,48 +26060,60 @@
 VkResult VkEncoder::vkRegisterImageColorBufferGOOGLE(
     VkDevice device,
     VkImage image,
-    uint32_t colorBuffer)
+    uint32_t colorBuffer,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkRegisterImageColorBufferGOOGLE");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkImage local_image;
     uint32_t local_colorBuffer;
+    uint32_t local_doLock;
     local_device = device;
     local_image = image;
     local_colorBuffer = colorBuffer;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1484;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1484, 1);
-        countingStream->write((uint64_t*)&cgen_var_1484, 1 * 8);
-        uint64_t cgen_var_1485;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_1485, 1);
-        countingStream->write((uint64_t*)&cgen_var_1485, 1 * 8);
-        countingStream->write((uint32_t*)&local_colorBuffer, sizeof(uint32_t));
+        uint64_t cgen_var_1322;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1323;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkRegisterImageColorBufferGOOGLE = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkRegisterImageColorBufferGOOGLE = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkRegisterImageColorBufferGOOGLE);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkRegisterImageColorBufferGOOGLE = OP_vkRegisterImageColorBufferGOOGLE;
-    stream->write(&opcode_vkRegisterImageColorBufferGOOGLE, sizeof(uint32_t));
-    stream->write(&packetSize_vkRegisterImageColorBufferGOOGLE, sizeof(uint32_t));
-    uint64_t cgen_var_1486;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1486, 1);
-    stream->write((uint64_t*)&cgen_var_1486, 1 * 8);
-    uint64_t cgen_var_1487;
-    stream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_1487, 1);
-    stream->write((uint64_t*)&cgen_var_1487, 1 * 8);
-    stream->write((uint32_t*)&local_colorBuffer, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkRegisterImageColorBufferGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkRegisterImageColorBufferGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1324;
+    *&cgen_var_1324 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1324, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1325;
+    *&cgen_var_1325 = get_host_u64_VkImage((*&local_image));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1325, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_colorBuffer, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkRegisterImageColorBufferGOOGLE_VkResult_return = (VkResult)0;
     stream->read(&vkRegisterImageColorBufferGOOGLE_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkRegisterImageColorBufferGOOGLE");;
     return vkRegisterImageColorBufferGOOGLE_VkResult_return;
 }
@@ -22096,48 +26121,60 @@
 VkResult VkEncoder::vkRegisterBufferColorBufferGOOGLE(
     VkDevice device,
     VkBuffer buffer,
-    uint32_t colorBuffer)
+    uint32_t colorBuffer,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkRegisterBufferColorBufferGOOGLE");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkBuffer local_buffer;
     uint32_t local_colorBuffer;
+    uint32_t local_doLock;
     local_device = device;
     local_buffer = buffer;
     local_colorBuffer = colorBuffer;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1488;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1488, 1);
-        countingStream->write((uint64_t*)&cgen_var_1488, 1 * 8);
-        uint64_t cgen_var_1489;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_1489, 1);
-        countingStream->write((uint64_t*)&cgen_var_1489, 1 * 8);
-        countingStream->write((uint32_t*)&local_colorBuffer, sizeof(uint32_t));
+        uint64_t cgen_var_1326;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1327;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkRegisterBufferColorBufferGOOGLE = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkRegisterBufferColorBufferGOOGLE = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkRegisterBufferColorBufferGOOGLE);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkRegisterBufferColorBufferGOOGLE = OP_vkRegisterBufferColorBufferGOOGLE;
-    stream->write(&opcode_vkRegisterBufferColorBufferGOOGLE, sizeof(uint32_t));
-    stream->write(&packetSize_vkRegisterBufferColorBufferGOOGLE, sizeof(uint32_t));
-    uint64_t cgen_var_1490;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1490, 1);
-    stream->write((uint64_t*)&cgen_var_1490, 1 * 8);
-    uint64_t cgen_var_1491;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_1491, 1);
-    stream->write((uint64_t*)&cgen_var_1491, 1 * 8);
-    stream->write((uint32_t*)&local_colorBuffer, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkRegisterBufferColorBufferGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkRegisterBufferColorBufferGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1328;
+    *&cgen_var_1328 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1328, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1329;
+    *&cgen_var_1329 = get_host_u64_VkBuffer((*&local_buffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1329, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_colorBuffer, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkRegisterBufferColorBufferGOOGLE_VkResult_return = (VkResult)0;
     stream->read(&vkRegisterBufferColorBufferGOOGLE_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkRegisterBufferColorBufferGOOGLE");;
     return vkRegisterBufferColorBufferGOOGLE_VkResult_return;
 }
@@ -22156,15 +26193,14 @@
     const uint32_t* pBufferViewEntryIndices,
     const VkDescriptorImageInfo* pImageInfos,
     const VkDescriptorBufferInfo* pBufferInfos,
-    const VkBufferView* pBufferViews)
+    const VkBufferView* pBufferViews,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkUpdateDescriptorSetWithTemplateSizedGOOGLE");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDescriptorSet local_descriptorSet;
     VkDescriptorUpdateTemplate local_descriptorUpdateTemplate;
@@ -22177,6 +26213,7 @@
     VkDescriptorImageInfo* local_pImageInfos;
     VkDescriptorBufferInfo* local_pBufferInfos;
     VkBufferView* local_pBufferViews;
+    uint32_t local_doLock;
     local_device = device;
     local_descriptorSet = descriptorSet;
     local_descriptorUpdateTemplate = descriptorUpdateTemplate;
@@ -22221,6 +26258,7 @@
     {
         local_pBufferViews = (VkBufferView*)pool->dupArray(pBufferViews, ((bufferViewCount)) * sizeof(const VkBufferView));
     }
+    local_doLock = doLock;
     if (local_pImageInfos)
     {
         for (uint32_t i = 0; i < (uint32_t)((imageInfoCount)); ++i)
@@ -22235,149 +26273,172 @@
             transform_tohost_VkDescriptorBufferInfo(mImpl->resources(), (VkDescriptorBufferInfo*)(local_pBufferInfos + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1492;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1492, 1);
-        countingStream->write((uint64_t*)&cgen_var_1492, 1 * 8);
-        uint64_t cgen_var_1493;
-        countingStream->handleMapping()->mapHandles_VkDescriptorSet_u64(&local_descriptorSet, &cgen_var_1493, 1);
-        countingStream->write((uint64_t*)&cgen_var_1493, 1 * 8);
-        uint64_t cgen_var_1494;
-        countingStream->handleMapping()->mapHandles_VkDescriptorUpdateTemplate_u64(&local_descriptorUpdateTemplate, &cgen_var_1494, 1);
-        countingStream->write((uint64_t*)&cgen_var_1494, 1 * 8);
-        countingStream->write((uint32_t*)&local_imageInfoCount, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_bufferInfoCount, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_bufferViewCount, sizeof(uint32_t));
+        uint64_t cgen_var_1330;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1331;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1332;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
         // WARNING PTR CHECK
-        uint64_t cgen_var_1495 = (uint64_t)(uintptr_t)local_pImageInfoEntryIndices;
-        countingStream->putBe64(cgen_var_1495);
+        *countPtr += 8;
         if (local_pImageInfoEntryIndices)
         {
-            countingStream->write((uint32_t*)local_pImageInfoEntryIndices, ((imageInfoCount)) * sizeof(uint32_t));
+            *countPtr += ((imageInfoCount)) * sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_1496 = (uint64_t)(uintptr_t)local_pBufferInfoEntryIndices;
-        countingStream->putBe64(cgen_var_1496);
+        *countPtr += 8;
         if (local_pBufferInfoEntryIndices)
         {
-            countingStream->write((uint32_t*)local_pBufferInfoEntryIndices, ((bufferInfoCount)) * sizeof(uint32_t));
+            *countPtr += ((bufferInfoCount)) * sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_1497 = (uint64_t)(uintptr_t)local_pBufferViewEntryIndices;
-        countingStream->putBe64(cgen_var_1497);
+        *countPtr += 8;
         if (local_pBufferViewEntryIndices)
         {
-            countingStream->write((uint32_t*)local_pBufferViewEntryIndices, ((bufferViewCount)) * sizeof(uint32_t));
+            *countPtr += ((bufferViewCount)) * sizeof(uint32_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_1498 = (uint64_t)(uintptr_t)local_pImageInfos;
-        countingStream->putBe64(cgen_var_1498);
+        *countPtr += 8;
         if (local_pImageInfos)
         {
             for (uint32_t i = 0; i < (uint32_t)((imageInfoCount)); ++i)
             {
-                marshal_VkDescriptorImageInfo(countingStream, (VkDescriptorImageInfo*)(local_pImageInfos + i));
+                count_VkDescriptorImageInfo(featureBits, (VkDescriptorImageInfo*)(local_pImageInfos + i), countPtr);
             }
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_1499 = (uint64_t)(uintptr_t)local_pBufferInfos;
-        countingStream->putBe64(cgen_var_1499);
+        *countPtr += 8;
         if (local_pBufferInfos)
         {
             for (uint32_t i = 0; i < (uint32_t)((bufferInfoCount)); ++i)
             {
-                marshal_VkDescriptorBufferInfo(countingStream, (VkDescriptorBufferInfo*)(local_pBufferInfos + i));
+                count_VkDescriptorBufferInfo(featureBits, (VkDescriptorBufferInfo*)(local_pBufferInfos + i), countPtr);
             }
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_1500 = (uint64_t)(uintptr_t)local_pBufferViews;
-        countingStream->putBe64(cgen_var_1500);
+        *countPtr += 8;
         if (local_pBufferViews)
         {
             if (((bufferViewCount)))
             {
-                uint64_t* cgen_var_1501;
-                countingStream->alloc((void**)&cgen_var_1501, ((bufferViewCount)) * 8);
-                countingStream->handleMapping()->mapHandles_VkBufferView_u64(local_pBufferViews, cgen_var_1501, ((bufferViewCount)));
-                countingStream->write((uint64_t*)cgen_var_1501, ((bufferViewCount)) * 8);
+                *countPtr += ((bufferViewCount)) * 8;
             }
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkUpdateDescriptorSetWithTemplateSizedGOOGLE = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkUpdateDescriptorSetWithTemplateSizedGOOGLE = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkUpdateDescriptorSetWithTemplateSizedGOOGLE);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkUpdateDescriptorSetWithTemplateSizedGOOGLE = OP_vkUpdateDescriptorSetWithTemplateSizedGOOGLE;
-    stream->write(&opcode_vkUpdateDescriptorSetWithTemplateSizedGOOGLE, sizeof(uint32_t));
-    stream->write(&packetSize_vkUpdateDescriptorSetWithTemplateSizedGOOGLE, sizeof(uint32_t));
-    uint64_t cgen_var_1502;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1502, 1);
-    stream->write((uint64_t*)&cgen_var_1502, 1 * 8);
-    uint64_t cgen_var_1503;
-    stream->handleMapping()->mapHandles_VkDescriptorSet_u64(&local_descriptorSet, &cgen_var_1503, 1);
-    stream->write((uint64_t*)&cgen_var_1503, 1 * 8);
-    uint64_t cgen_var_1504;
-    stream->handleMapping()->mapHandles_VkDescriptorUpdateTemplate_u64(&local_descriptorUpdateTemplate, &cgen_var_1504, 1);
-    stream->write((uint64_t*)&cgen_var_1504, 1 * 8);
-    stream->write((uint32_t*)&local_imageInfoCount, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_bufferInfoCount, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_bufferViewCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkUpdateDescriptorSetWithTemplateSizedGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkUpdateDescriptorSetWithTemplateSizedGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1334;
+    *&cgen_var_1334 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1334, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1335;
+    *&cgen_var_1335 = get_host_u64_VkDescriptorSet((*&local_descriptorSet));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1335, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1336;
+    *&cgen_var_1336 = get_host_u64_VkDescriptorUpdateTemplate((*&local_descriptorUpdateTemplate));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1336, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_imageInfoCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_bufferInfoCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_bufferViewCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
-    uint64_t cgen_var_1505 = (uint64_t)(uintptr_t)local_pImageInfoEntryIndices;
-    stream->putBe64(cgen_var_1505);
+    uint64_t cgen_var_1337 = (uint64_t)(uintptr_t)local_pImageInfoEntryIndices;
+    memcpy((*streamPtrPtr), &cgen_var_1337, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pImageInfoEntryIndices)
     {
-        stream->write((uint32_t*)local_pImageInfoEntryIndices, ((imageInfoCount)) * sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)local_pImageInfoEntryIndices, ((imageInfoCount)) * sizeof(uint32_t));
+        *streamPtrPtr += ((imageInfoCount)) * sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_1506 = (uint64_t)(uintptr_t)local_pBufferInfoEntryIndices;
-    stream->putBe64(cgen_var_1506);
+    uint64_t cgen_var_1338 = (uint64_t)(uintptr_t)local_pBufferInfoEntryIndices;
+    memcpy((*streamPtrPtr), &cgen_var_1338, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pBufferInfoEntryIndices)
     {
-        stream->write((uint32_t*)local_pBufferInfoEntryIndices, ((bufferInfoCount)) * sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)local_pBufferInfoEntryIndices, ((bufferInfoCount)) * sizeof(uint32_t));
+        *streamPtrPtr += ((bufferInfoCount)) * sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_1507 = (uint64_t)(uintptr_t)local_pBufferViewEntryIndices;
-    stream->putBe64(cgen_var_1507);
+    uint64_t cgen_var_1339 = (uint64_t)(uintptr_t)local_pBufferViewEntryIndices;
+    memcpy((*streamPtrPtr), &cgen_var_1339, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pBufferViewEntryIndices)
     {
-        stream->write((uint32_t*)local_pBufferViewEntryIndices, ((bufferViewCount)) * sizeof(uint32_t));
+        memcpy(*streamPtrPtr, (uint32_t*)local_pBufferViewEntryIndices, ((bufferViewCount)) * sizeof(uint32_t));
+        *streamPtrPtr += ((bufferViewCount)) * sizeof(uint32_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_1508 = (uint64_t)(uintptr_t)local_pImageInfos;
-    stream->putBe64(cgen_var_1508);
+    uint64_t cgen_var_1340 = (uint64_t)(uintptr_t)local_pImageInfos;
+    memcpy((*streamPtrPtr), &cgen_var_1340, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pImageInfos)
     {
         for (uint32_t i = 0; i < (uint32_t)((imageInfoCount)); ++i)
         {
-            marshal_VkDescriptorImageInfo(stream, (VkDescriptorImageInfo*)(local_pImageInfos + i));
+            reservedmarshal_VkDescriptorImageInfo(stream, (VkDescriptorImageInfo*)(local_pImageInfos + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_1509 = (uint64_t)(uintptr_t)local_pBufferInfos;
-    stream->putBe64(cgen_var_1509);
+    uint64_t cgen_var_1341 = (uint64_t)(uintptr_t)local_pBufferInfos;
+    memcpy((*streamPtrPtr), &cgen_var_1341, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pBufferInfos)
     {
         for (uint32_t i = 0; i < (uint32_t)((bufferInfoCount)); ++i)
         {
-            marshal_VkDescriptorBufferInfo(stream, (VkDescriptorBufferInfo*)(local_pBufferInfos + i));
+            reservedmarshal_VkDescriptorBufferInfo(stream, (VkDescriptorBufferInfo*)(local_pBufferInfos + i), streamPtrPtr);
         }
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_1510 = (uint64_t)(uintptr_t)local_pBufferViews;
-    stream->putBe64(cgen_var_1510);
+    uint64_t cgen_var_1342 = (uint64_t)(uintptr_t)local_pBufferViews;
+    memcpy((*streamPtrPtr), &cgen_var_1342, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pBufferViews)
     {
         if (((bufferViewCount)))
         {
-            uint64_t* cgen_var_1511;
-            stream->alloc((void**)&cgen_var_1511, ((bufferViewCount)) * 8);
-            stream->handleMapping()->mapHandles_VkBufferView_u64(local_pBufferViews, cgen_var_1511, ((bufferViewCount)));
-            stream->write((uint64_t*)cgen_var_1511, ((bufferViewCount)) * 8);
+            uint64_t* cgen_var_1343;
+            stream->alloc((void**)&cgen_var_1343, ((bufferViewCount)) * 8);
+            for (uint32_t k = 0; k < ((bufferViewCount)); ++k)
+            {
+                cgen_var_1343[k] = get_host_u64_VkBufferView(local_pBufferViews[k]);
+            }
+            memcpy(*streamPtrPtr, (uint64_t*)cgen_var_1343, ((bufferViewCount)) * 8);
+            *streamPtrPtr += ((bufferViewCount)) * 8;
         }
     }
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkUpdateDescriptorSetWithTemplateSizedGOOGLE");;
 }
 
@@ -22385,17 +26446,17 @@
 #ifdef VK_GOOGLE_async_command_buffers
 void VkEncoder::vkBeginCommandBufferAsyncGOOGLE(
     VkCommandBuffer commandBuffer,
-    const VkCommandBufferBeginInfo* pBeginInfo)
+    const VkCommandBufferBeginInfo* pBeginInfo,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkBeginCommandBufferAsyncGOOGLE");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkCommandBufferBeginInfo* local_pBeginInfo;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_pBeginInfo = nullptr;
     if (pBeginInfo)
@@ -22403,141 +26464,188 @@
         local_pBeginInfo = (VkCommandBufferBeginInfo*)pool->alloc(sizeof(const VkCommandBufferBeginInfo));
         deepcopy_VkCommandBufferBeginInfo(pool, pBeginInfo, (VkCommandBufferBeginInfo*)(local_pBeginInfo));
     }
+    local_doLock = doLock;
     if (local_pBeginInfo)
     {
         transform_tohost_VkCommandBufferBeginInfo(mImpl->resources(), (VkCommandBufferBeginInfo*)(local_pBeginInfo));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1512;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1512, 1);
-        countingStream->write((uint64_t*)&cgen_var_1512, 1 * 8);
-        marshal_VkCommandBufferBeginInfo(countingStream, (VkCommandBufferBeginInfo*)(local_pBeginInfo));
+        uint64_t cgen_var_1344;
+        *countPtr += 1 * 8;
+        count_VkCommandBufferBeginInfo(featureBits, (VkCommandBufferBeginInfo*)(local_pBeginInfo), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkBeginCommandBufferAsyncGOOGLE = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkBeginCommandBufferAsyncGOOGLE = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkBeginCommandBufferAsyncGOOGLE);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkBeginCommandBufferAsyncGOOGLE = OP_vkBeginCommandBufferAsyncGOOGLE;
-    stream->write(&opcode_vkBeginCommandBufferAsyncGOOGLE, sizeof(uint32_t));
-    stream->write(&packetSize_vkBeginCommandBufferAsyncGOOGLE, sizeof(uint32_t));
-    uint64_t cgen_var_1513;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1513, 1);
-    stream->write((uint64_t*)&cgen_var_1513, 1 * 8);
-    marshal_VkCommandBufferBeginInfo(stream, (VkCommandBufferBeginInfo*)(local_pBeginInfo));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkBeginCommandBufferAsyncGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkBeginCommandBufferAsyncGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1345;
+    *&cgen_var_1345 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1345, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkCommandBufferBeginInfo(stream, (VkCommandBufferBeginInfo*)(local_pBeginInfo), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkBeginCommandBufferAsyncGOOGLE");;
 }
 
 void VkEncoder::vkEndCommandBufferAsyncGOOGLE(
-    VkCommandBuffer commandBuffer)
+    VkCommandBuffer commandBuffer,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkEndCommandBufferAsyncGOOGLE");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1514;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1514, 1);
-        countingStream->write((uint64_t*)&cgen_var_1514, 1 * 8);
+        uint64_t cgen_var_1346;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkEndCommandBufferAsyncGOOGLE = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkEndCommandBufferAsyncGOOGLE = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkEndCommandBufferAsyncGOOGLE);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkEndCommandBufferAsyncGOOGLE = OP_vkEndCommandBufferAsyncGOOGLE;
-    stream->write(&opcode_vkEndCommandBufferAsyncGOOGLE, sizeof(uint32_t));
-    stream->write(&packetSize_vkEndCommandBufferAsyncGOOGLE, sizeof(uint32_t));
-    uint64_t cgen_var_1515;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1515, 1);
-    stream->write((uint64_t*)&cgen_var_1515, 1 * 8);
+    memcpy(streamPtr, &opcode_vkEndCommandBufferAsyncGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkEndCommandBufferAsyncGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1347;
+    *&cgen_var_1347 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1347, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->flush();
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkEndCommandBufferAsyncGOOGLE");;
 }
 
 void VkEncoder::vkResetCommandBufferAsyncGOOGLE(
     VkCommandBuffer commandBuffer,
-    VkCommandBufferResetFlags flags)
+    VkCommandBufferResetFlags flags,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkResetCommandBufferAsyncGOOGLE");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     VkCommandBufferResetFlags local_flags;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_flags = flags;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1516;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1516, 1);
-        countingStream->write((uint64_t*)&cgen_var_1516, 1 * 8);
-        countingStream->write((VkCommandBufferResetFlags*)&local_flags, sizeof(VkCommandBufferResetFlags));
+        uint64_t cgen_var_1348;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkCommandBufferResetFlags);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkResetCommandBufferAsyncGOOGLE = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkResetCommandBufferAsyncGOOGLE = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkResetCommandBufferAsyncGOOGLE);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkResetCommandBufferAsyncGOOGLE = OP_vkResetCommandBufferAsyncGOOGLE;
-    stream->write(&opcode_vkResetCommandBufferAsyncGOOGLE, sizeof(uint32_t));
-    stream->write(&packetSize_vkResetCommandBufferAsyncGOOGLE, sizeof(uint32_t));
-    uint64_t cgen_var_1517;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1517, 1);
-    stream->write((uint64_t*)&cgen_var_1517, 1 * 8);
-    stream->write((VkCommandBufferResetFlags*)&local_flags, sizeof(VkCommandBufferResetFlags));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkResetCommandBufferAsyncGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkResetCommandBufferAsyncGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1349;
+    *&cgen_var_1349 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1349, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkCommandBufferResetFlags*)&local_flags, sizeof(VkCommandBufferResetFlags));
+    *streamPtrPtr += sizeof(VkCommandBufferResetFlags);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkResetCommandBufferAsyncGOOGLE");;
 }
 
 void VkEncoder::vkCommandBufferHostSyncGOOGLE(
     VkCommandBuffer commandBuffer,
     uint32_t needHostSync,
-    uint32_t sequenceNumber)
+    uint32_t sequenceNumber,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCommandBufferHostSyncGOOGLE");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkCommandBuffer local_commandBuffer;
     uint32_t local_needHostSync;
     uint32_t local_sequenceNumber;
+    uint32_t local_doLock;
     local_commandBuffer = commandBuffer;
     local_needHostSync = needHostSync;
     local_sequenceNumber = sequenceNumber;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1518;
-        countingStream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1518, 1);
-        countingStream->write((uint64_t*)&cgen_var_1518, 1 * 8);
-        countingStream->write((uint32_t*)&local_needHostSync, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_sequenceNumber, sizeof(uint32_t));
+        uint64_t cgen_var_1350;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCommandBufferHostSyncGOOGLE = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCommandBufferHostSyncGOOGLE = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCommandBufferHostSyncGOOGLE);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCommandBufferHostSyncGOOGLE = OP_vkCommandBufferHostSyncGOOGLE;
-    stream->write(&opcode_vkCommandBufferHostSyncGOOGLE, sizeof(uint32_t));
-    stream->write(&packetSize_vkCommandBufferHostSyncGOOGLE, sizeof(uint32_t));
-    uint64_t cgen_var_1519;
-    stream->handleMapping()->mapHandles_VkCommandBuffer_u64(&local_commandBuffer, &cgen_var_1519, 1);
-    stream->write((uint64_t*)&cgen_var_1519, 1 * 8);
-    stream->write((uint32_t*)&local_needHostSync, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_sequenceNumber, sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkCommandBufferHostSyncGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCommandBufferHostSyncGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1351;
+    *&cgen_var_1351 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1351, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_needHostSync, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_sequenceNumber, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCommandBufferHostSyncGOOGLE");;
 }
 
@@ -22548,18 +26656,18 @@
     const VkImageCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
     VkImage* pImage,
-    VkMemoryRequirements* pMemoryRequirements)
+    VkMemoryRequirements* pMemoryRequirements,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateImageWithRequirementsGOOGLE");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkImageCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -22573,6 +26681,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     mImpl->resources()->unwrap_VkNativeBufferANDROID(pCreateInfo, local_pCreateInfo);
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
@@ -22583,50 +26692,57 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1520;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1520, 1);
-        countingStream->write((uint64_t*)&cgen_var_1520, 1 * 8);
-        marshal_VkImageCreateInfo(countingStream, (VkImageCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_1352;
+        *countPtr += 1 * 8;
+        count_VkImageCreateInfo(featureBits, (VkImageCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_1521 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_1521);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_1522;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(pImage, &cgen_var_1522, 1);
-        countingStream->write((uint64_t*)&cgen_var_1522, 8);
-        marshal_VkMemoryRequirements(countingStream, (VkMemoryRequirements*)(pMemoryRequirements));
+        uint64_t cgen_var_1353;
+        *countPtr += 8;
+        count_VkMemoryRequirements(featureBits, (VkMemoryRequirements*)(pMemoryRequirements), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateImageWithRequirementsGOOGLE = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateImageWithRequirementsGOOGLE = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateImageWithRequirementsGOOGLE);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateImageWithRequirementsGOOGLE = OP_vkCreateImageWithRequirementsGOOGLE;
-    stream->write(&opcode_vkCreateImageWithRequirementsGOOGLE, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateImageWithRequirementsGOOGLE, sizeof(uint32_t));
-    uint64_t cgen_var_1523;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1523, 1);
-    stream->write((uint64_t*)&cgen_var_1523, 1 * 8);
-    marshal_VkImageCreateInfo(stream, (VkImageCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateImageWithRequirementsGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateImageWithRequirementsGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1354;
+    *&cgen_var_1354 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1354, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkImageCreateInfo(stream, (VkImageCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_1524 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_1524);
+    uint64_t cgen_var_1355 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_1355, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_1525;
-    stream->handleMapping()->mapHandles_VkImage_u64(pImage, &cgen_var_1525, 1);
-    stream->write((uint64_t*)&cgen_var_1525, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
-    marshal_VkMemoryRequirements(stream, (VkMemoryRequirements*)(pMemoryRequirements));
+    /* is handle, possibly out */;
+    uint64_t cgen_var_1356;
+    *&cgen_var_1356 = (uint64_t)((*pImage));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1356, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    reservedmarshal_VkMemoryRequirements(stream, (VkMemoryRequirements*)(pMemoryRequirements), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_1526;
-    stream->read((uint64_t*)&cgen_var_1526, 8);
-    stream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_1526, (VkImage*)pImage, 1);
+    uint64_t cgen_var_1357;
+    stream->read((uint64_t*)&cgen_var_1357, 8);
+    stream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_1357, (VkImage*)pImage, 1);
     stream->unsetHandleMapping();
     unmarshal_VkMemoryRequirements(stream, (VkMemoryRequirements*)(pMemoryRequirements));
     if (pMemoryRequirements)
@@ -22635,9 +26751,13 @@
     }
     VkResult vkCreateImageWithRequirementsGOOGLE_VkResult_return = (VkResult)0;
     stream->read(&vkCreateImageWithRequirementsGOOGLE_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateImageWithRequirementsGOOGLE");;
     return vkCreateImageWithRequirementsGOOGLE_VkResult_return;
 }
@@ -22647,18 +26767,18 @@
     const VkBufferCreateInfo* pCreateInfo,
     const VkAllocationCallbacks* pAllocator,
     VkBuffer* pBuffer,
-    VkMemoryRequirements* pMemoryRequirements)
+    VkMemoryRequirements* pMemoryRequirements,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkCreateBufferWithRequirementsGOOGLE");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkBufferCreateInfo* local_pCreateInfo;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_pCreateInfo = nullptr;
     if (pCreateInfo)
@@ -22672,6 +26792,7 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     if (local_pCreateInfo)
     {
@@ -22681,50 +26802,57 @@
     {
         transform_tohost_VkAllocationCallbacks(mImpl->resources(), (VkAllocationCallbacks*)(local_pAllocator));
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1527;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1527, 1);
-        countingStream->write((uint64_t*)&cgen_var_1527, 1 * 8);
-        marshal_VkBufferCreateInfo(countingStream, (VkBufferCreateInfo*)(local_pCreateInfo));
+        uint64_t cgen_var_1358;
+        *countPtr += 1 * 8;
+        count_VkBufferCreateInfo(featureBits, (VkBufferCreateInfo*)(local_pCreateInfo), countPtr);
         // WARNING PTR CHECK
-        uint64_t cgen_var_1528 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_1528);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
-        uint64_t cgen_var_1529;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(pBuffer, &cgen_var_1529, 1);
-        countingStream->write((uint64_t*)&cgen_var_1529, 8);
-        marshal_VkMemoryRequirements(countingStream, (VkMemoryRequirements*)(pMemoryRequirements));
+        uint64_t cgen_var_1359;
+        *countPtr += 8;
+        count_VkMemoryRequirements(featureBits, (VkMemoryRequirements*)(pMemoryRequirements), countPtr);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkCreateBufferWithRequirementsGOOGLE = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkCreateBufferWithRequirementsGOOGLE = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateBufferWithRequirementsGOOGLE);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkCreateBufferWithRequirementsGOOGLE = OP_vkCreateBufferWithRequirementsGOOGLE;
-    stream->write(&opcode_vkCreateBufferWithRequirementsGOOGLE, sizeof(uint32_t));
-    stream->write(&packetSize_vkCreateBufferWithRequirementsGOOGLE, sizeof(uint32_t));
-    uint64_t cgen_var_1530;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1530, 1);
-    stream->write((uint64_t*)&cgen_var_1530, 1 * 8);
-    marshal_VkBufferCreateInfo(stream, (VkBufferCreateInfo*)(local_pCreateInfo));
+    memcpy(streamPtr, &opcode_vkCreateBufferWithRequirementsGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkCreateBufferWithRequirementsGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1360;
+    *&cgen_var_1360 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1360, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    reservedmarshal_VkBufferCreateInfo(stream, (VkBufferCreateInfo*)(local_pCreateInfo), streamPtrPtr);
     // WARNING PTR CHECK
-    uint64_t cgen_var_1531 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_1531);
+    uint64_t cgen_var_1361 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_1361, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
-    stream->unsetHandleMapping() /* emit_marshal, is handle, possibly out */;
-    uint64_t cgen_var_1532;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(pBuffer, &cgen_var_1532, 1);
-    stream->write((uint64_t*)&cgen_var_1532, 8);
-    stream->setHandleMapping(resources->unwrapMapping());
-    marshal_VkMemoryRequirements(stream, (VkMemoryRequirements*)(pMemoryRequirements));
+    /* is handle, possibly out */;
+    uint64_t cgen_var_1362;
+    *&cgen_var_1362 = (uint64_t)((*pBuffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1362, 8);
+    *streamPtrPtr += 8;
+    /* is handle, possibly out */;
+    reservedmarshal_VkMemoryRequirements(stream, (VkMemoryRequirements*)(pMemoryRequirements), streamPtrPtr);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->setHandleMapping(resources->createMapping());
-    uint64_t cgen_var_1533;
-    stream->read((uint64_t*)&cgen_var_1533, 8);
-    stream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_1533, (VkBuffer*)pBuffer, 1);
+    uint64_t cgen_var_1363;
+    stream->read((uint64_t*)&cgen_var_1363, 8);
+    stream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_1363, (VkBuffer*)pBuffer, 1);
     stream->unsetHandleMapping();
     unmarshal_VkMemoryRequirements(stream, (VkMemoryRequirements*)(pMemoryRequirements));
     if (pMemoryRequirements)
@@ -22733,9 +26861,13 @@
     }
     VkResult vkCreateBufferWithRequirementsGOOGLE_VkResult_return = (VkResult)0;
     stream->read(&vkCreateBufferWithRequirementsGOOGLE_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkCreateBufferWithRequirementsGOOGLE");;
     return vkCreateBufferWithRequirementsGOOGLE_VkResult_return;
 }
@@ -22747,82 +26879,95 @@
     VkDeviceMemory memory,
     uint64_t* pAddress,
     uint64_t* pSize,
-    uint64_t* pHostmemId)
+    uint64_t* pHostmemId,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetMemoryHostAddressInfoGOOGLE");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDeviceMemory local_memory;
+    uint32_t local_doLock;
     local_device = device;
     local_memory = memory;
+    local_doLock = doLock;
     mImpl->resources()->deviceMemoryTransform_tohost((VkDeviceMemory*)&local_memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1534;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1534, 1);
-        countingStream->write((uint64_t*)&cgen_var_1534, 1 * 8);
-        uint64_t cgen_var_1535;
-        countingStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&local_memory, &cgen_var_1535, 1);
-        countingStream->write((uint64_t*)&cgen_var_1535, 1 * 8);
+        uint64_t cgen_var_1364;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1365;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_1536 = (uint64_t)(uintptr_t)pAddress;
-        countingStream->putBe64(cgen_var_1536);
+        *countPtr += 8;
         if (pAddress)
         {
-            countingStream->write((uint64_t*)pAddress, sizeof(uint64_t));
+            *countPtr += sizeof(uint64_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_1537 = (uint64_t)(uintptr_t)pSize;
-        countingStream->putBe64(cgen_var_1537);
+        *countPtr += 8;
         if (pSize)
         {
-            countingStream->write((uint64_t*)pSize, sizeof(uint64_t));
+            *countPtr += sizeof(uint64_t);
         }
         // WARNING PTR CHECK
-        uint64_t cgen_var_1538 = (uint64_t)(uintptr_t)pHostmemId;
-        countingStream->putBe64(cgen_var_1538);
+        *countPtr += 8;
         if (pHostmemId)
         {
-            countingStream->write((uint64_t*)pHostmemId, sizeof(uint64_t));
+            *countPtr += sizeof(uint64_t);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetMemoryHostAddressInfoGOOGLE = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetMemoryHostAddressInfoGOOGLE = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetMemoryHostAddressInfoGOOGLE);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetMemoryHostAddressInfoGOOGLE = OP_vkGetMemoryHostAddressInfoGOOGLE;
-    stream->write(&opcode_vkGetMemoryHostAddressInfoGOOGLE, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetMemoryHostAddressInfoGOOGLE, sizeof(uint32_t));
-    uint64_t cgen_var_1539;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1539, 1);
-    stream->write((uint64_t*)&cgen_var_1539, 1 * 8);
-    uint64_t cgen_var_1540;
-    stream->handleMapping()->mapHandles_VkDeviceMemory_u64(&local_memory, &cgen_var_1540, 1);
-    stream->write((uint64_t*)&cgen_var_1540, 1 * 8);
+    memcpy(streamPtr, &opcode_vkGetMemoryHostAddressInfoGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetMemoryHostAddressInfoGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1366;
+    *&cgen_var_1366 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1366, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1367;
+    *&cgen_var_1367 = get_host_u64_VkDeviceMemory((*&local_memory));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1367, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_1541 = (uint64_t)(uintptr_t)pAddress;
-    stream->putBe64(cgen_var_1541);
+    uint64_t cgen_var_1368 = (uint64_t)(uintptr_t)pAddress;
+    memcpy((*streamPtrPtr), &cgen_var_1368, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pAddress)
     {
-        stream->write((uint64_t*)pAddress, sizeof(uint64_t));
+        memcpy(*streamPtrPtr, (uint64_t*)pAddress, sizeof(uint64_t));
+        *streamPtrPtr += sizeof(uint64_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_1542 = (uint64_t)(uintptr_t)pSize;
-    stream->putBe64(cgen_var_1542);
+    uint64_t cgen_var_1369 = (uint64_t)(uintptr_t)pSize;
+    memcpy((*streamPtrPtr), &cgen_var_1369, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pSize)
     {
-        stream->write((uint64_t*)pSize, sizeof(uint64_t));
+        memcpy(*streamPtrPtr, (uint64_t*)pSize, sizeof(uint64_t));
+        *streamPtrPtr += sizeof(uint64_t);
     }
     // WARNING PTR CHECK
-    uint64_t cgen_var_1543 = (uint64_t)(uintptr_t)pHostmemId;
-    stream->putBe64(cgen_var_1543);
+    uint64_t cgen_var_1370 = (uint64_t)(uintptr_t)pHostmemId;
+    memcpy((*streamPtrPtr), &cgen_var_1370, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (pHostmemId)
     {
-        stream->write((uint64_t*)pHostmemId, sizeof(uint64_t));
+        memcpy(*streamPtrPtr, (uint64_t*)pHostmemId, sizeof(uint64_t));
+        *streamPtrPtr += sizeof(uint64_t);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     // WARNING PTR CHECK
     uint64_t* check_pAddress;
     check_pAddress = (uint64_t*)(uintptr_t)stream->getBe64();
@@ -22858,9 +27003,13 @@
     }
     VkResult vkGetMemoryHostAddressInfoGOOGLE_VkResult_return = (VkResult)0;
     stream->read(&vkGetMemoryHostAddressInfoGOOGLE_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetMemoryHostAddressInfoGOOGLE");;
     return vkGetMemoryHostAddressInfoGOOGLE_VkResult_return;
 }
@@ -22870,18 +27019,18 @@
 VkResult VkEncoder::vkFreeMemorySyncGOOGLE(
     VkDevice device,
     VkDeviceMemory memory,
-    const VkAllocationCallbacks* pAllocator)
+    const VkAllocationCallbacks* pAllocator,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkFreeMemorySyncGOOGLE");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkDeviceMemory local_memory;
     VkAllocationCallbacks* local_pAllocator;
+    uint32_t local_doLock;
     local_device = device;
     local_memory = memory;
     local_pAllocator = nullptr;
@@ -22890,48 +27039,60 @@
         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
         deepcopy_VkAllocationCallbacks(pool, pAllocator, (VkAllocationCallbacks*)(local_pAllocator));
     }
+    local_doLock = doLock;
     local_pAllocator = nullptr;
     mImpl->resources()->deviceMemoryTransform_tohost((VkDeviceMemory*)&local_memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1547;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1547, 1);
-        countingStream->write((uint64_t*)&cgen_var_1547, 1 * 8);
-        uint64_t cgen_var_1548;
-        countingStream->handleMapping()->mapHandles_VkDeviceMemory_u64(&local_memory, &cgen_var_1548, 1);
-        countingStream->write((uint64_t*)&cgen_var_1548, 1 * 8);
+        uint64_t cgen_var_1374;
+        *countPtr += 1 * 8;
+        uint64_t cgen_var_1375;
+        *countPtr += 1 * 8;
         // WARNING PTR CHECK
-        uint64_t cgen_var_1549 = (uint64_t)(uintptr_t)local_pAllocator;
-        countingStream->putBe64(cgen_var_1549);
+        *countPtr += 8;
         if (local_pAllocator)
         {
-            marshal_VkAllocationCallbacks(countingStream, (VkAllocationCallbacks*)(local_pAllocator));
+            count_VkAllocationCallbacks(featureBits, (VkAllocationCallbacks*)(local_pAllocator), countPtr);
         }
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkFreeMemorySyncGOOGLE = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkFreeMemorySyncGOOGLE = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkFreeMemorySyncGOOGLE);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkFreeMemorySyncGOOGLE = OP_vkFreeMemorySyncGOOGLE;
-    stream->write(&opcode_vkFreeMemorySyncGOOGLE, sizeof(uint32_t));
-    stream->write(&packetSize_vkFreeMemorySyncGOOGLE, sizeof(uint32_t));
-    uint64_t cgen_var_1550;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1550, 1);
-    stream->write((uint64_t*)&cgen_var_1550, 1 * 8);
-    uint64_t cgen_var_1551;
-    stream->handleMapping()->mapHandles_VkDeviceMemory_u64(&local_memory, &cgen_var_1551, 1);
-    stream->write((uint64_t*)&cgen_var_1551, 1 * 8);
+    memcpy(streamPtr, &opcode_vkFreeMemorySyncGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkFreeMemorySyncGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1376;
+    *&cgen_var_1376 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1376, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    uint64_t cgen_var_1377;
+    *&cgen_var_1377 = get_host_u64_VkDeviceMemory((*&local_memory));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1377, 1 * 8);
+    *streamPtrPtr += 1 * 8;
     // WARNING PTR CHECK
-    uint64_t cgen_var_1552 = (uint64_t)(uintptr_t)local_pAllocator;
-    stream->putBe64(cgen_var_1552);
+    uint64_t cgen_var_1378 = (uint64_t)(uintptr_t)local_pAllocator;
+    memcpy((*streamPtrPtr), &cgen_var_1378, 8);
+    android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+    *streamPtrPtr += 8;
     if (local_pAllocator)
     {
-        marshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator));
+        reservedmarshal_VkAllocationCallbacks(stream, (VkAllocationCallbacks*)(local_pAllocator), streamPtrPtr);
     }
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     VkResult vkFreeMemorySyncGOOGLE_VkResult_return = (VkResult)0;
     stream->read(&vkFreeMemorySyncGOOGLE_VkResult_return, sizeof(VkResult));
     resources->destroyMapping()->mapHandles_VkDeviceMemory((VkDeviceMemory*)&memory);
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkFreeMemorySyncGOOGLE");;
     return vkFreeMemorySyncGOOGLE_VkResult_return;
 }
@@ -22941,42 +27102,55 @@
 void VkEncoder::vkQueueHostSyncGOOGLE(
     VkQueue queue,
     uint32_t needHostSync,
-    uint32_t sequenceNumber)
+    uint32_t sequenceNumber,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkQueueHostSyncGOOGLE");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkQueue local_queue;
     uint32_t local_needHostSync;
     uint32_t local_sequenceNumber;
+    uint32_t local_doLock;
     local_queue = queue;
     local_needHostSync = needHostSync;
     local_sequenceNumber = sequenceNumber;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1553;
-        countingStream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1553, 1);
-        countingStream->write((uint64_t*)&cgen_var_1553, 1 * 8);
-        countingStream->write((uint32_t*)&local_needHostSync, sizeof(uint32_t));
-        countingStream->write((uint32_t*)&local_sequenceNumber, sizeof(uint32_t));
+        uint64_t cgen_var_1379;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkQueueHostSyncGOOGLE = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkQueueHostSyncGOOGLE = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkQueueHostSyncGOOGLE);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkQueueHostSyncGOOGLE = OP_vkQueueHostSyncGOOGLE;
-    stream->write(&opcode_vkQueueHostSyncGOOGLE, sizeof(uint32_t));
-    stream->write(&packetSize_vkQueueHostSyncGOOGLE, sizeof(uint32_t));
-    uint64_t cgen_var_1554;
-    stream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1554, 1);
-    stream->write((uint64_t*)&cgen_var_1554, 1 * 8);
-    stream->write((uint32_t*)&local_needHostSync, sizeof(uint32_t));
-    stream->write((uint32_t*)&local_sequenceNumber, sizeof(uint32_t));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    memcpy(streamPtr, &opcode_vkQueueHostSyncGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkQueueHostSyncGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1380;
+    *&cgen_var_1380 = get_host_u64_VkQueue((*&local_queue));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1380, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_needHostSync, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_sequenceNumber, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkQueueHostSyncGOOGLE");;
 }
 
@@ -22984,19 +27158,19 @@
     VkQueue queue,
     uint32_t submitCount,
     const VkSubmitInfo* pSubmits,
-    VkFence fence)
+    VkFence fence,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkQueueSubmitAsyncGOOGLE");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkQueue local_queue;
     uint32_t local_submitCount;
     VkSubmitInfo* local_pSubmits;
     VkFence local_fence;
+    uint32_t local_doLock;
     local_queue = queue;
     local_submitCount = submitCount;
     local_pSubmits = nullptr;
@@ -23009,6 +27183,7 @@
         }
     }
     local_fence = fence;
+    local_doLock = doLock;
     if (local_pSubmits)
     {
         for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i)
@@ -23016,73 +27191,95 @@
             transform_tohost_VkSubmitInfo(mImpl->resources(), (VkSubmitInfo*)(local_pSubmits + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1555;
-        countingStream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1555, 1);
-        countingStream->write((uint64_t*)&cgen_var_1555, 1 * 8);
-        countingStream->write((uint32_t*)&local_submitCount, sizeof(uint32_t));
+        uint64_t cgen_var_1381;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i)
         {
-            marshal_VkSubmitInfo(countingStream, (VkSubmitInfo*)(local_pSubmits + i));
+            count_VkSubmitInfo(featureBits, (VkSubmitInfo*)(local_pSubmits + i), countPtr);
         }
-        uint64_t cgen_var_1556;
-        countingStream->handleMapping()->mapHandles_VkFence_u64(&local_fence, &cgen_var_1556, 1);
-        countingStream->write((uint64_t*)&cgen_var_1556, 1 * 8);
+        uint64_t cgen_var_1382;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkQueueSubmitAsyncGOOGLE = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkQueueSubmitAsyncGOOGLE = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkQueueSubmitAsyncGOOGLE);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkQueueSubmitAsyncGOOGLE = OP_vkQueueSubmitAsyncGOOGLE;
-    stream->write(&opcode_vkQueueSubmitAsyncGOOGLE, sizeof(uint32_t));
-    stream->write(&packetSize_vkQueueSubmitAsyncGOOGLE, sizeof(uint32_t));
-    uint64_t cgen_var_1557;
-    stream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1557, 1);
-    stream->write((uint64_t*)&cgen_var_1557, 1 * 8);
-    stream->write((uint32_t*)&local_submitCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkQueueSubmitAsyncGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkQueueSubmitAsyncGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1383;
+    *&cgen_var_1383 = get_host_u64_VkQueue((*&local_queue));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1383, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_submitCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i)
     {
-        marshal_VkSubmitInfo(stream, (VkSubmitInfo*)(local_pSubmits + i));
+        reservedmarshal_VkSubmitInfo(stream, (VkSubmitInfo*)(local_pSubmits + i), streamPtrPtr);
     }
-    uint64_t cgen_var_1558;
-    stream->handleMapping()->mapHandles_VkFence_u64(&local_fence, &cgen_var_1558, 1);
-    stream->write((uint64_t*)&cgen_var_1558, 1 * 8);
+    uint64_t cgen_var_1384;
+    *&cgen_var_1384 = get_host_u64_VkFence((*&local_fence));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1384, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->flush();
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkQueueSubmitAsyncGOOGLE");;
 }
 
 void VkEncoder::vkQueueWaitIdleAsyncGOOGLE(
-    VkQueue queue)
+    VkQueue queue,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkQueueWaitIdleAsyncGOOGLE");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkQueue local_queue;
+    uint32_t local_doLock;
     local_queue = queue;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1559;
-        countingStream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1559, 1);
-        countingStream->write((uint64_t*)&cgen_var_1559, 1 * 8);
+        uint64_t cgen_var_1385;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkQueueWaitIdleAsyncGOOGLE = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkQueueWaitIdleAsyncGOOGLE = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkQueueWaitIdleAsyncGOOGLE);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkQueueWaitIdleAsyncGOOGLE = OP_vkQueueWaitIdleAsyncGOOGLE;
-    stream->write(&opcode_vkQueueWaitIdleAsyncGOOGLE, sizeof(uint32_t));
-    stream->write(&packetSize_vkQueueWaitIdleAsyncGOOGLE, sizeof(uint32_t));
-    uint64_t cgen_var_1560;
-    stream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1560, 1);
-    stream->write((uint64_t*)&cgen_var_1560, 1 * 8);
+    memcpy(streamPtr, &opcode_vkQueueWaitIdleAsyncGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkQueueWaitIdleAsyncGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1386;
+    *&cgen_var_1386 = get_host_u64_VkQueue((*&local_queue));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1386, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->flush();
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkQueueWaitIdleAsyncGOOGLE");;
 }
 
@@ -23090,19 +27287,19 @@
     VkQueue queue,
     uint32_t bindInfoCount,
     const VkBindSparseInfo* pBindInfo,
-    VkFence fence)
+    VkFence fence,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkQueueBindSparseAsyncGOOGLE");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkQueue local_queue;
     uint32_t local_bindInfoCount;
     VkBindSparseInfo* local_pBindInfo;
     VkFence local_fence;
+    uint32_t local_doLock;
     local_queue = queue;
     local_bindInfoCount = bindInfoCount;
     local_pBindInfo = nullptr;
@@ -23115,6 +27312,7 @@
         }
     }
     local_fence = fence;
+    local_doLock = doLock;
     if (local_pBindInfo)
     {
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
@@ -23122,40 +27320,51 @@
             transform_tohost_VkBindSparseInfo(mImpl->resources(), (VkBindSparseInfo*)(local_pBindInfo + i));
         }
     }
-    countingStream->rewind();
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1561;
-        countingStream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1561, 1);
-        countingStream->write((uint64_t*)&cgen_var_1561, 1 * 8);
-        countingStream->write((uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
+        uint64_t cgen_var_1387;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
         {
-            marshal_VkBindSparseInfo(countingStream, (VkBindSparseInfo*)(local_pBindInfo + i));
+            count_VkBindSparseInfo(featureBits, (VkBindSparseInfo*)(local_pBindInfo + i), countPtr);
         }
-        uint64_t cgen_var_1562;
-        countingStream->handleMapping()->mapHandles_VkFence_u64(&local_fence, &cgen_var_1562, 1);
-        countingStream->write((uint64_t*)&cgen_var_1562, 1 * 8);
+        uint64_t cgen_var_1388;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkQueueBindSparseAsyncGOOGLE = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkQueueBindSparseAsyncGOOGLE = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkQueueBindSparseAsyncGOOGLE);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkQueueBindSparseAsyncGOOGLE = OP_vkQueueBindSparseAsyncGOOGLE;
-    stream->write(&opcode_vkQueueBindSparseAsyncGOOGLE, sizeof(uint32_t));
-    stream->write(&packetSize_vkQueueBindSparseAsyncGOOGLE, sizeof(uint32_t));
-    uint64_t cgen_var_1563;
-    stream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1563, 1);
-    stream->write((uint64_t*)&cgen_var_1563, 1 * 8);
-    stream->write((uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
+    memcpy(streamPtr, &opcode_vkQueueBindSparseAsyncGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkQueueBindSparseAsyncGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1389;
+    *&cgen_var_1389 = get_host_u64_VkQueue((*&local_queue));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1389, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
     {
-        marshal_VkBindSparseInfo(stream, (VkBindSparseInfo*)(local_pBindInfo + i));
+        reservedmarshal_VkBindSparseInfo(stream, (VkBindSparseInfo*)(local_pBindInfo + i), streamPtrPtr);
     }
-    uint64_t cgen_var_1564;
-    stream->handleMapping()->mapHandles_VkFence_u64(&local_fence, &cgen_var_1564, 1);
-    stream->write((uint64_t*)&cgen_var_1564, 1 * 8);
+    uint64_t cgen_var_1390;
+    *&cgen_var_1390 = get_host_u64_VkFence((*&local_fence));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1390, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->flush();
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkQueueBindSparseAsyncGOOGLE");;
 }
 
@@ -23165,44 +27374,58 @@
     VkDevice device,
     VkFormat format,
     VkDeviceSize* pOffset,
-    VkDeviceSize* pRowPitchAlignment)
+    VkDeviceSize* pRowPitchAlignment,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetLinearImageLayoutGOOGLE");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkDevice local_device;
     VkFormat local_format;
+    uint32_t local_doLock;
     local_device = device;
     local_format = format;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1565;
-        countingStream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1565, 1);
-        countingStream->write((uint64_t*)&cgen_var_1565, 1 * 8);
-        countingStream->write((VkFormat*)&local_format, sizeof(VkFormat));
-        countingStream->write((VkDeviceSize*)pOffset, sizeof(VkDeviceSize));
-        countingStream->write((VkDeviceSize*)pRowPitchAlignment, sizeof(VkDeviceSize));
+        uint64_t cgen_var_1391;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(VkFormat);
+        *countPtr += sizeof(VkDeviceSize);
+        *countPtr += sizeof(VkDeviceSize);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetLinearImageLayoutGOOGLE = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetLinearImageLayoutGOOGLE = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetLinearImageLayoutGOOGLE);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetLinearImageLayoutGOOGLE = OP_vkGetLinearImageLayoutGOOGLE;
-    stream->write(&opcode_vkGetLinearImageLayoutGOOGLE, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetLinearImageLayoutGOOGLE, sizeof(uint32_t));
-    uint64_t cgen_var_1566;
-    stream->handleMapping()->mapHandles_VkDevice_u64(&local_device, &cgen_var_1566, 1);
-    stream->write((uint64_t*)&cgen_var_1566, 1 * 8);
-    stream->write((VkFormat*)&local_format, sizeof(VkFormat));
-    stream->write((VkDeviceSize*)pOffset, sizeof(VkDeviceSize));
-    stream->write((VkDeviceSize*)pRowPitchAlignment, sizeof(VkDeviceSize));
+    memcpy(streamPtr, &opcode_vkGetLinearImageLayoutGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetLinearImageLayoutGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1392;
+    *&cgen_var_1392 = get_host_u64_VkDevice((*&local_device));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1392, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (VkFormat*)&local_format, sizeof(VkFormat));
+    *streamPtrPtr += sizeof(VkFormat);
+    memcpy(*streamPtrPtr, (VkDeviceSize*)pOffset, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    memcpy(*streamPtrPtr, (VkDeviceSize*)pRowPitchAlignment, sizeof(VkDeviceSize));
+    *streamPtrPtr += sizeof(VkDeviceSize);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((VkDeviceSize*)pOffset, sizeof(VkDeviceSize));
     stream->read((VkDeviceSize*)pRowPitchAlignment, sizeof(VkDeviceSize));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetLinearImageLayoutGOOGLE");;
 }
 
@@ -23210,223 +27433,295 @@
 #ifdef VK_MVK_moltenvk
 void VkEncoder::vkGetMTLDeviceMVK(
     VkPhysicalDevice physicalDevice,
-    void** pMTLDevice)
+    void** pMTLDevice,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetMTLDeviceMVK");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkPhysicalDevice local_physicalDevice;
+    uint32_t local_doLock;
     local_physicalDevice = physicalDevice;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1567;
-        countingStream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1567, 1);
-        countingStream->write((uint64_t*)&cgen_var_1567, 1 * 8);
-        countingStream->write((void**)pMTLDevice, sizeof(void*));
+        uint64_t cgen_var_1393;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(void*);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetMTLDeviceMVK = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetMTLDeviceMVK = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetMTLDeviceMVK);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetMTLDeviceMVK = OP_vkGetMTLDeviceMVK;
-    stream->write(&opcode_vkGetMTLDeviceMVK, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetMTLDeviceMVK, sizeof(uint32_t));
-    uint64_t cgen_var_1568;
-    stream->handleMapping()->mapHandles_VkPhysicalDevice_u64(&local_physicalDevice, &cgen_var_1568, 1);
-    stream->write((uint64_t*)&cgen_var_1568, 1 * 8);
-    stream->write((void**)pMTLDevice, sizeof(void*));
+    memcpy(streamPtr, &opcode_vkGetMTLDeviceMVK, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetMTLDeviceMVK, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1394;
+    *&cgen_var_1394 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1394, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (void**)pMTLDevice, sizeof(void*));
+    *streamPtrPtr += sizeof(void*);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((void**)pMTLDevice, sizeof(void*));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetMTLDeviceMVK");;
 }
 
 VkResult VkEncoder::vkSetMTLTextureMVK(
     VkImage image,
-    void* mtlTexture)
+    void* mtlTexture,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkSetMTLTextureMVK");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkImage local_image;
+    uint32_t local_doLock;
     local_image = image;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1569;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_1569, 1);
-        countingStream->write((uint64_t*)&cgen_var_1569, 1 * 8);
-        countingStream->write((void*)mtlTexture, sizeof(uint8_t));
+        uint64_t cgen_var_1395;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint8_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkSetMTLTextureMVK = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkSetMTLTextureMVK = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkSetMTLTextureMVK);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkSetMTLTextureMVK = OP_vkSetMTLTextureMVK;
-    stream->write(&opcode_vkSetMTLTextureMVK, sizeof(uint32_t));
-    stream->write(&packetSize_vkSetMTLTextureMVK, sizeof(uint32_t));
-    uint64_t cgen_var_1570;
-    stream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_1570, 1);
-    stream->write((uint64_t*)&cgen_var_1570, 1 * 8);
-    stream->write((void*)mtlTexture, sizeof(uint8_t));
+    memcpy(streamPtr, &opcode_vkSetMTLTextureMVK, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkSetMTLTextureMVK, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1396;
+    *&cgen_var_1396 = get_host_u64_VkImage((*&local_image));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1396, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (void*)mtlTexture, sizeof(uint8_t));
+    *streamPtrPtr += sizeof(uint8_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((void*)mtlTexture, sizeof(uint8_t));
     VkResult vkSetMTLTextureMVK_VkResult_return = (VkResult)0;
     stream->read(&vkSetMTLTextureMVK_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkSetMTLTextureMVK");;
     return vkSetMTLTextureMVK_VkResult_return;
 }
 
 void VkEncoder::vkGetMTLTextureMVK(
     VkImage image,
-    void** pMTLTexture)
+    void** pMTLTexture,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetMTLTextureMVK");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkImage local_image;
+    uint32_t local_doLock;
     local_image = image;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1571;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_1571, 1);
-        countingStream->write((uint64_t*)&cgen_var_1571, 1 * 8);
-        countingStream->write((void**)pMTLTexture, sizeof(void*));
+        uint64_t cgen_var_1397;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(void*);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetMTLTextureMVK = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetMTLTextureMVK = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetMTLTextureMVK);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetMTLTextureMVK = OP_vkGetMTLTextureMVK;
-    stream->write(&opcode_vkGetMTLTextureMVK, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetMTLTextureMVK, sizeof(uint32_t));
-    uint64_t cgen_var_1572;
-    stream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_1572, 1);
-    stream->write((uint64_t*)&cgen_var_1572, 1 * 8);
-    stream->write((void**)pMTLTexture, sizeof(void*));
+    memcpy(streamPtr, &opcode_vkGetMTLTextureMVK, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetMTLTextureMVK, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1398;
+    *&cgen_var_1398 = get_host_u64_VkImage((*&local_image));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1398, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (void**)pMTLTexture, sizeof(void*));
+    *streamPtrPtr += sizeof(void*);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((void**)pMTLTexture, sizeof(void*));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetMTLTextureMVK");;
 }
 
 void VkEncoder::vkGetMTLBufferMVK(
     VkBuffer buffer,
-    void** pMTLBuffer)
+    void** pMTLBuffer,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetMTLBufferMVK");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkBuffer local_buffer;
+    uint32_t local_doLock;
     local_buffer = buffer;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1573;
-        countingStream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_1573, 1);
-        countingStream->write((uint64_t*)&cgen_var_1573, 1 * 8);
-        countingStream->write((void**)pMTLBuffer, sizeof(void*));
+        uint64_t cgen_var_1399;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(void*);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetMTLBufferMVK = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetMTLBufferMVK = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetMTLBufferMVK);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetMTLBufferMVK = OP_vkGetMTLBufferMVK;
-    stream->write(&opcode_vkGetMTLBufferMVK, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetMTLBufferMVK, sizeof(uint32_t));
-    uint64_t cgen_var_1574;
-    stream->handleMapping()->mapHandles_VkBuffer_u64(&local_buffer, &cgen_var_1574, 1);
-    stream->write((uint64_t*)&cgen_var_1574, 1 * 8);
-    stream->write((void**)pMTLBuffer, sizeof(void*));
+    memcpy(streamPtr, &opcode_vkGetMTLBufferMVK, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetMTLBufferMVK, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1400;
+    *&cgen_var_1400 = get_host_u64_VkBuffer((*&local_buffer));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1400, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (void**)pMTLBuffer, sizeof(void*));
+    *streamPtrPtr += sizeof(void*);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((void**)pMTLBuffer, sizeof(void*));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetMTLBufferMVK");;
 }
 
 VkResult VkEncoder::vkUseIOSurfaceMVK(
     VkImage image,
-    void* ioSurface)
+    void* ioSurface,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkUseIOSurfaceMVK");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkImage local_image;
+    uint32_t local_doLock;
     local_image = image;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1575;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_1575, 1);
-        countingStream->write((uint64_t*)&cgen_var_1575, 1 * 8);
-        countingStream->write((void*)ioSurface, sizeof(uint8_t));
+        uint64_t cgen_var_1401;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(uint8_t);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkUseIOSurfaceMVK = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkUseIOSurfaceMVK = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkUseIOSurfaceMVK);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkUseIOSurfaceMVK = OP_vkUseIOSurfaceMVK;
-    stream->write(&opcode_vkUseIOSurfaceMVK, sizeof(uint32_t));
-    stream->write(&packetSize_vkUseIOSurfaceMVK, sizeof(uint32_t));
-    uint64_t cgen_var_1576;
-    stream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_1576, 1);
-    stream->write((uint64_t*)&cgen_var_1576, 1 * 8);
-    stream->write((void*)ioSurface, sizeof(uint8_t));
+    memcpy(streamPtr, &opcode_vkUseIOSurfaceMVK, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkUseIOSurfaceMVK, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1402;
+    *&cgen_var_1402 = get_host_u64_VkImage((*&local_image));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1402, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (void*)ioSurface, sizeof(uint8_t));
+    *streamPtrPtr += sizeof(uint8_t);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((void*)ioSurface, sizeof(uint8_t));
     VkResult vkUseIOSurfaceMVK_VkResult_return = (VkResult)0;
     stream->read(&vkUseIOSurfaceMVK_VkResult_return, sizeof(VkResult));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkUseIOSurfaceMVK");;
     return vkUseIOSurfaceMVK_VkResult_return;
 }
 
 void VkEncoder::vkGetIOSurfaceMVK(
     VkImage image,
-    void** pIOSurface)
+    void** pIOSurface,
+    uint32_t doLock)
 {
-    EncoderAutoLock encoderLock(this);
+    if (doLock) this->lock();
     mImpl->log("start vkGetIOSurfaceMVK");
     auto stream = mImpl->stream();
-    auto countingStream = mImpl->countingStream();
     auto resources = mImpl->resources();
     auto pool = mImpl->pool();
-    stream->setHandleMapping(resources->unwrapMapping());
     VkImage local_image;
+    uint32_t local_doLock;
     local_image = image;
-    countingStream->rewind();
+    local_doLock = doLock;
+    uint32_t featureBits = stream->getFeatureBits();
+    size_t count = 0;
+    size_t* countPtr = &count;
     {
-        uint64_t cgen_var_1577;
-        countingStream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_1577, 1);
-        countingStream->write((uint64_t*)&cgen_var_1577, 1 * 8);
-        countingStream->write((void**)pIOSurface, sizeof(void*));
+        uint64_t cgen_var_1403;
+        *countPtr += 1 * 8;
+        *countPtr += sizeof(void*);
+        *countPtr += sizeof(uint32_t);
     }
-    uint32_t packetSize_vkGetIOSurfaceMVK = 4 + 4 + (uint32_t)countingStream->bytesWritten();
-    countingStream->rewind();
+    uint32_t packetSize_vkGetIOSurfaceMVK = 4 + 4 + count;
+    uint8_t* streamPtr = stream->reserve(packetSize_vkGetIOSurfaceMVK);
+    uint8_t** streamPtrPtr = &streamPtr;
     uint32_t opcode_vkGetIOSurfaceMVK = OP_vkGetIOSurfaceMVK;
-    stream->write(&opcode_vkGetIOSurfaceMVK, sizeof(uint32_t));
-    stream->write(&packetSize_vkGetIOSurfaceMVK, sizeof(uint32_t));
-    uint64_t cgen_var_1578;
-    stream->handleMapping()->mapHandles_VkImage_u64(&local_image, &cgen_var_1578, 1);
-    stream->write((uint64_t*)&cgen_var_1578, 1 * 8);
-    stream->write((void**)pIOSurface, sizeof(void*));
+    memcpy(streamPtr, &opcode_vkGetIOSurfaceMVK, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    memcpy(streamPtr, &packetSize_vkGetIOSurfaceMVK, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+    uint64_t cgen_var_1404;
+    *&cgen_var_1404 = get_host_u64_VkImage((*&local_image));
+    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1404, 1 * 8);
+    *streamPtrPtr += 1 * 8;
+    memcpy(*streamPtrPtr, (void**)pIOSurface, sizeof(void*));
+    *streamPtrPtr += sizeof(void*);
+    memcpy(*streamPtrPtr, (uint32_t*)&local_doLock, sizeof(uint32_t));
+    *streamPtrPtr += sizeof(uint32_t);
     stream->read((void**)pIOSurface, sizeof(void*));
-    pool->freeAll();
-    countingStream->clearPool();
-    stream->clearPool();
+    ++encodeCount;;
+    if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+    {
+        pool->freeAll();
+        stream->clearPool();
+    }
+    if (doLock) this->unlock();
     mImpl->log("finish vkGetIOSurfaceMVK");;
 }
 
diff --git a/system/vulkan_enc/VkEncoder.cpp.inl b/system/vulkan_enc/VkEncoder.cpp.inl
index e8120d1..f38ad4d 100644
--- a/system/vulkan_enc/VkEncoder.cpp.inl
+++ b/system/vulkan_enc/VkEncoder.cpp.inl
@@ -33,37 +33,11 @@
 
     // can be recursive
     void lock() {
-        if (this == sAcquiredEncoderThreadLocal) {
-            ++sAcquiredEncoderThreadLockLevels;
-            return; // recursive
-        }
         while (mLock.test_and_set(std::memory_order_acquire));
-        sAcquiredEncoderThreadLocal = this;
-        sAcquiredEncoderThreadLockLevels = 1;
     }
 
     void unlock() {
-        if (this != sAcquiredEncoderThreadLocal) {
-            // error, trying to unlock without having locked first
-            return;
-        }
-
-        --sAcquiredEncoderThreadLockLevels;
-        if (0 == sAcquiredEncoderThreadLockLevels) {
-            mLock.clear(std::memory_order_release);
-            sAcquiredEncoderThreadLocal = nullptr;
-        }
-    }
-
-    void incRef() {
-        __atomic_add_fetch(&m_refCount, 1, __ATOMIC_SEQ_CST);
-    }
-
-    bool decRef() {
-        if (0 == __atomic_sub_fetch(&m_refCount, 1, __ATOMIC_SEQ_CST)) {
-            return true;
-        }
-        return false;
+        mLock.clear(std::memory_order_release);
     }
 
 private:
@@ -76,7 +50,6 @@
     std::atomic_flag mLock = ATOMIC_FLAG_INIT;
     static thread_local Impl* sAcquiredEncoderThreadLocal;
     static thread_local uint32_t sAcquiredEncoderThreadLockLevels;
-    uint32_t m_refCount = 1;
 };
 
 VkEncoder::~VkEncoder() { }
@@ -111,14 +84,13 @@
 }
 
 void VkEncoder::incRef() {
-    mImpl->incRef();
+    __atomic_add_fetch(&refCount, 1, __ATOMIC_SEQ_CST);
 }
 
 bool VkEncoder::decRef() {
-    if (mImpl->decRef()) {
+    if (0 == __atomic_sub_fetch(&refCount, 1, __ATOMIC_SEQ_CST)) {
         delete this;
         return true;
     }
     return false;
 }
-
diff --git a/system/vulkan_enc/VkEncoder.h b/system/vulkan_enc/VkEncoder.h
index 6e3eba1..affade3 100644
--- a/system/vulkan_enc/VkEncoder.h
+++ b/system/vulkan_enc/VkEncoder.h
@@ -45,21 +45,26 @@
     VkResult vkCreateInstance(
     const VkInstanceCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkInstance* pInstance);
+        VkInstance* pInstance,
+        uint32_t doLock);
     void vkDestroyInstance(
     VkInstance instance,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkEnumeratePhysicalDevices(
     VkInstance instance,
         uint32_t* pPhysicalDeviceCount,
-        VkPhysicalDevice* pPhysicalDevices);
+        VkPhysicalDevice* pPhysicalDevices,
+        uint32_t doLock);
     void vkGetPhysicalDeviceFeatures(
     VkPhysicalDevice physicalDevice,
-        VkPhysicalDeviceFeatures* pFeatures);
+        VkPhysicalDeviceFeatures* pFeatures,
+        uint32_t doLock);
     void vkGetPhysicalDeviceFormatProperties(
     VkPhysicalDevice physicalDevice,
         VkFormat format,
-        VkFormatProperties* pFormatProperties);
+        VkFormatProperties* pFormatProperties,
+        uint32_t doLock);
     VkResult vkGetPhysicalDeviceImageFormatProperties(
     VkPhysicalDevice physicalDevice,
         VkFormat format,
@@ -67,115 +72,143 @@
         VkImageTiling tiling,
         VkImageUsageFlags usage,
         VkImageCreateFlags flags,
-        VkImageFormatProperties* pImageFormatProperties);
+        VkImageFormatProperties* pImageFormatProperties,
+        uint32_t doLock);
     void vkGetPhysicalDeviceProperties(
     VkPhysicalDevice physicalDevice,
-        VkPhysicalDeviceProperties* pProperties);
+        VkPhysicalDeviceProperties* pProperties,
+        uint32_t doLock);
     void vkGetPhysicalDeviceQueueFamilyProperties(
     VkPhysicalDevice physicalDevice,
         uint32_t* pQueueFamilyPropertyCount,
-        VkQueueFamilyProperties* pQueueFamilyProperties);
+        VkQueueFamilyProperties* pQueueFamilyProperties,
+        uint32_t doLock);
     void vkGetPhysicalDeviceMemoryProperties(
     VkPhysicalDevice physicalDevice,
-        VkPhysicalDeviceMemoryProperties* pMemoryProperties);
+        VkPhysicalDeviceMemoryProperties* pMemoryProperties,
+        uint32_t doLock);
     PFN_vkVoidFunction vkGetInstanceProcAddr(
     VkInstance instance,
-        const char* pName);
+        const char* pName,
+        uint32_t doLock);
     PFN_vkVoidFunction vkGetDeviceProcAddr(
     VkDevice device,
-        const char* pName);
+        const char* pName,
+        uint32_t doLock);
     VkResult vkCreateDevice(
     VkPhysicalDevice physicalDevice,
         const VkDeviceCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkDevice* pDevice);
+        VkDevice* pDevice,
+        uint32_t doLock);
     void vkDestroyDevice(
     VkDevice device,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkEnumerateInstanceExtensionProperties(
     const char* pLayerName,
         uint32_t* pPropertyCount,
-        VkExtensionProperties* pProperties);
+        VkExtensionProperties* pProperties,
+        uint32_t doLock);
     VkResult vkEnumerateDeviceExtensionProperties(
     VkPhysicalDevice physicalDevice,
         const char* pLayerName,
         uint32_t* pPropertyCount,
-        VkExtensionProperties* pProperties);
+        VkExtensionProperties* pProperties,
+        uint32_t doLock);
     VkResult vkEnumerateInstanceLayerProperties(
     uint32_t* pPropertyCount,
-        VkLayerProperties* pProperties);
+        VkLayerProperties* pProperties,
+        uint32_t doLock);
     VkResult vkEnumerateDeviceLayerProperties(
     VkPhysicalDevice physicalDevice,
         uint32_t* pPropertyCount,
-        VkLayerProperties* pProperties);
+        VkLayerProperties* pProperties,
+        uint32_t doLock);
     void vkGetDeviceQueue(
     VkDevice device,
         uint32_t queueFamilyIndex,
         uint32_t queueIndex,
-        VkQueue* pQueue);
+        VkQueue* pQueue,
+        uint32_t doLock);
     VkResult vkQueueSubmit(
     VkQueue queue,
         uint32_t submitCount,
         const VkSubmitInfo* pSubmits,
-        VkFence fence);
+        VkFence fence,
+        uint32_t doLock);
     VkResult vkQueueWaitIdle(
-    VkQueue queue);
+    VkQueue queue,
+        uint32_t doLock);
     VkResult vkDeviceWaitIdle(
-    VkDevice device);
+    VkDevice device,
+        uint32_t doLock);
     VkResult vkAllocateMemory(
     VkDevice device,
         const VkMemoryAllocateInfo* pAllocateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkDeviceMemory* pMemory);
+        VkDeviceMemory* pMemory,
+        uint32_t doLock);
     void vkFreeMemory(
     VkDevice device,
         VkDeviceMemory memory,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkMapMemory(
     VkDevice device,
         VkDeviceMemory memory,
         VkDeviceSize offset,
         VkDeviceSize size,
         VkMemoryMapFlags flags,
-        void** ppData);
+        void** ppData,
+        uint32_t doLock);
     void vkUnmapMemory(
     VkDevice device,
-        VkDeviceMemory memory);
+        VkDeviceMemory memory,
+        uint32_t doLock);
     VkResult vkFlushMappedMemoryRanges(
     VkDevice device,
         uint32_t memoryRangeCount,
-        const VkMappedMemoryRange* pMemoryRanges);
+        const VkMappedMemoryRange* pMemoryRanges,
+        uint32_t doLock);
     VkResult vkInvalidateMappedMemoryRanges(
     VkDevice device,
         uint32_t memoryRangeCount,
-        const VkMappedMemoryRange* pMemoryRanges);
+        const VkMappedMemoryRange* pMemoryRanges,
+        uint32_t doLock);
     void vkGetDeviceMemoryCommitment(
     VkDevice device,
         VkDeviceMemory memory,
-        VkDeviceSize* pCommittedMemoryInBytes);
+        VkDeviceSize* pCommittedMemoryInBytes,
+        uint32_t doLock);
     VkResult vkBindBufferMemory(
     VkDevice device,
         VkBuffer buffer,
         VkDeviceMemory memory,
-        VkDeviceSize memoryOffset);
+        VkDeviceSize memoryOffset,
+        uint32_t doLock);
     VkResult vkBindImageMemory(
     VkDevice device,
         VkImage image,
         VkDeviceMemory memory,
-        VkDeviceSize memoryOffset);
+        VkDeviceSize memoryOffset,
+        uint32_t doLock);
     void vkGetBufferMemoryRequirements(
     VkDevice device,
         VkBuffer buffer,
-        VkMemoryRequirements* pMemoryRequirements);
+        VkMemoryRequirements* pMemoryRequirements,
+        uint32_t doLock);
     void vkGetImageMemoryRequirements(
     VkDevice device,
         VkImage image,
-        VkMemoryRequirements* pMemoryRequirements);
+        VkMemoryRequirements* pMemoryRequirements,
+        uint32_t doLock);
     void vkGetImageSparseMemoryRequirements(
     VkDevice device,
         VkImage image,
         uint32_t* pSparseMemoryRequirementCount,
-        VkSparseImageMemoryRequirements* pSparseMemoryRequirements);
+        VkSparseImageMemoryRequirements* pSparseMemoryRequirements,
+        uint32_t doLock);
     void vkGetPhysicalDeviceSparseImageFormatProperties(
     VkPhysicalDevice physicalDevice,
         VkFormat format,
@@ -184,70 +217,86 @@
         VkImageUsageFlags usage,
         VkImageTiling tiling,
         uint32_t* pPropertyCount,
-        VkSparseImageFormatProperties* pProperties);
+        VkSparseImageFormatProperties* pProperties,
+        uint32_t doLock);
     VkResult vkQueueBindSparse(
     VkQueue queue,
         uint32_t bindInfoCount,
         const VkBindSparseInfo* pBindInfo,
-        VkFence fence);
+        VkFence fence,
+        uint32_t doLock);
     VkResult vkCreateFence(
     VkDevice device,
         const VkFenceCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkFence* pFence);
+        VkFence* pFence,
+        uint32_t doLock);
     void vkDestroyFence(
     VkDevice device,
         VkFence fence,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkResetFences(
     VkDevice device,
         uint32_t fenceCount,
-        const VkFence* pFences);
+        const VkFence* pFences,
+        uint32_t doLock);
     VkResult vkGetFenceStatus(
     VkDevice device,
-        VkFence fence);
+        VkFence fence,
+        uint32_t doLock);
     VkResult vkWaitForFences(
     VkDevice device,
         uint32_t fenceCount,
         const VkFence* pFences,
         VkBool32 waitAll,
-        uint64_t timeout);
+        uint64_t timeout,
+        uint32_t doLock);
     VkResult vkCreateSemaphore(
     VkDevice device,
         const VkSemaphoreCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkSemaphore* pSemaphore);
+        VkSemaphore* pSemaphore,
+        uint32_t doLock);
     void vkDestroySemaphore(
     VkDevice device,
         VkSemaphore semaphore,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkCreateEvent(
     VkDevice device,
         const VkEventCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkEvent* pEvent);
+        VkEvent* pEvent,
+        uint32_t doLock);
     void vkDestroyEvent(
     VkDevice device,
         VkEvent event,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkGetEventStatus(
     VkDevice device,
-        VkEvent event);
+        VkEvent event,
+        uint32_t doLock);
     VkResult vkSetEvent(
     VkDevice device,
-        VkEvent event);
+        VkEvent event,
+        uint32_t doLock);
     VkResult vkResetEvent(
     VkDevice device,
-        VkEvent event);
+        VkEvent event,
+        uint32_t doLock);
     VkResult vkCreateQueryPool(
     VkDevice device,
         const VkQueryPoolCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkQueryPool* pQueryPool);
+        VkQueryPool* pQueryPool,
+        uint32_t doLock);
     void vkDestroyQueryPool(
     VkDevice device,
         VkQueryPool queryPool,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkGetQueryPoolResults(
     VkDevice device,
         VkQueryPool queryPool,
@@ -256,242 +305,296 @@
         size_t dataSize,
         void* pData,
         VkDeviceSize stride,
-        VkQueryResultFlags flags);
+        VkQueryResultFlags flags,
+        uint32_t doLock);
     VkResult vkCreateBuffer(
     VkDevice device,
         const VkBufferCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkBuffer* pBuffer);
+        VkBuffer* pBuffer,
+        uint32_t doLock);
     void vkDestroyBuffer(
     VkDevice device,
         VkBuffer buffer,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkCreateBufferView(
     VkDevice device,
         const VkBufferViewCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkBufferView* pView);
+        VkBufferView* pView,
+        uint32_t doLock);
     void vkDestroyBufferView(
     VkDevice device,
         VkBufferView bufferView,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkCreateImage(
     VkDevice device,
         const VkImageCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkImage* pImage);
+        VkImage* pImage,
+        uint32_t doLock);
     void vkDestroyImage(
     VkDevice device,
         VkImage image,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     void vkGetImageSubresourceLayout(
     VkDevice device,
         VkImage image,
         const VkImageSubresource* pSubresource,
-        VkSubresourceLayout* pLayout);
+        VkSubresourceLayout* pLayout,
+        uint32_t doLock);
     VkResult vkCreateImageView(
     VkDevice device,
         const VkImageViewCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkImageView* pView);
+        VkImageView* pView,
+        uint32_t doLock);
     void vkDestroyImageView(
     VkDevice device,
         VkImageView imageView,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkCreateShaderModule(
     VkDevice device,
         const VkShaderModuleCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkShaderModule* pShaderModule);
+        VkShaderModule* pShaderModule,
+        uint32_t doLock);
     void vkDestroyShaderModule(
     VkDevice device,
         VkShaderModule shaderModule,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkCreatePipelineCache(
     VkDevice device,
         const VkPipelineCacheCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkPipelineCache* pPipelineCache);
+        VkPipelineCache* pPipelineCache,
+        uint32_t doLock);
     void vkDestroyPipelineCache(
     VkDevice device,
         VkPipelineCache pipelineCache,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkGetPipelineCacheData(
     VkDevice device,
         VkPipelineCache pipelineCache,
         size_t* pDataSize,
-        void* pData);
+        void* pData,
+        uint32_t doLock);
     VkResult vkMergePipelineCaches(
     VkDevice device,
         VkPipelineCache dstCache,
         uint32_t srcCacheCount,
-        const VkPipelineCache* pSrcCaches);
+        const VkPipelineCache* pSrcCaches,
+        uint32_t doLock);
     VkResult vkCreateGraphicsPipelines(
     VkDevice device,
         VkPipelineCache pipelineCache,
         uint32_t createInfoCount,
         const VkGraphicsPipelineCreateInfo* pCreateInfos,
         const VkAllocationCallbacks* pAllocator,
-        VkPipeline* pPipelines);
+        VkPipeline* pPipelines,
+        uint32_t doLock);
     VkResult vkCreateComputePipelines(
     VkDevice device,
         VkPipelineCache pipelineCache,
         uint32_t createInfoCount,
         const VkComputePipelineCreateInfo* pCreateInfos,
         const VkAllocationCallbacks* pAllocator,
-        VkPipeline* pPipelines);
+        VkPipeline* pPipelines,
+        uint32_t doLock);
     void vkDestroyPipeline(
     VkDevice device,
         VkPipeline pipeline,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkCreatePipelineLayout(
     VkDevice device,
         const VkPipelineLayoutCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkPipelineLayout* pPipelineLayout);
+        VkPipelineLayout* pPipelineLayout,
+        uint32_t doLock);
     void vkDestroyPipelineLayout(
     VkDevice device,
         VkPipelineLayout pipelineLayout,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkCreateSampler(
     VkDevice device,
         const VkSamplerCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkSampler* pSampler);
+        VkSampler* pSampler,
+        uint32_t doLock);
     void vkDestroySampler(
     VkDevice device,
         VkSampler sampler,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkCreateDescriptorSetLayout(
     VkDevice device,
         const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkDescriptorSetLayout* pSetLayout);
+        VkDescriptorSetLayout* pSetLayout,
+        uint32_t doLock);
     void vkDestroyDescriptorSetLayout(
     VkDevice device,
         VkDescriptorSetLayout descriptorSetLayout,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkCreateDescriptorPool(
     VkDevice device,
         const VkDescriptorPoolCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkDescriptorPool* pDescriptorPool);
+        VkDescriptorPool* pDescriptorPool,
+        uint32_t doLock);
     void vkDestroyDescriptorPool(
     VkDevice device,
         VkDescriptorPool descriptorPool,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkResetDescriptorPool(
     VkDevice device,
         VkDescriptorPool descriptorPool,
-        VkDescriptorPoolResetFlags flags);
+        VkDescriptorPoolResetFlags flags,
+        uint32_t doLock);
     VkResult vkAllocateDescriptorSets(
     VkDevice device,
         const VkDescriptorSetAllocateInfo* pAllocateInfo,
-        VkDescriptorSet* pDescriptorSets);
+        VkDescriptorSet* pDescriptorSets,
+        uint32_t doLock);
     VkResult vkFreeDescriptorSets(
     VkDevice device,
         VkDescriptorPool descriptorPool,
         uint32_t descriptorSetCount,
-        const VkDescriptorSet* pDescriptorSets);
+        const VkDescriptorSet* pDescriptorSets,
+        uint32_t doLock);
     void vkUpdateDescriptorSets(
     VkDevice device,
         uint32_t descriptorWriteCount,
         const VkWriteDescriptorSet* pDescriptorWrites,
         uint32_t descriptorCopyCount,
-        const VkCopyDescriptorSet* pDescriptorCopies);
+        const VkCopyDescriptorSet* pDescriptorCopies,
+        uint32_t doLock);
     VkResult vkCreateFramebuffer(
     VkDevice device,
         const VkFramebufferCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkFramebuffer* pFramebuffer);
+        VkFramebuffer* pFramebuffer,
+        uint32_t doLock);
     void vkDestroyFramebuffer(
     VkDevice device,
         VkFramebuffer framebuffer,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkCreateRenderPass(
     VkDevice device,
         const VkRenderPassCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkRenderPass* pRenderPass);
+        VkRenderPass* pRenderPass,
+        uint32_t doLock);
     void vkDestroyRenderPass(
     VkDevice device,
         VkRenderPass renderPass,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     void vkGetRenderAreaGranularity(
     VkDevice device,
         VkRenderPass renderPass,
-        VkExtent2D* pGranularity);
+        VkExtent2D* pGranularity,
+        uint32_t doLock);
     VkResult vkCreateCommandPool(
     VkDevice device,
         const VkCommandPoolCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkCommandPool* pCommandPool);
+        VkCommandPool* pCommandPool,
+        uint32_t doLock);
     void vkDestroyCommandPool(
     VkDevice device,
         VkCommandPool commandPool,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkResetCommandPool(
     VkDevice device,
         VkCommandPool commandPool,
-        VkCommandPoolResetFlags flags);
+        VkCommandPoolResetFlags flags,
+        uint32_t doLock);
     VkResult vkAllocateCommandBuffers(
     VkDevice device,
         const VkCommandBufferAllocateInfo* pAllocateInfo,
-        VkCommandBuffer* pCommandBuffers);
+        VkCommandBuffer* pCommandBuffers,
+        uint32_t doLock);
     void vkFreeCommandBuffers(
     VkDevice device,
         VkCommandPool commandPool,
         uint32_t commandBufferCount,
-        const VkCommandBuffer* pCommandBuffers);
+        const VkCommandBuffer* pCommandBuffers,
+        uint32_t doLock);
     VkResult vkBeginCommandBuffer(
     VkCommandBuffer commandBuffer,
-        const VkCommandBufferBeginInfo* pBeginInfo);
+        const VkCommandBufferBeginInfo* pBeginInfo,
+        uint32_t doLock);
     VkResult vkEndCommandBuffer(
-    VkCommandBuffer commandBuffer);
+    VkCommandBuffer commandBuffer,
+        uint32_t doLock);
     VkResult vkResetCommandBuffer(
     VkCommandBuffer commandBuffer,
-        VkCommandBufferResetFlags flags);
+        VkCommandBufferResetFlags flags,
+        uint32_t doLock);
     void vkCmdBindPipeline(
     VkCommandBuffer commandBuffer,
         VkPipelineBindPoint pipelineBindPoint,
-        VkPipeline pipeline);
+        VkPipeline pipeline,
+        uint32_t doLock);
     void vkCmdSetViewport(
     VkCommandBuffer commandBuffer,
         uint32_t firstViewport,
         uint32_t viewportCount,
-        const VkViewport* pViewports);
+        const VkViewport* pViewports,
+        uint32_t doLock);
     void vkCmdSetScissor(
     VkCommandBuffer commandBuffer,
         uint32_t firstScissor,
         uint32_t scissorCount,
-        const VkRect2D* pScissors);
+        const VkRect2D* pScissors,
+        uint32_t doLock);
     void vkCmdSetLineWidth(
     VkCommandBuffer commandBuffer,
-        float lineWidth);
+        float lineWidth,
+        uint32_t doLock);
     void vkCmdSetDepthBias(
     VkCommandBuffer commandBuffer,
         float depthBiasConstantFactor,
         float depthBiasClamp,
-        float depthBiasSlopeFactor);
+        float depthBiasSlopeFactor,
+        uint32_t doLock);
     void vkCmdSetBlendConstants(
     VkCommandBuffer commandBuffer,
-        const float blendConstants[4]);
+        const float blendConstants[4],
+        uint32_t doLock);
     void vkCmdSetDepthBounds(
     VkCommandBuffer commandBuffer,
         float minDepthBounds,
-        float maxDepthBounds);
+        float maxDepthBounds,
+        uint32_t doLock);
     void vkCmdSetStencilCompareMask(
     VkCommandBuffer commandBuffer,
         VkStencilFaceFlags faceMask,
-        uint32_t compareMask);
+        uint32_t compareMask,
+        uint32_t doLock);
     void vkCmdSetStencilWriteMask(
     VkCommandBuffer commandBuffer,
         VkStencilFaceFlags faceMask,
-        uint32_t writeMask);
+        uint32_t writeMask,
+        uint32_t doLock);
     void vkCmdSetStencilReference(
     VkCommandBuffer commandBuffer,
         VkStencilFaceFlags faceMask,
-        uint32_t reference);
+        uint32_t reference,
+        uint32_t doLock);
     void vkCmdBindDescriptorSets(
     VkCommandBuffer commandBuffer,
         VkPipelineBindPoint pipelineBindPoint,
@@ -500,58 +603,68 @@
         uint32_t descriptorSetCount,
         const VkDescriptorSet* pDescriptorSets,
         uint32_t dynamicOffsetCount,
-        const uint32_t* pDynamicOffsets);
+        const uint32_t* pDynamicOffsets,
+        uint32_t doLock);
     void vkCmdBindIndexBuffer(
     VkCommandBuffer commandBuffer,
         VkBuffer buffer,
         VkDeviceSize offset,
-        VkIndexType indexType);
+        VkIndexType indexType,
+        uint32_t doLock);
     void vkCmdBindVertexBuffers(
     VkCommandBuffer commandBuffer,
         uint32_t firstBinding,
         uint32_t bindingCount,
         const VkBuffer* pBuffers,
-        const VkDeviceSize* pOffsets);
+        const VkDeviceSize* pOffsets,
+        uint32_t doLock);
     void vkCmdDraw(
     VkCommandBuffer commandBuffer,
         uint32_t vertexCount,
         uint32_t instanceCount,
         uint32_t firstVertex,
-        uint32_t firstInstance);
+        uint32_t firstInstance,
+        uint32_t doLock);
     void vkCmdDrawIndexed(
     VkCommandBuffer commandBuffer,
         uint32_t indexCount,
         uint32_t instanceCount,
         uint32_t firstIndex,
         int32_t vertexOffset,
-        uint32_t firstInstance);
+        uint32_t firstInstance,
+        uint32_t doLock);
     void vkCmdDrawIndirect(
     VkCommandBuffer commandBuffer,
         VkBuffer buffer,
         VkDeviceSize offset,
         uint32_t drawCount,
-        uint32_t stride);
+        uint32_t stride,
+        uint32_t doLock);
     void vkCmdDrawIndexedIndirect(
     VkCommandBuffer commandBuffer,
         VkBuffer buffer,
         VkDeviceSize offset,
         uint32_t drawCount,
-        uint32_t stride);
+        uint32_t stride,
+        uint32_t doLock);
     void vkCmdDispatch(
     VkCommandBuffer commandBuffer,
         uint32_t groupCountX,
         uint32_t groupCountY,
-        uint32_t groupCountZ);
+        uint32_t groupCountZ,
+        uint32_t doLock);
     void vkCmdDispatchIndirect(
     VkCommandBuffer commandBuffer,
         VkBuffer buffer,
-        VkDeviceSize offset);
+        VkDeviceSize offset,
+        uint32_t doLock);
     void vkCmdCopyBuffer(
     VkCommandBuffer commandBuffer,
         VkBuffer srcBuffer,
         VkBuffer dstBuffer,
         uint32_t regionCount,
-        const VkBufferCopy* pRegions);
+        const VkBufferCopy* pRegions,
+        uint32_t doLock);
     void vkCmdCopyImage(
     VkCommandBuffer commandBuffer,
         VkImage srcImage,
@@ -559,7 +672,8 @@
         VkImage dstImage,
         VkImageLayout dstImageLayout,
         uint32_t regionCount,
-        const VkImageCopy* pRegions);
+        const VkImageCopy* pRegions,
+        uint32_t doLock);
     void vkCmdBlitImage(
     VkCommandBuffer commandBuffer,
         VkImage srcImage,
@@ -568,53 +682,61 @@
         VkImageLayout dstImageLayout,
         uint32_t regionCount,
         const VkImageBlit* pRegions,
-        VkFilter filter);
+        VkFilter filter,
+        uint32_t doLock);
     void vkCmdCopyBufferToImage(
     VkCommandBuffer commandBuffer,
         VkBuffer srcBuffer,
         VkImage dstImage,
         VkImageLayout dstImageLayout,
         uint32_t regionCount,
-        const VkBufferImageCopy* pRegions);
+        const VkBufferImageCopy* pRegions,
+        uint32_t doLock);
     void vkCmdCopyImageToBuffer(
     VkCommandBuffer commandBuffer,
         VkImage srcImage,
         VkImageLayout srcImageLayout,
         VkBuffer dstBuffer,
         uint32_t regionCount,
-        const VkBufferImageCopy* pRegions);
+        const VkBufferImageCopy* pRegions,
+        uint32_t doLock);
     void vkCmdUpdateBuffer(
     VkCommandBuffer commandBuffer,
         VkBuffer dstBuffer,
         VkDeviceSize dstOffset,
         VkDeviceSize dataSize,
-        const void* pData);
+        const void* pData,
+        uint32_t doLock);
     void vkCmdFillBuffer(
     VkCommandBuffer commandBuffer,
         VkBuffer dstBuffer,
         VkDeviceSize dstOffset,
         VkDeviceSize size,
-        uint32_t data);
+        uint32_t data,
+        uint32_t doLock);
     void vkCmdClearColorImage(
     VkCommandBuffer commandBuffer,
         VkImage image,
         VkImageLayout imageLayout,
         const VkClearColorValue* pColor,
         uint32_t rangeCount,
-        const VkImageSubresourceRange* pRanges);
+        const VkImageSubresourceRange* pRanges,
+        uint32_t doLock);
     void vkCmdClearDepthStencilImage(
     VkCommandBuffer commandBuffer,
         VkImage image,
         VkImageLayout imageLayout,
         const VkClearDepthStencilValue* pDepthStencil,
         uint32_t rangeCount,
-        const VkImageSubresourceRange* pRanges);
+        const VkImageSubresourceRange* pRanges,
+        uint32_t doLock);
     void vkCmdClearAttachments(
     VkCommandBuffer commandBuffer,
         uint32_t attachmentCount,
         const VkClearAttachment* pAttachments,
         uint32_t rectCount,
-        const VkClearRect* pRects);
+        const VkClearRect* pRects,
+        uint32_t doLock);
     void vkCmdResolveImage(
     VkCommandBuffer commandBuffer,
         VkImage srcImage,
@@ -622,15 +744,18 @@
         VkImage dstImage,
         VkImageLayout dstImageLayout,
         uint32_t regionCount,
-        const VkImageResolve* pRegions);
+        const VkImageResolve* pRegions,
+        uint32_t doLock);
     void vkCmdSetEvent(
     VkCommandBuffer commandBuffer,
         VkEvent event,
-        VkPipelineStageFlags stageMask);
+        VkPipelineStageFlags stageMask,
+        uint32_t doLock);
     void vkCmdResetEvent(
     VkCommandBuffer commandBuffer,
         VkEvent event,
-        VkPipelineStageFlags stageMask);
+        VkPipelineStageFlags stageMask,
+        uint32_t doLock);
     void vkCmdWaitEvents(
     VkCommandBuffer commandBuffer,
         uint32_t eventCount,
@@ -642,7 +767,8 @@
         uint32_t bufferMemoryBarrierCount,
         const VkBufferMemoryBarrier* pBufferMemoryBarriers,
         uint32_t imageMemoryBarrierCount,
-        const VkImageMemoryBarrier* pImageMemoryBarriers);
+        const VkImageMemoryBarrier* pImageMemoryBarriers,
+        uint32_t doLock);
     void vkCmdPipelineBarrier(
     VkCommandBuffer commandBuffer,
         VkPipelineStageFlags srcStageMask,
@@ -653,26 +779,31 @@
         uint32_t bufferMemoryBarrierCount,
         const VkBufferMemoryBarrier* pBufferMemoryBarriers,
         uint32_t imageMemoryBarrierCount,
-        const VkImageMemoryBarrier* pImageMemoryBarriers);
+        const VkImageMemoryBarrier* pImageMemoryBarriers,
+        uint32_t doLock);
     void vkCmdBeginQuery(
     VkCommandBuffer commandBuffer,
         VkQueryPool queryPool,
         uint32_t query,
-        VkQueryControlFlags flags);
+        VkQueryControlFlags flags,
+        uint32_t doLock);
     void vkCmdEndQuery(
     VkCommandBuffer commandBuffer,
         VkQueryPool queryPool,
-        uint32_t query);
+        uint32_t query,
+        uint32_t doLock);
     void vkCmdResetQueryPool(
     VkCommandBuffer commandBuffer,
         VkQueryPool queryPool,
         uint32_t firstQuery,
-        uint32_t queryCount);
+        uint32_t queryCount,
+        uint32_t doLock);
     void vkCmdWriteTimestamp(
     VkCommandBuffer commandBuffer,
         VkPipelineStageFlagBits pipelineStage,
         VkQueryPool queryPool,
-        uint32_t query);
+        uint32_t query,
+        uint32_t doLock);
     void vkCmdCopyQueryPoolResults(
     VkCommandBuffer commandBuffer,
         VkQueryPool queryPool,
@@ -681,48 +812,59 @@
         VkBuffer dstBuffer,
         VkDeviceSize dstOffset,
         VkDeviceSize stride,
-        VkQueryResultFlags flags);
+        VkQueryResultFlags flags,
+        uint32_t doLock);
     void vkCmdPushConstants(
     VkCommandBuffer commandBuffer,
         VkPipelineLayout layout,
         VkShaderStageFlags stageFlags,
         uint32_t offset,
         uint32_t size,
-        const void* pValues);
+        const void* pValues,
+        uint32_t doLock);
     void vkCmdBeginRenderPass(
     VkCommandBuffer commandBuffer,
         const VkRenderPassBeginInfo* pRenderPassBegin,
-        VkSubpassContents contents);
+        VkSubpassContents contents,
+        uint32_t doLock);
     void vkCmdNextSubpass(
     VkCommandBuffer commandBuffer,
-        VkSubpassContents contents);
+        VkSubpassContents contents,
+        uint32_t doLock);
     void vkCmdEndRenderPass(
-    VkCommandBuffer commandBuffer);
+    VkCommandBuffer commandBuffer,
+        uint32_t doLock);
     void vkCmdExecuteCommands(
     VkCommandBuffer commandBuffer,
         uint32_t commandBufferCount,
-        const VkCommandBuffer* pCommandBuffers);
+        const VkCommandBuffer* pCommandBuffers,
+        uint32_t doLock);
 #endif
 #ifdef VK_VERSION_1_1
     VkResult vkEnumerateInstanceVersion(
-    uint32_t* pApiVersion);
+    uint32_t* pApiVersion,
+        uint32_t doLock);
     VkResult vkBindBufferMemory2(
     VkDevice device,
         uint32_t bindInfoCount,
-        const VkBindBufferMemoryInfo* pBindInfos);
+        const VkBindBufferMemoryInfo* pBindInfos,
+        uint32_t doLock);
     VkResult vkBindImageMemory2(
     VkDevice device,
         uint32_t bindInfoCount,
-        const VkBindImageMemoryInfo* pBindInfos);
+        const VkBindImageMemoryInfo* pBindInfos,
+        uint32_t doLock);
     void vkGetDeviceGroupPeerMemoryFeatures(
     VkDevice device,
         uint32_t heapIndex,
         uint32_t localDeviceIndex,
         uint32_t remoteDeviceIndex,
-        VkPeerMemoryFeatureFlags* pPeerMemoryFeatures);
+        VkPeerMemoryFeatureFlags* pPeerMemoryFeatures,
+        uint32_t doLock);
     void vkCmdSetDeviceMask(
     VkCommandBuffer commandBuffer,
-        uint32_t deviceMask);
+        uint32_t deviceMask,
+        uint32_t doLock);
     void vkCmdDispatchBase(
     VkCommandBuffer commandBuffer,
         uint32_t baseGroupX,
@@ -730,200 +872,244 @@
         uint32_t baseGroupZ,
         uint32_t groupCountX,
         uint32_t groupCountY,
-        uint32_t groupCountZ);
+        uint32_t groupCountZ,
+        uint32_t doLock);
     VkResult vkEnumeratePhysicalDeviceGroups(
     VkInstance instance,
         uint32_t* pPhysicalDeviceGroupCount,
-        VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties);
+        VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties,
+        uint32_t doLock);
     void vkGetImageMemoryRequirements2(
     VkDevice device,
         const VkImageMemoryRequirementsInfo2* pInfo,
-        VkMemoryRequirements2* pMemoryRequirements);
+        VkMemoryRequirements2* pMemoryRequirements,
+        uint32_t doLock);
     void vkGetBufferMemoryRequirements2(
     VkDevice device,
         const VkBufferMemoryRequirementsInfo2* pInfo,
-        VkMemoryRequirements2* pMemoryRequirements);
+        VkMemoryRequirements2* pMemoryRequirements,
+        uint32_t doLock);
     void vkGetImageSparseMemoryRequirements2(
     VkDevice device,
         const VkImageSparseMemoryRequirementsInfo2* pInfo,
         uint32_t* pSparseMemoryRequirementCount,
-        VkSparseImageMemoryRequirements2* pSparseMemoryRequirements);
+        VkSparseImageMemoryRequirements2* pSparseMemoryRequirements,
+        uint32_t doLock);
     void vkGetPhysicalDeviceFeatures2(
     VkPhysicalDevice physicalDevice,
-        VkPhysicalDeviceFeatures2* pFeatures);
+        VkPhysicalDeviceFeatures2* pFeatures,
+        uint32_t doLock);
     void vkGetPhysicalDeviceProperties2(
     VkPhysicalDevice physicalDevice,
-        VkPhysicalDeviceProperties2* pProperties);
+        VkPhysicalDeviceProperties2* pProperties,
+        uint32_t doLock);
     void vkGetPhysicalDeviceFormatProperties2(
     VkPhysicalDevice physicalDevice,
         VkFormat format,
-        VkFormatProperties2* pFormatProperties);
+        VkFormatProperties2* pFormatProperties,
+        uint32_t doLock);
     VkResult vkGetPhysicalDeviceImageFormatProperties2(
     VkPhysicalDevice physicalDevice,
         const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
-        VkImageFormatProperties2* pImageFormatProperties);
+        VkImageFormatProperties2* pImageFormatProperties,
+        uint32_t doLock);
     void vkGetPhysicalDeviceQueueFamilyProperties2(
     VkPhysicalDevice physicalDevice,
         uint32_t* pQueueFamilyPropertyCount,
-        VkQueueFamilyProperties2* pQueueFamilyProperties);
+        VkQueueFamilyProperties2* pQueueFamilyProperties,
+        uint32_t doLock);
     void vkGetPhysicalDeviceMemoryProperties2(
     VkPhysicalDevice physicalDevice,
-        VkPhysicalDeviceMemoryProperties2* pMemoryProperties);
+        VkPhysicalDeviceMemoryProperties2* pMemoryProperties,
+        uint32_t doLock);
     void vkGetPhysicalDeviceSparseImageFormatProperties2(
     VkPhysicalDevice physicalDevice,
         const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo,
         uint32_t* pPropertyCount,
-        VkSparseImageFormatProperties2* pProperties);
+        VkSparseImageFormatProperties2* pProperties,
+        uint32_t doLock);
     void vkTrimCommandPool(
     VkDevice device,
         VkCommandPool commandPool,
-        VkCommandPoolTrimFlags flags);
+        VkCommandPoolTrimFlags flags,
+        uint32_t doLock);
     void vkGetDeviceQueue2(
     VkDevice device,
         const VkDeviceQueueInfo2* pQueueInfo,
-        VkQueue* pQueue);
+        VkQueue* pQueue,
+        uint32_t doLock);
     VkResult vkCreateSamplerYcbcrConversion(
     VkDevice device,
         const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkSamplerYcbcrConversion* pYcbcrConversion);
+        VkSamplerYcbcrConversion* pYcbcrConversion,
+        uint32_t doLock);
     void vkDestroySamplerYcbcrConversion(
     VkDevice device,
         VkSamplerYcbcrConversion ycbcrConversion,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkCreateDescriptorUpdateTemplate(
     VkDevice device,
         const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate);
+        VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate,
+        uint32_t doLock);
     void vkDestroyDescriptorUpdateTemplate(
     VkDevice device,
         VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     void vkUpdateDescriptorSetWithTemplate(
     VkDevice device,
         VkDescriptorSet descriptorSet,
         VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-        const void* pData);
+        const void* pData,
+        uint32_t doLock);
     void vkGetPhysicalDeviceExternalBufferProperties(
     VkPhysicalDevice physicalDevice,
         const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo,
-        VkExternalBufferProperties* pExternalBufferProperties);
+        VkExternalBufferProperties* pExternalBufferProperties,
+        uint32_t doLock);
     void vkGetPhysicalDeviceExternalFenceProperties(
     VkPhysicalDevice physicalDevice,
         const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo,
-        VkExternalFenceProperties* pExternalFenceProperties);
+        VkExternalFenceProperties* pExternalFenceProperties,
+        uint32_t doLock);
     void vkGetPhysicalDeviceExternalSemaphoreProperties(
     VkPhysicalDevice physicalDevice,
         const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,
-        VkExternalSemaphoreProperties* pExternalSemaphoreProperties);
+        VkExternalSemaphoreProperties* pExternalSemaphoreProperties,
+        uint32_t doLock);
     void vkGetDescriptorSetLayoutSupport(
     VkDevice device,
         const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
-        VkDescriptorSetLayoutSupport* pSupport);
+        VkDescriptorSetLayoutSupport* pSupport,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_surface
     void vkDestroySurfaceKHR(
     VkInstance instance,
         VkSurfaceKHR surface,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkGetPhysicalDeviceSurfaceSupportKHR(
     VkPhysicalDevice physicalDevice,
         uint32_t queueFamilyIndex,
         VkSurfaceKHR surface,
-        VkBool32* pSupported);
+        VkBool32* pSupported,
+        uint32_t doLock);
     VkResult vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
     VkPhysicalDevice physicalDevice,
         VkSurfaceKHR surface,
-        VkSurfaceCapabilitiesKHR* pSurfaceCapabilities);
+        VkSurfaceCapabilitiesKHR* pSurfaceCapabilities,
+        uint32_t doLock);
     VkResult vkGetPhysicalDeviceSurfaceFormatsKHR(
     VkPhysicalDevice physicalDevice,
         VkSurfaceKHR surface,
         uint32_t* pSurfaceFormatCount,
-        VkSurfaceFormatKHR* pSurfaceFormats);
+        VkSurfaceFormatKHR* pSurfaceFormats,
+        uint32_t doLock);
     VkResult vkGetPhysicalDeviceSurfacePresentModesKHR(
     VkPhysicalDevice physicalDevice,
         VkSurfaceKHR surface,
         uint32_t* pPresentModeCount,
-        VkPresentModeKHR* pPresentModes);
+        VkPresentModeKHR* pPresentModes,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_swapchain
     VkResult vkCreateSwapchainKHR(
     VkDevice device,
         const VkSwapchainCreateInfoKHR* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkSwapchainKHR* pSwapchain);
+        VkSwapchainKHR* pSwapchain,
+        uint32_t doLock);
     void vkDestroySwapchainKHR(
     VkDevice device,
         VkSwapchainKHR swapchain,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkGetSwapchainImagesKHR(
     VkDevice device,
         VkSwapchainKHR swapchain,
         uint32_t* pSwapchainImageCount,
-        VkImage* pSwapchainImages);
+        VkImage* pSwapchainImages,
+        uint32_t doLock);
     VkResult vkAcquireNextImageKHR(
     VkDevice device,
         VkSwapchainKHR swapchain,
         uint64_t timeout,
         VkSemaphore semaphore,
         VkFence fence,
-        uint32_t* pImageIndex);
+        uint32_t* pImageIndex,
+        uint32_t doLock);
     VkResult vkQueuePresentKHR(
     VkQueue queue,
-        const VkPresentInfoKHR* pPresentInfo);
+        const VkPresentInfoKHR* pPresentInfo,
+        uint32_t doLock);
     VkResult vkGetDeviceGroupPresentCapabilitiesKHR(
     VkDevice device,
-        VkDeviceGroupPresentCapabilitiesKHR* pDeviceGroupPresentCapabilities);
+        VkDeviceGroupPresentCapabilitiesKHR* pDeviceGroupPresentCapabilities,
+        uint32_t doLock);
     VkResult vkGetDeviceGroupSurfacePresentModesKHR(
     VkDevice device,
         VkSurfaceKHR surface,
-        VkDeviceGroupPresentModeFlagsKHR* pModes);
+        VkDeviceGroupPresentModeFlagsKHR* pModes,
+        uint32_t doLock);
     VkResult vkGetPhysicalDevicePresentRectanglesKHR(
     VkPhysicalDevice physicalDevice,
         VkSurfaceKHR surface,
         uint32_t* pRectCount,
-        VkRect2D* pRects);
+        VkRect2D* pRects,
+        uint32_t doLock);
     VkResult vkAcquireNextImage2KHR(
     VkDevice device,
         const VkAcquireNextImageInfoKHR* pAcquireInfo,
-        uint32_t* pImageIndex);
+        uint32_t* pImageIndex,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_display
     VkResult vkGetPhysicalDeviceDisplayPropertiesKHR(
     VkPhysicalDevice physicalDevice,
         uint32_t* pPropertyCount,
-        VkDisplayPropertiesKHR* pProperties);
+        VkDisplayPropertiesKHR* pProperties,
+        uint32_t doLock);
     VkResult vkGetPhysicalDeviceDisplayPlanePropertiesKHR(
     VkPhysicalDevice physicalDevice,
         uint32_t* pPropertyCount,
-        VkDisplayPlanePropertiesKHR* pProperties);
+        VkDisplayPlanePropertiesKHR* pProperties,
+        uint32_t doLock);
     VkResult vkGetDisplayPlaneSupportedDisplaysKHR(
     VkPhysicalDevice physicalDevice,
         uint32_t planeIndex,
         uint32_t* pDisplayCount,
-        VkDisplayKHR* pDisplays);
+        VkDisplayKHR* pDisplays,
+        uint32_t doLock);
     VkResult vkGetDisplayModePropertiesKHR(
     VkPhysicalDevice physicalDevice,
         VkDisplayKHR display,
         uint32_t* pPropertyCount,
-        VkDisplayModePropertiesKHR* pProperties);
+        VkDisplayModePropertiesKHR* pProperties,
+        uint32_t doLock);
     VkResult vkCreateDisplayModeKHR(
     VkPhysicalDevice physicalDevice,
         VkDisplayKHR display,
         const VkDisplayModeCreateInfoKHR* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkDisplayModeKHR* pMode);
+        VkDisplayModeKHR* pMode,
+        uint32_t doLock);
     VkResult vkGetDisplayPlaneCapabilitiesKHR(
     VkPhysicalDevice physicalDevice,
         VkDisplayModeKHR mode,
         uint32_t planeIndex,
-        VkDisplayPlaneCapabilitiesKHR* pCapabilities);
+        VkDisplayPlaneCapabilitiesKHR* pCapabilities,
+        uint32_t doLock);
     VkResult vkCreateDisplayPlaneSurfaceKHR(
     VkInstance instance,
         const VkDisplaySurfaceCreateInfoKHR* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+        VkSurfaceKHR* pSurface,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_display_swapchain
     VkResult vkCreateSharedSwapchainsKHR(
@@ -931,70 +1117,82 @@
         uint32_t swapchainCount,
         const VkSwapchainCreateInfoKHR* pCreateInfos,
         const VkAllocationCallbacks* pAllocator,
-        VkSwapchainKHR* pSwapchains);
+        VkSwapchainKHR* pSwapchains,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_xlib_surface
     VkResult vkCreateXlibSurfaceKHR(
     VkInstance instance,
         const VkXlibSurfaceCreateInfoKHR* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+        VkSurfaceKHR* pSurface,
+        uint32_t doLock);
     VkBool32 vkGetPhysicalDeviceXlibPresentationSupportKHR(
     VkPhysicalDevice physicalDevice,
         uint32_t queueFamilyIndex,
         Display* dpy,
-        VisualID visualID);
+        VisualID visualID,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_xcb_surface
     VkResult vkCreateXcbSurfaceKHR(
     VkInstance instance,
         const VkXcbSurfaceCreateInfoKHR* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+        VkSurfaceKHR* pSurface,
+        uint32_t doLock);
     VkBool32 vkGetPhysicalDeviceXcbPresentationSupportKHR(
     VkPhysicalDevice physicalDevice,
         uint32_t queueFamilyIndex,
         xcb_connection_t* connection,
-        xcb_visualid_t visual_id);
+        xcb_visualid_t visual_id,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_wayland_surface
     VkResult vkCreateWaylandSurfaceKHR(
     VkInstance instance,
         const VkWaylandSurfaceCreateInfoKHR* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+        VkSurfaceKHR* pSurface,
+        uint32_t doLock);
     VkBool32 vkGetPhysicalDeviceWaylandPresentationSupportKHR(
     VkPhysicalDevice physicalDevice,
         uint32_t queueFamilyIndex,
-        wl_display* display);
+        wl_display* display,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_mir_surface
     VkResult vkCreateMirSurfaceKHR(
     VkInstance instance,
         const VkMirSurfaceCreateInfoKHR* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+        VkSurfaceKHR* pSurface,
+        uint32_t doLock);
     VkBool32 vkGetPhysicalDeviceMirPresentationSupportKHR(
     VkPhysicalDevice physicalDevice,
         uint32_t queueFamilyIndex,
-        MirConnection* connection);
+        MirConnection* connection,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_android_surface
     VkResult vkCreateAndroidSurfaceKHR(
     VkInstance instance,
         const VkAndroidSurfaceCreateInfoKHR* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+        VkSurfaceKHR* pSurface,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_win32_surface
     VkResult vkCreateWin32SurfaceKHR(
     VkInstance instance,
         const VkWin32SurfaceCreateInfoKHR* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+        VkSurfaceKHR* pSurface,
+        uint32_t doLock);
     VkBool32 vkGetPhysicalDeviceWin32PresentationSupportKHR(
     VkPhysicalDevice physicalDevice,
-        uint32_t queueFamilyIndex);
+        uint32_t queueFamilyIndex,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_sampler_mirror_clamp_to_edge
 #endif
@@ -1003,30 +1201,37 @@
 #ifdef VK_KHR_get_physical_device_properties2
     void vkGetPhysicalDeviceFeatures2KHR(
     VkPhysicalDevice physicalDevice,
-        VkPhysicalDeviceFeatures2* pFeatures);
+        VkPhysicalDeviceFeatures2* pFeatures,
+        uint32_t doLock);
     void vkGetPhysicalDeviceProperties2KHR(
     VkPhysicalDevice physicalDevice,
-        VkPhysicalDeviceProperties2* pProperties);
+        VkPhysicalDeviceProperties2* pProperties,
+        uint32_t doLock);
     void vkGetPhysicalDeviceFormatProperties2KHR(
     VkPhysicalDevice physicalDevice,
         VkFormat format,
-        VkFormatProperties2* pFormatProperties);
+        VkFormatProperties2* pFormatProperties,
+        uint32_t doLock);
     VkResult vkGetPhysicalDeviceImageFormatProperties2KHR(
     VkPhysicalDevice physicalDevice,
         const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
-        VkImageFormatProperties2* pImageFormatProperties);
+        VkImageFormatProperties2* pImageFormatProperties,
+        uint32_t doLock);
     void vkGetPhysicalDeviceQueueFamilyProperties2KHR(
     VkPhysicalDevice physicalDevice,
         uint32_t* pQueueFamilyPropertyCount,
-        VkQueueFamilyProperties2* pQueueFamilyProperties);
+        VkQueueFamilyProperties2* pQueueFamilyProperties,
+        uint32_t doLock);
     void vkGetPhysicalDeviceMemoryProperties2KHR(
     VkPhysicalDevice physicalDevice,
-        VkPhysicalDeviceMemoryProperties2* pMemoryProperties);
+        VkPhysicalDeviceMemoryProperties2* pMemoryProperties,
+        uint32_t doLock);
     void vkGetPhysicalDeviceSparseImageFormatProperties2KHR(
     VkPhysicalDevice physicalDevice,
         const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo,
         uint32_t* pPropertyCount,
-        VkSparseImageFormatProperties2* pProperties);
+        VkSparseImageFormatProperties2* pProperties,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_device_group
     void vkGetDeviceGroupPeerMemoryFeaturesKHR(
@@ -1034,10 +1239,12 @@
         uint32_t heapIndex,
         uint32_t localDeviceIndex,
         uint32_t remoteDeviceIndex,
-        VkPeerMemoryFeatureFlags* pPeerMemoryFeatures);
+        VkPeerMemoryFeatureFlags* pPeerMemoryFeatures,
+        uint32_t doLock);
     void vkCmdSetDeviceMaskKHR(
     VkCommandBuffer commandBuffer,
-        uint32_t deviceMask);
+        uint32_t deviceMask,
+        uint32_t doLock);
     void vkCmdDispatchBaseKHR(
     VkCommandBuffer commandBuffer,
         uint32_t baseGroupX,
@@ -1045,7 +1252,8 @@
         uint32_t baseGroupZ,
         uint32_t groupCountX,
         uint32_t groupCountY,
-        uint32_t groupCountZ);
+        uint32_t groupCountZ,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_shader_draw_parameters
 #endif
@@ -1053,19 +1261,22 @@
     void vkTrimCommandPoolKHR(
     VkDevice device,
         VkCommandPool commandPool,
-        VkCommandPoolTrimFlags flags);
+        VkCommandPoolTrimFlags flags,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_device_group_creation
     VkResult vkEnumeratePhysicalDeviceGroupsKHR(
     VkInstance instance,
         uint32_t* pPhysicalDeviceGroupCount,
-        VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties);
+        VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_external_memory_capabilities
     void vkGetPhysicalDeviceExternalBufferPropertiesKHR(
     VkPhysicalDevice physicalDevice,
         const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo,
-        VkExternalBufferProperties* pExternalBufferProperties);
+        VkExternalBufferProperties* pExternalBufferProperties,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_external_memory
 #endif
@@ -1073,23 +1284,27 @@
     VkResult vkGetMemoryWin32HandleKHR(
     VkDevice device,
         const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo,
-        HANDLE* pHandle);
+        HANDLE* pHandle,
+        uint32_t doLock);
     VkResult vkGetMemoryWin32HandlePropertiesKHR(
     VkDevice device,
         VkExternalMemoryHandleTypeFlagBits handleType,
         HANDLE handle,
-        VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties);
+        VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_external_memory_fd
     VkResult vkGetMemoryFdKHR(
     VkDevice device,
         const VkMemoryGetFdInfoKHR* pGetFdInfo,
-        int* pFd);
+        int* pFd,
+        uint32_t doLock);
     VkResult vkGetMemoryFdPropertiesKHR(
     VkDevice device,
         VkExternalMemoryHandleTypeFlagBits handleType,
         int fd,
-        VkMemoryFdPropertiesKHR* pMemoryFdProperties);
+        VkMemoryFdPropertiesKHR* pMemoryFdProperties,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_win32_keyed_mutex
 #endif
@@ -1097,27 +1312,32 @@
     void vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(
     VkPhysicalDevice physicalDevice,
         const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,
-        VkExternalSemaphoreProperties* pExternalSemaphoreProperties);
+        VkExternalSemaphoreProperties* pExternalSemaphoreProperties,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_external_semaphore
 #endif
 #ifdef VK_KHR_external_semaphore_win32
     VkResult vkImportSemaphoreWin32HandleKHR(
     VkDevice device,
-        const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo);
+        const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo,
+        uint32_t doLock);
     VkResult vkGetSemaphoreWin32HandleKHR(
     VkDevice device,
         const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo,
-        HANDLE* pHandle);
+        HANDLE* pHandle,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_external_semaphore_fd
     VkResult vkImportSemaphoreFdKHR(
     VkDevice device,
-        const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo);
+        const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo,
+        uint32_t doLock);
     VkResult vkGetSemaphoreFdKHR(
     VkDevice device,
         const VkSemaphoreGetFdInfoKHR* pGetFdInfo,
-        int* pFd);
+        int* pFd,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_push_descriptor
     void vkCmdPushDescriptorSetKHR(
@@ -1126,13 +1346,15 @@
         VkPipelineLayout layout,
         uint32_t set,
         uint32_t descriptorWriteCount,
-        const VkWriteDescriptorSet* pDescriptorWrites);
+        const VkWriteDescriptorSet* pDescriptorWrites,
+        uint32_t doLock);
     void vkCmdPushDescriptorSetWithTemplateKHR(
     VkCommandBuffer commandBuffer,
         VkDescriptorUpdateTemplate descriptorUpdateTemplate,
         VkPipelineLayout layout,
         uint32_t set,
-        const void* pData);
+        const void* pData,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_16bit_storage
 #endif
@@ -1143,65 +1365,78 @@
     VkDevice device,
         const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate);
+        VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate,
+        uint32_t doLock);
     void vkDestroyDescriptorUpdateTemplateKHR(
     VkDevice device,
         VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     void vkUpdateDescriptorSetWithTemplateKHR(
     VkDevice device,
         VkDescriptorSet descriptorSet,
         VkDescriptorUpdateTemplate descriptorUpdateTemplate,
-        const void* pData);
+        const void* pData,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_create_renderpass2
     VkResult vkCreateRenderPass2KHR(
     VkDevice device,
         const VkRenderPassCreateInfo2KHR* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkRenderPass* pRenderPass);
+        VkRenderPass* pRenderPass,
+        uint32_t doLock);
     void vkCmdBeginRenderPass2KHR(
     VkCommandBuffer commandBuffer,
         const VkRenderPassBeginInfo* pRenderPassBegin,
-        const VkSubpassBeginInfoKHR* pSubpassBeginInfo);
+        const VkSubpassBeginInfoKHR* pSubpassBeginInfo,
+        uint32_t doLock);
     void vkCmdNextSubpass2KHR(
     VkCommandBuffer commandBuffer,
         const VkSubpassBeginInfoKHR* pSubpassBeginInfo,
-        const VkSubpassEndInfoKHR* pSubpassEndInfo);
+        const VkSubpassEndInfoKHR* pSubpassEndInfo,
+        uint32_t doLock);
     void vkCmdEndRenderPass2KHR(
     VkCommandBuffer commandBuffer,
-        const VkSubpassEndInfoKHR* pSubpassEndInfo);
+        const VkSubpassEndInfoKHR* pSubpassEndInfo,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_shared_presentable_image
     VkResult vkGetSwapchainStatusKHR(
     VkDevice device,
-        VkSwapchainKHR swapchain);
+        VkSwapchainKHR swapchain,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_external_fence_capabilities
     void vkGetPhysicalDeviceExternalFencePropertiesKHR(
     VkPhysicalDevice physicalDevice,
         const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo,
-        VkExternalFenceProperties* pExternalFenceProperties);
+        VkExternalFenceProperties* pExternalFenceProperties,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_external_fence
 #endif
 #ifdef VK_KHR_external_fence_win32
     VkResult vkImportFenceWin32HandleKHR(
     VkDevice device,
-        const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo);
+        const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo,
+        uint32_t doLock);
     VkResult vkGetFenceWin32HandleKHR(
     VkDevice device,
         const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo,
-        HANDLE* pHandle);
+        HANDLE* pHandle,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_external_fence_fd
     VkResult vkImportFenceFdKHR(
     VkDevice device,
-        const VkImportFenceFdInfoKHR* pImportFenceFdInfo);
+        const VkImportFenceFdInfoKHR* pImportFenceFdInfo,
+        uint32_t doLock);
     VkResult vkGetFenceFdKHR(
     VkDevice device,
         const VkFenceGetFdInfoKHR* pGetFdInfo,
-        int* pFd);
+        int* pFd,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_maintenance2
 #endif
@@ -1209,12 +1444,14 @@
     VkResult vkGetPhysicalDeviceSurfaceCapabilities2KHR(
     VkPhysicalDevice physicalDevice,
         const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
-        VkSurfaceCapabilities2KHR* pSurfaceCapabilities);
+        VkSurfaceCapabilities2KHR* pSurfaceCapabilities,
+        uint32_t doLock);
     VkResult vkGetPhysicalDeviceSurfaceFormats2KHR(
     VkPhysicalDevice physicalDevice,
         const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
         uint32_t* pSurfaceFormatCount,
-        VkSurfaceFormat2KHR* pSurfaceFormats);
+        VkSurfaceFormat2KHR* pSurfaceFormats,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_variable_pointers
 #endif
@@ -1222,20 +1459,24 @@
     VkResult vkGetPhysicalDeviceDisplayProperties2KHR(
     VkPhysicalDevice physicalDevice,
         uint32_t* pPropertyCount,
-        VkDisplayProperties2KHR* pProperties);
+        VkDisplayProperties2KHR* pProperties,
+        uint32_t doLock);
     VkResult vkGetPhysicalDeviceDisplayPlaneProperties2KHR(
     VkPhysicalDevice physicalDevice,
         uint32_t* pPropertyCount,
-        VkDisplayPlaneProperties2KHR* pProperties);
+        VkDisplayPlaneProperties2KHR* pProperties,
+        uint32_t doLock);
     VkResult vkGetDisplayModeProperties2KHR(
     VkPhysicalDevice physicalDevice,
         VkDisplayKHR display,
         uint32_t* pPropertyCount,
-        VkDisplayModeProperties2KHR* pProperties);
+        VkDisplayModeProperties2KHR* pProperties,
+        uint32_t doLock);
     VkResult vkGetDisplayPlaneCapabilities2KHR(
     VkPhysicalDevice physicalDevice,
         const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo,
-        VkDisplayPlaneCapabilities2KHR* pCapabilities);
+        VkDisplayPlaneCapabilities2KHR* pCapabilities,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_dedicated_allocation
 #endif
@@ -1247,16 +1488,19 @@
     void vkGetImageMemoryRequirements2KHR(
     VkDevice device,
         const VkImageMemoryRequirementsInfo2* pInfo,
-        VkMemoryRequirements2* pMemoryRequirements);
+        VkMemoryRequirements2* pMemoryRequirements,
+        uint32_t doLock);
     void vkGetBufferMemoryRequirements2KHR(
     VkDevice device,
         const VkBufferMemoryRequirementsInfo2* pInfo,
-        VkMemoryRequirements2* pMemoryRequirements);
+        VkMemoryRequirements2* pMemoryRequirements,
+        uint32_t doLock);
     void vkGetImageSparseMemoryRequirements2KHR(
     VkDevice device,
         const VkImageSparseMemoryRequirementsInfo2* pInfo,
         uint32_t* pSparseMemoryRequirementCount,
-        VkSparseImageMemoryRequirements2* pSparseMemoryRequirements);
+        VkSparseImageMemoryRequirements2* pSparseMemoryRequirements,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_image_format_list
 #endif
@@ -1265,27 +1509,32 @@
     VkDevice device,
         const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkSamplerYcbcrConversion* pYcbcrConversion);
+        VkSamplerYcbcrConversion* pYcbcrConversion,
+        uint32_t doLock);
     void vkDestroySamplerYcbcrConversionKHR(
     VkDevice device,
         VkSamplerYcbcrConversion ycbcrConversion,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_bind_memory2
     VkResult vkBindBufferMemory2KHR(
     VkDevice device,
         uint32_t bindInfoCount,
-        const VkBindBufferMemoryInfo* pBindInfos);
+        const VkBindBufferMemoryInfo* pBindInfos,
+        uint32_t doLock);
     VkResult vkBindImageMemory2KHR(
     VkDevice device,
         uint32_t bindInfoCount,
-        const VkBindImageMemoryInfo* pBindInfos);
+        const VkBindImageMemoryInfo* pBindInfos,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_maintenance3
     void vkGetDescriptorSetLayoutSupportKHR(
     VkDevice device,
         const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
-        VkDescriptorSetLayoutSupport* pSupport);
+        VkDescriptorSetLayoutSupport* pSupport,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_draw_indirect_count
     void vkCmdDrawIndirectCountKHR(
@@ -1295,7 +1544,8 @@
         VkBuffer countBuffer,
         VkDeviceSize countBufferOffset,
         uint32_t maxDrawCount,
-        uint32_t stride);
+        uint32_t stride,
+        uint32_t doLock);
     void vkCmdDrawIndexedIndirectCountKHR(
     VkCommandBuffer commandBuffer,
         VkBuffer buffer,
@@ -1303,7 +1553,8 @@
         VkBuffer countBuffer,
         VkDeviceSize countBufferOffset,
         uint32_t maxDrawCount,
-        uint32_t stride);
+        uint32_t stride,
+        uint32_t doLock);
 #endif
 #ifdef VK_KHR_8bit_storage
 #endif
@@ -1314,30 +1565,35 @@
     VkDevice device,
         VkFormat format,
         VkImageUsageFlags imageUsage,
-        int* grallocUsage);
+        int* grallocUsage,
+        uint32_t doLock);
     VkResult vkAcquireImageANDROID(
     VkDevice device,
         VkImage image,
         int nativeFenceFd,
         VkSemaphore semaphore,
-        VkFence fence);
+        VkFence fence,
+        uint32_t doLock);
     VkResult vkQueueSignalReleaseImageANDROID(
     VkQueue queue,
         uint32_t waitSemaphoreCount,
         const VkSemaphore* pWaitSemaphores,
         VkImage image,
-        int* pNativeFenceFd);
+        int* pNativeFenceFd,
+        uint32_t doLock);
 #endif
 #ifdef VK_EXT_debug_report
     VkResult vkCreateDebugReportCallbackEXT(
     VkInstance instance,
         const VkDebugReportCallbackCreateInfoEXT* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkDebugReportCallbackEXT* pCallback);
+        VkDebugReportCallbackEXT* pCallback,
+        uint32_t doLock);
     void vkDestroyDebugReportCallbackEXT(
     VkInstance instance,
         VkDebugReportCallbackEXT callback,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     void vkDebugReportMessageEXT(
     VkInstance instance,
         VkDebugReportFlagsEXT flags,
@@ -1346,7 +1602,8 @@
         size_t location,
         int32_t messageCode,
         const char* pLayerPrefix,
-        const char* pMessage);
+        const char* pMessage,
+        uint32_t doLock);
 #endif
 #ifdef VK_NV_glsl_shader
 #endif
@@ -1363,18 +1620,23 @@
 #ifdef VK_EXT_debug_marker
     VkResult vkDebugMarkerSetObjectTagEXT(
     VkDevice device,
-        const VkDebugMarkerObjectTagInfoEXT* pTagInfo);
+        const VkDebugMarkerObjectTagInfoEXT* pTagInfo,
+        uint32_t doLock);
     VkResult vkDebugMarkerSetObjectNameEXT(
     VkDevice device,
-        const VkDebugMarkerObjectNameInfoEXT* pNameInfo);
+        const VkDebugMarkerObjectNameInfoEXT* pNameInfo,
+        uint32_t doLock);
     void vkCmdDebugMarkerBeginEXT(
     VkCommandBuffer commandBuffer,
-        const VkDebugMarkerMarkerInfoEXT* pMarkerInfo);
+        const VkDebugMarkerMarkerInfoEXT* pMarkerInfo,
+        uint32_t doLock);
     void vkCmdDebugMarkerEndEXT(
-    VkCommandBuffer commandBuffer);
+    VkCommandBuffer commandBuffer,
+        uint32_t doLock);
     void vkCmdDebugMarkerInsertEXT(
     VkCommandBuffer commandBuffer,
-        const VkDebugMarkerMarkerInfoEXT* pMarkerInfo);
+        const VkDebugMarkerMarkerInfoEXT* pMarkerInfo,
+        uint32_t doLock);
 #endif
 #ifdef VK_AMD_gcn_shader
 #endif
@@ -1388,7 +1650,8 @@
         VkBuffer countBuffer,
         VkDeviceSize countBufferOffset,
         uint32_t maxDrawCount,
-        uint32_t stride);
+        uint32_t stride,
+        uint32_t doLock);
     void vkCmdDrawIndexedIndirectCountAMD(
     VkCommandBuffer commandBuffer,
         VkBuffer buffer,
@@ -1396,7 +1659,8 @@
         VkBuffer countBuffer,
         VkDeviceSize countBufferOffset,
         uint32_t maxDrawCount,
-        uint32_t stride);
+        uint32_t stride,
+        uint32_t doLock);
 #endif
 #ifdef VK_AMD_negative_viewport_height
 #endif
@@ -1413,7 +1677,8 @@
         VkShaderStageFlagBits shaderStage,
         VkShaderInfoTypeAMD infoType,
         size_t* pInfoSize,
-        void* pInfo);
+        void* pInfo,
+        uint32_t doLock);
 #endif
 #ifdef VK_AMD_shader_image_load_store_lod
 #endif
@@ -1428,7 +1693,8 @@
         VkImageUsageFlags usage,
         VkImageCreateFlags flags,
         VkExternalMemoryHandleTypeFlagsNV externalHandleType,
-        VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties);
+        VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties,
+        uint32_t doLock);
 #endif
 #ifdef VK_NV_external_memory
 #endif
@@ -1437,7 +1703,8 @@
     VkDevice device,
         VkDeviceMemory memory,
         VkExternalMemoryHandleTypeFlagsNV handleType,
-        HANDLE* pHandle);
+        HANDLE* pHandle,
+        uint32_t doLock);
 #endif
 #ifdef VK_NV_win32_keyed_mutex
 #endif
@@ -1448,7 +1715,8 @@
     VkInstance instance,
         const VkViSurfaceCreateInfoNN* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+        VkSurfaceKHR* pSurface,
+        uint32_t doLock);
 #endif
 #ifdef VK_EXT_shader_subgroup_ballot
 #endif
@@ -1457,113 +1725,135 @@
 #ifdef VK_EXT_conditional_rendering
     void vkCmdBeginConditionalRenderingEXT(
     VkCommandBuffer commandBuffer,
-        const VkConditionalRenderingBeginInfoEXT* pConditionalRenderingBegin);
+        const VkConditionalRenderingBeginInfoEXT* pConditionalRenderingBegin,
+        uint32_t doLock);
     void vkCmdEndConditionalRenderingEXT(
-    VkCommandBuffer commandBuffer);
+    VkCommandBuffer commandBuffer,
+        uint32_t doLock);
 #endif
 #ifdef VK_NVX_device_generated_commands
     void vkCmdProcessCommandsNVX(
     VkCommandBuffer commandBuffer,
-        const VkCmdProcessCommandsInfoNVX* pProcessCommandsInfo);
+        const VkCmdProcessCommandsInfoNVX* pProcessCommandsInfo,
+        uint32_t doLock);
     void vkCmdReserveSpaceForCommandsNVX(
     VkCommandBuffer commandBuffer,
-        const VkCmdReserveSpaceForCommandsInfoNVX* pReserveSpaceInfo);
+        const VkCmdReserveSpaceForCommandsInfoNVX* pReserveSpaceInfo,
+        uint32_t doLock);
     VkResult vkCreateIndirectCommandsLayoutNVX(
     VkDevice device,
         const VkIndirectCommandsLayoutCreateInfoNVX* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkIndirectCommandsLayoutNVX* pIndirectCommandsLayout);
+        VkIndirectCommandsLayoutNVX* pIndirectCommandsLayout,
+        uint32_t doLock);
     void vkDestroyIndirectCommandsLayoutNVX(
     VkDevice device,
         VkIndirectCommandsLayoutNVX indirectCommandsLayout,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkCreateObjectTableNVX(
     VkDevice device,
         const VkObjectTableCreateInfoNVX* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkObjectTableNVX* pObjectTable);
+        VkObjectTableNVX* pObjectTable,
+        uint32_t doLock);
     void vkDestroyObjectTableNVX(
     VkDevice device,
         VkObjectTableNVX objectTable,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkRegisterObjectsNVX(
     VkDevice device,
         VkObjectTableNVX objectTable,
         uint32_t objectCount,
         const VkObjectTableEntryNVX* const* ppObjectTableEntries,
-        const uint32_t* pObjectIndices);
+        const uint32_t* pObjectIndices,
+        uint32_t doLock);
     VkResult vkUnregisterObjectsNVX(
     VkDevice device,
         VkObjectTableNVX objectTable,
         uint32_t objectCount,
         const VkObjectEntryTypeNVX* pObjectEntryTypes,
-        const uint32_t* pObjectIndices);
+        const uint32_t* pObjectIndices,
+        uint32_t doLock);
     void vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX(
     VkPhysicalDevice physicalDevice,
         VkDeviceGeneratedCommandsFeaturesNVX* pFeatures,
-        VkDeviceGeneratedCommandsLimitsNVX* pLimits);
+        VkDeviceGeneratedCommandsLimitsNVX* pLimits,
+        uint32_t doLock);
 #endif
 #ifdef VK_NV_clip_space_w_scaling
     void vkCmdSetViewportWScalingNV(
     VkCommandBuffer commandBuffer,
         uint32_t firstViewport,
         uint32_t viewportCount,
-        const VkViewportWScalingNV* pViewportWScalings);
+        const VkViewportWScalingNV* pViewportWScalings,
+        uint32_t doLock);
 #endif
 #ifdef VK_EXT_direct_mode_display
     VkResult vkReleaseDisplayEXT(
     VkPhysicalDevice physicalDevice,
-        VkDisplayKHR display);
+        VkDisplayKHR display,
+        uint32_t doLock);
 #endif
 #ifdef VK_EXT_acquire_xlib_display
     VkResult vkAcquireXlibDisplayEXT(
     VkPhysicalDevice physicalDevice,
         Display* dpy,
-        VkDisplayKHR display);
+        VkDisplayKHR display,
+        uint32_t doLock);
     VkResult vkGetRandROutputDisplayEXT(
     VkPhysicalDevice physicalDevice,
         Display* dpy,
         RROutput rrOutput,
-        VkDisplayKHR* pDisplay);
+        VkDisplayKHR* pDisplay,
+        uint32_t doLock);
 #endif
 #ifdef VK_EXT_display_surface_counter
     VkResult vkGetPhysicalDeviceSurfaceCapabilities2EXT(
     VkPhysicalDevice physicalDevice,
         VkSurfaceKHR surface,
-        VkSurfaceCapabilities2EXT* pSurfaceCapabilities);
+        VkSurfaceCapabilities2EXT* pSurfaceCapabilities,
+        uint32_t doLock);
 #endif
 #ifdef VK_EXT_display_control
     VkResult vkDisplayPowerControlEXT(
     VkDevice device,
         VkDisplayKHR display,
-        const VkDisplayPowerInfoEXT* pDisplayPowerInfo);
+        const VkDisplayPowerInfoEXT* pDisplayPowerInfo,
+        uint32_t doLock);
     VkResult vkRegisterDeviceEventEXT(
     VkDevice device,
         const VkDeviceEventInfoEXT* pDeviceEventInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkFence* pFence);
+        VkFence* pFence,
+        uint32_t doLock);
     VkResult vkRegisterDisplayEventEXT(
     VkDevice device,
         VkDisplayKHR display,
         const VkDisplayEventInfoEXT* pDisplayEventInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkFence* pFence);
+        VkFence* pFence,
+        uint32_t doLock);
     VkResult vkGetSwapchainCounterEXT(
     VkDevice device,
         VkSwapchainKHR swapchain,
         VkSurfaceCounterFlagBitsEXT counter,
-        uint64_t* pCounterValue);
+        uint64_t* pCounterValue,
+        uint32_t doLock);
 #endif
 #ifdef VK_GOOGLE_display_timing
     VkResult vkGetRefreshCycleDurationGOOGLE(
     VkDevice device,
         VkSwapchainKHR swapchain,
-        VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties);
+        VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties,
+        uint32_t doLock);
     VkResult vkGetPastPresentationTimingGOOGLE(
     VkDevice device,
         VkSwapchainKHR swapchain,
         uint32_t* pPresentationTimingCount,
-        VkPastPresentationTimingGOOGLE* pPresentationTimings);
+        VkPastPresentationTimingGOOGLE* pPresentationTimings,
+        uint32_t doLock);
 #endif
 #ifdef VK_NV_sample_mask_override_coverage
 #endif
@@ -1580,7 +1870,8 @@
     VkCommandBuffer commandBuffer,
         uint32_t firstDiscardRectangle,
         uint32_t discardRectangleCount,
-        const VkRect2D* pDiscardRectangles);
+        const VkRect2D* pDiscardRectangles,
+        uint32_t doLock);
 #endif
 #ifdef VK_EXT_conservative_rasterization
 #endif
@@ -1591,21 +1882,24 @@
     VkDevice device,
         uint32_t swapchainCount,
         const VkSwapchainKHR* pSwapchains,
-        const VkHdrMetadataEXT* pMetadata);
+        const VkHdrMetadataEXT* pMetadata,
+        uint32_t doLock);
 #endif
 #ifdef VK_MVK_ios_surface
     VkResult vkCreateIOSSurfaceMVK(
     VkInstance instance,
         const VkIOSSurfaceCreateInfoMVK* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+        VkSurfaceKHR* pSurface,
+        uint32_t doLock);
 #endif
 #ifdef VK_MVK_macos_surface
     VkResult vkCreateMacOSSurfaceMVK(
     VkInstance instance,
         const VkMacOSSurfaceCreateInfoMVK* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkSurfaceKHR* pSurface);
+        VkSurfaceKHR* pSurface,
+        uint32_t doLock);
 #endif
 #ifdef VK_EXT_external_memory_dma_buf
 #endif
@@ -1614,50 +1908,63 @@
 #ifdef VK_EXT_debug_utils
     VkResult vkSetDebugUtilsObjectNameEXT(
     VkDevice device,
-        const VkDebugUtilsObjectNameInfoEXT* pNameInfo);
+        const VkDebugUtilsObjectNameInfoEXT* pNameInfo,
+        uint32_t doLock);
     VkResult vkSetDebugUtilsObjectTagEXT(
     VkDevice device,
-        const VkDebugUtilsObjectTagInfoEXT* pTagInfo);
+        const VkDebugUtilsObjectTagInfoEXT* pTagInfo,
+        uint32_t doLock);
     void vkQueueBeginDebugUtilsLabelEXT(
     VkQueue queue,
-        const VkDebugUtilsLabelEXT* pLabelInfo);
+        const VkDebugUtilsLabelEXT* pLabelInfo,
+        uint32_t doLock);
     void vkQueueEndDebugUtilsLabelEXT(
-    VkQueue queue);
+    VkQueue queue,
+        uint32_t doLock);
     void vkQueueInsertDebugUtilsLabelEXT(
     VkQueue queue,
-        const VkDebugUtilsLabelEXT* pLabelInfo);
+        const VkDebugUtilsLabelEXT* pLabelInfo,
+        uint32_t doLock);
     void vkCmdBeginDebugUtilsLabelEXT(
     VkCommandBuffer commandBuffer,
-        const VkDebugUtilsLabelEXT* pLabelInfo);
+        const VkDebugUtilsLabelEXT* pLabelInfo,
+        uint32_t doLock);
     void vkCmdEndDebugUtilsLabelEXT(
-    VkCommandBuffer commandBuffer);
+    VkCommandBuffer commandBuffer,
+        uint32_t doLock);
     void vkCmdInsertDebugUtilsLabelEXT(
     VkCommandBuffer commandBuffer,
-        const VkDebugUtilsLabelEXT* pLabelInfo);
+        const VkDebugUtilsLabelEXT* pLabelInfo,
+        uint32_t doLock);
     VkResult vkCreateDebugUtilsMessengerEXT(
     VkInstance instance,
         const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkDebugUtilsMessengerEXT* pMessenger);
+        VkDebugUtilsMessengerEXT* pMessenger,
+        uint32_t doLock);
     void vkDestroyDebugUtilsMessengerEXT(
     VkInstance instance,
         VkDebugUtilsMessengerEXT messenger,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     void vkSubmitDebugUtilsMessageEXT(
     VkInstance instance,
         VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
         VkDebugUtilsMessageTypeFlagsEXT messageTypes,
-        const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData);
+        const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
+        uint32_t doLock);
 #endif
 #ifdef VK_ANDROID_external_memory_android_hardware_buffer
     VkResult vkGetAndroidHardwareBufferPropertiesANDROID(
     VkDevice device,
         const AHardwareBuffer* buffer,
-        VkAndroidHardwareBufferPropertiesANDROID* pProperties);
+        VkAndroidHardwareBufferPropertiesANDROID* pProperties,
+        uint32_t doLock);
     VkResult vkGetMemoryAndroidHardwareBufferANDROID(
     VkDevice device,
         const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo,
-        AHardwareBuffer** pBuffer);
+        AHardwareBuffer** pBuffer,
+        uint32_t doLock);
 #endif
 #ifdef VK_EXT_sampler_filter_minmax
 #endif
@@ -1672,11 +1979,13 @@
 #ifdef VK_EXT_sample_locations
     void vkCmdSetSampleLocationsEXT(
     VkCommandBuffer commandBuffer,
-        const VkSampleLocationsInfoEXT* pSampleLocationsInfo);
+        const VkSampleLocationsInfoEXT* pSampleLocationsInfo,
+        uint32_t doLock);
     void vkGetPhysicalDeviceMultisamplePropertiesEXT(
     VkPhysicalDevice physicalDevice,
         VkSampleCountFlagBits samples,
-        VkMultisamplePropertiesEXT* pMultisampleProperties);
+        VkMultisamplePropertiesEXT* pMultisampleProperties,
+        uint32_t doLock);
 #endif
 #ifdef VK_EXT_blend_operation_advanced
 #endif
@@ -1693,21 +2002,25 @@
     VkDevice device,
         const VkValidationCacheCreateInfoEXT* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
-        VkValidationCacheEXT* pValidationCache);
+        VkValidationCacheEXT* pValidationCache,
+        uint32_t doLock);
     void vkDestroyValidationCacheEXT(
     VkDevice device,
         VkValidationCacheEXT validationCache,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
     VkResult vkMergeValidationCachesEXT(
     VkDevice device,
         VkValidationCacheEXT dstCache,
         uint32_t srcCacheCount,
-        const VkValidationCacheEXT* pSrcCaches);
+        const VkValidationCacheEXT* pSrcCaches,
+        uint32_t doLock);
     VkResult vkGetValidationCacheDataEXT(
     VkDevice device,
         VkValidationCacheEXT validationCache,
         size_t* pDataSize,
-        void* pData);
+        void* pData,
+        uint32_t doLock);
 #endif
 #ifdef VK_EXT_descriptor_indexing
 #endif
@@ -1720,7 +2033,8 @@
     VkDevice device,
         VkExternalMemoryHandleTypeFlagBits handleType,
         const void* pHostPointer,
-        VkMemoryHostPointerPropertiesEXT* pMemoryHostPointerProperties);
+        VkMemoryHostPointerPropertiesEXT* pMemoryHostPointerProperties,
+        uint32_t doLock);
 #endif
 #ifdef VK_AMD_buffer_marker
     void vkCmdWriteBufferMarkerAMD(
@@ -1728,7 +2042,8 @@
         VkPipelineStageFlagBits pipelineStage,
         VkBuffer dstBuffer,
         VkDeviceSize dstOffset,
-        uint32_t marker);
+        uint32_t marker,
+        uint32_t doLock);
 #endif
 #ifdef VK_AMD_shader_core_properties
 #endif
@@ -1739,27 +2054,32 @@
 #ifdef VK_NV_device_diagnostic_checkpoints
     void vkCmdSetCheckpointNV(
     VkCommandBuffer commandBuffer,
-        const void* pCheckpointMarker);
+        const void* pCheckpointMarker,
+        uint32_t doLock);
     void vkGetQueueCheckpointDataNV(
     VkQueue queue,
         uint32_t* pCheckpointDataCount,
-        VkCheckpointDataNV* pCheckpointData);
+        VkCheckpointDataNV* pCheckpointData,
+        uint32_t doLock);
 #endif
 #ifdef VK_GOOGLE_address_space
     VkResult vkMapMemoryIntoAddressSpaceGOOGLE(
     VkDevice device,
         VkDeviceMemory memory,
-        uint64_t* pAddress);
+        uint64_t* pAddress,
+        uint32_t doLock);
 #endif
 #ifdef VK_GOOGLE_color_buffer
     VkResult vkRegisterImageColorBufferGOOGLE(
     VkDevice device,
         VkImage image,
-        uint32_t colorBuffer);
+        uint32_t colorBuffer,
+        uint32_t doLock);
     VkResult vkRegisterBufferColorBufferGOOGLE(
     VkDevice device,
         VkBuffer buffer,
-        uint32_t colorBuffer);
+        uint32_t colorBuffer,
+        uint32_t doLock);
 #endif
 #ifdef VK_GOOGLE_sized_descriptor_update_template
     void vkUpdateDescriptorSetWithTemplateSizedGOOGLE(
@@ -1774,21 +2094,26 @@
         const uint32_t* pBufferViewEntryIndices,
         const VkDescriptorImageInfo* pImageInfos,
         const VkDescriptorBufferInfo* pBufferInfos,
-        const VkBufferView* pBufferViews);
+        const VkBufferView* pBufferViews,
+        uint32_t doLock);
 #endif
 #ifdef VK_GOOGLE_async_command_buffers
     void vkBeginCommandBufferAsyncGOOGLE(
     VkCommandBuffer commandBuffer,
-        const VkCommandBufferBeginInfo* pBeginInfo);
+        const VkCommandBufferBeginInfo* pBeginInfo,
+        uint32_t doLock);
     void vkEndCommandBufferAsyncGOOGLE(
-    VkCommandBuffer commandBuffer);
+    VkCommandBuffer commandBuffer,
+        uint32_t doLock);
     void vkResetCommandBufferAsyncGOOGLE(
     VkCommandBuffer commandBuffer,
-        VkCommandBufferResetFlags flags);
+        VkCommandBufferResetFlags flags,
+        uint32_t doLock);
     void vkCommandBufferHostSyncGOOGLE(
     VkCommandBuffer commandBuffer,
         uint32_t needHostSync,
-        uint32_t sequenceNumber);
+        uint32_t sequenceNumber,
+        uint32_t doLock);
 #endif
 #ifdef VK_GOOGLE_create_resources_with_requirements
     VkResult vkCreateImageWithRequirementsGOOGLE(
@@ -1796,13 +2121,15 @@
         const VkImageCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
         VkImage* pImage,
-        VkMemoryRequirements* pMemoryRequirements);
+        VkMemoryRequirements* pMemoryRequirements,
+        uint32_t doLock);
     VkResult vkCreateBufferWithRequirementsGOOGLE(
     VkDevice device,
         const VkBufferCreateInfo* pCreateInfo,
         const VkAllocationCallbacks* pAllocator,
         VkBuffer* pBuffer,
-        VkMemoryRequirements* pMemoryRequirements);
+        VkMemoryRequirements* pMemoryRequirements,
+        uint32_t doLock);
 #endif
 #ifdef VK_GOOGLE_address_space_info
     VkResult vkGetMemoryHostAddressInfoGOOGLE(
@@ -1810,58 +2137,71 @@
         VkDeviceMemory memory,
         uint64_t* pAddress,
         uint64_t* pSize,
-        uint64_t* pHostmemId);
+        uint64_t* pHostmemId,
+        uint32_t doLock);
 #endif
 #ifdef VK_GOOGLE_free_memory_sync
     VkResult vkFreeMemorySyncGOOGLE(
     VkDevice device,
         VkDeviceMemory memory,
-        const VkAllocationCallbacks* pAllocator);
+        const VkAllocationCallbacks* pAllocator,
+        uint32_t doLock);
 #endif
 #ifdef VK_GOOGLE_async_queue_submit
     void vkQueueHostSyncGOOGLE(
     VkQueue queue,
         uint32_t needHostSync,
-        uint32_t sequenceNumber);
+        uint32_t sequenceNumber,
+        uint32_t doLock);
     void vkQueueSubmitAsyncGOOGLE(
     VkQueue queue,
         uint32_t submitCount,
         const VkSubmitInfo* pSubmits,
-        VkFence fence);
+        VkFence fence,
+        uint32_t doLock);
     void vkQueueWaitIdleAsyncGOOGLE(
-    VkQueue queue);
+    VkQueue queue,
+        uint32_t doLock);
     void vkQueueBindSparseAsyncGOOGLE(
     VkQueue queue,
         uint32_t bindInfoCount,
         const VkBindSparseInfo* pBindInfo,
-        VkFence fence);
+        VkFence fence,
+        uint32_t doLock);
 #endif
 #ifdef VK_GOOGLE_linear_image_layout
     void vkGetLinearImageLayoutGOOGLE(
     VkDevice device,
         VkFormat format,
         VkDeviceSize* pOffset,
-        VkDeviceSize* pRowPitchAlignment);
+        VkDeviceSize* pRowPitchAlignment,
+        uint32_t doLock);
 #endif
 #ifdef VK_MVK_moltenvk
     void vkGetMTLDeviceMVK(
     VkPhysicalDevice physicalDevice,
-        void** pMTLDevice);
+        void** pMTLDevice,
+        uint32_t doLock);
     VkResult vkSetMTLTextureMVK(
     VkImage image,
-        void* mtlTexture);
+        void* mtlTexture,
+        uint32_t doLock);
     void vkGetMTLTextureMVK(
     VkImage image,
-        void** pMTLTexture);
+        void** pMTLTexture,
+        uint32_t doLock);
     void vkGetMTLBufferMVK(
     VkBuffer buffer,
-        void** pMTLBuffer);
+        void** pMTLBuffer,
+        uint32_t doLock);
     VkResult vkUseIOSurfaceMVK(
     VkImage image,
-        void* ioSurface);
+        void* ioSurface,
+        uint32_t doLock);
     void vkGetIOSurfaceMVK(
     VkImage image,
-        void** pIOSurface);
+        void** pIOSurface,
+        uint32_t doLock);
 #endif
 
 private:
diff --git a/system/vulkan_enc/VkEncoder.h.inl b/system/vulkan_enc/VkEncoder.h.inl
index d415596..42a6199 100644
--- a/system/vulkan_enc/VkEncoder.h.inl
+++ b/system/vulkan_enc/VkEncoder.h.inl
@@ -3,3 +3,6 @@
     void unlock();
     void incRef();
     bool decRef();
+    uint32_t refCount = 1;
+    #define POOL_CLEAR_INTERVAL 10
+    uint32_t encodeCount = 0;
diff --git a/system/vulkan_enc/VulkanStreamGuest.cpp b/system/vulkan_enc/VulkanStreamGuest.cpp
index af71d02..e93295f 100644
--- a/system/vulkan_enc/VulkanStreamGuest.cpp
+++ b/system/vulkan_enc/VulkanStreamGuest.cpp
@@ -92,6 +92,9 @@
         return mStream->decRef();
     }
 
+    uint8_t* reserve(size_t size) {
+        return (uint8_t*)mStream->alloc(size);
+    }
 private:
     size_t oustandingWriteBuffer() const {
         return mWritePos;
@@ -165,6 +168,41 @@
     }
 }
 
+void VulkanStreamGuest::loadStringInPlaceWithStreamPtr(char** forOutput, uint8_t** streamPtr) {
+    uint32_t len;
+    memcpy(&len, *streamPtr, sizeof(uint32_t));
+    *streamPtr += sizeof(uint32_t);
+    android::base::Stream::fromBe32((uint8_t*)&len);
+
+    alloc((void**)forOutput, len + 1);
+
+    memset(*forOutput, 0x0, len + 1);
+
+    if (len > 0) {
+        memcpy(*forOutput, *streamPtr, len);
+        *streamPtr += len;
+    }
+}
+
+void VulkanStreamGuest::loadStringArrayInPlaceWithStreamPtr(char*** forOutput, uint8_t** streamPtr) {
+ uint32_t count;
+    memcpy(&count, *streamPtr, sizeof(uint32_t));
+    *streamPtr += sizeof(uint32_t);
+    android::base::Stream::fromBe32((uint8_t*)&count);
+    if (!count) {
+        *forOutput = nullptr;
+        return;
+    }
+
+    alloc((void**)forOutput, count * sizeof(char*));
+
+    char **stringsForOutput = *forOutput;
+
+    for (size_t i = 0; i < count; i++) {
+        loadStringInPlaceWithStreamPtr(stringsForOutput + i, streamPtr);
+    }
+}
+
 
 ssize_t VulkanStreamGuest::read(void *buffer, size_t size) {
     return mImpl->read(buffer, size);
@@ -206,6 +244,10 @@
     return mImpl->decStreamRef();
 }
 
+uint8_t* VulkanStreamGuest::reserve(size_t size) {
+    return mImpl->reserve(size);
+}
+
 VulkanCountingStream::VulkanCountingStream() : VulkanStreamGuest(nullptr) { }
 VulkanCountingStream::~VulkanCountingStream() = default;
 
diff --git a/system/vulkan_enc/VulkanStreamGuest.h b/system/vulkan_enc/VulkanStreamGuest.h
index e8425e1..8132f37 100644
--- a/system/vulkan_enc/VulkanStreamGuest.h
+++ b/system/vulkan_enc/VulkanStreamGuest.h
@@ -42,6 +42,10 @@
     void loadStringInPlace(char** forOutput);
     void loadStringArrayInPlace(char*** forOutput);
 
+    // When we load a string and are using a reserved pointer.
+    void loadStringInPlaceWithStreamPtr(char** forOutput, uint8_t** streamPtr);
+    void loadStringArrayInPlaceWithStreamPtr(char*** forOutput, uint8_t** streamPtr);
+
     ssize_t read(void *buffer, size_t size) override;
     ssize_t write(const void *buffer, size_t size) override;
 
@@ -59,6 +63,7 @@
     void incStreamRef();
     bool decStreamRef();
 
+    uint8_t* reserve(size_t size);
 private:
     class Impl;
     std::unique_ptr<Impl> mImpl;
diff --git a/system/vulkan_enc/goldfish_vk_counting_guest.cpp b/system/vulkan_enc/goldfish_vk_counting_guest.cpp
new file mode 100644
index 0000000..5699894
--- /dev/null
+++ b/system/vulkan_enc/goldfish_vk_counting_guest.cpp
@@ -0,0 +1,7101 @@
+// Copyright (C) 2018 The Android Open Source Project
+// Copyright (C) 2018 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Autogenerated module goldfish_vk_counting_guest
+// (impl) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
+// Please do not modify directly;
+// re-run android/scripts/generate-vulkan-sources.sh,
+// or directly from Python by defining:
+// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
+// CEREAL_OUTPUT_DIR: Where to put the generated sources.
+// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+
+#include "goldfish_vk_counting_guest.h"
+
+
+#include "goldfish_vk_extension_structs_guest.h"
+#include "goldfish_vk_private_defs.h"
+
+
+namespace goldfish_vk {
+
+void count_extension_struct(
+    uint32_t featureBits,
+    const void* structExtension,
+    size_t* count);
+
+#ifdef VK_VERSION_1_0
+void count_VkApplicationInfo(
+    uint32_t featureBits,
+    const VkApplicationInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    if (featureBits & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+    {
+        // WARNING PTR CHECK
+        *count += 8;
+        if (toCount->pApplicationName)
+        {
+            *count += sizeof(uint32_t) + (toCount->pApplicationName ? strlen(toCount->pApplicationName) : 0);
+        }
+    }
+    else
+    {
+        *count += sizeof(uint32_t) + (toCount->pApplicationName ? strlen(toCount->pApplicationName) : 0);
+    }
+    *count += sizeof(uint32_t);
+    if (featureBits & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+    {
+        // WARNING PTR CHECK
+        *count += 8;
+        if (toCount->pEngineName)
+        {
+            *count += sizeof(uint32_t) + (toCount->pEngineName ? strlen(toCount->pEngineName) : 0);
+        }
+    }
+    else
+    {
+        *count += sizeof(uint32_t) + (toCount->pEngineName ? strlen(toCount->pEngineName) : 0);
+    }
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkInstanceCreateInfo(
+    uint32_t featureBits,
+    const VkInstanceCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkInstanceCreateFlags);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pApplicationInfo)
+    {
+        count_VkApplicationInfo(featureBits, (const VkApplicationInfo*)(toCount->pApplicationInfo), count);
+    }
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < toCount->enabledLayerCount; ++i)
+    {
+        size_t l = toCount->ppEnabledLayerNames[i] ? strlen(toCount->ppEnabledLayerNames[i]) : 0;
+        *count += sizeof(uint32_t) + (toCount->ppEnabledLayerNames[i] ? strlen(toCount->ppEnabledLayerNames[i]) : 0);
+    }
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < toCount->enabledExtensionCount; ++i)
+    {
+        size_t l = toCount->ppEnabledExtensionNames[i] ? strlen(toCount->ppEnabledExtensionNames[i]) : 0;
+        *count += sizeof(uint32_t) + (toCount->ppEnabledExtensionNames[i] ? strlen(toCount->ppEnabledExtensionNames[i]) : 0);
+    }
+}
+
+void count_VkAllocationCallbacks(
+    uint32_t featureBits,
+    const VkAllocationCallbacks* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pUserData)
+    {
+        *count += sizeof(uint8_t);
+    }
+    *count += 8;
+    *count += 8;
+    *count += 8;
+    *count += 8;
+    *count += 8;
+}
+
+void count_VkPhysicalDeviceFeatures(
+    uint32_t featureBits,
+    const VkPhysicalDeviceFeatures* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkFormatProperties(
+    uint32_t featureBits,
+    const VkFormatProperties* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkFormatFeatureFlags);
+    *count += sizeof(VkFormatFeatureFlags);
+    *count += sizeof(VkFormatFeatureFlags);
+}
+
+void count_VkExtent3D(
+    uint32_t featureBits,
+    const VkExtent3D* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkImageFormatProperties(
+    uint32_t featureBits,
+    const VkImageFormatProperties* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    count_VkExtent3D(featureBits, (VkExtent3D*)(&toCount->maxExtent), count);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkSampleCountFlags);
+    *count += sizeof(VkDeviceSize);
+}
+
+void count_VkPhysicalDeviceLimits(
+    uint32_t featureBits,
+    const VkPhysicalDeviceLimits* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += 3 * sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += 3 * sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(float);
+    *count += sizeof(float);
+    *count += sizeof(uint32_t);
+    *count += 2 * sizeof(uint32_t);
+    *count += 2 * sizeof(float);
+    *count += sizeof(uint32_t);
+    *count += 8;
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(int32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(int32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(float);
+    *count += sizeof(float);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkSampleCountFlags);
+    *count += sizeof(VkSampleCountFlags);
+    *count += sizeof(VkSampleCountFlags);
+    *count += sizeof(VkSampleCountFlags);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkSampleCountFlags);
+    *count += sizeof(VkSampleCountFlags);
+    *count += sizeof(VkSampleCountFlags);
+    *count += sizeof(VkSampleCountFlags);
+    *count += sizeof(VkSampleCountFlags);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkBool32);
+    *count += sizeof(float);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += 2 * sizeof(float);
+    *count += 2 * sizeof(float);
+    *count += sizeof(float);
+    *count += sizeof(float);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkDeviceSize);
+}
+
+void count_VkPhysicalDeviceSparseProperties(
+    uint32_t featureBits,
+    const VkPhysicalDeviceSparseProperties* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkPhysicalDeviceProperties(
+    uint32_t featureBits,
+    const VkPhysicalDeviceProperties* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkPhysicalDeviceType);
+    *count += VK_MAX_PHYSICAL_DEVICE_NAME_SIZE * sizeof(char);
+    *count += VK_UUID_SIZE * sizeof(uint8_t);
+    count_VkPhysicalDeviceLimits(featureBits, (VkPhysicalDeviceLimits*)(&toCount->limits), count);
+    count_VkPhysicalDeviceSparseProperties(featureBits, (VkPhysicalDeviceSparseProperties*)(&toCount->sparseProperties), count);
+}
+
+void count_VkQueueFamilyProperties(
+    uint32_t featureBits,
+    const VkQueueFamilyProperties* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkQueueFlags);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    count_VkExtent3D(featureBits, (VkExtent3D*)(&toCount->minImageTransferGranularity), count);
+}
+
+void count_VkMemoryType(
+    uint32_t featureBits,
+    const VkMemoryType* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkMemoryPropertyFlags);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkMemoryHeap(
+    uint32_t featureBits,
+    const VkMemoryHeap* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkMemoryHeapFlags);
+}
+
+void count_VkPhysicalDeviceMemoryProperties(
+    uint32_t featureBits,
+    const VkPhysicalDeviceMemoryProperties* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_TYPES; ++i)
+    {
+        count_VkMemoryType(featureBits, (VkMemoryType*)(toCount->memoryTypes + i), count);
+    }
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_HEAPS; ++i)
+    {
+        count_VkMemoryHeap(featureBits, (VkMemoryHeap*)(toCount->memoryHeaps + i), count);
+    }
+}
+
+void count_VkDeviceQueueCreateInfo(
+    uint32_t featureBits,
+    const VkDeviceQueueCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkDeviceQueueCreateFlags);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += toCount->queueCount * sizeof(const float);
+}
+
+void count_VkDeviceCreateInfo(
+    uint32_t featureBits,
+    const VkDeviceCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkDeviceCreateFlags);
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->queueCreateInfoCount; ++i)
+    {
+        count_VkDeviceQueueCreateInfo(featureBits, (const VkDeviceQueueCreateInfo*)(toCount->pQueueCreateInfos + i), count);
+    }
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < toCount->enabledLayerCount; ++i)
+    {
+        size_t l = toCount->ppEnabledLayerNames[i] ? strlen(toCount->ppEnabledLayerNames[i]) : 0;
+        *count += sizeof(uint32_t) + (toCount->ppEnabledLayerNames[i] ? strlen(toCount->ppEnabledLayerNames[i]) : 0);
+    }
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < toCount->enabledExtensionCount; ++i)
+    {
+        size_t l = toCount->ppEnabledExtensionNames[i] ? strlen(toCount->ppEnabledExtensionNames[i]) : 0;
+        *count += sizeof(uint32_t) + (toCount->ppEnabledExtensionNames[i] ? strlen(toCount->ppEnabledExtensionNames[i]) : 0);
+    }
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pEnabledFeatures)
+    {
+        count_VkPhysicalDeviceFeatures(featureBits, (const VkPhysicalDeviceFeatures*)(toCount->pEnabledFeatures), count);
+    }
+}
+
+void count_VkExtensionProperties(
+    uint32_t featureBits,
+    const VkExtensionProperties* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += VK_MAX_EXTENSION_NAME_SIZE * sizeof(char);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkLayerProperties(
+    uint32_t featureBits,
+    const VkLayerProperties* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += VK_MAX_EXTENSION_NAME_SIZE * sizeof(char);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += VK_MAX_DESCRIPTION_SIZE * sizeof(char);
+}
+
+void count_VkSubmitInfo(
+    uint32_t featureBits,
+    const VkSubmitInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    if (toCount->waitSemaphoreCount)
+    {
+        *count += toCount->waitSemaphoreCount * 8;
+    }
+    *count += toCount->waitSemaphoreCount * sizeof(const VkPipelineStageFlags);
+    *count += sizeof(uint32_t);
+    if (toCount->commandBufferCount)
+    {
+        *count += toCount->commandBufferCount * 8;
+    }
+    *count += sizeof(uint32_t);
+    if (toCount->signalSemaphoreCount)
+    {
+        *count += toCount->signalSemaphoreCount * 8;
+    }
+}
+
+void count_VkMemoryAllocateInfo(
+    uint32_t featureBits,
+    const VkMemoryAllocateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkMappedMemoryRange(
+    uint32_t featureBits,
+    const VkMappedMemoryRange* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_3;
+    *count += 1 * 8;
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkDeviceSize);
+}
+
+void count_VkMemoryRequirements(
+    uint32_t featureBits,
+    const VkMemoryRequirements* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkSparseImageFormatProperties(
+    uint32_t featureBits,
+    const VkSparseImageFormatProperties* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkImageAspectFlags);
+    count_VkExtent3D(featureBits, (VkExtent3D*)(&toCount->imageGranularity), count);
+    *count += sizeof(VkSparseImageFormatFlags);
+}
+
+void count_VkSparseImageMemoryRequirements(
+    uint32_t featureBits,
+    const VkSparseImageMemoryRequirements* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    count_VkSparseImageFormatProperties(featureBits, (VkSparseImageFormatProperties*)(&toCount->formatProperties), count);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkDeviceSize);
+}
+
+void count_VkSparseMemoryBind(
+    uint32_t featureBits,
+    const VkSparseMemoryBind* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkDeviceSize);
+    uint64_t cgen_var_4;
+    *count += 1 * 8;
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkSparseMemoryBindFlags);
+}
+
+void count_VkSparseBufferMemoryBindInfo(
+    uint32_t featureBits,
+    const VkSparseBufferMemoryBindInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    uint64_t cgen_var_5;
+    *count += 1 * 8;
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->bindCount; ++i)
+    {
+        count_VkSparseMemoryBind(featureBits, (const VkSparseMemoryBind*)(toCount->pBinds + i), count);
+    }
+}
+
+void count_VkSparseImageOpaqueMemoryBindInfo(
+    uint32_t featureBits,
+    const VkSparseImageOpaqueMemoryBindInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    uint64_t cgen_var_6;
+    *count += 1 * 8;
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->bindCount; ++i)
+    {
+        count_VkSparseMemoryBind(featureBits, (const VkSparseMemoryBind*)(toCount->pBinds + i), count);
+    }
+}
+
+void count_VkImageSubresource(
+    uint32_t featureBits,
+    const VkImageSubresource* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkImageAspectFlags);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkOffset3D(
+    uint32_t featureBits,
+    const VkOffset3D* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(int32_t);
+    *count += sizeof(int32_t);
+    *count += sizeof(int32_t);
+}
+
+void count_VkSparseImageMemoryBind(
+    uint32_t featureBits,
+    const VkSparseImageMemoryBind* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    count_VkImageSubresource(featureBits, (VkImageSubresource*)(&toCount->subresource), count);
+    count_VkOffset3D(featureBits, (VkOffset3D*)(&toCount->offset), count);
+    count_VkExtent3D(featureBits, (VkExtent3D*)(&toCount->extent), count);
+    uint64_t cgen_var_7;
+    *count += 1 * 8;
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkSparseMemoryBindFlags);
+}
+
+void count_VkSparseImageMemoryBindInfo(
+    uint32_t featureBits,
+    const VkSparseImageMemoryBindInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    uint64_t cgen_var_8;
+    *count += 1 * 8;
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->bindCount; ++i)
+    {
+        count_VkSparseImageMemoryBind(featureBits, (const VkSparseImageMemoryBind*)(toCount->pBinds + i), count);
+    }
+}
+
+void count_VkBindSparseInfo(
+    uint32_t featureBits,
+    const VkBindSparseInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    if (toCount->waitSemaphoreCount)
+    {
+        *count += toCount->waitSemaphoreCount * 8;
+    }
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->bufferBindCount; ++i)
+    {
+        count_VkSparseBufferMemoryBindInfo(featureBits, (const VkSparseBufferMemoryBindInfo*)(toCount->pBufferBinds + i), count);
+    }
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->imageOpaqueBindCount; ++i)
+    {
+        count_VkSparseImageOpaqueMemoryBindInfo(featureBits, (const VkSparseImageOpaqueMemoryBindInfo*)(toCount->pImageOpaqueBinds + i), count);
+    }
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->imageBindCount; ++i)
+    {
+        count_VkSparseImageMemoryBindInfo(featureBits, (const VkSparseImageMemoryBindInfo*)(toCount->pImageBinds + i), count);
+    }
+    *count += sizeof(uint32_t);
+    if (toCount->signalSemaphoreCount)
+    {
+        *count += toCount->signalSemaphoreCount * 8;
+    }
+}
+
+void count_VkFenceCreateInfo(
+    uint32_t featureBits,
+    const VkFenceCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkFenceCreateFlags);
+}
+
+void count_VkSemaphoreCreateInfo(
+    uint32_t featureBits,
+    const VkSemaphoreCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkSemaphoreCreateFlags);
+}
+
+void count_VkEventCreateInfo(
+    uint32_t featureBits,
+    const VkEventCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkEventCreateFlags);
+}
+
+void count_VkQueryPoolCreateInfo(
+    uint32_t featureBits,
+    const VkQueryPoolCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkQueryPoolCreateFlags);
+    *count += sizeof(VkQueryType);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkQueryPipelineStatisticFlags);
+}
+
+void count_VkBufferCreateInfo(
+    uint32_t featureBits,
+    const VkBufferCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBufferCreateFlags);
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkBufferUsageFlags);
+    *count += sizeof(VkSharingMode);
+    *count += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pQueueFamilyIndices)
+    {
+        *count += toCount->queueFamilyIndexCount * sizeof(const uint32_t);
+    }
+}
+
+void count_VkBufferViewCreateInfo(
+    uint32_t featureBits,
+    const VkBufferViewCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBufferViewCreateFlags);
+    uint64_t cgen_var_11;
+    *count += 1 * 8;
+    *count += sizeof(VkFormat);
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkDeviceSize);
+}
+
+void count_VkImageCreateInfo(
+    uint32_t featureBits,
+    const VkImageCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkImageCreateFlags);
+    *count += sizeof(VkImageType);
+    *count += sizeof(VkFormat);
+    count_VkExtent3D(featureBits, (VkExtent3D*)(&toCount->extent), count);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkSampleCountFlagBits);
+    *count += sizeof(VkImageTiling);
+    *count += sizeof(VkImageUsageFlags);
+    *count += sizeof(VkSharingMode);
+    *count += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pQueueFamilyIndices)
+    {
+        *count += toCount->queueFamilyIndexCount * sizeof(const uint32_t);
+    }
+    *count += sizeof(VkImageLayout);
+}
+
+void count_VkSubresourceLayout(
+    uint32_t featureBits,
+    const VkSubresourceLayout* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkDeviceSize);
+}
+
+void count_VkComponentMapping(
+    uint32_t featureBits,
+    const VkComponentMapping* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkComponentSwizzle);
+    *count += sizeof(VkComponentSwizzle);
+    *count += sizeof(VkComponentSwizzle);
+    *count += sizeof(VkComponentSwizzle);
+}
+
+void count_VkImageSubresourceRange(
+    uint32_t featureBits,
+    const VkImageSubresourceRange* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkImageAspectFlags);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkImageViewCreateInfo(
+    uint32_t featureBits,
+    const VkImageViewCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkImageViewCreateFlags);
+    uint64_t cgen_var_12;
+    *count += 1 * 8;
+    *count += sizeof(VkImageViewType);
+    *count += sizeof(VkFormat);
+    count_VkComponentMapping(featureBits, (VkComponentMapping*)(&toCount->components), count);
+    count_VkImageSubresourceRange(featureBits, (VkImageSubresourceRange*)(&toCount->subresourceRange), count);
+}
+
+void count_VkShaderModuleCreateInfo(
+    uint32_t featureBits,
+    const VkShaderModuleCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkShaderModuleCreateFlags);
+    *count += 8;
+    *count += (toCount->codeSize / 4) * sizeof(const uint32_t);
+}
+
+void count_VkPipelineCacheCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineCacheCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkPipelineCacheCreateFlags);
+    *count += 8;
+    *count += toCount->initialDataSize * sizeof(const uint8_t);
+}
+
+void count_VkSpecializationMapEntry(
+    uint32_t featureBits,
+    const VkSpecializationMapEntry* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += 8;
+}
+
+void count_VkSpecializationInfo(
+    uint32_t featureBits,
+    const VkSpecializationInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->mapEntryCount; ++i)
+    {
+        count_VkSpecializationMapEntry(featureBits, (const VkSpecializationMapEntry*)(toCount->pMapEntries + i), count);
+    }
+    *count += 8;
+    *count += toCount->dataSize * sizeof(const uint8_t);
+}
+
+void count_VkPipelineShaderStageCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineShaderStageCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkPipelineShaderStageCreateFlags);
+    *count += sizeof(VkShaderStageFlagBits);
+    uint64_t cgen_var_13;
+    *count += 1 * 8;
+    *count += sizeof(uint32_t) + (toCount->pName ? strlen(toCount->pName) : 0);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pSpecializationInfo)
+    {
+        count_VkSpecializationInfo(featureBits, (const VkSpecializationInfo*)(toCount->pSpecializationInfo), count);
+    }
+}
+
+void count_VkVertexInputBindingDescription(
+    uint32_t featureBits,
+    const VkVertexInputBindingDescription* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkVertexInputRate);
+}
+
+void count_VkVertexInputAttributeDescription(
+    uint32_t featureBits,
+    const VkVertexInputAttributeDescription* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkFormat);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkPipelineVertexInputStateCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineVertexInputStateCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkPipelineVertexInputStateCreateFlags);
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->vertexBindingDescriptionCount; ++i)
+    {
+        count_VkVertexInputBindingDescription(featureBits, (const VkVertexInputBindingDescription*)(toCount->pVertexBindingDescriptions + i), count);
+    }
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->vertexAttributeDescriptionCount; ++i)
+    {
+        count_VkVertexInputAttributeDescription(featureBits, (const VkVertexInputAttributeDescription*)(toCount->pVertexAttributeDescriptions + i), count);
+    }
+}
+
+void count_VkPipelineInputAssemblyStateCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineInputAssemblyStateCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkPipelineInputAssemblyStateCreateFlags);
+    *count += sizeof(VkPrimitiveTopology);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkPipelineTessellationStateCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineTessellationStateCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkPipelineTessellationStateCreateFlags);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkViewport(
+    uint32_t featureBits,
+    const VkViewport* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(float);
+    *count += sizeof(float);
+    *count += sizeof(float);
+    *count += sizeof(float);
+    *count += sizeof(float);
+    *count += sizeof(float);
+}
+
+void count_VkOffset2D(
+    uint32_t featureBits,
+    const VkOffset2D* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(int32_t);
+    *count += sizeof(int32_t);
+}
+
+void count_VkExtent2D(
+    uint32_t featureBits,
+    const VkExtent2D* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkRect2D(
+    uint32_t featureBits,
+    const VkRect2D* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    count_VkOffset2D(featureBits, (VkOffset2D*)(&toCount->offset), count);
+    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->extent), count);
+}
+
+void count_VkPipelineViewportStateCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineViewportStateCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkPipelineViewportStateCreateFlags);
+    *count += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pViewports)
+    {
+        for (uint32_t i = 0; i < (uint32_t)toCount->viewportCount; ++i)
+        {
+            count_VkViewport(featureBits, (const VkViewport*)(toCount->pViewports + i), count);
+        }
+    }
+    *count += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pScissors)
+    {
+        for (uint32_t i = 0; i < (uint32_t)toCount->scissorCount; ++i)
+        {
+            count_VkRect2D(featureBits, (const VkRect2D*)(toCount->pScissors + i), count);
+        }
+    }
+}
+
+void count_VkPipelineRasterizationStateCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineRasterizationStateCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkPipelineRasterizationStateCreateFlags);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkPolygonMode);
+    *count += sizeof(VkCullModeFlags);
+    *count += sizeof(VkFrontFace);
+    *count += sizeof(VkBool32);
+    *count += sizeof(float);
+    *count += sizeof(float);
+    *count += sizeof(float);
+    *count += sizeof(float);
+}
+
+void count_VkPipelineMultisampleStateCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineMultisampleStateCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkPipelineMultisampleStateCreateFlags);
+    *count += sizeof(VkSampleCountFlagBits);
+    *count += sizeof(VkBool32);
+    *count += sizeof(float);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pSampleMask)
+    {
+        *count += (((toCount->rasterizationSamples) + 31) / 32) * sizeof(const VkSampleMask);
+    }
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkStencilOpState(
+    uint32_t featureBits,
+    const VkStencilOpState* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStencilOp);
+    *count += sizeof(VkStencilOp);
+    *count += sizeof(VkStencilOp);
+    *count += sizeof(VkCompareOp);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkPipelineDepthStencilStateCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineDepthStencilStateCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkPipelineDepthStencilStateCreateFlags);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkCompareOp);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    count_VkStencilOpState(featureBits, (VkStencilOpState*)(&toCount->front), count);
+    count_VkStencilOpState(featureBits, (VkStencilOpState*)(&toCount->back), count);
+    *count += sizeof(float);
+    *count += sizeof(float);
+}
+
+void count_VkPipelineColorBlendAttachmentState(
+    uint32_t featureBits,
+    const VkPipelineColorBlendAttachmentState* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBlendFactor);
+    *count += sizeof(VkBlendFactor);
+    *count += sizeof(VkBlendOp);
+    *count += sizeof(VkBlendFactor);
+    *count += sizeof(VkBlendFactor);
+    *count += sizeof(VkBlendOp);
+    *count += sizeof(VkColorComponentFlags);
+}
+
+void count_VkPipelineColorBlendStateCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineColorBlendStateCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkPipelineColorBlendStateCreateFlags);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkLogicOp);
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->attachmentCount; ++i)
+    {
+        count_VkPipelineColorBlendAttachmentState(featureBits, (const VkPipelineColorBlendAttachmentState*)(toCount->pAttachments + i), count);
+    }
+    *count += 4 * sizeof(float);
+}
+
+void count_VkPipelineDynamicStateCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineDynamicStateCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkPipelineDynamicStateCreateFlags);
+    *count += sizeof(uint32_t);
+    *count += toCount->dynamicStateCount * sizeof(const VkDynamicState);
+}
+
+void count_VkGraphicsPipelineCreateInfo(
+    uint32_t featureBits,
+    const VkGraphicsPipelineCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    uint32_t hasRasterization = 1;
+    if (featureBits & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
+    {
+        hasRasterization = (((0 == toCount->pRasterizationState)) ? (0) : (!((*(toCount->pRasterizationState)).rasterizerDiscardEnable)));
+        *count += 4;
+    }
+    uint32_t hasTessellation = 1;
+    if (featureBits & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
+    {
+        hasTessellation = arrayany(toCount->pStages, 0, toCount->stageCount, [](VkPipelineShaderStageCreateInfo s) { return ((s.stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) || (s.stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT)); });
+        *count += 4;
+    }
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkPipelineCreateFlags);
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->stageCount; ++i)
+    {
+        count_VkPipelineShaderStageCreateInfo(featureBits, (const VkPipelineShaderStageCreateInfo*)(toCount->pStages + i), count);
+    }
+    // WARNING PTR CHECK
+    if (featureBits & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
+    {
+        *count += 8;
+    }
+    if ((!(featureBits & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || toCount->pVertexInputState))
+    {
+        count_VkPipelineVertexInputStateCreateInfo(featureBits, (const VkPipelineVertexInputStateCreateInfo*)(toCount->pVertexInputState), count);
+    }
+    // WARNING PTR CHECK
+    if (featureBits & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
+    {
+        *count += 8;
+    }
+    if ((!(featureBits & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || toCount->pInputAssemblyState))
+    {
+        count_VkPipelineInputAssemblyStateCreateInfo(featureBits, (const VkPipelineInputAssemblyStateCreateInfo*)(toCount->pInputAssemblyState), count);
+    }
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pTessellationState)
+    {
+        if (hasTessellation)
+        {
+            count_VkPipelineTessellationStateCreateInfo(featureBits, (const VkPipelineTessellationStateCreateInfo*)(toCount->pTessellationState), count);
+        }
+    }
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pViewportState)
+    {
+        if (hasRasterization)
+        {
+            count_VkPipelineViewportStateCreateInfo(featureBits, (const VkPipelineViewportStateCreateInfo*)(toCount->pViewportState), count);
+        }
+    }
+    // WARNING PTR CHECK
+    if (featureBits & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
+    {
+        *count += 8;
+    }
+    if ((!(featureBits & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || toCount->pRasterizationState))
+    {
+        count_VkPipelineRasterizationStateCreateInfo(featureBits, (const VkPipelineRasterizationStateCreateInfo*)(toCount->pRasterizationState), count);
+    }
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pMultisampleState)
+    {
+        if (hasRasterization)
+        {
+            count_VkPipelineMultisampleStateCreateInfo(featureBits, (const VkPipelineMultisampleStateCreateInfo*)(toCount->pMultisampleState), count);
+        }
+    }
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pDepthStencilState)
+    {
+        if (hasRasterization)
+        {
+            count_VkPipelineDepthStencilStateCreateInfo(featureBits, (const VkPipelineDepthStencilStateCreateInfo*)(toCount->pDepthStencilState), count);
+        }
+    }
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pColorBlendState)
+    {
+        if (hasRasterization)
+        {
+            count_VkPipelineColorBlendStateCreateInfo(featureBits, (const VkPipelineColorBlendStateCreateInfo*)(toCount->pColorBlendState), count);
+        }
+    }
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pDynamicState)
+    {
+        count_VkPipelineDynamicStateCreateInfo(featureBits, (const VkPipelineDynamicStateCreateInfo*)(toCount->pDynamicState), count);
+    }
+    uint64_t cgen_var_14;
+    *count += 1 * 8;
+    uint64_t cgen_var_15;
+    *count += 1 * 8;
+    *count += sizeof(uint32_t);
+    uint64_t cgen_var_16;
+    *count += 1 * 8;
+    *count += sizeof(int32_t);
+}
+
+void count_VkComputePipelineCreateInfo(
+    uint32_t featureBits,
+    const VkComputePipelineCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkPipelineCreateFlags);
+    count_VkPipelineShaderStageCreateInfo(featureBits, (VkPipelineShaderStageCreateInfo*)(&toCount->stage), count);
+    uint64_t cgen_var_17;
+    *count += 1 * 8;
+    uint64_t cgen_var_18;
+    *count += 1 * 8;
+    *count += sizeof(int32_t);
+}
+
+void count_VkPushConstantRange(
+    uint32_t featureBits,
+    const VkPushConstantRange* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkShaderStageFlags);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkPipelineLayoutCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineLayoutCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkPipelineLayoutCreateFlags);
+    *count += sizeof(uint32_t);
+    if (toCount->setLayoutCount)
+    {
+        *count += toCount->setLayoutCount * 8;
+    }
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->pushConstantRangeCount; ++i)
+    {
+        count_VkPushConstantRange(featureBits, (const VkPushConstantRange*)(toCount->pPushConstantRanges + i), count);
+    }
+}
+
+void count_VkSamplerCreateInfo(
+    uint32_t featureBits,
+    const VkSamplerCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkSamplerCreateFlags);
+    *count += sizeof(VkFilter);
+    *count += sizeof(VkFilter);
+    *count += sizeof(VkSamplerMipmapMode);
+    *count += sizeof(VkSamplerAddressMode);
+    *count += sizeof(VkSamplerAddressMode);
+    *count += sizeof(VkSamplerAddressMode);
+    *count += sizeof(float);
+    *count += sizeof(VkBool32);
+    *count += sizeof(float);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkCompareOp);
+    *count += sizeof(float);
+    *count += sizeof(float);
+    *count += sizeof(VkBorderColor);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkDescriptorSetLayoutBinding(
+    uint32_t featureBits,
+    const VkDescriptorSetLayoutBinding* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkDescriptorType);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkShaderStageFlags);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pImmutableSamplers)
+    {
+        if (toCount->descriptorCount)
+        {
+            *count += toCount->descriptorCount * 8;
+        }
+    }
+}
+
+void count_VkDescriptorSetLayoutCreateInfo(
+    uint32_t featureBits,
+    const VkDescriptorSetLayoutCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkDescriptorSetLayoutCreateFlags);
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->bindingCount; ++i)
+    {
+        count_VkDescriptorSetLayoutBinding(featureBits, (const VkDescriptorSetLayoutBinding*)(toCount->pBindings + i), count);
+    }
+}
+
+void count_VkDescriptorPoolSize(
+    uint32_t featureBits,
+    const VkDescriptorPoolSize* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkDescriptorType);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkDescriptorPoolCreateInfo(
+    uint32_t featureBits,
+    const VkDescriptorPoolCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkDescriptorPoolCreateFlags);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->poolSizeCount; ++i)
+    {
+        count_VkDescriptorPoolSize(featureBits, (const VkDescriptorPoolSize*)(toCount->pPoolSizes + i), count);
+    }
+}
+
+void count_VkDescriptorSetAllocateInfo(
+    uint32_t featureBits,
+    const VkDescriptorSetAllocateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_21;
+    *count += 1 * 8;
+    *count += sizeof(uint32_t);
+    if (toCount->descriptorSetCount)
+    {
+        *count += toCount->descriptorSetCount * 8;
+    }
+}
+
+void count_VkDescriptorImageInfo(
+    uint32_t featureBits,
+    const VkDescriptorImageInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    uint64_t cgen_var_23;
+    *count += 1 * 8;
+    uint64_t cgen_var_24;
+    *count += 1 * 8;
+    *count += sizeof(VkImageLayout);
+}
+
+void count_VkDescriptorBufferInfo(
+    uint32_t featureBits,
+    const VkDescriptorBufferInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    uint64_t cgen_var_25;
+    *count += 1 * 8;
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkDeviceSize);
+}
+
+void count_VkWriteDescriptorSet(
+    uint32_t featureBits,
+    const VkWriteDescriptorSet* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_26;
+    *count += 1 * 8;
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkDescriptorType);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pImageInfo)
+    {
+        if ((!(featureBits & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || ((VK_DESCRIPTOR_TYPE_SAMPLER == toCount->descriptorType) || (VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER == toCount->descriptorType) || (VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE == toCount->descriptorType) || (VK_DESCRIPTOR_TYPE_STORAGE_IMAGE == toCount->descriptorType) || (VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT == toCount->descriptorType))))
+        {
+            for (uint32_t i = 0; i < (uint32_t)toCount->descriptorCount; ++i)
+            {
+                count_VkDescriptorImageInfo(featureBits, (const VkDescriptorImageInfo*)(toCount->pImageInfo + i), count);
+            }
+        }
+    }
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pBufferInfo)
+    {
+        if ((!(featureBits & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || ((VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER == toCount->descriptorType) || (VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC == toCount->descriptorType) || (VK_DESCRIPTOR_TYPE_STORAGE_BUFFER == toCount->descriptorType) || (VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC == toCount->descriptorType))))
+        {
+            for (uint32_t i = 0; i < (uint32_t)toCount->descriptorCount; ++i)
+            {
+                count_VkDescriptorBufferInfo(featureBits, (const VkDescriptorBufferInfo*)(toCount->pBufferInfo + i), count);
+            }
+        }
+    }
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pTexelBufferView)
+    {
+        if ((!(featureBits & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || ((VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER == toCount->descriptorType) || (VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER == toCount->descriptorType))))
+        {
+            if (toCount->descriptorCount)
+            {
+                *count += toCount->descriptorCount * 8;
+            }
+        }
+    }
+}
+
+void count_VkCopyDescriptorSet(
+    uint32_t featureBits,
+    const VkCopyDescriptorSet* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_28;
+    *count += 1 * 8;
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    uint64_t cgen_var_29;
+    *count += 1 * 8;
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkFramebufferCreateInfo(
+    uint32_t featureBits,
+    const VkFramebufferCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkFramebufferCreateFlags);
+    uint64_t cgen_var_30;
+    *count += 1 * 8;
+    *count += sizeof(uint32_t);
+    if (toCount->attachmentCount)
+    {
+        *count += toCount->attachmentCount * 8;
+    }
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkAttachmentDescription(
+    uint32_t featureBits,
+    const VkAttachmentDescription* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkAttachmentDescriptionFlags);
+    *count += sizeof(VkFormat);
+    *count += sizeof(VkSampleCountFlagBits);
+    *count += sizeof(VkAttachmentLoadOp);
+    *count += sizeof(VkAttachmentStoreOp);
+    *count += sizeof(VkAttachmentLoadOp);
+    *count += sizeof(VkAttachmentStoreOp);
+    *count += sizeof(VkImageLayout);
+    *count += sizeof(VkImageLayout);
+}
+
+void count_VkAttachmentReference(
+    uint32_t featureBits,
+    const VkAttachmentReference* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkImageLayout);
+}
+
+void count_VkSubpassDescription(
+    uint32_t featureBits,
+    const VkSubpassDescription* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkSubpassDescriptionFlags);
+    *count += sizeof(VkPipelineBindPoint);
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->inputAttachmentCount; ++i)
+    {
+        count_VkAttachmentReference(featureBits, (const VkAttachmentReference*)(toCount->pInputAttachments + i), count);
+    }
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->colorAttachmentCount; ++i)
+    {
+        count_VkAttachmentReference(featureBits, (const VkAttachmentReference*)(toCount->pColorAttachments + i), count);
+    }
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pResolveAttachments)
+    {
+        for (uint32_t i = 0; i < (uint32_t)toCount->colorAttachmentCount; ++i)
+        {
+            count_VkAttachmentReference(featureBits, (const VkAttachmentReference*)(toCount->pResolveAttachments + i), count);
+        }
+    }
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pDepthStencilAttachment)
+    {
+        count_VkAttachmentReference(featureBits, (const VkAttachmentReference*)(toCount->pDepthStencilAttachment), count);
+    }
+    *count += sizeof(uint32_t);
+    *count += toCount->preserveAttachmentCount * sizeof(const uint32_t);
+}
+
+void count_VkSubpassDependency(
+    uint32_t featureBits,
+    const VkSubpassDependency* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkPipelineStageFlags);
+    *count += sizeof(VkPipelineStageFlags);
+    *count += sizeof(VkAccessFlags);
+    *count += sizeof(VkAccessFlags);
+    *count += sizeof(VkDependencyFlags);
+}
+
+void count_VkRenderPassCreateInfo(
+    uint32_t featureBits,
+    const VkRenderPassCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkRenderPassCreateFlags);
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->attachmentCount; ++i)
+    {
+        count_VkAttachmentDescription(featureBits, (const VkAttachmentDescription*)(toCount->pAttachments + i), count);
+    }
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->subpassCount; ++i)
+    {
+        count_VkSubpassDescription(featureBits, (const VkSubpassDescription*)(toCount->pSubpasses + i), count);
+    }
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->dependencyCount; ++i)
+    {
+        count_VkSubpassDependency(featureBits, (const VkSubpassDependency*)(toCount->pDependencies + i), count);
+    }
+}
+
+void count_VkCommandPoolCreateInfo(
+    uint32_t featureBits,
+    const VkCommandPoolCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkCommandPoolCreateFlags);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkCommandBufferAllocateInfo(
+    uint32_t featureBits,
+    const VkCommandBufferAllocateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_32;
+    *count += 1 * 8;
+    *count += sizeof(VkCommandBufferLevel);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkCommandBufferInheritanceInfo(
+    uint32_t featureBits,
+    const VkCommandBufferInheritanceInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_33;
+    *count += 1 * 8;
+    *count += sizeof(uint32_t);
+    uint64_t cgen_var_34;
+    *count += 1 * 8;
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkQueryControlFlags);
+    *count += sizeof(VkQueryPipelineStatisticFlags);
+}
+
+void count_VkCommandBufferBeginInfo(
+    uint32_t featureBits,
+    const VkCommandBufferBeginInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkCommandBufferUsageFlags);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pInheritanceInfo)
+    {
+        count_VkCommandBufferInheritanceInfo(featureBits, (const VkCommandBufferInheritanceInfo*)(toCount->pInheritanceInfo), count);
+    }
+}
+
+void count_VkBufferCopy(
+    uint32_t featureBits,
+    const VkBufferCopy* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkDeviceSize);
+}
+
+void count_VkImageSubresourceLayers(
+    uint32_t featureBits,
+    const VkImageSubresourceLayers* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkImageAspectFlags);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkImageCopy(
+    uint32_t featureBits,
+    const VkImageCopy* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    count_VkImageSubresourceLayers(featureBits, (VkImageSubresourceLayers*)(&toCount->srcSubresource), count);
+    count_VkOffset3D(featureBits, (VkOffset3D*)(&toCount->srcOffset), count);
+    count_VkImageSubresourceLayers(featureBits, (VkImageSubresourceLayers*)(&toCount->dstSubresource), count);
+    count_VkOffset3D(featureBits, (VkOffset3D*)(&toCount->dstOffset), count);
+    count_VkExtent3D(featureBits, (VkExtent3D*)(&toCount->extent), count);
+}
+
+void count_VkImageBlit(
+    uint32_t featureBits,
+    const VkImageBlit* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    count_VkImageSubresourceLayers(featureBits, (VkImageSubresourceLayers*)(&toCount->srcSubresource), count);
+    for (uint32_t i = 0; i < (uint32_t)2; ++i)
+    {
+        count_VkOffset3D(featureBits, (VkOffset3D*)(toCount->srcOffsets + i), count);
+    }
+    count_VkImageSubresourceLayers(featureBits, (VkImageSubresourceLayers*)(&toCount->dstSubresource), count);
+    for (uint32_t i = 0; i < (uint32_t)2; ++i)
+    {
+        count_VkOffset3D(featureBits, (VkOffset3D*)(toCount->dstOffsets + i), count);
+    }
+}
+
+void count_VkBufferImageCopy(
+    uint32_t featureBits,
+    const VkBufferImageCopy* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    count_VkImageSubresourceLayers(featureBits, (VkImageSubresourceLayers*)(&toCount->imageSubresource), count);
+    count_VkOffset3D(featureBits, (VkOffset3D*)(&toCount->imageOffset), count);
+    count_VkExtent3D(featureBits, (VkExtent3D*)(&toCount->imageExtent), count);
+}
+
+void count_VkClearColorValue(
+    uint32_t featureBits,
+    const VkClearColorValue* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += 4 * sizeof(float);
+}
+
+void count_VkClearDepthStencilValue(
+    uint32_t featureBits,
+    const VkClearDepthStencilValue* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(float);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkClearValue(
+    uint32_t featureBits,
+    const VkClearValue* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    count_VkClearColorValue(featureBits, (VkClearColorValue*)(&toCount->color), count);
+}
+
+void count_VkClearAttachment(
+    uint32_t featureBits,
+    const VkClearAttachment* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkImageAspectFlags);
+    *count += sizeof(uint32_t);
+    count_VkClearValue(featureBits, (VkClearValue*)(&toCount->clearValue), count);
+}
+
+void count_VkClearRect(
+    uint32_t featureBits,
+    const VkClearRect* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    count_VkRect2D(featureBits, (VkRect2D*)(&toCount->rect), count);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkImageResolve(
+    uint32_t featureBits,
+    const VkImageResolve* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    count_VkImageSubresourceLayers(featureBits, (VkImageSubresourceLayers*)(&toCount->srcSubresource), count);
+    count_VkOffset3D(featureBits, (VkOffset3D*)(&toCount->srcOffset), count);
+    count_VkImageSubresourceLayers(featureBits, (VkImageSubresourceLayers*)(&toCount->dstSubresource), count);
+    count_VkOffset3D(featureBits, (VkOffset3D*)(&toCount->dstOffset), count);
+    count_VkExtent3D(featureBits, (VkExtent3D*)(&toCount->extent), count);
+}
+
+void count_VkMemoryBarrier(
+    uint32_t featureBits,
+    const VkMemoryBarrier* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkAccessFlags);
+    *count += sizeof(VkAccessFlags);
+}
+
+void count_VkBufferMemoryBarrier(
+    uint32_t featureBits,
+    const VkBufferMemoryBarrier* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkAccessFlags);
+    *count += sizeof(VkAccessFlags);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    uint64_t cgen_var_35;
+    *count += 1 * 8;
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkDeviceSize);
+}
+
+void count_VkImageMemoryBarrier(
+    uint32_t featureBits,
+    const VkImageMemoryBarrier* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkAccessFlags);
+    *count += sizeof(VkAccessFlags);
+    *count += sizeof(VkImageLayout);
+    *count += sizeof(VkImageLayout);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    uint64_t cgen_var_36;
+    *count += 1 * 8;
+    count_VkImageSubresourceRange(featureBits, (VkImageSubresourceRange*)(&toCount->subresourceRange), count);
+}
+
+void count_VkRenderPassBeginInfo(
+    uint32_t featureBits,
+    const VkRenderPassBeginInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_37;
+    *count += 1 * 8;
+    uint64_t cgen_var_38;
+    *count += 1 * 8;
+    count_VkRect2D(featureBits, (VkRect2D*)(&toCount->renderArea), count);
+    *count += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pClearValues)
+    {
+        for (uint32_t i = 0; i < (uint32_t)toCount->clearValueCount; ++i)
+        {
+            count_VkClearValue(featureBits, (const VkClearValue*)(toCount->pClearValues + i), count);
+        }
+    }
+}
+
+void count_VkDispatchIndirectCommand(
+    uint32_t featureBits,
+    const VkDispatchIndirectCommand* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkDrawIndexedIndirectCommand(
+    uint32_t featureBits,
+    const VkDrawIndexedIndirectCommand* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(int32_t);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkDrawIndirectCommand(
+    uint32_t featureBits,
+    const VkDrawIndirectCommand* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkBaseOutStructure(
+    uint32_t featureBits,
+    const VkBaseOutStructure* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+}
+
+void count_VkBaseInStructure(
+    uint32_t featureBits,
+    const VkBaseInStructure* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+}
+
+#endif
+#ifdef VK_VERSION_1_1
+void count_VkPhysicalDeviceSubgroupProperties(
+    uint32_t featureBits,
+    const VkPhysicalDeviceSubgroupProperties* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkShaderStageFlags);
+    *count += sizeof(VkSubgroupFeatureFlags);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkBindBufferMemoryInfo(
+    uint32_t featureBits,
+    const VkBindBufferMemoryInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_39;
+    *count += 1 * 8;
+    uint64_t cgen_var_40;
+    *count += 1 * 8;
+    *count += sizeof(VkDeviceSize);
+}
+
+void count_VkBindImageMemoryInfo(
+    uint32_t featureBits,
+    const VkBindImageMemoryInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_41;
+    *count += 1 * 8;
+    uint64_t cgen_var_42;
+    *count += 1 * 8;
+    *count += sizeof(VkDeviceSize);
+}
+
+void count_VkPhysicalDevice16BitStorageFeatures(
+    uint32_t featureBits,
+    const VkPhysicalDevice16BitStorageFeatures* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkMemoryDedicatedRequirements(
+    uint32_t featureBits,
+    const VkMemoryDedicatedRequirements* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkMemoryDedicatedAllocateInfo(
+    uint32_t featureBits,
+    const VkMemoryDedicatedAllocateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_43;
+    *count += 1 * 8;
+    uint64_t cgen_var_44;
+    *count += 1 * 8;
+}
+
+void count_VkMemoryAllocateFlagsInfo(
+    uint32_t featureBits,
+    const VkMemoryAllocateFlagsInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkMemoryAllocateFlags);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkDeviceGroupRenderPassBeginInfo(
+    uint32_t featureBits,
+    const VkDeviceGroupRenderPassBeginInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->deviceRenderAreaCount; ++i)
+    {
+        count_VkRect2D(featureBits, (const VkRect2D*)(toCount->pDeviceRenderAreas + i), count);
+    }
+}
+
+void count_VkDeviceGroupCommandBufferBeginInfo(
+    uint32_t featureBits,
+    const VkDeviceGroupCommandBufferBeginInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkDeviceGroupSubmitInfo(
+    uint32_t featureBits,
+    const VkDeviceGroupSubmitInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    *count += toCount->waitSemaphoreCount * sizeof(const uint32_t);
+    *count += sizeof(uint32_t);
+    *count += toCount->commandBufferCount * sizeof(const uint32_t);
+    *count += sizeof(uint32_t);
+    *count += toCount->signalSemaphoreCount * sizeof(const uint32_t);
+}
+
+void count_VkDeviceGroupBindSparseInfo(
+    uint32_t featureBits,
+    const VkDeviceGroupBindSparseInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkBindBufferMemoryDeviceGroupInfo(
+    uint32_t featureBits,
+    const VkBindBufferMemoryDeviceGroupInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    *count += toCount->deviceIndexCount * sizeof(const uint32_t);
+}
+
+void count_VkBindImageMemoryDeviceGroupInfo(
+    uint32_t featureBits,
+    const VkBindImageMemoryDeviceGroupInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    *count += toCount->deviceIndexCount * sizeof(const uint32_t);
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->splitInstanceBindRegionCount; ++i)
+    {
+        count_VkRect2D(featureBits, (const VkRect2D*)(toCount->pSplitInstanceBindRegions + i), count);
+    }
+}
+
+void count_VkPhysicalDeviceGroupProperties(
+    uint32_t featureBits,
+    const VkPhysicalDeviceGroupProperties* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    *count += VK_MAX_DEVICE_GROUP_SIZE * sizeof(VkPhysicalDevice);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkDeviceGroupDeviceCreateInfo(
+    uint32_t featureBits,
+    const VkDeviceGroupDeviceCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    if (toCount->physicalDeviceCount)
+    {
+        *count += toCount->physicalDeviceCount * 8;
+    }
+}
+
+void count_VkBufferMemoryRequirementsInfo2(
+    uint32_t featureBits,
+    const VkBufferMemoryRequirementsInfo2* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_46;
+    *count += 1 * 8;
+}
+
+void count_VkImageMemoryRequirementsInfo2(
+    uint32_t featureBits,
+    const VkImageMemoryRequirementsInfo2* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_47;
+    *count += 1 * 8;
+}
+
+void count_VkImageSparseMemoryRequirementsInfo2(
+    uint32_t featureBits,
+    const VkImageSparseMemoryRequirementsInfo2* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_48;
+    *count += 1 * 8;
+}
+
+void count_VkMemoryRequirements2(
+    uint32_t featureBits,
+    const VkMemoryRequirements2* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    count_VkMemoryRequirements(featureBits, (VkMemoryRequirements*)(&toCount->memoryRequirements), count);
+}
+
+void count_VkSparseImageMemoryRequirements2(
+    uint32_t featureBits,
+    const VkSparseImageMemoryRequirements2* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    count_VkSparseImageMemoryRequirements(featureBits, (VkSparseImageMemoryRequirements*)(&toCount->memoryRequirements), count);
+}
+
+void count_VkPhysicalDeviceFeatures2(
+    uint32_t featureBits,
+    const VkPhysicalDeviceFeatures2* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    count_VkPhysicalDeviceFeatures(featureBits, (VkPhysicalDeviceFeatures*)(&toCount->features), count);
+}
+
+void count_VkPhysicalDeviceProperties2(
+    uint32_t featureBits,
+    const VkPhysicalDeviceProperties2* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    count_VkPhysicalDeviceProperties(featureBits, (VkPhysicalDeviceProperties*)(&toCount->properties), count);
+}
+
+void count_VkFormatProperties2(
+    uint32_t featureBits,
+    const VkFormatProperties2* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    count_VkFormatProperties(featureBits, (VkFormatProperties*)(&toCount->formatProperties), count);
+}
+
+void count_VkImageFormatProperties2(
+    uint32_t featureBits,
+    const VkImageFormatProperties2* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    count_VkImageFormatProperties(featureBits, (VkImageFormatProperties*)(&toCount->imageFormatProperties), count);
+}
+
+void count_VkPhysicalDeviceImageFormatInfo2(
+    uint32_t featureBits,
+    const VkPhysicalDeviceImageFormatInfo2* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkFormat);
+    *count += sizeof(VkImageType);
+    *count += sizeof(VkImageTiling);
+    *count += sizeof(VkImageUsageFlags);
+    *count += sizeof(VkImageCreateFlags);
+}
+
+void count_VkQueueFamilyProperties2(
+    uint32_t featureBits,
+    const VkQueueFamilyProperties2* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    count_VkQueueFamilyProperties(featureBits, (VkQueueFamilyProperties*)(&toCount->queueFamilyProperties), count);
+}
+
+void count_VkPhysicalDeviceMemoryProperties2(
+    uint32_t featureBits,
+    const VkPhysicalDeviceMemoryProperties2* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    count_VkPhysicalDeviceMemoryProperties(featureBits, (VkPhysicalDeviceMemoryProperties*)(&toCount->memoryProperties), count);
+}
+
+void count_VkSparseImageFormatProperties2(
+    uint32_t featureBits,
+    const VkSparseImageFormatProperties2* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    count_VkSparseImageFormatProperties(featureBits, (VkSparseImageFormatProperties*)(&toCount->properties), count);
+}
+
+void count_VkPhysicalDeviceSparseImageFormatInfo2(
+    uint32_t featureBits,
+    const VkPhysicalDeviceSparseImageFormatInfo2* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkFormat);
+    *count += sizeof(VkImageType);
+    *count += sizeof(VkSampleCountFlagBits);
+    *count += sizeof(VkImageUsageFlags);
+    *count += sizeof(VkImageTiling);
+}
+
+void count_VkPhysicalDevicePointClippingProperties(
+    uint32_t featureBits,
+    const VkPhysicalDevicePointClippingProperties* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkPointClippingBehavior);
+}
+
+void count_VkInputAttachmentAspectReference(
+    uint32_t featureBits,
+    const VkInputAttachmentAspectReference* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkImageAspectFlags);
+}
+
+void count_VkRenderPassInputAttachmentAspectCreateInfo(
+    uint32_t featureBits,
+    const VkRenderPassInputAttachmentAspectCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->aspectReferenceCount; ++i)
+    {
+        count_VkInputAttachmentAspectReference(featureBits, (const VkInputAttachmentAspectReference*)(toCount->pAspectReferences + i), count);
+    }
+}
+
+void count_VkImageViewUsageCreateInfo(
+    uint32_t featureBits,
+    const VkImageViewUsageCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkImageUsageFlags);
+}
+
+void count_VkPipelineTessellationDomainOriginStateCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineTessellationDomainOriginStateCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkTessellationDomainOrigin);
+}
+
+void count_VkRenderPassMultiviewCreateInfo(
+    uint32_t featureBits,
+    const VkRenderPassMultiviewCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    *count += toCount->subpassCount * sizeof(const uint32_t);
+    *count += sizeof(uint32_t);
+    *count += toCount->dependencyCount * sizeof(const int32_t);
+    *count += sizeof(uint32_t);
+    *count += toCount->correlationMaskCount * sizeof(const uint32_t);
+}
+
+void count_VkPhysicalDeviceMultiviewFeatures(
+    uint32_t featureBits,
+    const VkPhysicalDeviceMultiviewFeatures* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkPhysicalDeviceMultiviewProperties(
+    uint32_t featureBits,
+    const VkPhysicalDeviceMultiviewProperties* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkPhysicalDeviceVariablePointerFeatures(
+    uint32_t featureBits,
+    const VkPhysicalDeviceVariablePointerFeatures* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkPhysicalDeviceProtectedMemoryFeatures(
+    uint32_t featureBits,
+    const VkPhysicalDeviceProtectedMemoryFeatures* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkPhysicalDeviceProtectedMemoryProperties(
+    uint32_t featureBits,
+    const VkPhysicalDeviceProtectedMemoryProperties* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkDeviceQueueInfo2(
+    uint32_t featureBits,
+    const VkDeviceQueueInfo2* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkDeviceQueueCreateFlags);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkProtectedSubmitInfo(
+    uint32_t featureBits,
+    const VkProtectedSubmitInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkSamplerYcbcrConversionCreateInfo(
+    uint32_t featureBits,
+    const VkSamplerYcbcrConversionCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkFormat);
+    *count += sizeof(VkSamplerYcbcrModelConversion);
+    *count += sizeof(VkSamplerYcbcrRange);
+    count_VkComponentMapping(featureBits, (VkComponentMapping*)(&toCount->components), count);
+    *count += sizeof(VkChromaLocation);
+    *count += sizeof(VkChromaLocation);
+    *count += sizeof(VkFilter);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkSamplerYcbcrConversionInfo(
+    uint32_t featureBits,
+    const VkSamplerYcbcrConversionInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_49;
+    *count += 1 * 8;
+}
+
+void count_VkBindImagePlaneMemoryInfo(
+    uint32_t featureBits,
+    const VkBindImagePlaneMemoryInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkImageAspectFlagBits);
+}
+
+void count_VkImagePlaneMemoryRequirementsInfo(
+    uint32_t featureBits,
+    const VkImagePlaneMemoryRequirementsInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkImageAspectFlagBits);
+}
+
+void count_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
+    uint32_t featureBits,
+    const VkPhysicalDeviceSamplerYcbcrConversionFeatures* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkSamplerYcbcrConversionImageFormatProperties(
+    uint32_t featureBits,
+    const VkSamplerYcbcrConversionImageFormatProperties* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkDescriptorUpdateTemplateEntry(
+    uint32_t featureBits,
+    const VkDescriptorUpdateTemplateEntry* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkDescriptorType);
+    *count += 8;
+    *count += 8;
+}
+
+void count_VkDescriptorUpdateTemplateCreateInfo(
+    uint32_t featureBits,
+    const VkDescriptorUpdateTemplateCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkDescriptorUpdateTemplateCreateFlags);
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->descriptorUpdateEntryCount; ++i)
+    {
+        count_VkDescriptorUpdateTemplateEntry(featureBits, (const VkDescriptorUpdateTemplateEntry*)(toCount->pDescriptorUpdateEntries + i), count);
+    }
+    *count += sizeof(VkDescriptorUpdateTemplateType);
+    uint64_t cgen_var_50;
+    *count += 1 * 8;
+    *count += sizeof(VkPipelineBindPoint);
+    uint64_t cgen_var_51;
+    *count += 1 * 8;
+    *count += sizeof(uint32_t);
+}
+
+void count_VkExternalMemoryProperties(
+    uint32_t featureBits,
+    const VkExternalMemoryProperties* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkExternalMemoryFeatureFlags);
+    *count += sizeof(VkExternalMemoryHandleTypeFlags);
+    *count += sizeof(VkExternalMemoryHandleTypeFlags);
+}
+
+void count_VkPhysicalDeviceExternalImageFormatInfo(
+    uint32_t featureBits,
+    const VkPhysicalDeviceExternalImageFormatInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkExternalMemoryHandleTypeFlagBits);
+}
+
+void count_VkExternalImageFormatProperties(
+    uint32_t featureBits,
+    const VkExternalImageFormatProperties* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    count_VkExternalMemoryProperties(featureBits, (VkExternalMemoryProperties*)(&toCount->externalMemoryProperties), count);
+}
+
+void count_VkPhysicalDeviceExternalBufferInfo(
+    uint32_t featureBits,
+    const VkPhysicalDeviceExternalBufferInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBufferCreateFlags);
+    *count += sizeof(VkBufferUsageFlags);
+    *count += sizeof(VkExternalMemoryHandleTypeFlagBits);
+}
+
+void count_VkExternalBufferProperties(
+    uint32_t featureBits,
+    const VkExternalBufferProperties* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    count_VkExternalMemoryProperties(featureBits, (VkExternalMemoryProperties*)(&toCount->externalMemoryProperties), count);
+}
+
+void count_VkPhysicalDeviceIDProperties(
+    uint32_t featureBits,
+    const VkPhysicalDeviceIDProperties* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += VK_UUID_SIZE * sizeof(uint8_t);
+    *count += VK_UUID_SIZE * sizeof(uint8_t);
+    *count += VK_LUID_SIZE * sizeof(uint8_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkExternalMemoryImageCreateInfo(
+    uint32_t featureBits,
+    const VkExternalMemoryImageCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkExternalMemoryHandleTypeFlags);
+}
+
+void count_VkExternalMemoryBufferCreateInfo(
+    uint32_t featureBits,
+    const VkExternalMemoryBufferCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkExternalMemoryHandleTypeFlags);
+}
+
+void count_VkExportMemoryAllocateInfo(
+    uint32_t featureBits,
+    const VkExportMemoryAllocateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkExternalMemoryHandleTypeFlags);
+}
+
+void count_VkPhysicalDeviceExternalFenceInfo(
+    uint32_t featureBits,
+    const VkPhysicalDeviceExternalFenceInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkExternalFenceHandleTypeFlagBits);
+}
+
+void count_VkExternalFenceProperties(
+    uint32_t featureBits,
+    const VkExternalFenceProperties* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkExternalFenceHandleTypeFlags);
+    *count += sizeof(VkExternalFenceHandleTypeFlags);
+    *count += sizeof(VkExternalFenceFeatureFlags);
+}
+
+void count_VkExportFenceCreateInfo(
+    uint32_t featureBits,
+    const VkExportFenceCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkExternalFenceHandleTypeFlags);
+}
+
+void count_VkExportSemaphoreCreateInfo(
+    uint32_t featureBits,
+    const VkExportSemaphoreCreateInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkExternalSemaphoreHandleTypeFlags);
+}
+
+void count_VkPhysicalDeviceExternalSemaphoreInfo(
+    uint32_t featureBits,
+    const VkPhysicalDeviceExternalSemaphoreInfo* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkExternalSemaphoreHandleTypeFlagBits);
+}
+
+void count_VkExternalSemaphoreProperties(
+    uint32_t featureBits,
+    const VkExternalSemaphoreProperties* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkExternalSemaphoreHandleTypeFlags);
+    *count += sizeof(VkExternalSemaphoreHandleTypeFlags);
+    *count += sizeof(VkExternalSemaphoreFeatureFlags);
+}
+
+void count_VkPhysicalDeviceMaintenance3Properties(
+    uint32_t featureBits,
+    const VkPhysicalDeviceMaintenance3Properties* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkDeviceSize);
+}
+
+void count_VkDescriptorSetLayoutSupport(
+    uint32_t featureBits,
+    const VkDescriptorSetLayoutSupport* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkPhysicalDeviceShaderDrawParameterFeatures(
+    uint32_t featureBits,
+    const VkPhysicalDeviceShaderDrawParameterFeatures* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+}
+
+#endif
+#ifdef VK_KHR_surface
+void count_VkSurfaceCapabilitiesKHR(
+    uint32_t featureBits,
+    const VkSurfaceCapabilitiesKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->currentExtent), count);
+    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->minImageExtent), count);
+    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->maxImageExtent), count);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkSurfaceTransformFlagsKHR);
+    *count += sizeof(VkSurfaceTransformFlagBitsKHR);
+    *count += sizeof(VkCompositeAlphaFlagsKHR);
+    *count += sizeof(VkImageUsageFlags);
+}
+
+void count_VkSurfaceFormatKHR(
+    uint32_t featureBits,
+    const VkSurfaceFormatKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkFormat);
+    *count += sizeof(VkColorSpaceKHR);
+}
+
+#endif
+#ifdef VK_KHR_swapchain
+void count_VkSwapchainCreateInfoKHR(
+    uint32_t featureBits,
+    const VkSwapchainCreateInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkSwapchainCreateFlagsKHR);
+    uint64_t cgen_var_52;
+    *count += 1 * 8;
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkFormat);
+    *count += sizeof(VkColorSpaceKHR);
+    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->imageExtent), count);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkImageUsageFlags);
+    *count += sizeof(VkSharingMode);
+    *count += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pQueueFamilyIndices)
+    {
+        *count += toCount->queueFamilyIndexCount * sizeof(const uint32_t);
+    }
+    *count += sizeof(VkSurfaceTransformFlagBitsKHR);
+    *count += sizeof(VkCompositeAlphaFlagBitsKHR);
+    *count += sizeof(VkPresentModeKHR);
+    *count += sizeof(VkBool32);
+    uint64_t cgen_var_53;
+    *count += 1 * 8;
+}
+
+void count_VkPresentInfoKHR(
+    uint32_t featureBits,
+    const VkPresentInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    if (toCount->waitSemaphoreCount)
+    {
+        *count += toCount->waitSemaphoreCount * 8;
+    }
+    *count += sizeof(uint32_t);
+    if (toCount->swapchainCount)
+    {
+        *count += toCount->swapchainCount * 8;
+    }
+    *count += toCount->swapchainCount * sizeof(const uint32_t);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pResults)
+    {
+        *count += toCount->swapchainCount * sizeof(VkResult);
+    }
+}
+
+void count_VkImageSwapchainCreateInfoKHR(
+    uint32_t featureBits,
+    const VkImageSwapchainCreateInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_56;
+    *count += 1 * 8;
+}
+
+void count_VkBindImageMemorySwapchainInfoKHR(
+    uint32_t featureBits,
+    const VkBindImageMemorySwapchainInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_57;
+    *count += 1 * 8;
+    *count += sizeof(uint32_t);
+}
+
+void count_VkAcquireNextImageInfoKHR(
+    uint32_t featureBits,
+    const VkAcquireNextImageInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_58;
+    *count += 1 * 8;
+    *count += sizeof(uint64_t);
+    uint64_t cgen_var_59;
+    *count += 1 * 8;
+    uint64_t cgen_var_60;
+    *count += 1 * 8;
+    *count += sizeof(uint32_t);
+}
+
+void count_VkDeviceGroupPresentCapabilitiesKHR(
+    uint32_t featureBits,
+    const VkDeviceGroupPresentCapabilitiesKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += VK_MAX_DEVICE_GROUP_SIZE * sizeof(uint32_t);
+    *count += sizeof(VkDeviceGroupPresentModeFlagsKHR);
+}
+
+void count_VkDeviceGroupPresentInfoKHR(
+    uint32_t featureBits,
+    const VkDeviceGroupPresentInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    *count += toCount->swapchainCount * sizeof(const uint32_t);
+    *count += sizeof(VkDeviceGroupPresentModeFlagBitsKHR);
+}
+
+void count_VkDeviceGroupSwapchainCreateInfoKHR(
+    uint32_t featureBits,
+    const VkDeviceGroupSwapchainCreateInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkDeviceGroupPresentModeFlagsKHR);
+}
+
+#endif
+#ifdef VK_KHR_display
+void count_VkDisplayPropertiesKHR(
+    uint32_t featureBits,
+    const VkDisplayPropertiesKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    uint64_t cgen_var_61;
+    *count += 1 * 8;
+    *count += sizeof(uint32_t) + (toCount->displayName ? strlen(toCount->displayName) : 0);
+    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->physicalDimensions), count);
+    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->physicalResolution), count);
+    *count += sizeof(VkSurfaceTransformFlagsKHR);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkDisplayModeParametersKHR(
+    uint32_t featureBits,
+    const VkDisplayModeParametersKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->visibleRegion), count);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkDisplayModePropertiesKHR(
+    uint32_t featureBits,
+    const VkDisplayModePropertiesKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    uint64_t cgen_var_62;
+    *count += 1 * 8;
+    count_VkDisplayModeParametersKHR(featureBits, (VkDisplayModeParametersKHR*)(&toCount->parameters), count);
+}
+
+void count_VkDisplayModeCreateInfoKHR(
+    uint32_t featureBits,
+    const VkDisplayModeCreateInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkDisplayModeCreateFlagsKHR);
+    count_VkDisplayModeParametersKHR(featureBits, (VkDisplayModeParametersKHR*)(&toCount->parameters), count);
+}
+
+void count_VkDisplayPlaneCapabilitiesKHR(
+    uint32_t featureBits,
+    const VkDisplayPlaneCapabilitiesKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkDisplayPlaneAlphaFlagsKHR);
+    count_VkOffset2D(featureBits, (VkOffset2D*)(&toCount->minSrcPosition), count);
+    count_VkOffset2D(featureBits, (VkOffset2D*)(&toCount->maxSrcPosition), count);
+    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->minSrcExtent), count);
+    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->maxSrcExtent), count);
+    count_VkOffset2D(featureBits, (VkOffset2D*)(&toCount->minDstPosition), count);
+    count_VkOffset2D(featureBits, (VkOffset2D*)(&toCount->maxDstPosition), count);
+    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->minDstExtent), count);
+    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->maxDstExtent), count);
+}
+
+void count_VkDisplayPlanePropertiesKHR(
+    uint32_t featureBits,
+    const VkDisplayPlanePropertiesKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    uint64_t cgen_var_63;
+    *count += 1 * 8;
+    *count += sizeof(uint32_t);
+}
+
+void count_VkDisplaySurfaceCreateInfoKHR(
+    uint32_t featureBits,
+    const VkDisplaySurfaceCreateInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkDisplaySurfaceCreateFlagsKHR);
+    uint64_t cgen_var_64;
+    *count += 1 * 8;
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkSurfaceTransformFlagBitsKHR);
+    *count += sizeof(float);
+    *count += sizeof(VkDisplayPlaneAlphaFlagBitsKHR);
+    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->imageExtent), count);
+}
+
+#endif
+#ifdef VK_KHR_display_swapchain
+void count_VkDisplayPresentInfoKHR(
+    uint32_t featureBits,
+    const VkDisplayPresentInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    count_VkRect2D(featureBits, (VkRect2D*)(&toCount->srcRect), count);
+    count_VkRect2D(featureBits, (VkRect2D*)(&toCount->dstRect), count);
+    *count += sizeof(VkBool32);
+}
+
+#endif
+#ifdef VK_KHR_xlib_surface
+void count_VkXlibSurfaceCreateInfoKHR(
+    uint32_t featureBits,
+    const VkXlibSurfaceCreateInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkXlibSurfaceCreateFlagsKHR);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->dpy)
+    {
+        *count += sizeof(Display);
+    }
+    *count += sizeof(Window);
+}
+
+#endif
+#ifdef VK_KHR_xcb_surface
+void count_VkXcbSurfaceCreateInfoKHR(
+    uint32_t featureBits,
+    const VkXcbSurfaceCreateInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkXcbSurfaceCreateFlagsKHR);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->connection)
+    {
+        *count += sizeof(xcb_connection_t);
+    }
+    *count += sizeof(xcb_window_t);
+}
+
+#endif
+#ifdef VK_KHR_wayland_surface
+void count_VkWaylandSurfaceCreateInfoKHR(
+    uint32_t featureBits,
+    const VkWaylandSurfaceCreateInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkWaylandSurfaceCreateFlagsKHR);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->display)
+    {
+        *count += sizeof(wl_display);
+    }
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->surface)
+    {
+        *count += sizeof(wl_surface);
+    }
+}
+
+#endif
+#ifdef VK_KHR_mir_surface
+void count_VkMirSurfaceCreateInfoKHR(
+    uint32_t featureBits,
+    const VkMirSurfaceCreateInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkMirSurfaceCreateFlagsKHR);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->connection)
+    {
+        *count += sizeof(MirConnection);
+    }
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->mirSurface)
+    {
+        *count += sizeof(MirSurface);
+    }
+}
+
+#endif
+#ifdef VK_KHR_android_surface
+void count_VkAndroidSurfaceCreateInfoKHR(
+    uint32_t featureBits,
+    const VkAndroidSurfaceCreateInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkAndroidSurfaceCreateFlagsKHR);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->window)
+    {
+        *count += sizeof(ANativeWindow);
+    }
+}
+
+#endif
+#ifdef VK_KHR_win32_surface
+void count_VkWin32SurfaceCreateInfoKHR(
+    uint32_t featureBits,
+    const VkWin32SurfaceCreateInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkWin32SurfaceCreateFlagsKHR);
+    *count += sizeof(HINSTANCE);
+    *count += sizeof(HWND);
+}
+
+#endif
+#ifdef VK_KHR_sampler_mirror_clamp_to_edge
+#endif
+#ifdef VK_KHR_multiview
+#endif
+#ifdef VK_KHR_get_physical_device_properties2
+#endif
+#ifdef VK_KHR_device_group
+#endif
+#ifdef VK_KHR_shader_draw_parameters
+#endif
+#ifdef VK_KHR_maintenance1
+#endif
+#ifdef VK_KHR_device_group_creation
+#endif
+#ifdef VK_KHR_external_memory_capabilities
+#endif
+#ifdef VK_KHR_external_memory
+#endif
+#ifdef VK_KHR_external_memory_win32
+void count_VkImportMemoryWin32HandleInfoKHR(
+    uint32_t featureBits,
+    const VkImportMemoryWin32HandleInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkExternalMemoryHandleTypeFlagBits);
+    *count += sizeof(HANDLE);
+    *count += sizeof(LPCWSTR);
+}
+
+void count_VkExportMemoryWin32HandleInfoKHR(
+    uint32_t featureBits,
+    const VkExportMemoryWin32HandleInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pAttributes)
+    {
+        *count += sizeof(const SECURITY_ATTRIBUTES);
+    }
+    *count += sizeof(DWORD);
+    *count += sizeof(LPCWSTR);
+}
+
+void count_VkMemoryWin32HandlePropertiesKHR(
+    uint32_t featureBits,
+    const VkMemoryWin32HandlePropertiesKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkMemoryGetWin32HandleInfoKHR(
+    uint32_t featureBits,
+    const VkMemoryGetWin32HandleInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_65;
+    *count += 1 * 8;
+    *count += sizeof(VkExternalMemoryHandleTypeFlagBits);
+}
+
+#endif
+#ifdef VK_KHR_external_memory_fd
+void count_VkImportMemoryFdInfoKHR(
+    uint32_t featureBits,
+    const VkImportMemoryFdInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkExternalMemoryHandleTypeFlagBits);
+    *count += sizeof(int);
+}
+
+void count_VkMemoryFdPropertiesKHR(
+    uint32_t featureBits,
+    const VkMemoryFdPropertiesKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkMemoryGetFdInfoKHR(
+    uint32_t featureBits,
+    const VkMemoryGetFdInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_66;
+    *count += 1 * 8;
+    *count += sizeof(VkExternalMemoryHandleTypeFlagBits);
+}
+
+#endif
+#ifdef VK_KHR_win32_keyed_mutex
+void count_VkWin32KeyedMutexAcquireReleaseInfoKHR(
+    uint32_t featureBits,
+    const VkWin32KeyedMutexAcquireReleaseInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    if (toCount->acquireCount)
+    {
+        *count += toCount->acquireCount * 8;
+    }
+    *count += toCount->acquireCount * sizeof(const uint64_t);
+    *count += toCount->acquireCount * sizeof(const uint32_t);
+    *count += sizeof(uint32_t);
+    if (toCount->releaseCount)
+    {
+        *count += toCount->releaseCount * 8;
+    }
+    *count += toCount->releaseCount * sizeof(const uint64_t);
+}
+
+#endif
+#ifdef VK_KHR_external_semaphore_capabilities
+#endif
+#ifdef VK_KHR_external_semaphore
+#endif
+#ifdef VK_KHR_external_semaphore_win32
+void count_VkImportSemaphoreWin32HandleInfoKHR(
+    uint32_t featureBits,
+    const VkImportSemaphoreWin32HandleInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_69;
+    *count += 1 * 8;
+    *count += sizeof(VkSemaphoreImportFlags);
+    *count += sizeof(VkExternalSemaphoreHandleTypeFlagBits);
+    *count += sizeof(HANDLE);
+    *count += sizeof(LPCWSTR);
+}
+
+void count_VkExportSemaphoreWin32HandleInfoKHR(
+    uint32_t featureBits,
+    const VkExportSemaphoreWin32HandleInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pAttributes)
+    {
+        *count += sizeof(const SECURITY_ATTRIBUTES);
+    }
+    *count += sizeof(DWORD);
+    *count += sizeof(LPCWSTR);
+}
+
+void count_VkD3D12FenceSubmitInfoKHR(
+    uint32_t featureBits,
+    const VkD3D12FenceSubmitInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pWaitSemaphoreValues)
+    {
+        *count += toCount->waitSemaphoreValuesCount * sizeof(const uint64_t);
+    }
+    *count += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pSignalSemaphoreValues)
+    {
+        *count += toCount->signalSemaphoreValuesCount * sizeof(const uint64_t);
+    }
+}
+
+void count_VkSemaphoreGetWin32HandleInfoKHR(
+    uint32_t featureBits,
+    const VkSemaphoreGetWin32HandleInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_70;
+    *count += 1 * 8;
+    *count += sizeof(VkExternalSemaphoreHandleTypeFlagBits);
+}
+
+#endif
+#ifdef VK_KHR_external_semaphore_fd
+void count_VkImportSemaphoreFdInfoKHR(
+    uint32_t featureBits,
+    const VkImportSemaphoreFdInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_71;
+    *count += 1 * 8;
+    *count += sizeof(VkSemaphoreImportFlags);
+    *count += sizeof(VkExternalSemaphoreHandleTypeFlagBits);
+    *count += sizeof(int);
+}
+
+void count_VkSemaphoreGetFdInfoKHR(
+    uint32_t featureBits,
+    const VkSemaphoreGetFdInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_72;
+    *count += 1 * 8;
+    *count += sizeof(VkExternalSemaphoreHandleTypeFlagBits);
+}
+
+#endif
+#ifdef VK_KHR_push_descriptor
+void count_VkPhysicalDevicePushDescriptorPropertiesKHR(
+    uint32_t featureBits,
+    const VkPhysicalDevicePushDescriptorPropertiesKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+}
+
+#endif
+#ifdef VK_KHR_16bit_storage
+#endif
+#ifdef VK_KHR_incremental_present
+void count_VkRectLayerKHR(
+    uint32_t featureBits,
+    const VkRectLayerKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    count_VkOffset2D(featureBits, (VkOffset2D*)(&toCount->offset), count);
+    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->extent), count);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkPresentRegionKHR(
+    uint32_t featureBits,
+    const VkPresentRegionKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pRectangles)
+    {
+        for (uint32_t i = 0; i < (uint32_t)toCount->rectangleCount; ++i)
+        {
+            count_VkRectLayerKHR(featureBits, (const VkRectLayerKHR*)(toCount->pRectangles + i), count);
+        }
+    }
+}
+
+void count_VkPresentRegionsKHR(
+    uint32_t featureBits,
+    const VkPresentRegionsKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pRegions)
+    {
+        for (uint32_t i = 0; i < (uint32_t)toCount->swapchainCount; ++i)
+        {
+            count_VkPresentRegionKHR(featureBits, (const VkPresentRegionKHR*)(toCount->pRegions + i), count);
+        }
+    }
+}
+
+#endif
+#ifdef VK_KHR_descriptor_update_template
+#endif
+#ifdef VK_KHR_create_renderpass2
+void count_VkAttachmentDescription2KHR(
+    uint32_t featureBits,
+    const VkAttachmentDescription2KHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkAttachmentDescriptionFlags);
+    *count += sizeof(VkFormat);
+    *count += sizeof(VkSampleCountFlagBits);
+    *count += sizeof(VkAttachmentLoadOp);
+    *count += sizeof(VkAttachmentStoreOp);
+    *count += sizeof(VkAttachmentLoadOp);
+    *count += sizeof(VkAttachmentStoreOp);
+    *count += sizeof(VkImageLayout);
+    *count += sizeof(VkImageLayout);
+}
+
+void count_VkAttachmentReference2KHR(
+    uint32_t featureBits,
+    const VkAttachmentReference2KHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkImageLayout);
+    *count += sizeof(VkImageAspectFlags);
+}
+
+void count_VkSubpassDescription2KHR(
+    uint32_t featureBits,
+    const VkSubpassDescription2KHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkSubpassDescriptionFlags);
+    *count += sizeof(VkPipelineBindPoint);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->inputAttachmentCount; ++i)
+    {
+        count_VkAttachmentReference2KHR(featureBits, (const VkAttachmentReference2KHR*)(toCount->pInputAttachments + i), count);
+    }
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->colorAttachmentCount; ++i)
+    {
+        count_VkAttachmentReference2KHR(featureBits, (const VkAttachmentReference2KHR*)(toCount->pColorAttachments + i), count);
+    }
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pResolveAttachments)
+    {
+        for (uint32_t i = 0; i < (uint32_t)toCount->colorAttachmentCount; ++i)
+        {
+            count_VkAttachmentReference2KHR(featureBits, (const VkAttachmentReference2KHR*)(toCount->pResolveAttachments + i), count);
+        }
+    }
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pDepthStencilAttachment)
+    {
+        count_VkAttachmentReference2KHR(featureBits, (const VkAttachmentReference2KHR*)(toCount->pDepthStencilAttachment), count);
+    }
+    *count += sizeof(uint32_t);
+    *count += toCount->preserveAttachmentCount * sizeof(const uint32_t);
+}
+
+void count_VkSubpassDependency2KHR(
+    uint32_t featureBits,
+    const VkSubpassDependency2KHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkPipelineStageFlags);
+    *count += sizeof(VkPipelineStageFlags);
+    *count += sizeof(VkAccessFlags);
+    *count += sizeof(VkAccessFlags);
+    *count += sizeof(VkDependencyFlags);
+    *count += sizeof(int32_t);
+}
+
+void count_VkRenderPassCreateInfo2KHR(
+    uint32_t featureBits,
+    const VkRenderPassCreateInfo2KHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkRenderPassCreateFlags);
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->attachmentCount; ++i)
+    {
+        count_VkAttachmentDescription2KHR(featureBits, (const VkAttachmentDescription2KHR*)(toCount->pAttachments + i), count);
+    }
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->subpassCount; ++i)
+    {
+        count_VkSubpassDescription2KHR(featureBits, (const VkSubpassDescription2KHR*)(toCount->pSubpasses + i), count);
+    }
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->dependencyCount; ++i)
+    {
+        count_VkSubpassDependency2KHR(featureBits, (const VkSubpassDependency2KHR*)(toCount->pDependencies + i), count);
+    }
+    *count += sizeof(uint32_t);
+    *count += toCount->correlatedViewMaskCount * sizeof(const uint32_t);
+}
+
+void count_VkSubpassBeginInfoKHR(
+    uint32_t featureBits,
+    const VkSubpassBeginInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkSubpassContents);
+}
+
+void count_VkSubpassEndInfoKHR(
+    uint32_t featureBits,
+    const VkSubpassEndInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+}
+
+#endif
+#ifdef VK_KHR_shared_presentable_image
+void count_VkSharedPresentSurfaceCapabilitiesKHR(
+    uint32_t featureBits,
+    const VkSharedPresentSurfaceCapabilitiesKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkImageUsageFlags);
+}
+
+#endif
+#ifdef VK_KHR_external_fence_capabilities
+#endif
+#ifdef VK_KHR_external_fence
+#endif
+#ifdef VK_KHR_external_fence_win32
+void count_VkImportFenceWin32HandleInfoKHR(
+    uint32_t featureBits,
+    const VkImportFenceWin32HandleInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_73;
+    *count += 1 * 8;
+    *count += sizeof(VkFenceImportFlags);
+    *count += sizeof(VkExternalFenceHandleTypeFlagBits);
+    *count += sizeof(HANDLE);
+    *count += sizeof(LPCWSTR);
+}
+
+void count_VkExportFenceWin32HandleInfoKHR(
+    uint32_t featureBits,
+    const VkExportFenceWin32HandleInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pAttributes)
+    {
+        *count += sizeof(const SECURITY_ATTRIBUTES);
+    }
+    *count += sizeof(DWORD);
+    *count += sizeof(LPCWSTR);
+}
+
+void count_VkFenceGetWin32HandleInfoKHR(
+    uint32_t featureBits,
+    const VkFenceGetWin32HandleInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_74;
+    *count += 1 * 8;
+    *count += sizeof(VkExternalFenceHandleTypeFlagBits);
+}
+
+#endif
+#ifdef VK_KHR_external_fence_fd
+void count_VkImportFenceFdInfoKHR(
+    uint32_t featureBits,
+    const VkImportFenceFdInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_75;
+    *count += 1 * 8;
+    *count += sizeof(VkFenceImportFlags);
+    *count += sizeof(VkExternalFenceHandleTypeFlagBits);
+    *count += sizeof(int);
+}
+
+void count_VkFenceGetFdInfoKHR(
+    uint32_t featureBits,
+    const VkFenceGetFdInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_76;
+    *count += 1 * 8;
+    *count += sizeof(VkExternalFenceHandleTypeFlagBits);
+}
+
+#endif
+#ifdef VK_KHR_maintenance2
+#endif
+#ifdef VK_KHR_get_surface_capabilities2
+void count_VkPhysicalDeviceSurfaceInfo2KHR(
+    uint32_t featureBits,
+    const VkPhysicalDeviceSurfaceInfo2KHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_77;
+    *count += 1 * 8;
+}
+
+void count_VkSurfaceCapabilities2KHR(
+    uint32_t featureBits,
+    const VkSurfaceCapabilities2KHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    count_VkSurfaceCapabilitiesKHR(featureBits, (VkSurfaceCapabilitiesKHR*)(&toCount->surfaceCapabilities), count);
+}
+
+void count_VkSurfaceFormat2KHR(
+    uint32_t featureBits,
+    const VkSurfaceFormat2KHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    count_VkSurfaceFormatKHR(featureBits, (VkSurfaceFormatKHR*)(&toCount->surfaceFormat), count);
+}
+
+#endif
+#ifdef VK_KHR_variable_pointers
+#endif
+#ifdef VK_KHR_get_display_properties2
+void count_VkDisplayProperties2KHR(
+    uint32_t featureBits,
+    const VkDisplayProperties2KHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    count_VkDisplayPropertiesKHR(featureBits, (VkDisplayPropertiesKHR*)(&toCount->displayProperties), count);
+}
+
+void count_VkDisplayPlaneProperties2KHR(
+    uint32_t featureBits,
+    const VkDisplayPlaneProperties2KHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    count_VkDisplayPlanePropertiesKHR(featureBits, (VkDisplayPlanePropertiesKHR*)(&toCount->displayPlaneProperties), count);
+}
+
+void count_VkDisplayModeProperties2KHR(
+    uint32_t featureBits,
+    const VkDisplayModeProperties2KHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    count_VkDisplayModePropertiesKHR(featureBits, (VkDisplayModePropertiesKHR*)(&toCount->displayModeProperties), count);
+}
+
+void count_VkDisplayPlaneInfo2KHR(
+    uint32_t featureBits,
+    const VkDisplayPlaneInfo2KHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_78;
+    *count += 1 * 8;
+    *count += sizeof(uint32_t);
+}
+
+void count_VkDisplayPlaneCapabilities2KHR(
+    uint32_t featureBits,
+    const VkDisplayPlaneCapabilities2KHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    count_VkDisplayPlaneCapabilitiesKHR(featureBits, (VkDisplayPlaneCapabilitiesKHR*)(&toCount->capabilities), count);
+}
+
+#endif
+#ifdef VK_KHR_dedicated_allocation
+#endif
+#ifdef VK_KHR_storage_buffer_storage_class
+#endif
+#ifdef VK_KHR_relaxed_block_layout
+#endif
+#ifdef VK_KHR_get_memory_requirements2
+#endif
+#ifdef VK_KHR_image_format_list
+void count_VkImageFormatListCreateInfoKHR(
+    uint32_t featureBits,
+    const VkImageFormatListCreateInfoKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    *count += toCount->viewFormatCount * sizeof(const VkFormat);
+}
+
+#endif
+#ifdef VK_KHR_sampler_ycbcr_conversion
+#endif
+#ifdef VK_KHR_bind_memory2
+#endif
+#ifdef VK_KHR_maintenance3
+#endif
+#ifdef VK_KHR_draw_indirect_count
+#endif
+#ifdef VK_KHR_8bit_storage
+void count_VkPhysicalDevice8BitStorageFeaturesKHR(
+    uint32_t featureBits,
+    const VkPhysicalDevice8BitStorageFeaturesKHR* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+}
+
+#endif
+#ifdef VK_KHR_shader_float16_int8
+void count_VkPhysicalDeviceShaderFloat16Int8Features(
+    uint32_t featureBits,
+    const VkPhysicalDeviceShaderFloat16Int8Features* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+}
+
+#endif
+#ifdef VK_ANDROID_native_buffer
+void count_VkNativeBufferANDROID(
+    uint32_t featureBits,
+    const VkNativeBufferANDROID* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->handle)
+    {
+        *count += sizeof(const uint32_t);
+    }
+    *count += sizeof(int);
+    *count += sizeof(int);
+    *count += sizeof(int);
+    *count += sizeof(uint64_t);
+    *count += sizeof(uint64_t);
+}
+
+#endif
+#ifdef VK_EXT_debug_report
+void count_VkDebugReportCallbackCreateInfoEXT(
+    uint32_t featureBits,
+    const VkDebugReportCallbackCreateInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkDebugReportFlagsEXT);
+    *count += 8;
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pUserData)
+    {
+        *count += sizeof(uint8_t);
+    }
+}
+
+#endif
+#ifdef VK_NV_glsl_shader
+#endif
+#ifdef VK_EXT_depth_range_unrestricted
+#endif
+#ifdef VK_IMG_filter_cubic
+#endif
+#ifdef VK_AMD_rasterization_order
+void count_VkPipelineRasterizationStateRasterizationOrderAMD(
+    uint32_t featureBits,
+    const VkPipelineRasterizationStateRasterizationOrderAMD* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkRasterizationOrderAMD);
+}
+
+#endif
+#ifdef VK_AMD_shader_trinary_minmax
+#endif
+#ifdef VK_AMD_shader_explicit_vertex_parameter
+#endif
+#ifdef VK_EXT_debug_marker
+void count_VkDebugMarkerObjectNameInfoEXT(
+    uint32_t featureBits,
+    const VkDebugMarkerObjectNameInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkDebugReportObjectTypeEXT);
+    *count += sizeof(uint64_t);
+    *count += sizeof(uint32_t) + (toCount->pObjectName ? strlen(toCount->pObjectName) : 0);
+}
+
+void count_VkDebugMarkerObjectTagInfoEXT(
+    uint32_t featureBits,
+    const VkDebugMarkerObjectTagInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkDebugReportObjectTypeEXT);
+    *count += sizeof(uint64_t);
+    *count += sizeof(uint64_t);
+    *count += 8;
+    *count += toCount->tagSize * sizeof(const uint8_t);
+}
+
+void count_VkDebugMarkerMarkerInfoEXT(
+    uint32_t featureBits,
+    const VkDebugMarkerMarkerInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t) + (toCount->pMarkerName ? strlen(toCount->pMarkerName) : 0);
+    *count += 4 * sizeof(float);
+}
+
+#endif
+#ifdef VK_AMD_gcn_shader
+#endif
+#ifdef VK_NV_dedicated_allocation
+void count_VkDedicatedAllocationImageCreateInfoNV(
+    uint32_t featureBits,
+    const VkDedicatedAllocationImageCreateInfoNV* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkDedicatedAllocationBufferCreateInfoNV(
+    uint32_t featureBits,
+    const VkDedicatedAllocationBufferCreateInfoNV* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkDedicatedAllocationMemoryAllocateInfoNV(
+    uint32_t featureBits,
+    const VkDedicatedAllocationMemoryAllocateInfoNV* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_79;
+    *count += 1 * 8;
+    uint64_t cgen_var_80;
+    *count += 1 * 8;
+}
+
+#endif
+#ifdef VK_AMD_draw_indirect_count
+#endif
+#ifdef VK_AMD_negative_viewport_height
+#endif
+#ifdef VK_AMD_gpu_shader_half_float
+#endif
+#ifdef VK_AMD_shader_ballot
+#endif
+#ifdef VK_AMD_texture_gather_bias_lod
+void count_VkTextureLODGatherFormatPropertiesAMD(
+    uint32_t featureBits,
+    const VkTextureLODGatherFormatPropertiesAMD* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+}
+
+#endif
+#ifdef VK_AMD_shader_info
+void count_VkShaderResourceUsageAMD(
+    uint32_t featureBits,
+    const VkShaderResourceUsageAMD* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += 8;
+    *count += 8;
+}
+
+void count_VkShaderStatisticsInfoAMD(
+    uint32_t featureBits,
+    const VkShaderStatisticsInfoAMD* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkShaderStageFlags);
+    count_VkShaderResourceUsageAMD(featureBits, (VkShaderResourceUsageAMD*)(&toCount->resourceUsage), count);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += 3 * sizeof(uint32_t);
+}
+
+#endif
+#ifdef VK_AMD_shader_image_load_store_lod
+#endif
+#ifdef VK_IMG_format_pvrtc
+#endif
+#ifdef VK_NV_external_memory_capabilities
+void count_VkExternalImageFormatPropertiesNV(
+    uint32_t featureBits,
+    const VkExternalImageFormatPropertiesNV* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    count_VkImageFormatProperties(featureBits, (VkImageFormatProperties*)(&toCount->imageFormatProperties), count);
+    *count += sizeof(VkExternalMemoryFeatureFlagsNV);
+    *count += sizeof(VkExternalMemoryHandleTypeFlagsNV);
+    *count += sizeof(VkExternalMemoryHandleTypeFlagsNV);
+}
+
+#endif
+#ifdef VK_NV_external_memory
+void count_VkExternalMemoryImageCreateInfoNV(
+    uint32_t featureBits,
+    const VkExternalMemoryImageCreateInfoNV* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkExternalMemoryHandleTypeFlagsNV);
+}
+
+void count_VkExportMemoryAllocateInfoNV(
+    uint32_t featureBits,
+    const VkExportMemoryAllocateInfoNV* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkExternalMemoryHandleTypeFlagsNV);
+}
+
+#endif
+#ifdef VK_NV_external_memory_win32
+void count_VkImportMemoryWin32HandleInfoNV(
+    uint32_t featureBits,
+    const VkImportMemoryWin32HandleInfoNV* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkExternalMemoryHandleTypeFlagsNV);
+    *count += sizeof(HANDLE);
+}
+
+void count_VkExportMemoryWin32HandleInfoNV(
+    uint32_t featureBits,
+    const VkExportMemoryWin32HandleInfoNV* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pAttributes)
+    {
+        *count += sizeof(const SECURITY_ATTRIBUTES);
+    }
+    *count += sizeof(DWORD);
+}
+
+#endif
+#ifdef VK_NV_win32_keyed_mutex
+void count_VkWin32KeyedMutexAcquireReleaseInfoNV(
+    uint32_t featureBits,
+    const VkWin32KeyedMutexAcquireReleaseInfoNV* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    if (toCount->acquireCount)
+    {
+        *count += toCount->acquireCount * 8;
+    }
+    *count += toCount->acquireCount * sizeof(const uint64_t);
+    *count += toCount->acquireCount * sizeof(const uint32_t);
+    *count += sizeof(uint32_t);
+    if (toCount->releaseCount)
+    {
+        *count += toCount->releaseCount * 8;
+    }
+    *count += toCount->releaseCount * sizeof(const uint64_t);
+}
+
+#endif
+#ifdef VK_EXT_validation_flags
+void count_VkValidationFlagsEXT(
+    uint32_t featureBits,
+    const VkValidationFlagsEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    *count += toCount->disabledValidationCheckCount * sizeof(const VkValidationCheckEXT);
+}
+
+#endif
+#ifdef VK_NN_vi_surface
+void count_VkViSurfaceCreateInfoNN(
+    uint32_t featureBits,
+    const VkViSurfaceCreateInfoNN* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkViSurfaceCreateFlagsNN);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->window)
+    {
+        *count += sizeof(uint8_t);
+    }
+}
+
+#endif
+#ifdef VK_EXT_shader_subgroup_ballot
+#endif
+#ifdef VK_EXT_shader_subgroup_vote
+#endif
+#ifdef VK_EXT_conditional_rendering
+void count_VkConditionalRenderingBeginInfoEXT(
+    uint32_t featureBits,
+    const VkConditionalRenderingBeginInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_83;
+    *count += 1 * 8;
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkConditionalRenderingFlagsEXT);
+}
+
+void count_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
+    uint32_t featureBits,
+    const VkPhysicalDeviceConditionalRenderingFeaturesEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
+    uint32_t featureBits,
+    const VkCommandBufferInheritanceConditionalRenderingInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+}
+
+#endif
+#ifdef VK_NVX_device_generated_commands
+void count_VkDeviceGeneratedCommandsFeaturesNVX(
+    uint32_t featureBits,
+    const VkDeviceGeneratedCommandsFeaturesNVX* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkDeviceGeneratedCommandsLimitsNVX(
+    uint32_t featureBits,
+    const VkDeviceGeneratedCommandsLimitsNVX* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkIndirectCommandsTokenNVX(
+    uint32_t featureBits,
+    const VkIndirectCommandsTokenNVX* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkIndirectCommandsTokenTypeNVX);
+    uint64_t cgen_var_84;
+    *count += 1 * 8;
+    *count += sizeof(VkDeviceSize);
+}
+
+void count_VkIndirectCommandsLayoutTokenNVX(
+    uint32_t featureBits,
+    const VkIndirectCommandsLayoutTokenNVX* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkIndirectCommandsTokenTypeNVX);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkIndirectCommandsLayoutCreateInfoNVX(
+    uint32_t featureBits,
+    const VkIndirectCommandsLayoutCreateInfoNVX* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkPipelineBindPoint);
+    *count += sizeof(VkIndirectCommandsLayoutUsageFlagsNVX);
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->tokenCount; ++i)
+    {
+        count_VkIndirectCommandsLayoutTokenNVX(featureBits, (const VkIndirectCommandsLayoutTokenNVX*)(toCount->pTokens + i), count);
+    }
+}
+
+void count_VkCmdProcessCommandsInfoNVX(
+    uint32_t featureBits,
+    const VkCmdProcessCommandsInfoNVX* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_85;
+    *count += 1 * 8;
+    uint64_t cgen_var_86;
+    *count += 1 * 8;
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->indirectCommandsTokenCount; ++i)
+    {
+        count_VkIndirectCommandsTokenNVX(featureBits, (const VkIndirectCommandsTokenNVX*)(toCount->pIndirectCommandsTokens + i), count);
+    }
+    *count += sizeof(uint32_t);
+    uint64_t cgen_var_87;
+    *count += 1 * 8;
+    uint64_t cgen_var_88;
+    *count += 1 * 8;
+    *count += sizeof(VkDeviceSize);
+    uint64_t cgen_var_89;
+    *count += 1 * 8;
+    *count += sizeof(VkDeviceSize);
+}
+
+void count_VkCmdReserveSpaceForCommandsInfoNVX(
+    uint32_t featureBits,
+    const VkCmdReserveSpaceForCommandsInfoNVX* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_90;
+    *count += 1 * 8;
+    uint64_t cgen_var_91;
+    *count += 1 * 8;
+    *count += sizeof(uint32_t);
+}
+
+void count_VkObjectTableCreateInfoNVX(
+    uint32_t featureBits,
+    const VkObjectTableCreateInfoNVX* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    *count += toCount->objectCount * sizeof(const VkObjectEntryTypeNVX);
+    *count += toCount->objectCount * sizeof(const uint32_t);
+    *count += toCount->objectCount * sizeof(const VkObjectEntryUsageFlagsNVX);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkObjectTableEntryNVX(
+    uint32_t featureBits,
+    const VkObjectTableEntryNVX* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkObjectEntryTypeNVX);
+    *count += sizeof(VkObjectEntryUsageFlagsNVX);
+}
+
+void count_VkObjectTablePipelineEntryNVX(
+    uint32_t featureBits,
+    const VkObjectTablePipelineEntryNVX* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkObjectEntryTypeNVX);
+    *count += sizeof(VkObjectEntryUsageFlagsNVX);
+    uint64_t cgen_var_92;
+    *count += 1 * 8;
+}
+
+void count_VkObjectTableDescriptorSetEntryNVX(
+    uint32_t featureBits,
+    const VkObjectTableDescriptorSetEntryNVX* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkObjectEntryTypeNVX);
+    *count += sizeof(VkObjectEntryUsageFlagsNVX);
+    uint64_t cgen_var_93;
+    *count += 1 * 8;
+    uint64_t cgen_var_94;
+    *count += 1 * 8;
+}
+
+void count_VkObjectTableVertexBufferEntryNVX(
+    uint32_t featureBits,
+    const VkObjectTableVertexBufferEntryNVX* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkObjectEntryTypeNVX);
+    *count += sizeof(VkObjectEntryUsageFlagsNVX);
+    uint64_t cgen_var_95;
+    *count += 1 * 8;
+}
+
+void count_VkObjectTableIndexBufferEntryNVX(
+    uint32_t featureBits,
+    const VkObjectTableIndexBufferEntryNVX* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkObjectEntryTypeNVX);
+    *count += sizeof(VkObjectEntryUsageFlagsNVX);
+    uint64_t cgen_var_96;
+    *count += 1 * 8;
+    *count += sizeof(VkIndexType);
+}
+
+void count_VkObjectTablePushConstantEntryNVX(
+    uint32_t featureBits,
+    const VkObjectTablePushConstantEntryNVX* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkObjectEntryTypeNVX);
+    *count += sizeof(VkObjectEntryUsageFlagsNVX);
+    uint64_t cgen_var_97;
+    *count += 1 * 8;
+    *count += sizeof(VkShaderStageFlags);
+}
+
+#endif
+#ifdef VK_NV_clip_space_w_scaling
+void count_VkViewportWScalingNV(
+    uint32_t featureBits,
+    const VkViewportWScalingNV* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(float);
+    *count += sizeof(float);
+}
+
+void count_VkPipelineViewportWScalingStateCreateInfoNV(
+    uint32_t featureBits,
+    const VkPipelineViewportWScalingStateCreateInfoNV* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+    *count += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pViewportWScalings)
+    {
+        for (uint32_t i = 0; i < (uint32_t)toCount->viewportCount; ++i)
+        {
+            count_VkViewportWScalingNV(featureBits, (const VkViewportWScalingNV*)(toCount->pViewportWScalings + i), count);
+        }
+    }
+}
+
+#endif
+#ifdef VK_EXT_direct_mode_display
+#endif
+#ifdef VK_EXT_acquire_xlib_display
+#endif
+#ifdef VK_EXT_display_surface_counter
+void count_VkSurfaceCapabilities2EXT(
+    uint32_t featureBits,
+    const VkSurfaceCapabilities2EXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->currentExtent), count);
+    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->minImageExtent), count);
+    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->maxImageExtent), count);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkSurfaceTransformFlagsKHR);
+    *count += sizeof(VkSurfaceTransformFlagBitsKHR);
+    *count += sizeof(VkCompositeAlphaFlagsKHR);
+    *count += sizeof(VkImageUsageFlags);
+    *count += sizeof(VkSurfaceCounterFlagsEXT);
+}
+
+#endif
+#ifdef VK_EXT_display_control
+void count_VkDisplayPowerInfoEXT(
+    uint32_t featureBits,
+    const VkDisplayPowerInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkDisplayPowerStateEXT);
+}
+
+void count_VkDeviceEventInfoEXT(
+    uint32_t featureBits,
+    const VkDeviceEventInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkDeviceEventTypeEXT);
+}
+
+void count_VkDisplayEventInfoEXT(
+    uint32_t featureBits,
+    const VkDisplayEventInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkDisplayEventTypeEXT);
+}
+
+void count_VkSwapchainCounterCreateInfoEXT(
+    uint32_t featureBits,
+    const VkSwapchainCounterCreateInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkSurfaceCounterFlagsEXT);
+}
+
+#endif
+#ifdef VK_GOOGLE_display_timing
+void count_VkRefreshCycleDurationGOOGLE(
+    uint32_t featureBits,
+    const VkRefreshCycleDurationGOOGLE* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint64_t);
+}
+
+void count_VkPastPresentationTimingGOOGLE(
+    uint32_t featureBits,
+    const VkPastPresentationTimingGOOGLE* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint64_t);
+    *count += sizeof(uint64_t);
+    *count += sizeof(uint64_t);
+    *count += sizeof(uint64_t);
+}
+
+void count_VkPresentTimeGOOGLE(
+    uint32_t featureBits,
+    const VkPresentTimeGOOGLE* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint64_t);
+}
+
+void count_VkPresentTimesInfoGOOGLE(
+    uint32_t featureBits,
+    const VkPresentTimesInfoGOOGLE* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pTimes)
+    {
+        for (uint32_t i = 0; i < (uint32_t)toCount->swapchainCount; ++i)
+        {
+            count_VkPresentTimeGOOGLE(featureBits, (const VkPresentTimeGOOGLE*)(toCount->pTimes + i), count);
+        }
+    }
+}
+
+#endif
+#ifdef VK_NV_sample_mask_override_coverage
+#endif
+#ifdef VK_NV_geometry_shader_passthrough
+#endif
+#ifdef VK_NV_viewport_array2
+#endif
+#ifdef VK_NVX_multiview_per_view_attributes
+void count_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
+    uint32_t featureBits,
+    const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+}
+
+#endif
+#ifdef VK_NV_viewport_swizzle
+void count_VkViewportSwizzleNV(
+    uint32_t featureBits,
+    const VkViewportSwizzleNV* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkViewportCoordinateSwizzleNV);
+    *count += sizeof(VkViewportCoordinateSwizzleNV);
+    *count += sizeof(VkViewportCoordinateSwizzleNV);
+    *count += sizeof(VkViewportCoordinateSwizzleNV);
+}
+
+void count_VkPipelineViewportSwizzleStateCreateInfoNV(
+    uint32_t featureBits,
+    const VkPipelineViewportSwizzleStateCreateInfoNV* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkPipelineViewportSwizzleStateCreateFlagsNV);
+    *count += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pViewportSwizzles)
+    {
+        for (uint32_t i = 0; i < (uint32_t)toCount->viewportCount; ++i)
+        {
+            count_VkViewportSwizzleNV(featureBits, (const VkViewportSwizzleNV*)(toCount->pViewportSwizzles + i), count);
+        }
+    }
+}
+
+#endif
+#ifdef VK_EXT_discard_rectangles
+void count_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
+    uint32_t featureBits,
+    const VkPhysicalDeviceDiscardRectanglePropertiesEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkPipelineDiscardRectangleStateCreateInfoEXT(
+    uint32_t featureBits,
+    const VkPipelineDiscardRectangleStateCreateInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkPipelineDiscardRectangleStateCreateFlagsEXT);
+    *count += sizeof(VkDiscardRectangleModeEXT);
+    *count += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pDiscardRectangles)
+    {
+        for (uint32_t i = 0; i < (uint32_t)toCount->discardRectangleCount; ++i)
+        {
+            count_VkRect2D(featureBits, (const VkRect2D*)(toCount->pDiscardRectangles + i), count);
+        }
+    }
+}
+
+#endif
+#ifdef VK_EXT_conservative_rasterization
+void count_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
+    uint32_t featureBits,
+    const VkPhysicalDeviceConservativeRasterizationPropertiesEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(float);
+    *count += sizeof(float);
+    *count += sizeof(float);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkPipelineRasterizationConservativeStateCreateInfoEXT(
+    uint32_t featureBits,
+    const VkPipelineRasterizationConservativeStateCreateInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkPipelineRasterizationConservativeStateCreateFlagsEXT);
+    *count += sizeof(VkConservativeRasterizationModeEXT);
+    *count += sizeof(float);
+}
+
+#endif
+#ifdef VK_EXT_swapchain_colorspace
+#endif
+#ifdef VK_EXT_hdr_metadata
+void count_VkXYColorEXT(
+    uint32_t featureBits,
+    const VkXYColorEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(float);
+    *count += sizeof(float);
+}
+
+void count_VkHdrMetadataEXT(
+    uint32_t featureBits,
+    const VkHdrMetadataEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    count_VkXYColorEXT(featureBits, (VkXYColorEXT*)(&toCount->displayPrimaryRed), count);
+    count_VkXYColorEXT(featureBits, (VkXYColorEXT*)(&toCount->displayPrimaryGreen), count);
+    count_VkXYColorEXT(featureBits, (VkXYColorEXT*)(&toCount->displayPrimaryBlue), count);
+    count_VkXYColorEXT(featureBits, (VkXYColorEXT*)(&toCount->whitePoint), count);
+    *count += sizeof(float);
+    *count += sizeof(float);
+    *count += sizeof(float);
+    *count += sizeof(float);
+}
+
+#endif
+#ifdef VK_MVK_ios_surface
+void count_VkIOSSurfaceCreateInfoMVK(
+    uint32_t featureBits,
+    const VkIOSSurfaceCreateInfoMVK* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkIOSSurfaceCreateFlagsMVK);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pView)
+    {
+        *count += sizeof(const uint8_t);
+    }
+}
+
+#endif
+#ifdef VK_MVK_macos_surface
+void count_VkMacOSSurfaceCreateInfoMVK(
+    uint32_t featureBits,
+    const VkMacOSSurfaceCreateInfoMVK* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkMacOSSurfaceCreateFlagsMVK);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pView)
+    {
+        *count += sizeof(const uint8_t);
+    }
+}
+
+#endif
+#ifdef VK_EXT_external_memory_dma_buf
+#endif
+#ifdef VK_EXT_queue_family_foreign
+#endif
+#ifdef VK_EXT_debug_utils
+void count_VkDebugUtilsObjectNameInfoEXT(
+    uint32_t featureBits,
+    const VkDebugUtilsObjectNameInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkObjectType);
+    *count += sizeof(uint64_t);
+    if (featureBits & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+    {
+        // WARNING PTR CHECK
+        *count += 8;
+        if (toCount->pObjectName)
+        {
+            *count += sizeof(uint32_t) + (toCount->pObjectName ? strlen(toCount->pObjectName) : 0);
+        }
+    }
+    else
+    {
+        *count += sizeof(uint32_t) + (toCount->pObjectName ? strlen(toCount->pObjectName) : 0);
+    }
+}
+
+void count_VkDebugUtilsObjectTagInfoEXT(
+    uint32_t featureBits,
+    const VkDebugUtilsObjectTagInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkObjectType);
+    *count += sizeof(uint64_t);
+    *count += sizeof(uint64_t);
+    *count += 8;
+    *count += toCount->tagSize * sizeof(const uint8_t);
+}
+
+void count_VkDebugUtilsLabelEXT(
+    uint32_t featureBits,
+    const VkDebugUtilsLabelEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t) + (toCount->pLabelName ? strlen(toCount->pLabelName) : 0);
+    *count += 4 * sizeof(float);
+}
+
+void count_VkDebugUtilsMessengerCallbackDataEXT(
+    uint32_t featureBits,
+    const VkDebugUtilsMessengerCallbackDataEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkDebugUtilsMessengerCallbackDataFlagsEXT);
+    if (featureBits & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+    {
+        // WARNING PTR CHECK
+        *count += 8;
+        if (toCount->pMessageIdName)
+        {
+            *count += sizeof(uint32_t) + (toCount->pMessageIdName ? strlen(toCount->pMessageIdName) : 0);
+        }
+    }
+    else
+    {
+        *count += sizeof(uint32_t) + (toCount->pMessageIdName ? strlen(toCount->pMessageIdName) : 0);
+    }
+    *count += sizeof(int32_t);
+    *count += sizeof(uint32_t) + (toCount->pMessage ? strlen(toCount->pMessage) : 0);
+    *count += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pQueueLabels)
+    {
+        for (uint32_t i = 0; i < (uint32_t)toCount->queueLabelCount; ++i)
+        {
+            count_VkDebugUtilsLabelEXT(featureBits, (VkDebugUtilsLabelEXT*)(toCount->pQueueLabels + i), count);
+        }
+    }
+    *count += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pCmdBufLabels)
+    {
+        for (uint32_t i = 0; i < (uint32_t)toCount->cmdBufLabelCount; ++i)
+        {
+            count_VkDebugUtilsLabelEXT(featureBits, (VkDebugUtilsLabelEXT*)(toCount->pCmdBufLabels + i), count);
+        }
+    }
+    *count += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pObjects)
+    {
+        for (uint32_t i = 0; i < (uint32_t)toCount->objectCount; ++i)
+        {
+            count_VkDebugUtilsObjectNameInfoEXT(featureBits, (VkDebugUtilsObjectNameInfoEXT*)(toCount->pObjects + i), count);
+        }
+    }
+}
+
+void count_VkDebugUtilsMessengerCreateInfoEXT(
+    uint32_t featureBits,
+    const VkDebugUtilsMessengerCreateInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkDebugUtilsMessengerCreateFlagsEXT);
+    *count += sizeof(VkDebugUtilsMessageSeverityFlagsEXT);
+    *count += sizeof(VkDebugUtilsMessageTypeFlagsEXT);
+    *count += 8;
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pUserData)
+    {
+        *count += sizeof(uint8_t);
+    }
+}
+
+#endif
+#ifdef VK_ANDROID_external_memory_android_hardware_buffer
+void count_VkAndroidHardwareBufferUsageANDROID(
+    uint32_t featureBits,
+    const VkAndroidHardwareBufferUsageANDROID* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint64_t);
+}
+
+void count_VkAndroidHardwareBufferPropertiesANDROID(
+    uint32_t featureBits,
+    const VkAndroidHardwareBufferPropertiesANDROID* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkAndroidHardwareBufferFormatPropertiesANDROID(
+    uint32_t featureBits,
+    const VkAndroidHardwareBufferFormatPropertiesANDROID* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkFormat);
+    *count += sizeof(uint64_t);
+    *count += sizeof(VkFormatFeatureFlags);
+    count_VkComponentMapping(featureBits, (VkComponentMapping*)(&toCount->samplerYcbcrConversionComponents), count);
+    *count += sizeof(VkSamplerYcbcrModelConversion);
+    *count += sizeof(VkSamplerYcbcrRange);
+    *count += sizeof(VkChromaLocation);
+    *count += sizeof(VkChromaLocation);
+}
+
+void count_VkImportAndroidHardwareBufferInfoANDROID(
+    uint32_t featureBits,
+    const VkImportAndroidHardwareBufferInfoANDROID* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(AHardwareBuffer);
+}
+
+void count_VkMemoryGetAndroidHardwareBufferInfoANDROID(
+    uint32_t featureBits,
+    const VkMemoryGetAndroidHardwareBufferInfoANDROID* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_98;
+    *count += 1 * 8;
+}
+
+void count_VkExternalFormatANDROID(
+    uint32_t featureBits,
+    const VkExternalFormatANDROID* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint64_t);
+}
+
+#endif
+#ifdef VK_EXT_sampler_filter_minmax
+void count_VkSamplerReductionModeCreateInfoEXT(
+    uint32_t featureBits,
+    const VkSamplerReductionModeCreateInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkSamplerReductionModeEXT);
+}
+
+void count_VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT(
+    uint32_t featureBits,
+    const VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+}
+
+#endif
+#ifdef VK_AMD_gpu_shader_int16
+#endif
+#ifdef VK_AMD_mixed_attachment_samples
+#endif
+#ifdef VK_AMD_shader_fragment_mask
+#endif
+#ifdef VK_EXT_shader_stencil_export
+#endif
+#ifdef VK_EXT_sample_locations
+void count_VkSampleLocationEXT(
+    uint32_t featureBits,
+    const VkSampleLocationEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(float);
+    *count += sizeof(float);
+}
+
+void count_VkSampleLocationsInfoEXT(
+    uint32_t featureBits,
+    const VkSampleLocationsInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkSampleCountFlagBits);
+    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->sampleLocationGridSize), count);
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->sampleLocationsCount; ++i)
+    {
+        count_VkSampleLocationEXT(featureBits, (const VkSampleLocationEXT*)(toCount->pSampleLocations + i), count);
+    }
+}
+
+void count_VkAttachmentSampleLocationsEXT(
+    uint32_t featureBits,
+    const VkAttachmentSampleLocationsEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    count_VkSampleLocationsInfoEXT(featureBits, (VkSampleLocationsInfoEXT*)(&toCount->sampleLocationsInfo), count);
+}
+
+void count_VkSubpassSampleLocationsEXT(
+    uint32_t featureBits,
+    const VkSubpassSampleLocationsEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    count_VkSampleLocationsInfoEXT(featureBits, (VkSampleLocationsInfoEXT*)(&toCount->sampleLocationsInfo), count);
+}
+
+void count_VkRenderPassSampleLocationsBeginInfoEXT(
+    uint32_t featureBits,
+    const VkRenderPassSampleLocationsBeginInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->attachmentInitialSampleLocationsCount; ++i)
+    {
+        count_VkAttachmentSampleLocationsEXT(featureBits, (const VkAttachmentSampleLocationsEXT*)(toCount->pAttachmentInitialSampleLocations + i), count);
+    }
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->postSubpassSampleLocationsCount; ++i)
+    {
+        count_VkSubpassSampleLocationsEXT(featureBits, (const VkSubpassSampleLocationsEXT*)(toCount->pPostSubpassSampleLocations + i), count);
+    }
+}
+
+void count_VkPipelineSampleLocationsStateCreateInfoEXT(
+    uint32_t featureBits,
+    const VkPipelineSampleLocationsStateCreateInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+    count_VkSampleLocationsInfoEXT(featureBits, (VkSampleLocationsInfoEXT*)(&toCount->sampleLocationsInfo), count);
+}
+
+void count_VkPhysicalDeviceSampleLocationsPropertiesEXT(
+    uint32_t featureBits,
+    const VkPhysicalDeviceSampleLocationsPropertiesEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkSampleCountFlags);
+    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->maxSampleLocationGridSize), count);
+    *count += 2 * sizeof(float);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkMultisamplePropertiesEXT(
+    uint32_t featureBits,
+    const VkMultisamplePropertiesEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    count_VkExtent2D(featureBits, (VkExtent2D*)(&toCount->maxSampleLocationGridSize), count);
+}
+
+#endif
+#ifdef VK_EXT_blend_operation_advanced
+void count_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
+    uint32_t featureBits,
+    const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
+    uint32_t featureBits,
+    const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
+    uint32_t featureBits,
+    const VkPipelineColorBlendAdvancedStateCreateInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBlendOverlapEXT);
+}
+
+#endif
+#ifdef VK_NV_fragment_coverage_to_color
+void count_VkPipelineCoverageToColorStateCreateInfoNV(
+    uint32_t featureBits,
+    const VkPipelineCoverageToColorStateCreateInfoNV* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkPipelineCoverageToColorStateCreateFlagsNV);
+    *count += sizeof(VkBool32);
+    *count += sizeof(uint32_t);
+}
+
+#endif
+#ifdef VK_NV_framebuffer_mixed_samples
+void count_VkPipelineCoverageModulationStateCreateInfoNV(
+    uint32_t featureBits,
+    const VkPipelineCoverageModulationStateCreateInfoNV* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkPipelineCoverageModulationStateCreateFlagsNV);
+    *count += sizeof(VkCoverageModulationModeNV);
+    *count += sizeof(VkBool32);
+    *count += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pCoverageModulationTable)
+    {
+        *count += toCount->coverageModulationTableCount * sizeof(const float);
+    }
+}
+
+#endif
+#ifdef VK_NV_fill_rectangle
+#endif
+#ifdef VK_EXT_post_depth_coverage
+#endif
+#ifdef VK_EXT_validation_cache
+void count_VkValidationCacheCreateInfoEXT(
+    uint32_t featureBits,
+    const VkValidationCacheCreateInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkValidationCacheCreateFlagsEXT);
+    *count += 8;
+    *count += toCount->initialDataSize * sizeof(const uint8_t);
+}
+
+void count_VkShaderModuleValidationCacheCreateInfoEXT(
+    uint32_t featureBits,
+    const VkShaderModuleValidationCacheCreateInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    uint64_t cgen_var_99;
+    *count += 1 * 8;
+}
+
+#endif
+#ifdef VK_EXT_descriptor_indexing
+void count_VkDescriptorSetLayoutBindingFlagsCreateInfoEXT(
+    uint32_t featureBits,
+    const VkDescriptorSetLayoutBindingFlagsCreateInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    *count += toCount->bindingCount * sizeof(const VkDescriptorBindingFlagsEXT);
+}
+
+void count_VkPhysicalDeviceDescriptorIndexingFeaturesEXT(
+    uint32_t featureBits,
+    const VkPhysicalDeviceDescriptorIndexingFeaturesEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+}
+
+void count_VkPhysicalDeviceDescriptorIndexingPropertiesEXT(
+    uint32_t featureBits,
+    const VkPhysicalDeviceDescriptorIndexingPropertiesEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(VkBool32);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkDescriptorSetVariableDescriptorCountAllocateInfoEXT(
+    uint32_t featureBits,
+    const VkDescriptorSetVariableDescriptorCountAllocateInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    *count += toCount->descriptorSetCount * sizeof(const uint32_t);
+}
+
+void count_VkDescriptorSetVariableDescriptorCountLayoutSupportEXT(
+    uint32_t featureBits,
+    const VkDescriptorSetVariableDescriptorCountLayoutSupportEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+}
+
+#endif
+#ifdef VK_EXT_shader_viewport_index_layer
+#endif
+#ifdef VK_EXT_global_priority
+void count_VkDeviceQueueGlobalPriorityCreateInfoEXT(
+    uint32_t featureBits,
+    const VkDeviceQueueGlobalPriorityCreateInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkQueueGlobalPriorityEXT);
+}
+
+#endif
+#ifdef VK_EXT_external_memory_host
+void count_VkImportMemoryHostPointerInfoEXT(
+    uint32_t featureBits,
+    const VkImportMemoryHostPointerInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkExternalMemoryHandleTypeFlagBits);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pHostPointer)
+    {
+        *count += sizeof(uint8_t);
+    }
+}
+
+void count_VkMemoryHostPointerPropertiesEXT(
+    uint32_t featureBits,
+    const VkMemoryHostPointerPropertiesEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
+    uint32_t featureBits,
+    const VkPhysicalDeviceExternalMemoryHostPropertiesEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkDeviceSize);
+}
+
+#endif
+#ifdef VK_AMD_buffer_marker
+#endif
+#ifdef VK_AMD_shader_core_properties
+void count_VkPhysicalDeviceShaderCorePropertiesAMD(
+    uint32_t featureBits,
+    const VkPhysicalDeviceShaderCorePropertiesAMD* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+}
+
+#endif
+#ifdef VK_EXT_vertex_attribute_divisor
+void count_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
+    uint32_t featureBits,
+    const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkVertexInputBindingDivisorDescriptionEXT(
+    uint32_t featureBits,
+    const VkVertexInputBindingDivisorDescriptionEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(uint32_t);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkPipelineVertexInputDivisorStateCreateInfoEXT(
+    uint32_t featureBits,
+    const VkPipelineVertexInputDivisorStateCreateInfoEXT* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)toCount->vertexBindingDivisorCount; ++i)
+    {
+        count_VkVertexInputBindingDivisorDescriptionEXT(featureBits, (const VkVertexInputBindingDivisorDescriptionEXT*)(toCount->pVertexBindingDivisors + i), count);
+    }
+}
+
+#endif
+#ifdef VK_NV_shader_subgroup_partitioned
+#endif
+#ifdef VK_NV_device_diagnostic_checkpoints
+void count_VkQueueFamilyCheckpointPropertiesNV(
+    uint32_t featureBits,
+    const VkQueueFamilyCheckpointPropertiesNV* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkPipelineStageFlags);
+}
+
+void count_VkCheckpointDataNV(
+    uint32_t featureBits,
+    const VkCheckpointDataNV* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(VkPipelineStageFlagBits);
+    // WARNING PTR CHECK
+    *count += 8;
+    if (toCount->pCheckpointMarker)
+    {
+        *count += sizeof(uint8_t);
+    }
+}
+
+#endif
+#ifdef VK_GOOGLE_address_space
+#endif
+#ifdef VK_GOOGLE_color_buffer
+void count_VkImportColorBufferGOOGLE(
+    uint32_t featureBits,
+    const VkImportColorBufferGOOGLE* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkImportBufferGOOGLE(
+    uint32_t featureBits,
+    const VkImportBufferGOOGLE* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint32_t);
+}
+
+void count_VkImportPhysicalAddressGOOGLE(
+    uint32_t featureBits,
+    const VkImportPhysicalAddressGOOGLE* toCount,
+    size_t* count)
+{
+    (void)featureBits;
+    (void)toCount;
+    (void)count;
+    *count += sizeof(VkStructureType);
+    count_extension_struct(featureBits, toCount->pNext, count);
+    *count += sizeof(uint64_t);
+    *count += sizeof(VkDeviceSize);
+    *count += sizeof(VkFormat);
+    *count += sizeof(VkImageTiling);
+    *count += sizeof(uint32_t);
+}
+
+#endif
+#ifdef VK_GOOGLE_sized_descriptor_update_template
+#endif
+#ifdef VK_GOOGLE_async_command_buffers
+#endif
+#ifdef VK_GOOGLE_create_resources_with_requirements
+#endif
+#ifdef VK_GOOGLE_address_space_info
+#endif
+#ifdef VK_GOOGLE_free_memory_sync
+#endif
+#ifdef VK_GOOGLE_async_queue_submit
+#endif
+#ifdef VK_GOOGLE_linear_image_layout
+#endif
+#ifdef VK_MVK_moltenvk
+#endif
+void count_extension_struct(
+    uint32_t featureBits,
+    const void* structExtension,
+    size_t* count)
+{
+    VkInstanceCreateInfo* structAccess = (VkInstanceCreateInfo*)(structExtension);
+    size_t currExtSize = goldfish_vk_extension_struct_size_with_stream_features(featureBits, structExtension);
+    if (!currExtSize && structExtension)
+    {
+        // unknown struct extension; skip and call on its pNext field
+        count_extension_struct(featureBits, (void*)structAccess->pNext, count);
+        return;
+    }
+    else
+    {
+        // known or null extension struct
+        *count += sizeof(uint32_t);
+        if (!currExtSize)
+        {
+            // exit if this was a null extension struct (size == 0 in this branch)
+            return;
+        }
+    }
+    *count += sizeof(VkStructureType);
+    if (!structExtension)
+    {
+        return;
+    }
+    uint32_t structType = (uint32_t)goldfish_vk_struct_type(structExtension);
+    switch(structType)
+    {
+#ifdef VK_VERSION_1_1
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES:
+        {
+            count_VkPhysicalDeviceSubgroupProperties(featureBits, reinterpret_cast<const VkPhysicalDeviceSubgroupProperties*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES:
+        {
+            count_VkPhysicalDevice16BitStorageFeatures(featureBits, reinterpret_cast<const VkPhysicalDevice16BitStorageFeatures*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS:
+        {
+            count_VkMemoryDedicatedRequirements(featureBits, reinterpret_cast<const VkMemoryDedicatedRequirements*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO:
+        {
+            count_VkMemoryDedicatedAllocateInfo(featureBits, reinterpret_cast<const VkMemoryDedicatedAllocateInfo*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO:
+        {
+            count_VkMemoryAllocateFlagsInfo(featureBits, reinterpret_cast<const VkMemoryAllocateFlagsInfo*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO:
+        {
+            count_VkDeviceGroupRenderPassBeginInfo(featureBits, reinterpret_cast<const VkDeviceGroupRenderPassBeginInfo*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO:
+        {
+            count_VkDeviceGroupCommandBufferBeginInfo(featureBits, reinterpret_cast<const VkDeviceGroupCommandBufferBeginInfo*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO:
+        {
+            count_VkDeviceGroupSubmitInfo(featureBits, reinterpret_cast<const VkDeviceGroupSubmitInfo*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO:
+        {
+            count_VkDeviceGroupBindSparseInfo(featureBits, reinterpret_cast<const VkDeviceGroupBindSparseInfo*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO:
+        {
+            count_VkBindBufferMemoryDeviceGroupInfo(featureBits, reinterpret_cast<const VkBindBufferMemoryDeviceGroupInfo*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO:
+        {
+            count_VkBindImageMemoryDeviceGroupInfo(featureBits, reinterpret_cast<const VkBindImageMemoryDeviceGroupInfo*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO:
+        {
+            count_VkDeviceGroupDeviceCreateInfo(featureBits, reinterpret_cast<const VkDeviceGroupDeviceCreateInfo*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
+        {
+            count_VkPhysicalDeviceFeatures2(featureBits, reinterpret_cast<const VkPhysicalDeviceFeatures2*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES:
+        {
+            count_VkPhysicalDevicePointClippingProperties(featureBits, reinterpret_cast<const VkPhysicalDevicePointClippingProperties*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO:
+        {
+            count_VkRenderPassInputAttachmentAspectCreateInfo(featureBits, reinterpret_cast<const VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO:
+        {
+            count_VkImageViewUsageCreateInfo(featureBits, reinterpret_cast<const VkImageViewUsageCreateInfo*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO:
+        {
+            count_VkPipelineTessellationDomainOriginStateCreateInfo(featureBits, reinterpret_cast<const VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO:
+        {
+            count_VkRenderPassMultiviewCreateInfo(featureBits, reinterpret_cast<const VkRenderPassMultiviewCreateInfo*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES:
+        {
+            count_VkPhysicalDeviceMultiviewFeatures(featureBits, reinterpret_cast<const VkPhysicalDeviceMultiviewFeatures*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES:
+        {
+            count_VkPhysicalDeviceMultiviewProperties(featureBits, reinterpret_cast<const VkPhysicalDeviceMultiviewProperties*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES:
+        {
+            count_VkPhysicalDeviceVariablePointerFeatures(featureBits, reinterpret_cast<const VkPhysicalDeviceVariablePointerFeatures*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES:
+        {
+            count_VkPhysicalDeviceProtectedMemoryFeatures(featureBits, reinterpret_cast<const VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES:
+        {
+            count_VkPhysicalDeviceProtectedMemoryProperties(featureBits, reinterpret_cast<const VkPhysicalDeviceProtectedMemoryProperties*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO:
+        {
+            count_VkProtectedSubmitInfo(featureBits, reinterpret_cast<const VkProtectedSubmitInfo*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO:
+        {
+            count_VkSamplerYcbcrConversionInfo(featureBits, reinterpret_cast<const VkSamplerYcbcrConversionInfo*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO:
+        {
+            count_VkBindImagePlaneMemoryInfo(featureBits, reinterpret_cast<const VkBindImagePlaneMemoryInfo*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO:
+        {
+            count_VkImagePlaneMemoryRequirementsInfo(featureBits, reinterpret_cast<const VkImagePlaneMemoryRequirementsInfo*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES:
+        {
+            count_VkPhysicalDeviceSamplerYcbcrConversionFeatures(featureBits, reinterpret_cast<const VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES:
+        {
+            count_VkSamplerYcbcrConversionImageFormatProperties(featureBits, reinterpret_cast<const VkSamplerYcbcrConversionImageFormatProperties*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO:
+        {
+            count_VkPhysicalDeviceExternalImageFormatInfo(featureBits, reinterpret_cast<const VkPhysicalDeviceExternalImageFormatInfo*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES:
+        {
+            count_VkExternalImageFormatProperties(featureBits, reinterpret_cast<const VkExternalImageFormatProperties*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES:
+        {
+            count_VkPhysicalDeviceIDProperties(featureBits, reinterpret_cast<const VkPhysicalDeviceIDProperties*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO:
+        {
+            count_VkExternalMemoryImageCreateInfo(featureBits, reinterpret_cast<const VkExternalMemoryImageCreateInfo*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO:
+        {
+            count_VkExternalMemoryBufferCreateInfo(featureBits, reinterpret_cast<const VkExternalMemoryBufferCreateInfo*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO:
+        {
+            count_VkExportMemoryAllocateInfo(featureBits, reinterpret_cast<const VkExportMemoryAllocateInfo*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO:
+        {
+            count_VkExportFenceCreateInfo(featureBits, reinterpret_cast<const VkExportFenceCreateInfo*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO:
+        {
+            count_VkExportSemaphoreCreateInfo(featureBits, reinterpret_cast<const VkExportSemaphoreCreateInfo*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES:
+        {
+            count_VkPhysicalDeviceMaintenance3Properties(featureBits, reinterpret_cast<const VkPhysicalDeviceMaintenance3Properties*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES:
+        {
+            count_VkPhysicalDeviceShaderDrawParameterFeatures(featureBits, reinterpret_cast<const VkPhysicalDeviceShaderDrawParameterFeatures*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_KHR_swapchain
+        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR:
+        {
+            count_VkImageSwapchainCreateInfoKHR(featureBits, reinterpret_cast<const VkImageSwapchainCreateInfoKHR*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR:
+        {
+            count_VkBindImageMemorySwapchainInfoKHR(featureBits, reinterpret_cast<const VkBindImageMemorySwapchainInfoKHR*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR:
+        {
+            count_VkDeviceGroupPresentInfoKHR(featureBits, reinterpret_cast<const VkDeviceGroupPresentInfoKHR*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR:
+        {
+            count_VkDeviceGroupSwapchainCreateInfoKHR(featureBits, reinterpret_cast<const VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_KHR_display_swapchain
+        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR:
+        {
+            count_VkDisplayPresentInfoKHR(featureBits, reinterpret_cast<const VkDisplayPresentInfoKHR*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_KHR_external_memory_win32
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
+        {
+            count_VkImportMemoryWin32HandleInfoKHR(featureBits, reinterpret_cast<const VkImportMemoryWin32HandleInfoKHR*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
+        {
+            count_VkExportMemoryWin32HandleInfoKHR(featureBits, reinterpret_cast<const VkExportMemoryWin32HandleInfoKHR*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_KHR_external_memory_fd
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR:
+        {
+            count_VkImportMemoryFdInfoKHR(featureBits, reinterpret_cast<const VkImportMemoryFdInfoKHR*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_KHR_win32_keyed_mutex
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR:
+        {
+            count_VkWin32KeyedMutexAcquireReleaseInfoKHR(featureBits, reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_KHR_external_semaphore_win32
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR:
+        {
+            count_VkExportSemaphoreWin32HandleInfoKHR(featureBits, reinterpret_cast<const VkExportSemaphoreWin32HandleInfoKHR*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR:
+        {
+            count_VkD3D12FenceSubmitInfoKHR(featureBits, reinterpret_cast<const VkD3D12FenceSubmitInfoKHR*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_KHR_push_descriptor
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR:
+        {
+            count_VkPhysicalDevicePushDescriptorPropertiesKHR(featureBits, reinterpret_cast<const VkPhysicalDevicePushDescriptorPropertiesKHR*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_KHR_incremental_present
+        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR:
+        {
+            count_VkPresentRegionsKHR(featureBits, reinterpret_cast<const VkPresentRegionsKHR*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_KHR_shared_presentable_image
+        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR:
+        {
+            count_VkSharedPresentSurfaceCapabilitiesKHR(featureBits, reinterpret_cast<const VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_KHR_external_fence_win32
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR:
+        {
+            count_VkExportFenceWin32HandleInfoKHR(featureBits, reinterpret_cast<const VkExportFenceWin32HandleInfoKHR*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_KHR_image_format_list
+        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR:
+        {
+            count_VkImageFormatListCreateInfoKHR(featureBits, reinterpret_cast<const VkImageFormatListCreateInfoKHR*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_KHR_8bit_storage
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR:
+        {
+            count_VkPhysicalDevice8BitStorageFeaturesKHR(featureBits, reinterpret_cast<const VkPhysicalDevice8BitStorageFeaturesKHR*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_KHR_shader_float16_int8
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES:
+        {
+            count_VkPhysicalDeviceShaderFloat16Int8Features(featureBits, reinterpret_cast<const VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_ANDROID_native_buffer
+        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID:
+        {
+            count_VkNativeBufferANDROID(featureBits, reinterpret_cast<const VkNativeBufferANDROID*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_EXT_debug_report
+        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT:
+        {
+            count_VkDebugReportCallbackCreateInfoEXT(featureBits, reinterpret_cast<const VkDebugReportCallbackCreateInfoEXT*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_AMD_rasterization_order
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD:
+        {
+            count_VkPipelineRasterizationStateRasterizationOrderAMD(featureBits, reinterpret_cast<const VkPipelineRasterizationStateRasterizationOrderAMD*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_NV_dedicated_allocation
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV:
+        {
+            count_VkDedicatedAllocationImageCreateInfoNV(featureBits, reinterpret_cast<const VkDedicatedAllocationImageCreateInfoNV*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV:
+        {
+            count_VkDedicatedAllocationBufferCreateInfoNV(featureBits, reinterpret_cast<const VkDedicatedAllocationBufferCreateInfoNV*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV:
+        {
+            count_VkDedicatedAllocationMemoryAllocateInfoNV(featureBits, reinterpret_cast<const VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_AMD_texture_gather_bias_lod
+        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD:
+        {
+            count_VkTextureLODGatherFormatPropertiesAMD(featureBits, reinterpret_cast<const VkTextureLODGatherFormatPropertiesAMD*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_NV_external_memory
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV:
+        {
+            count_VkExternalMemoryImageCreateInfoNV(featureBits, reinterpret_cast<const VkExternalMemoryImageCreateInfoNV*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV:
+        {
+            count_VkExportMemoryAllocateInfoNV(featureBits, reinterpret_cast<const VkExportMemoryAllocateInfoNV*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_NV_external_memory_win32
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV:
+        {
+            count_VkImportMemoryWin32HandleInfoNV(featureBits, reinterpret_cast<const VkImportMemoryWin32HandleInfoNV*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV:
+        {
+            count_VkExportMemoryWin32HandleInfoNV(featureBits, reinterpret_cast<const VkExportMemoryWin32HandleInfoNV*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_NV_win32_keyed_mutex
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV:
+        {
+            count_VkWin32KeyedMutexAcquireReleaseInfoNV(featureBits, reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_EXT_validation_flags
+        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT:
+        {
+            count_VkValidationFlagsEXT(featureBits, reinterpret_cast<const VkValidationFlagsEXT*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_EXT_conditional_rendering
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT:
+        {
+            count_VkPhysicalDeviceConditionalRenderingFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT:
+        {
+            count_VkCommandBufferInheritanceConditionalRenderingInfoEXT(featureBits, reinterpret_cast<const VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_NV_clip_space_w_scaling
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV:
+        {
+            count_VkPipelineViewportWScalingStateCreateInfoNV(featureBits, reinterpret_cast<const VkPipelineViewportWScalingStateCreateInfoNV*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_EXT_display_control
+        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT:
+        {
+            count_VkSwapchainCounterCreateInfoEXT(featureBits, reinterpret_cast<const VkSwapchainCounterCreateInfoEXT*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_GOOGLE_display_timing
+        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE:
+        {
+            count_VkPresentTimesInfoGOOGLE(featureBits, reinterpret_cast<const VkPresentTimesInfoGOOGLE*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_NVX_multiview_per_view_attributes
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX:
+        {
+            count_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(featureBits, reinterpret_cast<const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_NV_viewport_swizzle
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV:
+        {
+            count_VkPipelineViewportSwizzleStateCreateInfoNV(featureBits, reinterpret_cast<const VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_EXT_discard_rectangles
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT:
+        {
+            count_VkPhysicalDeviceDiscardRectanglePropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT:
+        {
+            count_VkPipelineDiscardRectangleStateCreateInfoEXT(featureBits, reinterpret_cast<const VkPipelineDiscardRectangleStateCreateInfoEXT*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_EXT_conservative_rasterization
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT:
+        {
+            count_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT:
+        {
+            count_VkPipelineRasterizationConservativeStateCreateInfoEXT(featureBits, reinterpret_cast<const VkPipelineRasterizationConservativeStateCreateInfoEXT*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_EXT_debug_utils
+        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT:
+        {
+            count_VkDebugUtilsMessengerCreateInfoEXT(featureBits, reinterpret_cast<const VkDebugUtilsMessengerCreateInfoEXT*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_ANDROID_external_memory_android_hardware_buffer
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID:
+        {
+            count_VkAndroidHardwareBufferUsageANDROID(featureBits, reinterpret_cast<const VkAndroidHardwareBufferUsageANDROID*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID:
+        {
+            count_VkAndroidHardwareBufferFormatPropertiesANDROID(featureBits, reinterpret_cast<const VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID:
+        {
+            count_VkImportAndroidHardwareBufferInfoANDROID(featureBits, reinterpret_cast<const VkImportAndroidHardwareBufferInfoANDROID*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID:
+        {
+            count_VkExternalFormatANDROID(featureBits, reinterpret_cast<const VkExternalFormatANDROID*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_EXT_sampler_filter_minmax
+        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT:
+        {
+            count_VkSamplerReductionModeCreateInfoEXT(featureBits, reinterpret_cast<const VkSamplerReductionModeCreateInfoEXT*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT:
+        {
+            count_VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_EXT_sample_locations
+        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT:
+        {
+            count_VkSampleLocationsInfoEXT(featureBits, reinterpret_cast<const VkSampleLocationsInfoEXT*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT:
+        {
+            count_VkRenderPassSampleLocationsBeginInfoEXT(featureBits, reinterpret_cast<const VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT:
+        {
+            count_VkPipelineSampleLocationsStateCreateInfoEXT(featureBits, reinterpret_cast<const VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT:
+        {
+            count_VkPhysicalDeviceSampleLocationsPropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceSampleLocationsPropertiesEXT*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_EXT_blend_operation_advanced
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT:
+        {
+            count_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT:
+        {
+            count_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT:
+        {
+            count_VkPipelineColorBlendAdvancedStateCreateInfoEXT(featureBits, reinterpret_cast<const VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_NV_fragment_coverage_to_color
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV:
+        {
+            count_VkPipelineCoverageToColorStateCreateInfoNV(featureBits, reinterpret_cast<const VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_NV_framebuffer_mixed_samples
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV:
+        {
+            count_VkPipelineCoverageModulationStateCreateInfoNV(featureBits, reinterpret_cast<const VkPipelineCoverageModulationStateCreateInfoNV*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_EXT_validation_cache
+        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT:
+        {
+            count_VkShaderModuleValidationCacheCreateInfoEXT(featureBits, reinterpret_cast<const VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_EXT_descriptor_indexing
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT:
+        {
+            count_VkDescriptorSetLayoutBindingFlagsCreateInfoEXT(featureBits, reinterpret_cast<const VkDescriptorSetLayoutBindingFlagsCreateInfoEXT*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT:
+        {
+            count_VkPhysicalDeviceDescriptorIndexingFeaturesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingFeaturesEXT*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT:
+        {
+            count_VkPhysicalDeviceDescriptorIndexingPropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingPropertiesEXT*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT:
+        {
+            count_VkDescriptorSetVariableDescriptorCountAllocateInfoEXT(featureBits, reinterpret_cast<const VkDescriptorSetVariableDescriptorCountAllocateInfoEXT*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT:
+        {
+            count_VkDescriptorSetVariableDescriptorCountLayoutSupportEXT(featureBits, reinterpret_cast<const VkDescriptorSetVariableDescriptorCountLayoutSupportEXT*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_EXT_global_priority
+        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT:
+        {
+            count_VkDeviceQueueGlobalPriorityCreateInfoEXT(featureBits, reinterpret_cast<const VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_EXT_external_memory_host
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT:
+        {
+            count_VkImportMemoryHostPointerInfoEXT(featureBits, reinterpret_cast<const VkImportMemoryHostPointerInfoEXT*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT:
+        {
+            count_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_AMD_shader_core_properties
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD:
+        {
+            count_VkPhysicalDeviceShaderCorePropertiesAMD(featureBits, reinterpret_cast<const VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_EXT_vertex_attribute_divisor
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT:
+        {
+            count_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(featureBits, reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT:
+        {
+            count_VkPipelineVertexInputDivisorStateCreateInfoEXT(featureBits, reinterpret_cast<const VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_NV_device_diagnostic_checkpoints
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV:
+        {
+            count_VkQueueFamilyCheckpointPropertiesNV(featureBits, reinterpret_cast<const VkQueueFamilyCheckpointPropertiesNV*>(structExtension), count);
+            break;
+        }
+#endif
+#ifdef VK_GOOGLE_color_buffer
+        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
+        {
+            count_VkImportColorBufferGOOGLE(featureBits, reinterpret_cast<const VkImportColorBufferGOOGLE*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
+        {
+            count_VkImportBufferGOOGLE(featureBits, reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension), count);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
+        {
+            count_VkImportPhysicalAddressGOOGLE(featureBits, reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension), count);
+            break;
+        }
+#endif
+        default:
+        {
+            // fatal; the switch is only taken if the extension struct is known
+            abort();
+        }
+    }
+}
+
+
+} // namespace goldfish_vk
diff --git a/system/vulkan_enc/goldfish_vk_counting_guest.h b/system/vulkan_enc/goldfish_vk_counting_guest.h
new file mode 100644
index 0000000..72e553f
--- /dev/null
+++ b/system/vulkan_enc/goldfish_vk_counting_guest.h
@@ -0,0 +1,2045 @@
+// Copyright (C) 2018 The Android Open Source Project
+// Copyright (C) 2018 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Autogenerated module goldfish_vk_counting_guest
+// (header) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
+// Please do not modify directly;
+// re-run android/scripts/generate-vulkan-sources.sh,
+// or directly from Python by defining:
+// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
+// CEREAL_OUTPUT_DIR: Where to put the generated sources.
+// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+
+#pragma once
+
+#include <vulkan/vulkan.h>
+
+
+#include "vk_platform_compat.h"
+#include "goldfish_vk_private_defs.h"
+
+
+namespace goldfish_vk {
+
+#ifdef VK_VERSION_1_0
+void count_VkApplicationInfo(
+    uint32_t featureBits,
+    const VkApplicationInfo* toCount,
+    size_t* count);
+
+void count_VkInstanceCreateInfo(
+    uint32_t featureBits,
+    const VkInstanceCreateInfo* toCount,
+    size_t* count);
+
+void count_VkAllocationCallbacks(
+    uint32_t featureBits,
+    const VkAllocationCallbacks* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceFeatures(
+    uint32_t featureBits,
+    const VkPhysicalDeviceFeatures* toCount,
+    size_t* count);
+
+void count_VkFormatProperties(
+    uint32_t featureBits,
+    const VkFormatProperties* toCount,
+    size_t* count);
+
+void count_VkExtent3D(
+    uint32_t featureBits,
+    const VkExtent3D* toCount,
+    size_t* count);
+
+void count_VkImageFormatProperties(
+    uint32_t featureBits,
+    const VkImageFormatProperties* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceLimits(
+    uint32_t featureBits,
+    const VkPhysicalDeviceLimits* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceSparseProperties(
+    uint32_t featureBits,
+    const VkPhysicalDeviceSparseProperties* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceProperties(
+    uint32_t featureBits,
+    const VkPhysicalDeviceProperties* toCount,
+    size_t* count);
+
+void count_VkQueueFamilyProperties(
+    uint32_t featureBits,
+    const VkQueueFamilyProperties* toCount,
+    size_t* count);
+
+void count_VkMemoryType(
+    uint32_t featureBits,
+    const VkMemoryType* toCount,
+    size_t* count);
+
+void count_VkMemoryHeap(
+    uint32_t featureBits,
+    const VkMemoryHeap* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceMemoryProperties(
+    uint32_t featureBits,
+    const VkPhysicalDeviceMemoryProperties* toCount,
+    size_t* count);
+
+void count_VkDeviceQueueCreateInfo(
+    uint32_t featureBits,
+    const VkDeviceQueueCreateInfo* toCount,
+    size_t* count);
+
+void count_VkDeviceCreateInfo(
+    uint32_t featureBits,
+    const VkDeviceCreateInfo* toCount,
+    size_t* count);
+
+void count_VkExtensionProperties(
+    uint32_t featureBits,
+    const VkExtensionProperties* toCount,
+    size_t* count);
+
+void count_VkLayerProperties(
+    uint32_t featureBits,
+    const VkLayerProperties* toCount,
+    size_t* count);
+
+void count_VkSubmitInfo(
+    uint32_t featureBits,
+    const VkSubmitInfo* toCount,
+    size_t* count);
+
+void count_VkMemoryAllocateInfo(
+    uint32_t featureBits,
+    const VkMemoryAllocateInfo* toCount,
+    size_t* count);
+
+void count_VkMappedMemoryRange(
+    uint32_t featureBits,
+    const VkMappedMemoryRange* toCount,
+    size_t* count);
+
+void count_VkMemoryRequirements(
+    uint32_t featureBits,
+    const VkMemoryRequirements* toCount,
+    size_t* count);
+
+void count_VkSparseImageFormatProperties(
+    uint32_t featureBits,
+    const VkSparseImageFormatProperties* toCount,
+    size_t* count);
+
+void count_VkSparseImageMemoryRequirements(
+    uint32_t featureBits,
+    const VkSparseImageMemoryRequirements* toCount,
+    size_t* count);
+
+void count_VkSparseMemoryBind(
+    uint32_t featureBits,
+    const VkSparseMemoryBind* toCount,
+    size_t* count);
+
+void count_VkSparseBufferMemoryBindInfo(
+    uint32_t featureBits,
+    const VkSparseBufferMemoryBindInfo* toCount,
+    size_t* count);
+
+void count_VkSparseImageOpaqueMemoryBindInfo(
+    uint32_t featureBits,
+    const VkSparseImageOpaqueMemoryBindInfo* toCount,
+    size_t* count);
+
+void count_VkImageSubresource(
+    uint32_t featureBits,
+    const VkImageSubresource* toCount,
+    size_t* count);
+
+void count_VkOffset3D(
+    uint32_t featureBits,
+    const VkOffset3D* toCount,
+    size_t* count);
+
+void count_VkSparseImageMemoryBind(
+    uint32_t featureBits,
+    const VkSparseImageMemoryBind* toCount,
+    size_t* count);
+
+void count_VkSparseImageMemoryBindInfo(
+    uint32_t featureBits,
+    const VkSparseImageMemoryBindInfo* toCount,
+    size_t* count);
+
+void count_VkBindSparseInfo(
+    uint32_t featureBits,
+    const VkBindSparseInfo* toCount,
+    size_t* count);
+
+void count_VkFenceCreateInfo(
+    uint32_t featureBits,
+    const VkFenceCreateInfo* toCount,
+    size_t* count);
+
+void count_VkSemaphoreCreateInfo(
+    uint32_t featureBits,
+    const VkSemaphoreCreateInfo* toCount,
+    size_t* count);
+
+void count_VkEventCreateInfo(
+    uint32_t featureBits,
+    const VkEventCreateInfo* toCount,
+    size_t* count);
+
+void count_VkQueryPoolCreateInfo(
+    uint32_t featureBits,
+    const VkQueryPoolCreateInfo* toCount,
+    size_t* count);
+
+void count_VkBufferCreateInfo(
+    uint32_t featureBits,
+    const VkBufferCreateInfo* toCount,
+    size_t* count);
+
+void count_VkBufferViewCreateInfo(
+    uint32_t featureBits,
+    const VkBufferViewCreateInfo* toCount,
+    size_t* count);
+
+void count_VkImageCreateInfo(
+    uint32_t featureBits,
+    const VkImageCreateInfo* toCount,
+    size_t* count);
+
+void count_VkSubresourceLayout(
+    uint32_t featureBits,
+    const VkSubresourceLayout* toCount,
+    size_t* count);
+
+void count_VkComponentMapping(
+    uint32_t featureBits,
+    const VkComponentMapping* toCount,
+    size_t* count);
+
+void count_VkImageSubresourceRange(
+    uint32_t featureBits,
+    const VkImageSubresourceRange* toCount,
+    size_t* count);
+
+void count_VkImageViewCreateInfo(
+    uint32_t featureBits,
+    const VkImageViewCreateInfo* toCount,
+    size_t* count);
+
+void count_VkShaderModuleCreateInfo(
+    uint32_t featureBits,
+    const VkShaderModuleCreateInfo* toCount,
+    size_t* count);
+
+void count_VkPipelineCacheCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineCacheCreateInfo* toCount,
+    size_t* count);
+
+void count_VkSpecializationMapEntry(
+    uint32_t featureBits,
+    const VkSpecializationMapEntry* toCount,
+    size_t* count);
+
+void count_VkSpecializationInfo(
+    uint32_t featureBits,
+    const VkSpecializationInfo* toCount,
+    size_t* count);
+
+void count_VkPipelineShaderStageCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineShaderStageCreateInfo* toCount,
+    size_t* count);
+
+void count_VkVertexInputBindingDescription(
+    uint32_t featureBits,
+    const VkVertexInputBindingDescription* toCount,
+    size_t* count);
+
+void count_VkVertexInputAttributeDescription(
+    uint32_t featureBits,
+    const VkVertexInputAttributeDescription* toCount,
+    size_t* count);
+
+void count_VkPipelineVertexInputStateCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineVertexInputStateCreateInfo* toCount,
+    size_t* count);
+
+void count_VkPipelineInputAssemblyStateCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineInputAssemblyStateCreateInfo* toCount,
+    size_t* count);
+
+void count_VkPipelineTessellationStateCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineTessellationStateCreateInfo* toCount,
+    size_t* count);
+
+void count_VkViewport(
+    uint32_t featureBits,
+    const VkViewport* toCount,
+    size_t* count);
+
+void count_VkOffset2D(
+    uint32_t featureBits,
+    const VkOffset2D* toCount,
+    size_t* count);
+
+void count_VkExtent2D(
+    uint32_t featureBits,
+    const VkExtent2D* toCount,
+    size_t* count);
+
+void count_VkRect2D(
+    uint32_t featureBits,
+    const VkRect2D* toCount,
+    size_t* count);
+
+void count_VkPipelineViewportStateCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineViewportStateCreateInfo* toCount,
+    size_t* count);
+
+void count_VkPipelineRasterizationStateCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineRasterizationStateCreateInfo* toCount,
+    size_t* count);
+
+void count_VkPipelineMultisampleStateCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineMultisampleStateCreateInfo* toCount,
+    size_t* count);
+
+void count_VkStencilOpState(
+    uint32_t featureBits,
+    const VkStencilOpState* toCount,
+    size_t* count);
+
+void count_VkPipelineDepthStencilStateCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineDepthStencilStateCreateInfo* toCount,
+    size_t* count);
+
+void count_VkPipelineColorBlendAttachmentState(
+    uint32_t featureBits,
+    const VkPipelineColorBlendAttachmentState* toCount,
+    size_t* count);
+
+void count_VkPipelineColorBlendStateCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineColorBlendStateCreateInfo* toCount,
+    size_t* count);
+
+void count_VkPipelineDynamicStateCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineDynamicStateCreateInfo* toCount,
+    size_t* count);
+
+void count_VkGraphicsPipelineCreateInfo(
+    uint32_t featureBits,
+    const VkGraphicsPipelineCreateInfo* toCount,
+    size_t* count);
+
+void count_VkComputePipelineCreateInfo(
+    uint32_t featureBits,
+    const VkComputePipelineCreateInfo* toCount,
+    size_t* count);
+
+void count_VkPushConstantRange(
+    uint32_t featureBits,
+    const VkPushConstantRange* toCount,
+    size_t* count);
+
+void count_VkPipelineLayoutCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineLayoutCreateInfo* toCount,
+    size_t* count);
+
+void count_VkSamplerCreateInfo(
+    uint32_t featureBits,
+    const VkSamplerCreateInfo* toCount,
+    size_t* count);
+
+void count_VkDescriptorSetLayoutBinding(
+    uint32_t featureBits,
+    const VkDescriptorSetLayoutBinding* toCount,
+    size_t* count);
+
+void count_VkDescriptorSetLayoutCreateInfo(
+    uint32_t featureBits,
+    const VkDescriptorSetLayoutCreateInfo* toCount,
+    size_t* count);
+
+void count_VkDescriptorPoolSize(
+    uint32_t featureBits,
+    const VkDescriptorPoolSize* toCount,
+    size_t* count);
+
+void count_VkDescriptorPoolCreateInfo(
+    uint32_t featureBits,
+    const VkDescriptorPoolCreateInfo* toCount,
+    size_t* count);
+
+void count_VkDescriptorSetAllocateInfo(
+    uint32_t featureBits,
+    const VkDescriptorSetAllocateInfo* toCount,
+    size_t* count);
+
+void count_VkDescriptorImageInfo(
+    uint32_t featureBits,
+    const VkDescriptorImageInfo* toCount,
+    size_t* count);
+
+void count_VkDescriptorBufferInfo(
+    uint32_t featureBits,
+    const VkDescriptorBufferInfo* toCount,
+    size_t* count);
+
+void count_VkWriteDescriptorSet(
+    uint32_t featureBits,
+    const VkWriteDescriptorSet* toCount,
+    size_t* count);
+
+void count_VkCopyDescriptorSet(
+    uint32_t featureBits,
+    const VkCopyDescriptorSet* toCount,
+    size_t* count);
+
+void count_VkFramebufferCreateInfo(
+    uint32_t featureBits,
+    const VkFramebufferCreateInfo* toCount,
+    size_t* count);
+
+void count_VkAttachmentDescription(
+    uint32_t featureBits,
+    const VkAttachmentDescription* toCount,
+    size_t* count);
+
+void count_VkAttachmentReference(
+    uint32_t featureBits,
+    const VkAttachmentReference* toCount,
+    size_t* count);
+
+void count_VkSubpassDescription(
+    uint32_t featureBits,
+    const VkSubpassDescription* toCount,
+    size_t* count);
+
+void count_VkSubpassDependency(
+    uint32_t featureBits,
+    const VkSubpassDependency* toCount,
+    size_t* count);
+
+void count_VkRenderPassCreateInfo(
+    uint32_t featureBits,
+    const VkRenderPassCreateInfo* toCount,
+    size_t* count);
+
+void count_VkCommandPoolCreateInfo(
+    uint32_t featureBits,
+    const VkCommandPoolCreateInfo* toCount,
+    size_t* count);
+
+void count_VkCommandBufferAllocateInfo(
+    uint32_t featureBits,
+    const VkCommandBufferAllocateInfo* toCount,
+    size_t* count);
+
+void count_VkCommandBufferInheritanceInfo(
+    uint32_t featureBits,
+    const VkCommandBufferInheritanceInfo* toCount,
+    size_t* count);
+
+void count_VkCommandBufferBeginInfo(
+    uint32_t featureBits,
+    const VkCommandBufferBeginInfo* toCount,
+    size_t* count);
+
+void count_VkBufferCopy(
+    uint32_t featureBits,
+    const VkBufferCopy* toCount,
+    size_t* count);
+
+void count_VkImageSubresourceLayers(
+    uint32_t featureBits,
+    const VkImageSubresourceLayers* toCount,
+    size_t* count);
+
+void count_VkImageCopy(
+    uint32_t featureBits,
+    const VkImageCopy* toCount,
+    size_t* count);
+
+void count_VkImageBlit(
+    uint32_t featureBits,
+    const VkImageBlit* toCount,
+    size_t* count);
+
+void count_VkBufferImageCopy(
+    uint32_t featureBits,
+    const VkBufferImageCopy* toCount,
+    size_t* count);
+
+void count_VkClearColorValue(
+    uint32_t featureBits,
+    const VkClearColorValue* toCount,
+    size_t* count);
+
+void count_VkClearDepthStencilValue(
+    uint32_t featureBits,
+    const VkClearDepthStencilValue* toCount,
+    size_t* count);
+
+void count_VkClearValue(
+    uint32_t featureBits,
+    const VkClearValue* toCount,
+    size_t* count);
+
+void count_VkClearAttachment(
+    uint32_t featureBits,
+    const VkClearAttachment* toCount,
+    size_t* count);
+
+void count_VkClearRect(
+    uint32_t featureBits,
+    const VkClearRect* toCount,
+    size_t* count);
+
+void count_VkImageResolve(
+    uint32_t featureBits,
+    const VkImageResolve* toCount,
+    size_t* count);
+
+void count_VkMemoryBarrier(
+    uint32_t featureBits,
+    const VkMemoryBarrier* toCount,
+    size_t* count);
+
+void count_VkBufferMemoryBarrier(
+    uint32_t featureBits,
+    const VkBufferMemoryBarrier* toCount,
+    size_t* count);
+
+void count_VkImageMemoryBarrier(
+    uint32_t featureBits,
+    const VkImageMemoryBarrier* toCount,
+    size_t* count);
+
+void count_VkRenderPassBeginInfo(
+    uint32_t featureBits,
+    const VkRenderPassBeginInfo* toCount,
+    size_t* count);
+
+void count_VkDispatchIndirectCommand(
+    uint32_t featureBits,
+    const VkDispatchIndirectCommand* toCount,
+    size_t* count);
+
+void count_VkDrawIndexedIndirectCommand(
+    uint32_t featureBits,
+    const VkDrawIndexedIndirectCommand* toCount,
+    size_t* count);
+
+void count_VkDrawIndirectCommand(
+    uint32_t featureBits,
+    const VkDrawIndirectCommand* toCount,
+    size_t* count);
+
+void count_VkBaseOutStructure(
+    uint32_t featureBits,
+    const VkBaseOutStructure* toCount,
+    size_t* count);
+
+void count_VkBaseInStructure(
+    uint32_t featureBits,
+    const VkBaseInStructure* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_VERSION_1_1
+void count_VkPhysicalDeviceSubgroupProperties(
+    uint32_t featureBits,
+    const VkPhysicalDeviceSubgroupProperties* toCount,
+    size_t* count);
+
+void count_VkBindBufferMemoryInfo(
+    uint32_t featureBits,
+    const VkBindBufferMemoryInfo* toCount,
+    size_t* count);
+
+void count_VkBindImageMemoryInfo(
+    uint32_t featureBits,
+    const VkBindImageMemoryInfo* toCount,
+    size_t* count);
+
+void count_VkPhysicalDevice16BitStorageFeatures(
+    uint32_t featureBits,
+    const VkPhysicalDevice16BitStorageFeatures* toCount,
+    size_t* count);
+
+void count_VkMemoryDedicatedRequirements(
+    uint32_t featureBits,
+    const VkMemoryDedicatedRequirements* toCount,
+    size_t* count);
+
+void count_VkMemoryDedicatedAllocateInfo(
+    uint32_t featureBits,
+    const VkMemoryDedicatedAllocateInfo* toCount,
+    size_t* count);
+
+void count_VkMemoryAllocateFlagsInfo(
+    uint32_t featureBits,
+    const VkMemoryAllocateFlagsInfo* toCount,
+    size_t* count);
+
+void count_VkDeviceGroupRenderPassBeginInfo(
+    uint32_t featureBits,
+    const VkDeviceGroupRenderPassBeginInfo* toCount,
+    size_t* count);
+
+void count_VkDeviceGroupCommandBufferBeginInfo(
+    uint32_t featureBits,
+    const VkDeviceGroupCommandBufferBeginInfo* toCount,
+    size_t* count);
+
+void count_VkDeviceGroupSubmitInfo(
+    uint32_t featureBits,
+    const VkDeviceGroupSubmitInfo* toCount,
+    size_t* count);
+
+void count_VkDeviceGroupBindSparseInfo(
+    uint32_t featureBits,
+    const VkDeviceGroupBindSparseInfo* toCount,
+    size_t* count);
+
+void count_VkBindBufferMemoryDeviceGroupInfo(
+    uint32_t featureBits,
+    const VkBindBufferMemoryDeviceGroupInfo* toCount,
+    size_t* count);
+
+void count_VkBindImageMemoryDeviceGroupInfo(
+    uint32_t featureBits,
+    const VkBindImageMemoryDeviceGroupInfo* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceGroupProperties(
+    uint32_t featureBits,
+    const VkPhysicalDeviceGroupProperties* toCount,
+    size_t* count);
+
+void count_VkDeviceGroupDeviceCreateInfo(
+    uint32_t featureBits,
+    const VkDeviceGroupDeviceCreateInfo* toCount,
+    size_t* count);
+
+void count_VkBufferMemoryRequirementsInfo2(
+    uint32_t featureBits,
+    const VkBufferMemoryRequirementsInfo2* toCount,
+    size_t* count);
+
+void count_VkImageMemoryRequirementsInfo2(
+    uint32_t featureBits,
+    const VkImageMemoryRequirementsInfo2* toCount,
+    size_t* count);
+
+void count_VkImageSparseMemoryRequirementsInfo2(
+    uint32_t featureBits,
+    const VkImageSparseMemoryRequirementsInfo2* toCount,
+    size_t* count);
+
+void count_VkMemoryRequirements2(
+    uint32_t featureBits,
+    const VkMemoryRequirements2* toCount,
+    size_t* count);
+
+void count_VkSparseImageMemoryRequirements2(
+    uint32_t featureBits,
+    const VkSparseImageMemoryRequirements2* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceFeatures2(
+    uint32_t featureBits,
+    const VkPhysicalDeviceFeatures2* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceProperties2(
+    uint32_t featureBits,
+    const VkPhysicalDeviceProperties2* toCount,
+    size_t* count);
+
+void count_VkFormatProperties2(
+    uint32_t featureBits,
+    const VkFormatProperties2* toCount,
+    size_t* count);
+
+void count_VkImageFormatProperties2(
+    uint32_t featureBits,
+    const VkImageFormatProperties2* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceImageFormatInfo2(
+    uint32_t featureBits,
+    const VkPhysicalDeviceImageFormatInfo2* toCount,
+    size_t* count);
+
+void count_VkQueueFamilyProperties2(
+    uint32_t featureBits,
+    const VkQueueFamilyProperties2* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceMemoryProperties2(
+    uint32_t featureBits,
+    const VkPhysicalDeviceMemoryProperties2* toCount,
+    size_t* count);
+
+void count_VkSparseImageFormatProperties2(
+    uint32_t featureBits,
+    const VkSparseImageFormatProperties2* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceSparseImageFormatInfo2(
+    uint32_t featureBits,
+    const VkPhysicalDeviceSparseImageFormatInfo2* toCount,
+    size_t* count);
+
+void count_VkPhysicalDevicePointClippingProperties(
+    uint32_t featureBits,
+    const VkPhysicalDevicePointClippingProperties* toCount,
+    size_t* count);
+
+void count_VkInputAttachmentAspectReference(
+    uint32_t featureBits,
+    const VkInputAttachmentAspectReference* toCount,
+    size_t* count);
+
+void count_VkRenderPassInputAttachmentAspectCreateInfo(
+    uint32_t featureBits,
+    const VkRenderPassInputAttachmentAspectCreateInfo* toCount,
+    size_t* count);
+
+void count_VkImageViewUsageCreateInfo(
+    uint32_t featureBits,
+    const VkImageViewUsageCreateInfo* toCount,
+    size_t* count);
+
+void count_VkPipelineTessellationDomainOriginStateCreateInfo(
+    uint32_t featureBits,
+    const VkPipelineTessellationDomainOriginStateCreateInfo* toCount,
+    size_t* count);
+
+void count_VkRenderPassMultiviewCreateInfo(
+    uint32_t featureBits,
+    const VkRenderPassMultiviewCreateInfo* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceMultiviewFeatures(
+    uint32_t featureBits,
+    const VkPhysicalDeviceMultiviewFeatures* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceMultiviewProperties(
+    uint32_t featureBits,
+    const VkPhysicalDeviceMultiviewProperties* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceVariablePointerFeatures(
+    uint32_t featureBits,
+    const VkPhysicalDeviceVariablePointerFeatures* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceProtectedMemoryFeatures(
+    uint32_t featureBits,
+    const VkPhysicalDeviceProtectedMemoryFeatures* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceProtectedMemoryProperties(
+    uint32_t featureBits,
+    const VkPhysicalDeviceProtectedMemoryProperties* toCount,
+    size_t* count);
+
+void count_VkDeviceQueueInfo2(
+    uint32_t featureBits,
+    const VkDeviceQueueInfo2* toCount,
+    size_t* count);
+
+void count_VkProtectedSubmitInfo(
+    uint32_t featureBits,
+    const VkProtectedSubmitInfo* toCount,
+    size_t* count);
+
+void count_VkSamplerYcbcrConversionCreateInfo(
+    uint32_t featureBits,
+    const VkSamplerYcbcrConversionCreateInfo* toCount,
+    size_t* count);
+
+void count_VkSamplerYcbcrConversionInfo(
+    uint32_t featureBits,
+    const VkSamplerYcbcrConversionInfo* toCount,
+    size_t* count);
+
+void count_VkBindImagePlaneMemoryInfo(
+    uint32_t featureBits,
+    const VkBindImagePlaneMemoryInfo* toCount,
+    size_t* count);
+
+void count_VkImagePlaneMemoryRequirementsInfo(
+    uint32_t featureBits,
+    const VkImagePlaneMemoryRequirementsInfo* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
+    uint32_t featureBits,
+    const VkPhysicalDeviceSamplerYcbcrConversionFeatures* toCount,
+    size_t* count);
+
+void count_VkSamplerYcbcrConversionImageFormatProperties(
+    uint32_t featureBits,
+    const VkSamplerYcbcrConversionImageFormatProperties* toCount,
+    size_t* count);
+
+void count_VkDescriptorUpdateTemplateEntry(
+    uint32_t featureBits,
+    const VkDescriptorUpdateTemplateEntry* toCount,
+    size_t* count);
+
+void count_VkDescriptorUpdateTemplateCreateInfo(
+    uint32_t featureBits,
+    const VkDescriptorUpdateTemplateCreateInfo* toCount,
+    size_t* count);
+
+void count_VkExternalMemoryProperties(
+    uint32_t featureBits,
+    const VkExternalMemoryProperties* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceExternalImageFormatInfo(
+    uint32_t featureBits,
+    const VkPhysicalDeviceExternalImageFormatInfo* toCount,
+    size_t* count);
+
+void count_VkExternalImageFormatProperties(
+    uint32_t featureBits,
+    const VkExternalImageFormatProperties* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceExternalBufferInfo(
+    uint32_t featureBits,
+    const VkPhysicalDeviceExternalBufferInfo* toCount,
+    size_t* count);
+
+void count_VkExternalBufferProperties(
+    uint32_t featureBits,
+    const VkExternalBufferProperties* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceIDProperties(
+    uint32_t featureBits,
+    const VkPhysicalDeviceIDProperties* toCount,
+    size_t* count);
+
+void count_VkExternalMemoryImageCreateInfo(
+    uint32_t featureBits,
+    const VkExternalMemoryImageCreateInfo* toCount,
+    size_t* count);
+
+void count_VkExternalMemoryBufferCreateInfo(
+    uint32_t featureBits,
+    const VkExternalMemoryBufferCreateInfo* toCount,
+    size_t* count);
+
+void count_VkExportMemoryAllocateInfo(
+    uint32_t featureBits,
+    const VkExportMemoryAllocateInfo* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceExternalFenceInfo(
+    uint32_t featureBits,
+    const VkPhysicalDeviceExternalFenceInfo* toCount,
+    size_t* count);
+
+void count_VkExternalFenceProperties(
+    uint32_t featureBits,
+    const VkExternalFenceProperties* toCount,
+    size_t* count);
+
+void count_VkExportFenceCreateInfo(
+    uint32_t featureBits,
+    const VkExportFenceCreateInfo* toCount,
+    size_t* count);
+
+void count_VkExportSemaphoreCreateInfo(
+    uint32_t featureBits,
+    const VkExportSemaphoreCreateInfo* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceExternalSemaphoreInfo(
+    uint32_t featureBits,
+    const VkPhysicalDeviceExternalSemaphoreInfo* toCount,
+    size_t* count);
+
+void count_VkExternalSemaphoreProperties(
+    uint32_t featureBits,
+    const VkExternalSemaphoreProperties* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceMaintenance3Properties(
+    uint32_t featureBits,
+    const VkPhysicalDeviceMaintenance3Properties* toCount,
+    size_t* count);
+
+void count_VkDescriptorSetLayoutSupport(
+    uint32_t featureBits,
+    const VkDescriptorSetLayoutSupport* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceShaderDrawParameterFeatures(
+    uint32_t featureBits,
+    const VkPhysicalDeviceShaderDrawParameterFeatures* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_surface
+void count_VkSurfaceCapabilitiesKHR(
+    uint32_t featureBits,
+    const VkSurfaceCapabilitiesKHR* toCount,
+    size_t* count);
+
+void count_VkSurfaceFormatKHR(
+    uint32_t featureBits,
+    const VkSurfaceFormatKHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_swapchain
+void count_VkSwapchainCreateInfoKHR(
+    uint32_t featureBits,
+    const VkSwapchainCreateInfoKHR* toCount,
+    size_t* count);
+
+void count_VkPresentInfoKHR(
+    uint32_t featureBits,
+    const VkPresentInfoKHR* toCount,
+    size_t* count);
+
+void count_VkImageSwapchainCreateInfoKHR(
+    uint32_t featureBits,
+    const VkImageSwapchainCreateInfoKHR* toCount,
+    size_t* count);
+
+void count_VkBindImageMemorySwapchainInfoKHR(
+    uint32_t featureBits,
+    const VkBindImageMemorySwapchainInfoKHR* toCount,
+    size_t* count);
+
+void count_VkAcquireNextImageInfoKHR(
+    uint32_t featureBits,
+    const VkAcquireNextImageInfoKHR* toCount,
+    size_t* count);
+
+void count_VkDeviceGroupPresentCapabilitiesKHR(
+    uint32_t featureBits,
+    const VkDeviceGroupPresentCapabilitiesKHR* toCount,
+    size_t* count);
+
+void count_VkDeviceGroupPresentInfoKHR(
+    uint32_t featureBits,
+    const VkDeviceGroupPresentInfoKHR* toCount,
+    size_t* count);
+
+void count_VkDeviceGroupSwapchainCreateInfoKHR(
+    uint32_t featureBits,
+    const VkDeviceGroupSwapchainCreateInfoKHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_display
+void count_VkDisplayPropertiesKHR(
+    uint32_t featureBits,
+    const VkDisplayPropertiesKHR* toCount,
+    size_t* count);
+
+void count_VkDisplayModeParametersKHR(
+    uint32_t featureBits,
+    const VkDisplayModeParametersKHR* toCount,
+    size_t* count);
+
+void count_VkDisplayModePropertiesKHR(
+    uint32_t featureBits,
+    const VkDisplayModePropertiesKHR* toCount,
+    size_t* count);
+
+void count_VkDisplayModeCreateInfoKHR(
+    uint32_t featureBits,
+    const VkDisplayModeCreateInfoKHR* toCount,
+    size_t* count);
+
+void count_VkDisplayPlaneCapabilitiesKHR(
+    uint32_t featureBits,
+    const VkDisplayPlaneCapabilitiesKHR* toCount,
+    size_t* count);
+
+void count_VkDisplayPlanePropertiesKHR(
+    uint32_t featureBits,
+    const VkDisplayPlanePropertiesKHR* toCount,
+    size_t* count);
+
+void count_VkDisplaySurfaceCreateInfoKHR(
+    uint32_t featureBits,
+    const VkDisplaySurfaceCreateInfoKHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_display_swapchain
+void count_VkDisplayPresentInfoKHR(
+    uint32_t featureBits,
+    const VkDisplayPresentInfoKHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_xlib_surface
+void count_VkXlibSurfaceCreateInfoKHR(
+    uint32_t featureBits,
+    const VkXlibSurfaceCreateInfoKHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_xcb_surface
+void count_VkXcbSurfaceCreateInfoKHR(
+    uint32_t featureBits,
+    const VkXcbSurfaceCreateInfoKHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_wayland_surface
+void count_VkWaylandSurfaceCreateInfoKHR(
+    uint32_t featureBits,
+    const VkWaylandSurfaceCreateInfoKHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_mir_surface
+void count_VkMirSurfaceCreateInfoKHR(
+    uint32_t featureBits,
+    const VkMirSurfaceCreateInfoKHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_android_surface
+void count_VkAndroidSurfaceCreateInfoKHR(
+    uint32_t featureBits,
+    const VkAndroidSurfaceCreateInfoKHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_win32_surface
+void count_VkWin32SurfaceCreateInfoKHR(
+    uint32_t featureBits,
+    const VkWin32SurfaceCreateInfoKHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_sampler_mirror_clamp_to_edge
+#endif
+#ifdef VK_KHR_multiview
+#endif
+#ifdef VK_KHR_get_physical_device_properties2
+#endif
+#ifdef VK_KHR_device_group
+#endif
+#ifdef VK_KHR_shader_draw_parameters
+#endif
+#ifdef VK_KHR_maintenance1
+#endif
+#ifdef VK_KHR_device_group_creation
+#endif
+#ifdef VK_KHR_external_memory_capabilities
+#endif
+#ifdef VK_KHR_external_memory
+#endif
+#ifdef VK_KHR_external_memory_win32
+void count_VkImportMemoryWin32HandleInfoKHR(
+    uint32_t featureBits,
+    const VkImportMemoryWin32HandleInfoKHR* toCount,
+    size_t* count);
+
+void count_VkExportMemoryWin32HandleInfoKHR(
+    uint32_t featureBits,
+    const VkExportMemoryWin32HandleInfoKHR* toCount,
+    size_t* count);
+
+void count_VkMemoryWin32HandlePropertiesKHR(
+    uint32_t featureBits,
+    const VkMemoryWin32HandlePropertiesKHR* toCount,
+    size_t* count);
+
+void count_VkMemoryGetWin32HandleInfoKHR(
+    uint32_t featureBits,
+    const VkMemoryGetWin32HandleInfoKHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_external_memory_fd
+void count_VkImportMemoryFdInfoKHR(
+    uint32_t featureBits,
+    const VkImportMemoryFdInfoKHR* toCount,
+    size_t* count);
+
+void count_VkMemoryFdPropertiesKHR(
+    uint32_t featureBits,
+    const VkMemoryFdPropertiesKHR* toCount,
+    size_t* count);
+
+void count_VkMemoryGetFdInfoKHR(
+    uint32_t featureBits,
+    const VkMemoryGetFdInfoKHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_win32_keyed_mutex
+void count_VkWin32KeyedMutexAcquireReleaseInfoKHR(
+    uint32_t featureBits,
+    const VkWin32KeyedMutexAcquireReleaseInfoKHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_external_semaphore_capabilities
+#endif
+#ifdef VK_KHR_external_semaphore
+#endif
+#ifdef VK_KHR_external_semaphore_win32
+void count_VkImportSemaphoreWin32HandleInfoKHR(
+    uint32_t featureBits,
+    const VkImportSemaphoreWin32HandleInfoKHR* toCount,
+    size_t* count);
+
+void count_VkExportSemaphoreWin32HandleInfoKHR(
+    uint32_t featureBits,
+    const VkExportSemaphoreWin32HandleInfoKHR* toCount,
+    size_t* count);
+
+void count_VkD3D12FenceSubmitInfoKHR(
+    uint32_t featureBits,
+    const VkD3D12FenceSubmitInfoKHR* toCount,
+    size_t* count);
+
+void count_VkSemaphoreGetWin32HandleInfoKHR(
+    uint32_t featureBits,
+    const VkSemaphoreGetWin32HandleInfoKHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_external_semaphore_fd
+void count_VkImportSemaphoreFdInfoKHR(
+    uint32_t featureBits,
+    const VkImportSemaphoreFdInfoKHR* toCount,
+    size_t* count);
+
+void count_VkSemaphoreGetFdInfoKHR(
+    uint32_t featureBits,
+    const VkSemaphoreGetFdInfoKHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_push_descriptor
+void count_VkPhysicalDevicePushDescriptorPropertiesKHR(
+    uint32_t featureBits,
+    const VkPhysicalDevicePushDescriptorPropertiesKHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_16bit_storage
+#endif
+#ifdef VK_KHR_incremental_present
+void count_VkRectLayerKHR(
+    uint32_t featureBits,
+    const VkRectLayerKHR* toCount,
+    size_t* count);
+
+void count_VkPresentRegionKHR(
+    uint32_t featureBits,
+    const VkPresentRegionKHR* toCount,
+    size_t* count);
+
+void count_VkPresentRegionsKHR(
+    uint32_t featureBits,
+    const VkPresentRegionsKHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_descriptor_update_template
+#endif
+#ifdef VK_KHR_create_renderpass2
+void count_VkAttachmentDescription2KHR(
+    uint32_t featureBits,
+    const VkAttachmentDescription2KHR* toCount,
+    size_t* count);
+
+void count_VkAttachmentReference2KHR(
+    uint32_t featureBits,
+    const VkAttachmentReference2KHR* toCount,
+    size_t* count);
+
+void count_VkSubpassDescription2KHR(
+    uint32_t featureBits,
+    const VkSubpassDescription2KHR* toCount,
+    size_t* count);
+
+void count_VkSubpassDependency2KHR(
+    uint32_t featureBits,
+    const VkSubpassDependency2KHR* toCount,
+    size_t* count);
+
+void count_VkRenderPassCreateInfo2KHR(
+    uint32_t featureBits,
+    const VkRenderPassCreateInfo2KHR* toCount,
+    size_t* count);
+
+void count_VkSubpassBeginInfoKHR(
+    uint32_t featureBits,
+    const VkSubpassBeginInfoKHR* toCount,
+    size_t* count);
+
+void count_VkSubpassEndInfoKHR(
+    uint32_t featureBits,
+    const VkSubpassEndInfoKHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_shared_presentable_image
+void count_VkSharedPresentSurfaceCapabilitiesKHR(
+    uint32_t featureBits,
+    const VkSharedPresentSurfaceCapabilitiesKHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_external_fence_capabilities
+#endif
+#ifdef VK_KHR_external_fence
+#endif
+#ifdef VK_KHR_external_fence_win32
+void count_VkImportFenceWin32HandleInfoKHR(
+    uint32_t featureBits,
+    const VkImportFenceWin32HandleInfoKHR* toCount,
+    size_t* count);
+
+void count_VkExportFenceWin32HandleInfoKHR(
+    uint32_t featureBits,
+    const VkExportFenceWin32HandleInfoKHR* toCount,
+    size_t* count);
+
+void count_VkFenceGetWin32HandleInfoKHR(
+    uint32_t featureBits,
+    const VkFenceGetWin32HandleInfoKHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_external_fence_fd
+void count_VkImportFenceFdInfoKHR(
+    uint32_t featureBits,
+    const VkImportFenceFdInfoKHR* toCount,
+    size_t* count);
+
+void count_VkFenceGetFdInfoKHR(
+    uint32_t featureBits,
+    const VkFenceGetFdInfoKHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_maintenance2
+#endif
+#ifdef VK_KHR_get_surface_capabilities2
+void count_VkPhysicalDeviceSurfaceInfo2KHR(
+    uint32_t featureBits,
+    const VkPhysicalDeviceSurfaceInfo2KHR* toCount,
+    size_t* count);
+
+void count_VkSurfaceCapabilities2KHR(
+    uint32_t featureBits,
+    const VkSurfaceCapabilities2KHR* toCount,
+    size_t* count);
+
+void count_VkSurfaceFormat2KHR(
+    uint32_t featureBits,
+    const VkSurfaceFormat2KHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_variable_pointers
+#endif
+#ifdef VK_KHR_get_display_properties2
+void count_VkDisplayProperties2KHR(
+    uint32_t featureBits,
+    const VkDisplayProperties2KHR* toCount,
+    size_t* count);
+
+void count_VkDisplayPlaneProperties2KHR(
+    uint32_t featureBits,
+    const VkDisplayPlaneProperties2KHR* toCount,
+    size_t* count);
+
+void count_VkDisplayModeProperties2KHR(
+    uint32_t featureBits,
+    const VkDisplayModeProperties2KHR* toCount,
+    size_t* count);
+
+void count_VkDisplayPlaneInfo2KHR(
+    uint32_t featureBits,
+    const VkDisplayPlaneInfo2KHR* toCount,
+    size_t* count);
+
+void count_VkDisplayPlaneCapabilities2KHR(
+    uint32_t featureBits,
+    const VkDisplayPlaneCapabilities2KHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_dedicated_allocation
+#endif
+#ifdef VK_KHR_storage_buffer_storage_class
+#endif
+#ifdef VK_KHR_relaxed_block_layout
+#endif
+#ifdef VK_KHR_get_memory_requirements2
+#endif
+#ifdef VK_KHR_image_format_list
+void count_VkImageFormatListCreateInfoKHR(
+    uint32_t featureBits,
+    const VkImageFormatListCreateInfoKHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_sampler_ycbcr_conversion
+#endif
+#ifdef VK_KHR_bind_memory2
+#endif
+#ifdef VK_KHR_maintenance3
+#endif
+#ifdef VK_KHR_draw_indirect_count
+#endif
+#ifdef VK_KHR_8bit_storage
+void count_VkPhysicalDevice8BitStorageFeaturesKHR(
+    uint32_t featureBits,
+    const VkPhysicalDevice8BitStorageFeaturesKHR* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_KHR_shader_float16_int8
+void count_VkPhysicalDeviceShaderFloat16Int8Features(
+    uint32_t featureBits,
+    const VkPhysicalDeviceShaderFloat16Int8Features* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_ANDROID_native_buffer
+void count_VkNativeBufferANDROID(
+    uint32_t featureBits,
+    const VkNativeBufferANDROID* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_EXT_debug_report
+void count_VkDebugReportCallbackCreateInfoEXT(
+    uint32_t featureBits,
+    const VkDebugReportCallbackCreateInfoEXT* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_NV_glsl_shader
+#endif
+#ifdef VK_EXT_depth_range_unrestricted
+#endif
+#ifdef VK_IMG_filter_cubic
+#endif
+#ifdef VK_AMD_rasterization_order
+void count_VkPipelineRasterizationStateRasterizationOrderAMD(
+    uint32_t featureBits,
+    const VkPipelineRasterizationStateRasterizationOrderAMD* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_AMD_shader_trinary_minmax
+#endif
+#ifdef VK_AMD_shader_explicit_vertex_parameter
+#endif
+#ifdef VK_EXT_debug_marker
+void count_VkDebugMarkerObjectNameInfoEXT(
+    uint32_t featureBits,
+    const VkDebugMarkerObjectNameInfoEXT* toCount,
+    size_t* count);
+
+void count_VkDebugMarkerObjectTagInfoEXT(
+    uint32_t featureBits,
+    const VkDebugMarkerObjectTagInfoEXT* toCount,
+    size_t* count);
+
+void count_VkDebugMarkerMarkerInfoEXT(
+    uint32_t featureBits,
+    const VkDebugMarkerMarkerInfoEXT* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_AMD_gcn_shader
+#endif
+#ifdef VK_NV_dedicated_allocation
+void count_VkDedicatedAllocationImageCreateInfoNV(
+    uint32_t featureBits,
+    const VkDedicatedAllocationImageCreateInfoNV* toCount,
+    size_t* count);
+
+void count_VkDedicatedAllocationBufferCreateInfoNV(
+    uint32_t featureBits,
+    const VkDedicatedAllocationBufferCreateInfoNV* toCount,
+    size_t* count);
+
+void count_VkDedicatedAllocationMemoryAllocateInfoNV(
+    uint32_t featureBits,
+    const VkDedicatedAllocationMemoryAllocateInfoNV* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_AMD_draw_indirect_count
+#endif
+#ifdef VK_AMD_negative_viewport_height
+#endif
+#ifdef VK_AMD_gpu_shader_half_float
+#endif
+#ifdef VK_AMD_shader_ballot
+#endif
+#ifdef VK_AMD_texture_gather_bias_lod
+void count_VkTextureLODGatherFormatPropertiesAMD(
+    uint32_t featureBits,
+    const VkTextureLODGatherFormatPropertiesAMD* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_AMD_shader_info
+void count_VkShaderResourceUsageAMD(
+    uint32_t featureBits,
+    const VkShaderResourceUsageAMD* toCount,
+    size_t* count);
+
+void count_VkShaderStatisticsInfoAMD(
+    uint32_t featureBits,
+    const VkShaderStatisticsInfoAMD* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_AMD_shader_image_load_store_lod
+#endif
+#ifdef VK_IMG_format_pvrtc
+#endif
+#ifdef VK_NV_external_memory_capabilities
+void count_VkExternalImageFormatPropertiesNV(
+    uint32_t featureBits,
+    const VkExternalImageFormatPropertiesNV* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_NV_external_memory
+void count_VkExternalMemoryImageCreateInfoNV(
+    uint32_t featureBits,
+    const VkExternalMemoryImageCreateInfoNV* toCount,
+    size_t* count);
+
+void count_VkExportMemoryAllocateInfoNV(
+    uint32_t featureBits,
+    const VkExportMemoryAllocateInfoNV* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_NV_external_memory_win32
+void count_VkImportMemoryWin32HandleInfoNV(
+    uint32_t featureBits,
+    const VkImportMemoryWin32HandleInfoNV* toCount,
+    size_t* count);
+
+void count_VkExportMemoryWin32HandleInfoNV(
+    uint32_t featureBits,
+    const VkExportMemoryWin32HandleInfoNV* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_NV_win32_keyed_mutex
+void count_VkWin32KeyedMutexAcquireReleaseInfoNV(
+    uint32_t featureBits,
+    const VkWin32KeyedMutexAcquireReleaseInfoNV* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_EXT_validation_flags
+void count_VkValidationFlagsEXT(
+    uint32_t featureBits,
+    const VkValidationFlagsEXT* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_NN_vi_surface
+void count_VkViSurfaceCreateInfoNN(
+    uint32_t featureBits,
+    const VkViSurfaceCreateInfoNN* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_EXT_shader_subgroup_ballot
+#endif
+#ifdef VK_EXT_shader_subgroup_vote
+#endif
+#ifdef VK_EXT_conditional_rendering
+void count_VkConditionalRenderingBeginInfoEXT(
+    uint32_t featureBits,
+    const VkConditionalRenderingBeginInfoEXT* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
+    uint32_t featureBits,
+    const VkPhysicalDeviceConditionalRenderingFeaturesEXT* toCount,
+    size_t* count);
+
+void count_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
+    uint32_t featureBits,
+    const VkCommandBufferInheritanceConditionalRenderingInfoEXT* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_NVX_device_generated_commands
+void count_VkDeviceGeneratedCommandsFeaturesNVX(
+    uint32_t featureBits,
+    const VkDeviceGeneratedCommandsFeaturesNVX* toCount,
+    size_t* count);
+
+void count_VkDeviceGeneratedCommandsLimitsNVX(
+    uint32_t featureBits,
+    const VkDeviceGeneratedCommandsLimitsNVX* toCount,
+    size_t* count);
+
+void count_VkIndirectCommandsTokenNVX(
+    uint32_t featureBits,
+    const VkIndirectCommandsTokenNVX* toCount,
+    size_t* count);
+
+void count_VkIndirectCommandsLayoutTokenNVX(
+    uint32_t featureBits,
+    const VkIndirectCommandsLayoutTokenNVX* toCount,
+    size_t* count);
+
+void count_VkIndirectCommandsLayoutCreateInfoNVX(
+    uint32_t featureBits,
+    const VkIndirectCommandsLayoutCreateInfoNVX* toCount,
+    size_t* count);
+
+void count_VkCmdProcessCommandsInfoNVX(
+    uint32_t featureBits,
+    const VkCmdProcessCommandsInfoNVX* toCount,
+    size_t* count);
+
+void count_VkCmdReserveSpaceForCommandsInfoNVX(
+    uint32_t featureBits,
+    const VkCmdReserveSpaceForCommandsInfoNVX* toCount,
+    size_t* count);
+
+void count_VkObjectTableCreateInfoNVX(
+    uint32_t featureBits,
+    const VkObjectTableCreateInfoNVX* toCount,
+    size_t* count);
+
+void count_VkObjectTableEntryNVX(
+    uint32_t featureBits,
+    const VkObjectTableEntryNVX* toCount,
+    size_t* count);
+
+void count_VkObjectTablePipelineEntryNVX(
+    uint32_t featureBits,
+    const VkObjectTablePipelineEntryNVX* toCount,
+    size_t* count);
+
+void count_VkObjectTableDescriptorSetEntryNVX(
+    uint32_t featureBits,
+    const VkObjectTableDescriptorSetEntryNVX* toCount,
+    size_t* count);
+
+void count_VkObjectTableVertexBufferEntryNVX(
+    uint32_t featureBits,
+    const VkObjectTableVertexBufferEntryNVX* toCount,
+    size_t* count);
+
+void count_VkObjectTableIndexBufferEntryNVX(
+    uint32_t featureBits,
+    const VkObjectTableIndexBufferEntryNVX* toCount,
+    size_t* count);
+
+void count_VkObjectTablePushConstantEntryNVX(
+    uint32_t featureBits,
+    const VkObjectTablePushConstantEntryNVX* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_NV_clip_space_w_scaling
+void count_VkViewportWScalingNV(
+    uint32_t featureBits,
+    const VkViewportWScalingNV* toCount,
+    size_t* count);
+
+void count_VkPipelineViewportWScalingStateCreateInfoNV(
+    uint32_t featureBits,
+    const VkPipelineViewportWScalingStateCreateInfoNV* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_EXT_direct_mode_display
+#endif
+#ifdef VK_EXT_acquire_xlib_display
+#endif
+#ifdef VK_EXT_display_surface_counter
+void count_VkSurfaceCapabilities2EXT(
+    uint32_t featureBits,
+    const VkSurfaceCapabilities2EXT* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_EXT_display_control
+void count_VkDisplayPowerInfoEXT(
+    uint32_t featureBits,
+    const VkDisplayPowerInfoEXT* toCount,
+    size_t* count);
+
+void count_VkDeviceEventInfoEXT(
+    uint32_t featureBits,
+    const VkDeviceEventInfoEXT* toCount,
+    size_t* count);
+
+void count_VkDisplayEventInfoEXT(
+    uint32_t featureBits,
+    const VkDisplayEventInfoEXT* toCount,
+    size_t* count);
+
+void count_VkSwapchainCounterCreateInfoEXT(
+    uint32_t featureBits,
+    const VkSwapchainCounterCreateInfoEXT* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_GOOGLE_display_timing
+void count_VkRefreshCycleDurationGOOGLE(
+    uint32_t featureBits,
+    const VkRefreshCycleDurationGOOGLE* toCount,
+    size_t* count);
+
+void count_VkPastPresentationTimingGOOGLE(
+    uint32_t featureBits,
+    const VkPastPresentationTimingGOOGLE* toCount,
+    size_t* count);
+
+void count_VkPresentTimeGOOGLE(
+    uint32_t featureBits,
+    const VkPresentTimeGOOGLE* toCount,
+    size_t* count);
+
+void count_VkPresentTimesInfoGOOGLE(
+    uint32_t featureBits,
+    const VkPresentTimesInfoGOOGLE* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_NV_sample_mask_override_coverage
+#endif
+#ifdef VK_NV_geometry_shader_passthrough
+#endif
+#ifdef VK_NV_viewport_array2
+#endif
+#ifdef VK_NVX_multiview_per_view_attributes
+void count_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
+    uint32_t featureBits,
+    const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_NV_viewport_swizzle
+void count_VkViewportSwizzleNV(
+    uint32_t featureBits,
+    const VkViewportSwizzleNV* toCount,
+    size_t* count);
+
+void count_VkPipelineViewportSwizzleStateCreateInfoNV(
+    uint32_t featureBits,
+    const VkPipelineViewportSwizzleStateCreateInfoNV* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_EXT_discard_rectangles
+void count_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
+    uint32_t featureBits,
+    const VkPhysicalDeviceDiscardRectanglePropertiesEXT* toCount,
+    size_t* count);
+
+void count_VkPipelineDiscardRectangleStateCreateInfoEXT(
+    uint32_t featureBits,
+    const VkPipelineDiscardRectangleStateCreateInfoEXT* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_EXT_conservative_rasterization
+void count_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
+    uint32_t featureBits,
+    const VkPhysicalDeviceConservativeRasterizationPropertiesEXT* toCount,
+    size_t* count);
+
+void count_VkPipelineRasterizationConservativeStateCreateInfoEXT(
+    uint32_t featureBits,
+    const VkPipelineRasterizationConservativeStateCreateInfoEXT* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_EXT_swapchain_colorspace
+#endif
+#ifdef VK_EXT_hdr_metadata
+void count_VkXYColorEXT(
+    uint32_t featureBits,
+    const VkXYColorEXT* toCount,
+    size_t* count);
+
+void count_VkHdrMetadataEXT(
+    uint32_t featureBits,
+    const VkHdrMetadataEXT* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_MVK_ios_surface
+void count_VkIOSSurfaceCreateInfoMVK(
+    uint32_t featureBits,
+    const VkIOSSurfaceCreateInfoMVK* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_MVK_macos_surface
+void count_VkMacOSSurfaceCreateInfoMVK(
+    uint32_t featureBits,
+    const VkMacOSSurfaceCreateInfoMVK* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_EXT_external_memory_dma_buf
+#endif
+#ifdef VK_EXT_queue_family_foreign
+#endif
+#ifdef VK_EXT_debug_utils
+void count_VkDebugUtilsObjectNameInfoEXT(
+    uint32_t featureBits,
+    const VkDebugUtilsObjectNameInfoEXT* toCount,
+    size_t* count);
+
+void count_VkDebugUtilsObjectTagInfoEXT(
+    uint32_t featureBits,
+    const VkDebugUtilsObjectTagInfoEXT* toCount,
+    size_t* count);
+
+void count_VkDebugUtilsLabelEXT(
+    uint32_t featureBits,
+    const VkDebugUtilsLabelEXT* toCount,
+    size_t* count);
+
+void count_VkDebugUtilsMessengerCallbackDataEXT(
+    uint32_t featureBits,
+    const VkDebugUtilsMessengerCallbackDataEXT* toCount,
+    size_t* count);
+
+void count_VkDebugUtilsMessengerCreateInfoEXT(
+    uint32_t featureBits,
+    const VkDebugUtilsMessengerCreateInfoEXT* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_ANDROID_external_memory_android_hardware_buffer
+void count_VkAndroidHardwareBufferUsageANDROID(
+    uint32_t featureBits,
+    const VkAndroidHardwareBufferUsageANDROID* toCount,
+    size_t* count);
+
+void count_VkAndroidHardwareBufferPropertiesANDROID(
+    uint32_t featureBits,
+    const VkAndroidHardwareBufferPropertiesANDROID* toCount,
+    size_t* count);
+
+void count_VkAndroidHardwareBufferFormatPropertiesANDROID(
+    uint32_t featureBits,
+    const VkAndroidHardwareBufferFormatPropertiesANDROID* toCount,
+    size_t* count);
+
+void count_VkImportAndroidHardwareBufferInfoANDROID(
+    uint32_t featureBits,
+    const VkImportAndroidHardwareBufferInfoANDROID* toCount,
+    size_t* count);
+
+void count_VkMemoryGetAndroidHardwareBufferInfoANDROID(
+    uint32_t featureBits,
+    const VkMemoryGetAndroidHardwareBufferInfoANDROID* toCount,
+    size_t* count);
+
+void count_VkExternalFormatANDROID(
+    uint32_t featureBits,
+    const VkExternalFormatANDROID* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_EXT_sampler_filter_minmax
+void count_VkSamplerReductionModeCreateInfoEXT(
+    uint32_t featureBits,
+    const VkSamplerReductionModeCreateInfoEXT* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT(
+    uint32_t featureBits,
+    const VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_AMD_gpu_shader_int16
+#endif
+#ifdef VK_AMD_mixed_attachment_samples
+#endif
+#ifdef VK_AMD_shader_fragment_mask
+#endif
+#ifdef VK_EXT_shader_stencil_export
+#endif
+#ifdef VK_EXT_sample_locations
+void count_VkSampleLocationEXT(
+    uint32_t featureBits,
+    const VkSampleLocationEXT* toCount,
+    size_t* count);
+
+void count_VkSampleLocationsInfoEXT(
+    uint32_t featureBits,
+    const VkSampleLocationsInfoEXT* toCount,
+    size_t* count);
+
+void count_VkAttachmentSampleLocationsEXT(
+    uint32_t featureBits,
+    const VkAttachmentSampleLocationsEXT* toCount,
+    size_t* count);
+
+void count_VkSubpassSampleLocationsEXT(
+    uint32_t featureBits,
+    const VkSubpassSampleLocationsEXT* toCount,
+    size_t* count);
+
+void count_VkRenderPassSampleLocationsBeginInfoEXT(
+    uint32_t featureBits,
+    const VkRenderPassSampleLocationsBeginInfoEXT* toCount,
+    size_t* count);
+
+void count_VkPipelineSampleLocationsStateCreateInfoEXT(
+    uint32_t featureBits,
+    const VkPipelineSampleLocationsStateCreateInfoEXT* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceSampleLocationsPropertiesEXT(
+    uint32_t featureBits,
+    const VkPhysicalDeviceSampleLocationsPropertiesEXT* toCount,
+    size_t* count);
+
+void count_VkMultisamplePropertiesEXT(
+    uint32_t featureBits,
+    const VkMultisamplePropertiesEXT* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_EXT_blend_operation_advanced
+void count_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
+    uint32_t featureBits,
+    const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
+    uint32_t featureBits,
+    const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* toCount,
+    size_t* count);
+
+void count_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
+    uint32_t featureBits,
+    const VkPipelineColorBlendAdvancedStateCreateInfoEXT* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_NV_fragment_coverage_to_color
+void count_VkPipelineCoverageToColorStateCreateInfoNV(
+    uint32_t featureBits,
+    const VkPipelineCoverageToColorStateCreateInfoNV* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_NV_framebuffer_mixed_samples
+void count_VkPipelineCoverageModulationStateCreateInfoNV(
+    uint32_t featureBits,
+    const VkPipelineCoverageModulationStateCreateInfoNV* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_NV_fill_rectangle
+#endif
+#ifdef VK_EXT_post_depth_coverage
+#endif
+#ifdef VK_EXT_validation_cache
+void count_VkValidationCacheCreateInfoEXT(
+    uint32_t featureBits,
+    const VkValidationCacheCreateInfoEXT* toCount,
+    size_t* count);
+
+void count_VkShaderModuleValidationCacheCreateInfoEXT(
+    uint32_t featureBits,
+    const VkShaderModuleValidationCacheCreateInfoEXT* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_EXT_descriptor_indexing
+void count_VkDescriptorSetLayoutBindingFlagsCreateInfoEXT(
+    uint32_t featureBits,
+    const VkDescriptorSetLayoutBindingFlagsCreateInfoEXT* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceDescriptorIndexingFeaturesEXT(
+    uint32_t featureBits,
+    const VkPhysicalDeviceDescriptorIndexingFeaturesEXT* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceDescriptorIndexingPropertiesEXT(
+    uint32_t featureBits,
+    const VkPhysicalDeviceDescriptorIndexingPropertiesEXT* toCount,
+    size_t* count);
+
+void count_VkDescriptorSetVariableDescriptorCountAllocateInfoEXT(
+    uint32_t featureBits,
+    const VkDescriptorSetVariableDescriptorCountAllocateInfoEXT* toCount,
+    size_t* count);
+
+void count_VkDescriptorSetVariableDescriptorCountLayoutSupportEXT(
+    uint32_t featureBits,
+    const VkDescriptorSetVariableDescriptorCountLayoutSupportEXT* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_EXT_shader_viewport_index_layer
+#endif
+#ifdef VK_EXT_global_priority
+void count_VkDeviceQueueGlobalPriorityCreateInfoEXT(
+    uint32_t featureBits,
+    const VkDeviceQueueGlobalPriorityCreateInfoEXT* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_EXT_external_memory_host
+void count_VkImportMemoryHostPointerInfoEXT(
+    uint32_t featureBits,
+    const VkImportMemoryHostPointerInfoEXT* toCount,
+    size_t* count);
+
+void count_VkMemoryHostPointerPropertiesEXT(
+    uint32_t featureBits,
+    const VkMemoryHostPointerPropertiesEXT* toCount,
+    size_t* count);
+
+void count_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
+    uint32_t featureBits,
+    const VkPhysicalDeviceExternalMemoryHostPropertiesEXT* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_AMD_buffer_marker
+#endif
+#ifdef VK_AMD_shader_core_properties
+void count_VkPhysicalDeviceShaderCorePropertiesAMD(
+    uint32_t featureBits,
+    const VkPhysicalDeviceShaderCorePropertiesAMD* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_EXT_vertex_attribute_divisor
+void count_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
+    uint32_t featureBits,
+    const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* toCount,
+    size_t* count);
+
+void count_VkVertexInputBindingDivisorDescriptionEXT(
+    uint32_t featureBits,
+    const VkVertexInputBindingDivisorDescriptionEXT* toCount,
+    size_t* count);
+
+void count_VkPipelineVertexInputDivisorStateCreateInfoEXT(
+    uint32_t featureBits,
+    const VkPipelineVertexInputDivisorStateCreateInfoEXT* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_NV_shader_subgroup_partitioned
+#endif
+#ifdef VK_NV_device_diagnostic_checkpoints
+void count_VkQueueFamilyCheckpointPropertiesNV(
+    uint32_t featureBits,
+    const VkQueueFamilyCheckpointPropertiesNV* toCount,
+    size_t* count);
+
+void count_VkCheckpointDataNV(
+    uint32_t featureBits,
+    const VkCheckpointDataNV* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_GOOGLE_address_space
+#endif
+#ifdef VK_GOOGLE_color_buffer
+void count_VkImportColorBufferGOOGLE(
+    uint32_t featureBits,
+    const VkImportColorBufferGOOGLE* toCount,
+    size_t* count);
+
+void count_VkImportBufferGOOGLE(
+    uint32_t featureBits,
+    const VkImportBufferGOOGLE* toCount,
+    size_t* count);
+
+void count_VkImportPhysicalAddressGOOGLE(
+    uint32_t featureBits,
+    const VkImportPhysicalAddressGOOGLE* toCount,
+    size_t* count);
+
+#endif
+#ifdef VK_GOOGLE_sized_descriptor_update_template
+#endif
+#ifdef VK_GOOGLE_async_command_buffers
+#endif
+#ifdef VK_GOOGLE_create_resources_with_requirements
+#endif
+#ifdef VK_GOOGLE_address_space_info
+#endif
+#ifdef VK_GOOGLE_free_memory_sync
+#endif
+#ifdef VK_GOOGLE_async_queue_submit
+#endif
+#ifdef VK_GOOGLE_linear_image_layout
+#endif
+#ifdef VK_MVK_moltenvk
+#endif
+
+} // namespace goldfish_vk
diff --git a/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp b/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp
new file mode 100644
index 0000000..c401c54
--- /dev/null
+++ b/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp
@@ -0,0 +1,8451 @@
+// Copyright (C) 2018 The Android Open Source Project
+// Copyright (C) 2018 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Autogenerated module goldfish_vk_reserved_marshaling_guest
+// (impl) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
+// Please do not modify directly;
+// re-run android/scripts/generate-vulkan-sources.sh,
+// or directly from Python by defining:
+// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
+// CEREAL_OUTPUT_DIR: Where to put the generated sources.
+// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+
+#include "goldfish_vk_reserved_marshaling_guest.h"
+
+
+#include "goldfish_vk_extension_structs_guest.h"
+#include "goldfish_vk_private_defs.h"
+
+#include "Resources.h"
+
+
+namespace goldfish_vk {
+
+void reservedmarshal_extension_struct(
+    VulkanStreamGuest* vkStream,
+    const void* structExtension,
+    uint8_t** ptr);
+
+void reservedunmarshal_extension_struct(
+    VulkanStreamGuest* vkStream,
+    void* structExtension_out,
+    uint8_t** ptr);
+
+#ifdef VK_VERSION_1_0
+void reservedmarshal_VkApplicationInfo(
+    VulkanStreamGuest* vkStream,
+    const VkApplicationInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+    {
+        // WARNING PTR CHECK
+        uint64_t cgen_var_0 = (uint64_t)(uintptr_t)forMarshaling->pApplicationName;
+        memcpy((*ptr), &cgen_var_0, 8);
+        android::base::Stream::toBe64((uint8_t*)(*ptr));
+        *ptr += 8;
+        if (forMarshaling->pApplicationName)
+        {
+            {
+                uint32_t l = forMarshaling->pApplicationName ? strlen(forMarshaling->pApplicationName): 0;
+                memcpy(*ptr, (uint32_t*)&l, sizeof(uint32_t));
+                android::base::Stream::toBe32((uint8_t*)*ptr);
+                *ptr += sizeof(uint32_t);
+                memcpy(*ptr, (char*)forMarshaling->pApplicationName, l);
+                *ptr += l;
+            }
+        }
+    }
+    else
+    {
+        {
+            uint32_t l = forMarshaling->pApplicationName ? strlen(forMarshaling->pApplicationName): 0;
+            memcpy(*ptr, (uint32_t*)&l, sizeof(uint32_t));
+            android::base::Stream::toBe32((uint8_t*)*ptr);
+            *ptr += sizeof(uint32_t);
+            memcpy(*ptr, (char*)forMarshaling->pApplicationName, l);
+            *ptr += l;
+        }
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->applicationVersion, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+    {
+        // WARNING PTR CHECK
+        uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pEngineName;
+        memcpy((*ptr), &cgen_var_1, 8);
+        android::base::Stream::toBe64((uint8_t*)(*ptr));
+        *ptr += 8;
+        if (forMarshaling->pEngineName)
+        {
+            {
+                uint32_t l = forMarshaling->pEngineName ? strlen(forMarshaling->pEngineName): 0;
+                memcpy(*ptr, (uint32_t*)&l, sizeof(uint32_t));
+                android::base::Stream::toBe32((uint8_t*)*ptr);
+                *ptr += sizeof(uint32_t);
+                memcpy(*ptr, (char*)forMarshaling->pEngineName, l);
+                *ptr += l;
+            }
+        }
+    }
+    else
+    {
+        {
+            uint32_t l = forMarshaling->pEngineName ? strlen(forMarshaling->pEngineName): 0;
+            memcpy(*ptr, (uint32_t*)&l, sizeof(uint32_t));
+            android::base::Stream::toBe32((uint8_t*)*ptr);
+            *ptr += sizeof(uint32_t);
+            memcpy(*ptr, (char*)forMarshaling->pEngineName, l);
+            *ptr += l;
+        }
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->engineVersion, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->apiVersion, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkInstanceCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkInstanceCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkInstanceCreateFlags*)&forMarshaling->flags, sizeof(VkInstanceCreateFlags));
+    *ptr += sizeof(VkInstanceCreateFlags);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_2 = (uint64_t)(uintptr_t)forMarshaling->pApplicationInfo;
+    memcpy((*ptr), &cgen_var_2, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pApplicationInfo)
+    {
+        reservedmarshal_VkApplicationInfo(vkStream, (const VkApplicationInfo*)(forMarshaling->pApplicationInfo), ptr);
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->enabledLayerCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    {
+        uint32_t c = forMarshaling->enabledLayerCount;
+        memcpy(*ptr, (uint32_t*)&c, sizeof(uint32_t));
+        android::base::Stream::toBe32((uint8_t*)*ptr);
+        *ptr += sizeof(uint32_t);
+        for (uint32_t i = 0; i < c; ++i)
+        {
+            uint32_t l = forMarshaling->ppEnabledLayerNames ? strlen(forMarshaling->ppEnabledLayerNames[i]): 0;
+            memcpy(*ptr, (uint32_t*)&l, sizeof(uint32_t));
+            android::base::Stream::toBe32((uint8_t*)*ptr);
+            *ptr += sizeof(uint32_t);
+            if (l)
+            {
+                memcpy(*ptr, (char*)(forMarshaling->ppEnabledLayerNames[i]), l);
+                *ptr += l;
+            }
+        }
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->enabledExtensionCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    {
+        uint32_t c = forMarshaling->enabledExtensionCount;
+        memcpy(*ptr, (uint32_t*)&c, sizeof(uint32_t));
+        android::base::Stream::toBe32((uint8_t*)*ptr);
+        *ptr += sizeof(uint32_t);
+        for (uint32_t i = 0; i < c; ++i)
+        {
+            uint32_t l = forMarshaling->ppEnabledExtensionNames ? strlen(forMarshaling->ppEnabledExtensionNames[i]): 0;
+            memcpy(*ptr, (uint32_t*)&l, sizeof(uint32_t));
+            android::base::Stream::toBe32((uint8_t*)*ptr);
+            *ptr += sizeof(uint32_t);
+            if (l)
+            {
+                memcpy(*ptr, (char*)(forMarshaling->ppEnabledExtensionNames[i]), l);
+                *ptr += l;
+            }
+        }
+    }
+}
+
+void reservedmarshal_VkAllocationCallbacks(
+    VulkanStreamGuest* vkStream,
+    const VkAllocationCallbacks* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    // WARNING PTR CHECK
+    uint64_t cgen_var_3 = (uint64_t)(uintptr_t)forMarshaling->pUserData;
+    memcpy((*ptr), &cgen_var_3, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pUserData)
+    {
+        memcpy(*ptr, (void*)forMarshaling->pUserData, sizeof(uint8_t));
+        *ptr += sizeof(uint8_t);
+    }
+    uint64_t cgen_var_4 = (uint64_t)forMarshaling->pfnAllocation;
+    memcpy((*ptr), &cgen_var_4, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    uint64_t cgen_var_5 = (uint64_t)forMarshaling->pfnReallocation;
+    memcpy((*ptr), &cgen_var_5, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    uint64_t cgen_var_6 = (uint64_t)forMarshaling->pfnFree;
+    memcpy((*ptr), &cgen_var_6, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    uint64_t cgen_var_7 = (uint64_t)forMarshaling->pfnInternalAllocation;
+    memcpy((*ptr), &cgen_var_7, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    uint64_t cgen_var_8 = (uint64_t)forMarshaling->pfnInternalFree;
+    memcpy((*ptr), &cgen_var_8, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+}
+
+void reservedmarshal_VkPhysicalDeviceFeatures(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceFeatures* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkBool32*)&forMarshaling->robustBufferAccess, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->fullDrawIndexUint32, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->imageCubeArray, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->independentBlend, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->geometryShader, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->tessellationShader, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->sampleRateShading, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->dualSrcBlend, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->logicOp, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->multiDrawIndirect, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->drawIndirectFirstInstance, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->depthClamp, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->depthBiasClamp, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->fillModeNonSolid, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->depthBounds, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->wideLines, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->largePoints, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->alphaToOne, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->multiViewport, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->samplerAnisotropy, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->textureCompressionETC2, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->textureCompressionASTC_LDR, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->textureCompressionBC, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->occlusionQueryPrecise, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->pipelineStatisticsQuery, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->vertexPipelineStoresAndAtomics, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->fragmentStoresAndAtomics, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderTessellationAndGeometryPointSize, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderImageGatherExtended, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderStorageImageExtendedFormats, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderStorageImageMultisample, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderStorageImageReadWithoutFormat, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderStorageImageWriteWithoutFormat, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderUniformBufferArrayDynamicIndexing, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderSampledImageArrayDynamicIndexing, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderStorageBufferArrayDynamicIndexing, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderStorageImageArrayDynamicIndexing, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderClipDistance, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderCullDistance, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderFloat64, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderInt64, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderInt16, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderResourceResidency, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderResourceMinLod, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->sparseBinding, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->sparseResidencyBuffer, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->sparseResidencyImage2D, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->sparseResidencyImage3D, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->sparseResidency2Samples, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->sparseResidency4Samples, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->sparseResidency8Samples, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->sparseResidency16Samples, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->sparseResidencyAliased, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->variableMultisampleRate, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->inheritedQueries, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkFormatProperties(
+    VulkanStreamGuest* vkStream,
+    const VkFormatProperties* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkFormatFeatureFlags*)&forMarshaling->linearTilingFeatures, sizeof(VkFormatFeatureFlags));
+    *ptr += sizeof(VkFormatFeatureFlags);
+    memcpy(*ptr, (VkFormatFeatureFlags*)&forMarshaling->optimalTilingFeatures, sizeof(VkFormatFeatureFlags));
+    *ptr += sizeof(VkFormatFeatureFlags);
+    memcpy(*ptr, (VkFormatFeatureFlags*)&forMarshaling->bufferFeatures, sizeof(VkFormatFeatureFlags));
+    *ptr += sizeof(VkFormatFeatureFlags);
+}
+
+void reservedmarshal_VkExtent3D(
+    VulkanStreamGuest* vkStream,
+    const VkExtent3D* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->width, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->height, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->depth, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkImageFormatProperties(
+    VulkanStreamGuest* vkStream,
+    const VkImageFormatProperties* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    reservedmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->maxExtent), ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxMipLevels, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxArrayLayers, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkSampleCountFlags*)&forMarshaling->sampleCounts, sizeof(VkSampleCountFlags));
+    *ptr += sizeof(VkSampleCountFlags);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->maxResourceSize, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+}
+
+void reservedmarshal_VkPhysicalDeviceLimits(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceLimits* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxImageDimension1D, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxImageDimension2D, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxImageDimension3D, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxImageDimensionCube, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxImageArrayLayers, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxTexelBufferElements, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxUniformBufferRange, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxStorageBufferRange, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxPushConstantsSize, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxMemoryAllocationCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxSamplerAllocationCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->bufferImageGranularity, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->sparseAddressSpaceSize, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxBoundDescriptorSets, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxPerStageDescriptorSamplers, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxPerStageDescriptorUniformBuffers, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxPerStageDescriptorStorageBuffers, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxPerStageDescriptorSampledImages, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxPerStageDescriptorStorageImages, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxPerStageDescriptorInputAttachments, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxPerStageResources, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxDescriptorSetSamplers, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxDescriptorSetUniformBuffers, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxDescriptorSetUniformBuffersDynamic, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxDescriptorSetStorageBuffers, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxDescriptorSetStorageBuffersDynamic, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxDescriptorSetSampledImages, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxDescriptorSetStorageImages, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxDescriptorSetInputAttachments, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxVertexInputAttributes, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxVertexInputBindings, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxVertexInputAttributeOffset, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxVertexInputBindingStride, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxVertexOutputComponents, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxTessellationGenerationLevel, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxTessellationPatchSize, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxTessellationControlPerVertexInputComponents, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxTessellationControlPerVertexOutputComponents, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxTessellationControlPerPatchOutputComponents, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxTessellationControlTotalOutputComponents, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxTessellationEvaluationInputComponents, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxTessellationEvaluationOutputComponents, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxGeometryShaderInvocations, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxGeometryInputComponents, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxGeometryOutputComponents, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxGeometryOutputVertices, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxGeometryTotalOutputComponents, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxFragmentInputComponents, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxFragmentOutputAttachments, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxFragmentDualSrcAttachments, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxFragmentCombinedOutputResources, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxComputeSharedMemorySize, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)forMarshaling->maxComputeWorkGroupCount, 3 * sizeof(uint32_t));
+    *ptr += 3 * sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxComputeWorkGroupInvocations, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)forMarshaling->maxComputeWorkGroupSize, 3 * sizeof(uint32_t));
+    *ptr += 3 * sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->subPixelPrecisionBits, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->subTexelPrecisionBits, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->mipmapPrecisionBits, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxDrawIndexedIndexValue, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxDrawIndirectCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (float*)&forMarshaling->maxSamplerLodBias, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (float*)&forMarshaling->maxSamplerAnisotropy, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxViewports, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)forMarshaling->maxViewportDimensions, 2 * sizeof(uint32_t));
+    *ptr += 2 * sizeof(uint32_t);
+    memcpy(*ptr, (float*)forMarshaling->viewportBoundsRange, 2 * sizeof(float));
+    *ptr += 2 * sizeof(float);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->viewportSubPixelBits, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    uint64_t cgen_var_9 = (uint64_t)forMarshaling->minMemoryMapAlignment;
+    memcpy((*ptr), &cgen_var_9, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->minTexelBufferOffsetAlignment, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->minUniformBufferOffsetAlignment, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->minStorageBufferOffsetAlignment, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (int32_t*)&forMarshaling->minTexelOffset, sizeof(int32_t));
+    *ptr += sizeof(int32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxTexelOffset, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (int32_t*)&forMarshaling->minTexelGatherOffset, sizeof(int32_t));
+    *ptr += sizeof(int32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxTexelGatherOffset, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (float*)&forMarshaling->minInterpolationOffset, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (float*)&forMarshaling->maxInterpolationOffset, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->subPixelInterpolationOffsetBits, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxFramebufferWidth, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxFramebufferHeight, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxFramebufferLayers, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkSampleCountFlags*)&forMarshaling->framebufferColorSampleCounts, sizeof(VkSampleCountFlags));
+    *ptr += sizeof(VkSampleCountFlags);
+    memcpy(*ptr, (VkSampleCountFlags*)&forMarshaling->framebufferDepthSampleCounts, sizeof(VkSampleCountFlags));
+    *ptr += sizeof(VkSampleCountFlags);
+    memcpy(*ptr, (VkSampleCountFlags*)&forMarshaling->framebufferStencilSampleCounts, sizeof(VkSampleCountFlags));
+    *ptr += sizeof(VkSampleCountFlags);
+    memcpy(*ptr, (VkSampleCountFlags*)&forMarshaling->framebufferNoAttachmentsSampleCounts, sizeof(VkSampleCountFlags));
+    *ptr += sizeof(VkSampleCountFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxColorAttachments, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkSampleCountFlags*)&forMarshaling->sampledImageColorSampleCounts, sizeof(VkSampleCountFlags));
+    *ptr += sizeof(VkSampleCountFlags);
+    memcpy(*ptr, (VkSampleCountFlags*)&forMarshaling->sampledImageIntegerSampleCounts, sizeof(VkSampleCountFlags));
+    *ptr += sizeof(VkSampleCountFlags);
+    memcpy(*ptr, (VkSampleCountFlags*)&forMarshaling->sampledImageDepthSampleCounts, sizeof(VkSampleCountFlags));
+    *ptr += sizeof(VkSampleCountFlags);
+    memcpy(*ptr, (VkSampleCountFlags*)&forMarshaling->sampledImageStencilSampleCounts, sizeof(VkSampleCountFlags));
+    *ptr += sizeof(VkSampleCountFlags);
+    memcpy(*ptr, (VkSampleCountFlags*)&forMarshaling->storageImageSampleCounts, sizeof(VkSampleCountFlags));
+    *ptr += sizeof(VkSampleCountFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxSampleMaskWords, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->timestampComputeAndGraphics, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (float*)&forMarshaling->timestampPeriod, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxClipDistances, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxCullDistances, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxCombinedClipAndCullDistances, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->discreteQueuePriorities, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (float*)forMarshaling->pointSizeRange, 2 * sizeof(float));
+    *ptr += 2 * sizeof(float);
+    memcpy(*ptr, (float*)forMarshaling->lineWidthRange, 2 * sizeof(float));
+    *ptr += 2 * sizeof(float);
+    memcpy(*ptr, (float*)&forMarshaling->pointSizeGranularity, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (float*)&forMarshaling->lineWidthGranularity, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->strictLines, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->standardSampleLocations, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->optimalBufferCopyOffsetAlignment, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->optimalBufferCopyRowPitchAlignment, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->nonCoherentAtomSize, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+}
+
+void reservedmarshal_VkPhysicalDeviceSparseProperties(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceSparseProperties* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkBool32*)&forMarshaling->residencyStandard2DBlockShape, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->residencyStandard2DMultisampleBlockShape, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->residencyStandard3DBlockShape, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->residencyAlignedMipSize, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->residencyNonResidentStrict, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkPhysicalDeviceProperties(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceProperties* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->apiVersion, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->driverVersion, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->vendorID, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->deviceID, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkPhysicalDeviceType*)&forMarshaling->deviceType, sizeof(VkPhysicalDeviceType));
+    *ptr += sizeof(VkPhysicalDeviceType);
+    memcpy(*ptr, (char*)forMarshaling->deviceName, VK_MAX_PHYSICAL_DEVICE_NAME_SIZE * sizeof(char));
+    *ptr += VK_MAX_PHYSICAL_DEVICE_NAME_SIZE * sizeof(char);
+    memcpy(*ptr, (uint8_t*)forMarshaling->pipelineCacheUUID, VK_UUID_SIZE * sizeof(uint8_t));
+    *ptr += VK_UUID_SIZE * sizeof(uint8_t);
+    reservedmarshal_VkPhysicalDeviceLimits(vkStream, (VkPhysicalDeviceLimits*)(&forMarshaling->limits), ptr);
+    reservedmarshal_VkPhysicalDeviceSparseProperties(vkStream, (VkPhysicalDeviceSparseProperties*)(&forMarshaling->sparseProperties), ptr);
+}
+
+void reservedmarshal_VkQueueFamilyProperties(
+    VulkanStreamGuest* vkStream,
+    const VkQueueFamilyProperties* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkQueueFlags*)&forMarshaling->queueFlags, sizeof(VkQueueFlags));
+    *ptr += sizeof(VkQueueFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->queueCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->timestampValidBits, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    reservedmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->minImageTransferGranularity), ptr);
+}
+
+void reservedmarshal_VkMemoryType(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryType* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkMemoryPropertyFlags*)&forMarshaling->propertyFlags, sizeof(VkMemoryPropertyFlags));
+    *ptr += sizeof(VkMemoryPropertyFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->heapIndex, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkMemoryHeap(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryHeap* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkMemoryHeapFlags*)&forMarshaling->flags, sizeof(VkMemoryHeapFlags));
+    *ptr += sizeof(VkMemoryHeapFlags);
+}
+
+void reservedmarshal_VkPhysicalDeviceMemoryProperties(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceMemoryProperties* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->memoryTypeCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_TYPES; ++i)
+    {
+        reservedmarshal_VkMemoryType(vkStream, (VkMemoryType*)(forMarshaling->memoryTypes + i), ptr);
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->memoryHeapCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)VK_MAX_MEMORY_HEAPS; ++i)
+    {
+        reservedmarshal_VkMemoryHeap(vkStream, (VkMemoryHeap*)(forMarshaling->memoryHeaps + i), ptr);
+    }
+}
+
+void reservedmarshal_VkDeviceQueueCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceQueueCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkDeviceQueueCreateFlags*)&forMarshaling->flags, sizeof(VkDeviceQueueCreateFlags));
+    *ptr += sizeof(VkDeviceQueueCreateFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->queueFamilyIndex, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->queueCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (const float*)forMarshaling->pQueuePriorities, forMarshaling->queueCount * sizeof(const float));
+    *ptr += forMarshaling->queueCount * sizeof(const float);
+}
+
+void reservedmarshal_VkDeviceCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkDeviceCreateFlags*)&forMarshaling->flags, sizeof(VkDeviceCreateFlags));
+    *ptr += sizeof(VkDeviceCreateFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->queueCreateInfoCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->queueCreateInfoCount; ++i)
+    {
+        reservedmarshal_VkDeviceQueueCreateInfo(vkStream, (const VkDeviceQueueCreateInfo*)(forMarshaling->pQueueCreateInfos + i), ptr);
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->enabledLayerCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    {
+        uint32_t c = forMarshaling->enabledLayerCount;
+        memcpy(*ptr, (uint32_t*)&c, sizeof(uint32_t));
+        android::base::Stream::toBe32((uint8_t*)*ptr);
+        *ptr += sizeof(uint32_t);
+        for (uint32_t i = 0; i < c; ++i)
+        {
+            uint32_t l = forMarshaling->ppEnabledLayerNames ? strlen(forMarshaling->ppEnabledLayerNames[i]): 0;
+            memcpy(*ptr, (uint32_t*)&l, sizeof(uint32_t));
+            android::base::Stream::toBe32((uint8_t*)*ptr);
+            *ptr += sizeof(uint32_t);
+            if (l)
+            {
+                memcpy(*ptr, (char*)(forMarshaling->ppEnabledLayerNames[i]), l);
+                *ptr += l;
+            }
+        }
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->enabledExtensionCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    {
+        uint32_t c = forMarshaling->enabledExtensionCount;
+        memcpy(*ptr, (uint32_t*)&c, sizeof(uint32_t));
+        android::base::Stream::toBe32((uint8_t*)*ptr);
+        *ptr += sizeof(uint32_t);
+        for (uint32_t i = 0; i < c; ++i)
+        {
+            uint32_t l = forMarshaling->ppEnabledExtensionNames ? strlen(forMarshaling->ppEnabledExtensionNames[i]): 0;
+            memcpy(*ptr, (uint32_t*)&l, sizeof(uint32_t));
+            android::base::Stream::toBe32((uint8_t*)*ptr);
+            *ptr += sizeof(uint32_t);
+            if (l)
+            {
+                memcpy(*ptr, (char*)(forMarshaling->ppEnabledExtensionNames[i]), l);
+                *ptr += l;
+            }
+        }
+    }
+    // WARNING PTR CHECK
+    uint64_t cgen_var_10 = (uint64_t)(uintptr_t)forMarshaling->pEnabledFeatures;
+    memcpy((*ptr), &cgen_var_10, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pEnabledFeatures)
+    {
+        reservedmarshal_VkPhysicalDeviceFeatures(vkStream, (const VkPhysicalDeviceFeatures*)(forMarshaling->pEnabledFeatures), ptr);
+    }
+}
+
+void reservedmarshal_VkExtensionProperties(
+    VulkanStreamGuest* vkStream,
+    const VkExtensionProperties* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (char*)forMarshaling->extensionName, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
+    *ptr += VK_MAX_EXTENSION_NAME_SIZE * sizeof(char);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->specVersion, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkLayerProperties(
+    VulkanStreamGuest* vkStream,
+    const VkLayerProperties* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (char*)forMarshaling->layerName, VK_MAX_EXTENSION_NAME_SIZE * sizeof(char));
+    *ptr += VK_MAX_EXTENSION_NAME_SIZE * sizeof(char);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->specVersion, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->implementationVersion, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (char*)forMarshaling->description, VK_MAX_DESCRIPTION_SIZE * sizeof(char));
+    *ptr += VK_MAX_DESCRIPTION_SIZE * sizeof(char);
+}
+
+void reservedmarshal_VkSubmitInfo(
+    VulkanStreamGuest* vkStream,
+    const VkSubmitInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->waitSemaphoreCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    if (forMarshaling->waitSemaphoreCount)
+    {
+        uint64_t* cgen_var_11;
+        vkStream->alloc((void**)&cgen_var_11, forMarshaling->waitSemaphoreCount * 8);
+        for (uint32_t k = 0; k < forMarshaling->waitSemaphoreCount; ++k)
+        {
+            cgen_var_11[k] = get_host_u64_VkSemaphore(forMarshaling->pWaitSemaphores[k]);
+        }
+        memcpy(*ptr, (uint64_t*)cgen_var_11, forMarshaling->waitSemaphoreCount * 8);
+        *ptr += forMarshaling->waitSemaphoreCount * 8;
+    }
+    memcpy(*ptr, (const VkPipelineStageFlags*)forMarshaling->pWaitDstStageMask, forMarshaling->waitSemaphoreCount * sizeof(const VkPipelineStageFlags));
+    *ptr += forMarshaling->waitSemaphoreCount * sizeof(const VkPipelineStageFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->commandBufferCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    if (forMarshaling->commandBufferCount)
+    {
+        uint64_t* cgen_var_12;
+        vkStream->alloc((void**)&cgen_var_12, forMarshaling->commandBufferCount * 8);
+        for (uint32_t k = 0; k < forMarshaling->commandBufferCount; ++k)
+        {
+            cgen_var_12[k] = get_host_u64_VkCommandBuffer(forMarshaling->pCommandBuffers[k]);
+        }
+        memcpy(*ptr, (uint64_t*)cgen_var_12, forMarshaling->commandBufferCount * 8);
+        *ptr += forMarshaling->commandBufferCount * 8;
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->signalSemaphoreCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    if (forMarshaling->signalSemaphoreCount)
+    {
+        uint64_t* cgen_var_13;
+        vkStream->alloc((void**)&cgen_var_13, forMarshaling->signalSemaphoreCount * 8);
+        for (uint32_t k = 0; k < forMarshaling->signalSemaphoreCount; ++k)
+        {
+            cgen_var_13[k] = get_host_u64_VkSemaphore(forMarshaling->pSignalSemaphores[k]);
+        }
+        memcpy(*ptr, (uint64_t*)cgen_var_13, forMarshaling->signalSemaphoreCount * 8);
+        *ptr += forMarshaling->signalSemaphoreCount * 8;
+    }
+}
+
+void reservedmarshal_VkMemoryAllocateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryAllocateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->allocationSize, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->memoryTypeIndex, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkMappedMemoryRange(
+    VulkanStreamGuest* vkStream,
+    const VkMappedMemoryRange* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_14;
+    *&cgen_var_14 = get_host_u64_VkDeviceMemory((*&forMarshaling->memory));
+    memcpy(*ptr, (uint64_t*)&cgen_var_14, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->offset, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+}
+
+void reservedmarshal_VkMemoryRequirements(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryRequirements* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->alignment, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->memoryTypeBits, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkSparseImageFormatProperties(
+    VulkanStreamGuest* vkStream,
+    const VkSparseImageFormatProperties* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkImageAspectFlags*)&forMarshaling->aspectMask, sizeof(VkImageAspectFlags));
+    *ptr += sizeof(VkImageAspectFlags);
+    reservedmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->imageGranularity), ptr);
+    memcpy(*ptr, (VkSparseImageFormatFlags*)&forMarshaling->flags, sizeof(VkSparseImageFormatFlags));
+    *ptr += sizeof(VkSparseImageFormatFlags);
+}
+
+void reservedmarshal_VkSparseImageMemoryRequirements(
+    VulkanStreamGuest* vkStream,
+    const VkSparseImageMemoryRequirements* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    reservedmarshal_VkSparseImageFormatProperties(vkStream, (VkSparseImageFormatProperties*)(&forMarshaling->formatProperties), ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->imageMipTailFirstLod, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->imageMipTailSize, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->imageMipTailOffset, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->imageMipTailStride, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+}
+
+void reservedmarshal_VkSparseMemoryBind(
+    VulkanStreamGuest* vkStream,
+    const VkSparseMemoryBind* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->resourceOffset, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    uint64_t cgen_var_15;
+    *&cgen_var_15 = get_host_u64_VkDeviceMemory((*&forMarshaling->memory));
+    memcpy(*ptr, (uint64_t*)&cgen_var_15, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->memoryOffset, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkSparseMemoryBindFlags*)&forMarshaling->flags, sizeof(VkSparseMemoryBindFlags));
+    *ptr += sizeof(VkSparseMemoryBindFlags);
+}
+
+void reservedmarshal_VkSparseBufferMemoryBindInfo(
+    VulkanStreamGuest* vkStream,
+    const VkSparseBufferMemoryBindInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    uint64_t cgen_var_16;
+    *&cgen_var_16 = get_host_u64_VkBuffer((*&forMarshaling->buffer));
+    memcpy(*ptr, (uint64_t*)&cgen_var_16, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->bindCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->bindCount; ++i)
+    {
+        reservedmarshal_VkSparseMemoryBind(vkStream, (const VkSparseMemoryBind*)(forMarshaling->pBinds + i), ptr);
+    }
+}
+
+void reservedmarshal_VkSparseImageOpaqueMemoryBindInfo(
+    VulkanStreamGuest* vkStream,
+    const VkSparseImageOpaqueMemoryBindInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    uint64_t cgen_var_17;
+    *&cgen_var_17 = get_host_u64_VkImage((*&forMarshaling->image));
+    memcpy(*ptr, (uint64_t*)&cgen_var_17, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->bindCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->bindCount; ++i)
+    {
+        reservedmarshal_VkSparseMemoryBind(vkStream, (const VkSparseMemoryBind*)(forMarshaling->pBinds + i), ptr);
+    }
+}
+
+void reservedmarshal_VkImageSubresource(
+    VulkanStreamGuest* vkStream,
+    const VkImageSubresource* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkImageAspectFlags*)&forMarshaling->aspectMask, sizeof(VkImageAspectFlags));
+    *ptr += sizeof(VkImageAspectFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->mipLevel, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->arrayLayer, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkOffset3D(
+    VulkanStreamGuest* vkStream,
+    const VkOffset3D* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (int32_t*)&forMarshaling->x, sizeof(int32_t));
+    *ptr += sizeof(int32_t);
+    memcpy(*ptr, (int32_t*)&forMarshaling->y, sizeof(int32_t));
+    *ptr += sizeof(int32_t);
+    memcpy(*ptr, (int32_t*)&forMarshaling->z, sizeof(int32_t));
+    *ptr += sizeof(int32_t);
+}
+
+void reservedmarshal_VkSparseImageMemoryBind(
+    VulkanStreamGuest* vkStream,
+    const VkSparseImageMemoryBind* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    reservedmarshal_VkImageSubresource(vkStream, (VkImageSubresource*)(&forMarshaling->subresource), ptr);
+    reservedmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->offset), ptr);
+    reservedmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->extent), ptr);
+    uint64_t cgen_var_18;
+    *&cgen_var_18 = get_host_u64_VkDeviceMemory((*&forMarshaling->memory));
+    memcpy(*ptr, (uint64_t*)&cgen_var_18, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->memoryOffset, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkSparseMemoryBindFlags*)&forMarshaling->flags, sizeof(VkSparseMemoryBindFlags));
+    *ptr += sizeof(VkSparseMemoryBindFlags);
+}
+
+void reservedmarshal_VkSparseImageMemoryBindInfo(
+    VulkanStreamGuest* vkStream,
+    const VkSparseImageMemoryBindInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    uint64_t cgen_var_19;
+    *&cgen_var_19 = get_host_u64_VkImage((*&forMarshaling->image));
+    memcpy(*ptr, (uint64_t*)&cgen_var_19, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->bindCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->bindCount; ++i)
+    {
+        reservedmarshal_VkSparseImageMemoryBind(vkStream, (const VkSparseImageMemoryBind*)(forMarshaling->pBinds + i), ptr);
+    }
+}
+
+void reservedmarshal_VkBindSparseInfo(
+    VulkanStreamGuest* vkStream,
+    const VkBindSparseInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->waitSemaphoreCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    if (forMarshaling->waitSemaphoreCount)
+    {
+        uint64_t* cgen_var_20;
+        vkStream->alloc((void**)&cgen_var_20, forMarshaling->waitSemaphoreCount * 8);
+        for (uint32_t k = 0; k < forMarshaling->waitSemaphoreCount; ++k)
+        {
+            cgen_var_20[k] = get_host_u64_VkSemaphore(forMarshaling->pWaitSemaphores[k]);
+        }
+        memcpy(*ptr, (uint64_t*)cgen_var_20, forMarshaling->waitSemaphoreCount * 8);
+        *ptr += forMarshaling->waitSemaphoreCount * 8;
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->bufferBindCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->bufferBindCount; ++i)
+    {
+        reservedmarshal_VkSparseBufferMemoryBindInfo(vkStream, (const VkSparseBufferMemoryBindInfo*)(forMarshaling->pBufferBinds + i), ptr);
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->imageOpaqueBindCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->imageOpaqueBindCount; ++i)
+    {
+        reservedmarshal_VkSparseImageOpaqueMemoryBindInfo(vkStream, (const VkSparseImageOpaqueMemoryBindInfo*)(forMarshaling->pImageOpaqueBinds + i), ptr);
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->imageBindCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->imageBindCount; ++i)
+    {
+        reservedmarshal_VkSparseImageMemoryBindInfo(vkStream, (const VkSparseImageMemoryBindInfo*)(forMarshaling->pImageBinds + i), ptr);
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->signalSemaphoreCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    if (forMarshaling->signalSemaphoreCount)
+    {
+        uint64_t* cgen_var_21;
+        vkStream->alloc((void**)&cgen_var_21, forMarshaling->signalSemaphoreCount * 8);
+        for (uint32_t k = 0; k < forMarshaling->signalSemaphoreCount; ++k)
+        {
+            cgen_var_21[k] = get_host_u64_VkSemaphore(forMarshaling->pSignalSemaphores[k]);
+        }
+        memcpy(*ptr, (uint64_t*)cgen_var_21, forMarshaling->signalSemaphoreCount * 8);
+        *ptr += forMarshaling->signalSemaphoreCount * 8;
+    }
+}
+
+void reservedmarshal_VkFenceCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkFenceCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkFenceCreateFlags*)&forMarshaling->flags, sizeof(VkFenceCreateFlags));
+    *ptr += sizeof(VkFenceCreateFlags);
+}
+
+void reservedmarshal_VkSemaphoreCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkSemaphoreCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkSemaphoreCreateFlags*)&forMarshaling->flags, sizeof(VkSemaphoreCreateFlags));
+    *ptr += sizeof(VkSemaphoreCreateFlags);
+}
+
+void reservedmarshal_VkEventCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkEventCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkEventCreateFlags*)&forMarshaling->flags, sizeof(VkEventCreateFlags));
+    *ptr += sizeof(VkEventCreateFlags);
+}
+
+void reservedmarshal_VkQueryPoolCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkQueryPoolCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkQueryPoolCreateFlags*)&forMarshaling->flags, sizeof(VkQueryPoolCreateFlags));
+    *ptr += sizeof(VkQueryPoolCreateFlags);
+    memcpy(*ptr, (VkQueryType*)&forMarshaling->queryType, sizeof(VkQueryType));
+    *ptr += sizeof(VkQueryType);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->queryCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkQueryPipelineStatisticFlags*)&forMarshaling->pipelineStatistics, sizeof(VkQueryPipelineStatisticFlags));
+    *ptr += sizeof(VkQueryPipelineStatisticFlags);
+}
+
+void reservedmarshal_VkBufferCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkBufferCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBufferCreateFlags*)&forMarshaling->flags, sizeof(VkBufferCreateFlags));
+    *ptr += sizeof(VkBufferCreateFlags);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkBufferUsageFlags*)&forMarshaling->usage, sizeof(VkBufferUsageFlags));
+    *ptr += sizeof(VkBufferUsageFlags);
+    memcpy(*ptr, (VkSharingMode*)&forMarshaling->sharingMode, sizeof(VkSharingMode));
+    *ptr += sizeof(VkSharingMode);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->queueFamilyIndexCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_22 = (uint64_t)(uintptr_t)forMarshaling->pQueueFamilyIndices;
+    memcpy((*ptr), &cgen_var_22, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pQueueFamilyIndices)
+    {
+        memcpy(*ptr, (const uint32_t*)forMarshaling->pQueueFamilyIndices, forMarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
+        *ptr += forMarshaling->queueFamilyIndexCount * sizeof(const uint32_t);
+    }
+}
+
+void reservedmarshal_VkBufferViewCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkBufferViewCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBufferViewCreateFlags*)&forMarshaling->flags, sizeof(VkBufferViewCreateFlags));
+    *ptr += sizeof(VkBufferViewCreateFlags);
+    uint64_t cgen_var_23;
+    *&cgen_var_23 = get_host_u64_VkBuffer((*&forMarshaling->buffer));
+    memcpy(*ptr, (uint64_t*)&cgen_var_23, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
+    *ptr += sizeof(VkFormat);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->offset, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->range, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+}
+
+void reservedmarshal_VkImageCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkImageCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkImageCreateFlags*)&forMarshaling->flags, sizeof(VkImageCreateFlags));
+    *ptr += sizeof(VkImageCreateFlags);
+    memcpy(*ptr, (VkImageType*)&forMarshaling->imageType, sizeof(VkImageType));
+    *ptr += sizeof(VkImageType);
+    memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
+    *ptr += sizeof(VkFormat);
+    reservedmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->extent), ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->mipLevels, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->arrayLayers, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkSampleCountFlagBits*)&forMarshaling->samples, sizeof(VkSampleCountFlagBits));
+    *ptr += sizeof(VkSampleCountFlagBits);
+    memcpy(*ptr, (VkImageTiling*)&forMarshaling->tiling, sizeof(VkImageTiling));
+    *ptr += sizeof(VkImageTiling);
+    memcpy(*ptr, (VkImageUsageFlags*)&forMarshaling->usage, sizeof(VkImageUsageFlags));
+    *ptr += sizeof(VkImageUsageFlags);
+    memcpy(*ptr, (VkSharingMode*)&forMarshaling->sharingMode, sizeof(VkSharingMode));
+    *ptr += sizeof(VkSharingMode);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->queueFamilyIndexCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_24 = (uint64_t)(uintptr_t)forMarshaling->pQueueFamilyIndices;
+    memcpy((*ptr), &cgen_var_24, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pQueueFamilyIndices)
+    {
+        memcpy(*ptr, (const uint32_t*)forMarshaling->pQueueFamilyIndices, forMarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
+        *ptr += forMarshaling->queueFamilyIndexCount * sizeof(const uint32_t);
+    }
+    memcpy(*ptr, (VkImageLayout*)&forMarshaling->initialLayout, sizeof(VkImageLayout));
+    *ptr += sizeof(VkImageLayout);
+}
+
+void reservedmarshal_VkSubresourceLayout(
+    VulkanStreamGuest* vkStream,
+    const VkSubresourceLayout* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->offset, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->rowPitch, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->arrayPitch, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->depthPitch, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+}
+
+void reservedmarshal_VkComponentMapping(
+    VulkanStreamGuest* vkStream,
+    const VkComponentMapping* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkComponentSwizzle*)&forMarshaling->r, sizeof(VkComponentSwizzle));
+    *ptr += sizeof(VkComponentSwizzle);
+    memcpy(*ptr, (VkComponentSwizzle*)&forMarshaling->g, sizeof(VkComponentSwizzle));
+    *ptr += sizeof(VkComponentSwizzle);
+    memcpy(*ptr, (VkComponentSwizzle*)&forMarshaling->b, sizeof(VkComponentSwizzle));
+    *ptr += sizeof(VkComponentSwizzle);
+    memcpy(*ptr, (VkComponentSwizzle*)&forMarshaling->a, sizeof(VkComponentSwizzle));
+    *ptr += sizeof(VkComponentSwizzle);
+}
+
+void reservedmarshal_VkImageSubresourceRange(
+    VulkanStreamGuest* vkStream,
+    const VkImageSubresourceRange* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkImageAspectFlags*)&forMarshaling->aspectMask, sizeof(VkImageAspectFlags));
+    *ptr += sizeof(VkImageAspectFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->baseMipLevel, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->levelCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->baseArrayLayer, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->layerCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkImageViewCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkImageViewCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkImageViewCreateFlags*)&forMarshaling->flags, sizeof(VkImageViewCreateFlags));
+    *ptr += sizeof(VkImageViewCreateFlags);
+    uint64_t cgen_var_25;
+    *&cgen_var_25 = get_host_u64_VkImage((*&forMarshaling->image));
+    memcpy(*ptr, (uint64_t*)&cgen_var_25, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkImageViewType*)&forMarshaling->viewType, sizeof(VkImageViewType));
+    *ptr += sizeof(VkImageViewType);
+    memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
+    *ptr += sizeof(VkFormat);
+    reservedmarshal_VkComponentMapping(vkStream, (VkComponentMapping*)(&forMarshaling->components), ptr);
+    reservedmarshal_VkImageSubresourceRange(vkStream, (VkImageSubresourceRange*)(&forMarshaling->subresourceRange), ptr);
+}
+
+void reservedmarshal_VkShaderModuleCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkShaderModuleCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkShaderModuleCreateFlags*)&forMarshaling->flags, sizeof(VkShaderModuleCreateFlags));
+    *ptr += sizeof(VkShaderModuleCreateFlags);
+    uint64_t cgen_var_26 = (uint64_t)forMarshaling->codeSize;
+    memcpy((*ptr), &cgen_var_26, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    memcpy(*ptr, (const uint32_t*)forMarshaling->pCode, (forMarshaling->codeSize / 4) * sizeof(const uint32_t));
+    *ptr += (forMarshaling->codeSize / 4) * sizeof(const uint32_t);
+}
+
+void reservedmarshal_VkPipelineCacheCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineCacheCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkPipelineCacheCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineCacheCreateFlags));
+    *ptr += sizeof(VkPipelineCacheCreateFlags);
+    uint64_t cgen_var_27 = (uint64_t)forMarshaling->initialDataSize;
+    memcpy((*ptr), &cgen_var_27, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    memcpy(*ptr, (const void*)forMarshaling->pInitialData, forMarshaling->initialDataSize * sizeof(const uint8_t));
+    *ptr += forMarshaling->initialDataSize * sizeof(const uint8_t);
+}
+
+void reservedmarshal_VkSpecializationMapEntry(
+    VulkanStreamGuest* vkStream,
+    const VkSpecializationMapEntry* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->constantID, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->offset, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    uint64_t cgen_var_28 = (uint64_t)forMarshaling->size;
+    memcpy((*ptr), &cgen_var_28, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+}
+
+void reservedmarshal_VkSpecializationInfo(
+    VulkanStreamGuest* vkStream,
+    const VkSpecializationInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->mapEntryCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->mapEntryCount; ++i)
+    {
+        reservedmarshal_VkSpecializationMapEntry(vkStream, (const VkSpecializationMapEntry*)(forMarshaling->pMapEntries + i), ptr);
+    }
+    uint64_t cgen_var_29 = (uint64_t)forMarshaling->dataSize;
+    memcpy((*ptr), &cgen_var_29, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    memcpy(*ptr, (const void*)forMarshaling->pData, forMarshaling->dataSize * sizeof(const uint8_t));
+    *ptr += forMarshaling->dataSize * sizeof(const uint8_t);
+}
+
+void reservedmarshal_VkPipelineShaderStageCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineShaderStageCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkPipelineShaderStageCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineShaderStageCreateFlags));
+    *ptr += sizeof(VkPipelineShaderStageCreateFlags);
+    memcpy(*ptr, (VkShaderStageFlagBits*)&forMarshaling->stage, sizeof(VkShaderStageFlagBits));
+    *ptr += sizeof(VkShaderStageFlagBits);
+    uint64_t cgen_var_30;
+    *&cgen_var_30 = get_host_u64_VkShaderModule((*&forMarshaling->module));
+    memcpy(*ptr, (uint64_t*)&cgen_var_30, 1 * 8);
+    *ptr += 1 * 8;
+    {
+        uint32_t l = forMarshaling->pName ? strlen(forMarshaling->pName): 0;
+        memcpy(*ptr, (uint32_t*)&l, sizeof(uint32_t));
+        android::base::Stream::toBe32((uint8_t*)*ptr);
+        *ptr += sizeof(uint32_t);
+        memcpy(*ptr, (char*)forMarshaling->pName, l);
+        *ptr += l;
+    }
+    // WARNING PTR CHECK
+    uint64_t cgen_var_31 = (uint64_t)(uintptr_t)forMarshaling->pSpecializationInfo;
+    memcpy((*ptr), &cgen_var_31, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pSpecializationInfo)
+    {
+        reservedmarshal_VkSpecializationInfo(vkStream, (const VkSpecializationInfo*)(forMarshaling->pSpecializationInfo), ptr);
+    }
+}
+
+void reservedmarshal_VkVertexInputBindingDescription(
+    VulkanStreamGuest* vkStream,
+    const VkVertexInputBindingDescription* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->binding, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->stride, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkVertexInputRate*)&forMarshaling->inputRate, sizeof(VkVertexInputRate));
+    *ptr += sizeof(VkVertexInputRate);
+}
+
+void reservedmarshal_VkVertexInputAttributeDescription(
+    VulkanStreamGuest* vkStream,
+    const VkVertexInputAttributeDescription* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->location, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->binding, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
+    *ptr += sizeof(VkFormat);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->offset, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkPipelineVertexInputStateCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineVertexInputStateCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkPipelineVertexInputStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineVertexInputStateCreateFlags));
+    *ptr += sizeof(VkPipelineVertexInputStateCreateFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->vertexBindingDescriptionCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->vertexBindingDescriptionCount; ++i)
+    {
+        reservedmarshal_VkVertexInputBindingDescription(vkStream, (const VkVertexInputBindingDescription*)(forMarshaling->pVertexBindingDescriptions + i), ptr);
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->vertexAttributeDescriptionCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->vertexAttributeDescriptionCount; ++i)
+    {
+        reservedmarshal_VkVertexInputAttributeDescription(vkStream, (const VkVertexInputAttributeDescription*)(forMarshaling->pVertexAttributeDescriptions + i), ptr);
+    }
+}
+
+void reservedmarshal_VkPipelineInputAssemblyStateCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineInputAssemblyStateCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkPipelineInputAssemblyStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineInputAssemblyStateCreateFlags));
+    *ptr += sizeof(VkPipelineInputAssemblyStateCreateFlags);
+    memcpy(*ptr, (VkPrimitiveTopology*)&forMarshaling->topology, sizeof(VkPrimitiveTopology));
+    *ptr += sizeof(VkPrimitiveTopology);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->primitiveRestartEnable, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkPipelineTessellationStateCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineTessellationStateCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkPipelineTessellationStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineTessellationStateCreateFlags));
+    *ptr += sizeof(VkPipelineTessellationStateCreateFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->patchControlPoints, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkViewport(
+    VulkanStreamGuest* vkStream,
+    const VkViewport* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (float*)&forMarshaling->x, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (float*)&forMarshaling->y, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (float*)&forMarshaling->width, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (float*)&forMarshaling->height, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (float*)&forMarshaling->minDepth, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (float*)&forMarshaling->maxDepth, sizeof(float));
+    *ptr += sizeof(float);
+}
+
+void reservedmarshal_VkOffset2D(
+    VulkanStreamGuest* vkStream,
+    const VkOffset2D* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (int32_t*)&forMarshaling->x, sizeof(int32_t));
+    *ptr += sizeof(int32_t);
+    memcpy(*ptr, (int32_t*)&forMarshaling->y, sizeof(int32_t));
+    *ptr += sizeof(int32_t);
+}
+
+void reservedmarshal_VkExtent2D(
+    VulkanStreamGuest* vkStream,
+    const VkExtent2D* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->width, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->height, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkRect2D(
+    VulkanStreamGuest* vkStream,
+    const VkRect2D* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    reservedmarshal_VkOffset2D(vkStream, (VkOffset2D*)(&forMarshaling->offset), ptr);
+    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->extent), ptr);
+}
+
+void reservedmarshal_VkPipelineViewportStateCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineViewportStateCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkPipelineViewportStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineViewportStateCreateFlags));
+    *ptr += sizeof(VkPipelineViewportStateCreateFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->viewportCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_32 = (uint64_t)(uintptr_t)forMarshaling->pViewports;
+    memcpy((*ptr), &cgen_var_32, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pViewports)
+    {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->viewportCount; ++i)
+        {
+            reservedmarshal_VkViewport(vkStream, (const VkViewport*)(forMarshaling->pViewports + i), ptr);
+        }
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->scissorCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_33 = (uint64_t)(uintptr_t)forMarshaling->pScissors;
+    memcpy((*ptr), &cgen_var_33, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pScissors)
+    {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->scissorCount; ++i)
+        {
+            reservedmarshal_VkRect2D(vkStream, (const VkRect2D*)(forMarshaling->pScissors + i), ptr);
+        }
+    }
+}
+
+void reservedmarshal_VkPipelineRasterizationStateCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineRasterizationStateCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkPipelineRasterizationStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineRasterizationStateCreateFlags));
+    *ptr += sizeof(VkPipelineRasterizationStateCreateFlags);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->depthClampEnable, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->rasterizerDiscardEnable, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkPolygonMode*)&forMarshaling->polygonMode, sizeof(VkPolygonMode));
+    *ptr += sizeof(VkPolygonMode);
+    memcpy(*ptr, (VkCullModeFlags*)&forMarshaling->cullMode, sizeof(VkCullModeFlags));
+    *ptr += sizeof(VkCullModeFlags);
+    memcpy(*ptr, (VkFrontFace*)&forMarshaling->frontFace, sizeof(VkFrontFace));
+    *ptr += sizeof(VkFrontFace);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->depthBiasEnable, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (float*)&forMarshaling->depthBiasConstantFactor, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (float*)&forMarshaling->depthBiasClamp, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (float*)&forMarshaling->depthBiasSlopeFactor, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (float*)&forMarshaling->lineWidth, sizeof(float));
+    *ptr += sizeof(float);
+}
+
+void reservedmarshal_VkPipelineMultisampleStateCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineMultisampleStateCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkPipelineMultisampleStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineMultisampleStateCreateFlags));
+    *ptr += sizeof(VkPipelineMultisampleStateCreateFlags);
+    memcpy(*ptr, (VkSampleCountFlagBits*)&forMarshaling->rasterizationSamples, sizeof(VkSampleCountFlagBits));
+    *ptr += sizeof(VkSampleCountFlagBits);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->sampleShadingEnable, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (float*)&forMarshaling->minSampleShading, sizeof(float));
+    *ptr += sizeof(float);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_34 = (uint64_t)(uintptr_t)forMarshaling->pSampleMask;
+    memcpy((*ptr), &cgen_var_34, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pSampleMask)
+    {
+        memcpy(*ptr, (const VkSampleMask*)forMarshaling->pSampleMask, (((forMarshaling->rasterizationSamples) + 31) / 32) * sizeof(const VkSampleMask));
+        *ptr += (((forMarshaling->rasterizationSamples) + 31) / 32) * sizeof(const VkSampleMask);
+    }
+    memcpy(*ptr, (VkBool32*)&forMarshaling->alphaToCoverageEnable, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->alphaToOneEnable, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkStencilOpState(
+    VulkanStreamGuest* vkStream,
+    const VkStencilOpState* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStencilOp*)&forMarshaling->failOp, sizeof(VkStencilOp));
+    *ptr += sizeof(VkStencilOp);
+    memcpy(*ptr, (VkStencilOp*)&forMarshaling->passOp, sizeof(VkStencilOp));
+    *ptr += sizeof(VkStencilOp);
+    memcpy(*ptr, (VkStencilOp*)&forMarshaling->depthFailOp, sizeof(VkStencilOp));
+    *ptr += sizeof(VkStencilOp);
+    memcpy(*ptr, (VkCompareOp*)&forMarshaling->compareOp, sizeof(VkCompareOp));
+    *ptr += sizeof(VkCompareOp);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->compareMask, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->writeMask, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->reference, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkPipelineDepthStencilStateCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineDepthStencilStateCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkPipelineDepthStencilStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineDepthStencilStateCreateFlags));
+    *ptr += sizeof(VkPipelineDepthStencilStateCreateFlags);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->depthTestEnable, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->depthWriteEnable, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkCompareOp*)&forMarshaling->depthCompareOp, sizeof(VkCompareOp));
+    *ptr += sizeof(VkCompareOp);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->depthBoundsTestEnable, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->stencilTestEnable, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    reservedmarshal_VkStencilOpState(vkStream, (VkStencilOpState*)(&forMarshaling->front), ptr);
+    reservedmarshal_VkStencilOpState(vkStream, (VkStencilOpState*)(&forMarshaling->back), ptr);
+    memcpy(*ptr, (float*)&forMarshaling->minDepthBounds, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (float*)&forMarshaling->maxDepthBounds, sizeof(float));
+    *ptr += sizeof(float);
+}
+
+void reservedmarshal_VkPipelineColorBlendAttachmentState(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineColorBlendAttachmentState* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkBool32*)&forMarshaling->blendEnable, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBlendFactor*)&forMarshaling->srcColorBlendFactor, sizeof(VkBlendFactor));
+    *ptr += sizeof(VkBlendFactor);
+    memcpy(*ptr, (VkBlendFactor*)&forMarshaling->dstColorBlendFactor, sizeof(VkBlendFactor));
+    *ptr += sizeof(VkBlendFactor);
+    memcpy(*ptr, (VkBlendOp*)&forMarshaling->colorBlendOp, sizeof(VkBlendOp));
+    *ptr += sizeof(VkBlendOp);
+    memcpy(*ptr, (VkBlendFactor*)&forMarshaling->srcAlphaBlendFactor, sizeof(VkBlendFactor));
+    *ptr += sizeof(VkBlendFactor);
+    memcpy(*ptr, (VkBlendFactor*)&forMarshaling->dstAlphaBlendFactor, sizeof(VkBlendFactor));
+    *ptr += sizeof(VkBlendFactor);
+    memcpy(*ptr, (VkBlendOp*)&forMarshaling->alphaBlendOp, sizeof(VkBlendOp));
+    *ptr += sizeof(VkBlendOp);
+    memcpy(*ptr, (VkColorComponentFlags*)&forMarshaling->colorWriteMask, sizeof(VkColorComponentFlags));
+    *ptr += sizeof(VkColorComponentFlags);
+}
+
+void reservedmarshal_VkPipelineColorBlendStateCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineColorBlendStateCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkPipelineColorBlendStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineColorBlendStateCreateFlags));
+    *ptr += sizeof(VkPipelineColorBlendStateCreateFlags);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->logicOpEnable, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkLogicOp*)&forMarshaling->logicOp, sizeof(VkLogicOp));
+    *ptr += sizeof(VkLogicOp);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->attachmentCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->attachmentCount; ++i)
+    {
+        reservedmarshal_VkPipelineColorBlendAttachmentState(vkStream, (const VkPipelineColorBlendAttachmentState*)(forMarshaling->pAttachments + i), ptr);
+    }
+    memcpy(*ptr, (float*)forMarshaling->blendConstants, 4 * sizeof(float));
+    *ptr += 4 * sizeof(float);
+}
+
+void reservedmarshal_VkPipelineDynamicStateCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineDynamicStateCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkPipelineDynamicStateCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineDynamicStateCreateFlags));
+    *ptr += sizeof(VkPipelineDynamicStateCreateFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->dynamicStateCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (const VkDynamicState*)forMarshaling->pDynamicStates, forMarshaling->dynamicStateCount * sizeof(const VkDynamicState));
+    *ptr += forMarshaling->dynamicStateCount * sizeof(const VkDynamicState);
+}
+
+void reservedmarshal_VkGraphicsPipelineCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkGraphicsPipelineCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    uint32_t hasRasterization = 1;
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
+    {
+        hasRasterization = (((0 == forMarshaling->pRasterizationState)) ? (0) : (!((*(forMarshaling->pRasterizationState)).rasterizerDiscardEnable)));
+        uint32_t cgen_var_35 = (uint32_t)hasRasterization;
+        memcpy((*ptr), &cgen_var_35, 4);
+        android::base::Stream::toBe32((uint8_t*)(*ptr));
+        *ptr += 4;
+    }
+    uint32_t hasTessellation = 1;
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
+    {
+        hasTessellation = arrayany(forMarshaling->pStages, 0, forMarshaling->stageCount, [](VkPipelineShaderStageCreateInfo s) { return ((s.stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) || (s.stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT)); });
+        uint32_t cgen_var_36 = (uint32_t)hasTessellation;
+        memcpy((*ptr), &cgen_var_36, 4);
+        android::base::Stream::toBe32((uint8_t*)(*ptr));
+        *ptr += 4;
+    }
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkPipelineCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineCreateFlags));
+    *ptr += sizeof(VkPipelineCreateFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->stageCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->stageCount; ++i)
+    {
+        reservedmarshal_VkPipelineShaderStageCreateInfo(vkStream, (const VkPipelineShaderStageCreateInfo*)(forMarshaling->pStages + i), ptr);
+    }
+    // WARNING PTR CHECK
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
+    {
+        uint64_t cgen_var_37 = (uint64_t)(uintptr_t)forMarshaling->pVertexInputState;
+        memcpy((*ptr), &cgen_var_37, 8);
+        android::base::Stream::toBe64((uint8_t*)(*ptr));
+        *ptr += 8;
+    }
+    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || forMarshaling->pVertexInputState))
+    {
+        reservedmarshal_VkPipelineVertexInputStateCreateInfo(vkStream, (const VkPipelineVertexInputStateCreateInfo*)(forMarshaling->pVertexInputState), ptr);
+    }
+    // WARNING PTR CHECK
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
+    {
+        uint64_t cgen_var_38 = (uint64_t)(uintptr_t)forMarshaling->pInputAssemblyState;
+        memcpy((*ptr), &cgen_var_38, 8);
+        android::base::Stream::toBe64((uint8_t*)(*ptr));
+        *ptr += 8;
+    }
+    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || forMarshaling->pInputAssemblyState))
+    {
+        reservedmarshal_VkPipelineInputAssemblyStateCreateInfo(vkStream, (const VkPipelineInputAssemblyStateCreateInfo*)(forMarshaling->pInputAssemblyState), ptr);
+    }
+    // WARNING PTR CHECK
+    uint64_t cgen_var_39 = (uint64_t)(uintptr_t)forMarshaling->pTessellationState;
+    memcpy((*ptr), &cgen_var_39, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pTessellationState)
+    {
+        if (hasTessellation)
+        {
+            reservedmarshal_VkPipelineTessellationStateCreateInfo(vkStream, (const VkPipelineTessellationStateCreateInfo*)(forMarshaling->pTessellationState), ptr);
+        }
+    }
+    // WARNING PTR CHECK
+    uint64_t cgen_var_40 = (uint64_t)(uintptr_t)forMarshaling->pViewportState;
+    memcpy((*ptr), &cgen_var_40, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pViewportState)
+    {
+        if (hasRasterization)
+        {
+            reservedmarshal_VkPipelineViewportStateCreateInfo(vkStream, (const VkPipelineViewportStateCreateInfo*)(forMarshaling->pViewportState), ptr);
+        }
+    }
+    // WARNING PTR CHECK
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT)
+    {
+        uint64_t cgen_var_41 = (uint64_t)(uintptr_t)forMarshaling->pRasterizationState;
+        memcpy((*ptr), &cgen_var_41, 8);
+        android::base::Stream::toBe64((uint8_t*)(*ptr));
+        *ptr += 8;
+    }
+    if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || forMarshaling->pRasterizationState))
+    {
+        reservedmarshal_VkPipelineRasterizationStateCreateInfo(vkStream, (const VkPipelineRasterizationStateCreateInfo*)(forMarshaling->pRasterizationState), ptr);
+    }
+    // WARNING PTR CHECK
+    uint64_t cgen_var_42 = (uint64_t)(uintptr_t)forMarshaling->pMultisampleState;
+    memcpy((*ptr), &cgen_var_42, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pMultisampleState)
+    {
+        if (hasRasterization)
+        {
+            reservedmarshal_VkPipelineMultisampleStateCreateInfo(vkStream, (const VkPipelineMultisampleStateCreateInfo*)(forMarshaling->pMultisampleState), ptr);
+        }
+    }
+    // WARNING PTR CHECK
+    uint64_t cgen_var_43 = (uint64_t)(uintptr_t)forMarshaling->pDepthStencilState;
+    memcpy((*ptr), &cgen_var_43, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pDepthStencilState)
+    {
+        if (hasRasterization)
+        {
+            reservedmarshal_VkPipelineDepthStencilStateCreateInfo(vkStream, (const VkPipelineDepthStencilStateCreateInfo*)(forMarshaling->pDepthStencilState), ptr);
+        }
+    }
+    // WARNING PTR CHECK
+    uint64_t cgen_var_44 = (uint64_t)(uintptr_t)forMarshaling->pColorBlendState;
+    memcpy((*ptr), &cgen_var_44, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pColorBlendState)
+    {
+        if (hasRasterization)
+        {
+            reservedmarshal_VkPipelineColorBlendStateCreateInfo(vkStream, (const VkPipelineColorBlendStateCreateInfo*)(forMarshaling->pColorBlendState), ptr);
+        }
+    }
+    // WARNING PTR CHECK
+    uint64_t cgen_var_45 = (uint64_t)(uintptr_t)forMarshaling->pDynamicState;
+    memcpy((*ptr), &cgen_var_45, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pDynamicState)
+    {
+        reservedmarshal_VkPipelineDynamicStateCreateInfo(vkStream, (const VkPipelineDynamicStateCreateInfo*)(forMarshaling->pDynamicState), ptr);
+    }
+    uint64_t cgen_var_46;
+    *&cgen_var_46 = get_host_u64_VkPipelineLayout((*&forMarshaling->layout));
+    memcpy(*ptr, (uint64_t*)&cgen_var_46, 1 * 8);
+    *ptr += 1 * 8;
+    uint64_t cgen_var_47;
+    *&cgen_var_47 = get_host_u64_VkRenderPass((*&forMarshaling->renderPass));
+    memcpy(*ptr, (uint64_t*)&cgen_var_47, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->subpass, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    uint64_t cgen_var_48;
+    *&cgen_var_48 = get_host_u64_VkPipeline((*&forMarshaling->basePipelineHandle));
+    memcpy(*ptr, (uint64_t*)&cgen_var_48, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (int32_t*)&forMarshaling->basePipelineIndex, sizeof(int32_t));
+    *ptr += sizeof(int32_t);
+}
+
+void reservedmarshal_VkComputePipelineCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkComputePipelineCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkPipelineCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineCreateFlags));
+    *ptr += sizeof(VkPipelineCreateFlags);
+    reservedmarshal_VkPipelineShaderStageCreateInfo(vkStream, (VkPipelineShaderStageCreateInfo*)(&forMarshaling->stage), ptr);
+    uint64_t cgen_var_49;
+    *&cgen_var_49 = get_host_u64_VkPipelineLayout((*&forMarshaling->layout));
+    memcpy(*ptr, (uint64_t*)&cgen_var_49, 1 * 8);
+    *ptr += 1 * 8;
+    uint64_t cgen_var_50;
+    *&cgen_var_50 = get_host_u64_VkPipeline((*&forMarshaling->basePipelineHandle));
+    memcpy(*ptr, (uint64_t*)&cgen_var_50, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (int32_t*)&forMarshaling->basePipelineIndex, sizeof(int32_t));
+    *ptr += sizeof(int32_t);
+}
+
+void reservedmarshal_VkPushConstantRange(
+    VulkanStreamGuest* vkStream,
+    const VkPushConstantRange* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkShaderStageFlags*)&forMarshaling->stageFlags, sizeof(VkShaderStageFlags));
+    *ptr += sizeof(VkShaderStageFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->offset, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->size, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkPipelineLayoutCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineLayoutCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkPipelineLayoutCreateFlags*)&forMarshaling->flags, sizeof(VkPipelineLayoutCreateFlags));
+    *ptr += sizeof(VkPipelineLayoutCreateFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->setLayoutCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    if (forMarshaling->setLayoutCount)
+    {
+        uint64_t* cgen_var_51;
+        vkStream->alloc((void**)&cgen_var_51, forMarshaling->setLayoutCount * 8);
+        for (uint32_t k = 0; k < forMarshaling->setLayoutCount; ++k)
+        {
+            cgen_var_51[k] = get_host_u64_VkDescriptorSetLayout(forMarshaling->pSetLayouts[k]);
+        }
+        memcpy(*ptr, (uint64_t*)cgen_var_51, forMarshaling->setLayoutCount * 8);
+        *ptr += forMarshaling->setLayoutCount * 8;
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->pushConstantRangeCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->pushConstantRangeCount; ++i)
+    {
+        reservedmarshal_VkPushConstantRange(vkStream, (const VkPushConstantRange*)(forMarshaling->pPushConstantRanges + i), ptr);
+    }
+}
+
+void reservedmarshal_VkSamplerCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkSamplerCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkSamplerCreateFlags*)&forMarshaling->flags, sizeof(VkSamplerCreateFlags));
+    *ptr += sizeof(VkSamplerCreateFlags);
+    memcpy(*ptr, (VkFilter*)&forMarshaling->magFilter, sizeof(VkFilter));
+    *ptr += sizeof(VkFilter);
+    memcpy(*ptr, (VkFilter*)&forMarshaling->minFilter, sizeof(VkFilter));
+    *ptr += sizeof(VkFilter);
+    memcpy(*ptr, (VkSamplerMipmapMode*)&forMarshaling->mipmapMode, sizeof(VkSamplerMipmapMode));
+    *ptr += sizeof(VkSamplerMipmapMode);
+    memcpy(*ptr, (VkSamplerAddressMode*)&forMarshaling->addressModeU, sizeof(VkSamplerAddressMode));
+    *ptr += sizeof(VkSamplerAddressMode);
+    memcpy(*ptr, (VkSamplerAddressMode*)&forMarshaling->addressModeV, sizeof(VkSamplerAddressMode));
+    *ptr += sizeof(VkSamplerAddressMode);
+    memcpy(*ptr, (VkSamplerAddressMode*)&forMarshaling->addressModeW, sizeof(VkSamplerAddressMode));
+    *ptr += sizeof(VkSamplerAddressMode);
+    memcpy(*ptr, (float*)&forMarshaling->mipLodBias, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->anisotropyEnable, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (float*)&forMarshaling->maxAnisotropy, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->compareEnable, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkCompareOp*)&forMarshaling->compareOp, sizeof(VkCompareOp));
+    *ptr += sizeof(VkCompareOp);
+    memcpy(*ptr, (float*)&forMarshaling->minLod, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (float*)&forMarshaling->maxLod, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (VkBorderColor*)&forMarshaling->borderColor, sizeof(VkBorderColor));
+    *ptr += sizeof(VkBorderColor);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->unnormalizedCoordinates, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkDescriptorSetLayoutBinding(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorSetLayoutBinding* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->binding, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkDescriptorType*)&forMarshaling->descriptorType, sizeof(VkDescriptorType));
+    *ptr += sizeof(VkDescriptorType);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->descriptorCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkShaderStageFlags*)&forMarshaling->stageFlags, sizeof(VkShaderStageFlags));
+    *ptr += sizeof(VkShaderStageFlags);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_52 = (uint64_t)(uintptr_t)forMarshaling->pImmutableSamplers;
+    memcpy((*ptr), &cgen_var_52, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pImmutableSamplers)
+    {
+        if (forMarshaling->descriptorCount)
+        {
+            uint64_t* cgen_var_53;
+            vkStream->alloc((void**)&cgen_var_53, forMarshaling->descriptorCount * 8);
+            for (uint32_t k = 0; k < forMarshaling->descriptorCount; ++k)
+            {
+                cgen_var_53[k] = get_host_u64_VkSampler(forMarshaling->pImmutableSamplers[k]);
+            }
+            memcpy(*ptr, (uint64_t*)cgen_var_53, forMarshaling->descriptorCount * 8);
+            *ptr += forMarshaling->descriptorCount * 8;
+        }
+    }
+}
+
+void reservedmarshal_VkDescriptorSetLayoutCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorSetLayoutCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkDescriptorSetLayoutCreateFlags*)&forMarshaling->flags, sizeof(VkDescriptorSetLayoutCreateFlags));
+    *ptr += sizeof(VkDescriptorSetLayoutCreateFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->bindingCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->bindingCount; ++i)
+    {
+        reservedmarshal_VkDescriptorSetLayoutBinding(vkStream, (const VkDescriptorSetLayoutBinding*)(forMarshaling->pBindings + i), ptr);
+    }
+}
+
+void reservedmarshal_VkDescriptorPoolSize(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorPoolSize* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkDescriptorType*)&forMarshaling->type, sizeof(VkDescriptorType));
+    *ptr += sizeof(VkDescriptorType);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->descriptorCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkDescriptorPoolCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorPoolCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkDescriptorPoolCreateFlags*)&forMarshaling->flags, sizeof(VkDescriptorPoolCreateFlags));
+    *ptr += sizeof(VkDescriptorPoolCreateFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxSets, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->poolSizeCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->poolSizeCount; ++i)
+    {
+        reservedmarshal_VkDescriptorPoolSize(vkStream, (const VkDescriptorPoolSize*)(forMarshaling->pPoolSizes + i), ptr);
+    }
+}
+
+void reservedmarshal_VkDescriptorSetAllocateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorSetAllocateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_54;
+    *&cgen_var_54 = get_host_u64_VkDescriptorPool((*&forMarshaling->descriptorPool));
+    memcpy(*ptr, (uint64_t*)&cgen_var_54, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->descriptorSetCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    if (forMarshaling->descriptorSetCount)
+    {
+        uint64_t* cgen_var_55;
+        vkStream->alloc((void**)&cgen_var_55, forMarshaling->descriptorSetCount * 8);
+        for (uint32_t k = 0; k < forMarshaling->descriptorSetCount; ++k)
+        {
+            cgen_var_55[k] = get_host_u64_VkDescriptorSetLayout(forMarshaling->pSetLayouts[k]);
+        }
+        memcpy(*ptr, (uint64_t*)cgen_var_55, forMarshaling->descriptorSetCount * 8);
+        *ptr += forMarshaling->descriptorSetCount * 8;
+    }
+}
+
+void reservedmarshal_VkDescriptorImageInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorImageInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    uint64_t cgen_var_56;
+    *&cgen_var_56 = get_host_u64_VkSampler((*&forMarshaling->sampler));
+    memcpy(*ptr, (uint64_t*)&cgen_var_56, 1 * 8);
+    *ptr += 1 * 8;
+    uint64_t cgen_var_57;
+    *&cgen_var_57 = get_host_u64_VkImageView((*&forMarshaling->imageView));
+    memcpy(*ptr, (uint64_t*)&cgen_var_57, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkImageLayout*)&forMarshaling->imageLayout, sizeof(VkImageLayout));
+    *ptr += sizeof(VkImageLayout);
+}
+
+void reservedmarshal_VkDescriptorBufferInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorBufferInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    uint64_t cgen_var_58;
+    *&cgen_var_58 = get_host_u64_VkBuffer((*&forMarshaling->buffer));
+    memcpy(*ptr, (uint64_t*)&cgen_var_58, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->offset, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->range, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+}
+
+void reservedmarshal_VkWriteDescriptorSet(
+    VulkanStreamGuest* vkStream,
+    const VkWriteDescriptorSet* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_59;
+    *&cgen_var_59 = get_host_u64_VkDescriptorSet((*&forMarshaling->dstSet));
+    memcpy(*ptr, (uint64_t*)&cgen_var_59, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->dstBinding, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->dstArrayElement, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->descriptorCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkDescriptorType*)&forMarshaling->descriptorType, sizeof(VkDescriptorType));
+    *ptr += sizeof(VkDescriptorType);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_60 = (uint64_t)(uintptr_t)forMarshaling->pImageInfo;
+    memcpy((*ptr), &cgen_var_60, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pImageInfo)
+    {
+        if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || ((VK_DESCRIPTOR_TYPE_SAMPLER == forMarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER == forMarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE == forMarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_STORAGE_IMAGE == forMarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT == forMarshaling->descriptorType))))
+        {
+            for (uint32_t i = 0; i < (uint32_t)forMarshaling->descriptorCount; ++i)
+            {
+                reservedmarshal_VkDescriptorImageInfo(vkStream, (const VkDescriptorImageInfo*)(forMarshaling->pImageInfo + i), ptr);
+            }
+        }
+    }
+    // WARNING PTR CHECK
+    uint64_t cgen_var_61 = (uint64_t)(uintptr_t)forMarshaling->pBufferInfo;
+    memcpy((*ptr), &cgen_var_61, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pBufferInfo)
+    {
+        if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || ((VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER == forMarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC == forMarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_STORAGE_BUFFER == forMarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC == forMarshaling->descriptorType))))
+        {
+            for (uint32_t i = 0; i < (uint32_t)forMarshaling->descriptorCount; ++i)
+            {
+                reservedmarshal_VkDescriptorBufferInfo(vkStream, (const VkDescriptorBufferInfo*)(forMarshaling->pBufferInfo + i), ptr);
+            }
+        }
+    }
+    // WARNING PTR CHECK
+    uint64_t cgen_var_62 = (uint64_t)(uintptr_t)forMarshaling->pTexelBufferView;
+    memcpy((*ptr), &cgen_var_62, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pTexelBufferView)
+    {
+        if ((!(vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT) || ((VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER == forMarshaling->descriptorType) || (VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER == forMarshaling->descriptorType))))
+        {
+            if (forMarshaling->descriptorCount)
+            {
+                uint64_t* cgen_var_63;
+                vkStream->alloc((void**)&cgen_var_63, forMarshaling->descriptorCount * 8);
+                for (uint32_t k = 0; k < forMarshaling->descriptorCount; ++k)
+                {
+                    cgen_var_63[k] = get_host_u64_VkBufferView(forMarshaling->pTexelBufferView[k]);
+                }
+                memcpy(*ptr, (uint64_t*)cgen_var_63, forMarshaling->descriptorCount * 8);
+                *ptr += forMarshaling->descriptorCount * 8;
+            }
+        }
+    }
+}
+
+void reservedmarshal_VkCopyDescriptorSet(
+    VulkanStreamGuest* vkStream,
+    const VkCopyDescriptorSet* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_64;
+    *&cgen_var_64 = get_host_u64_VkDescriptorSet((*&forMarshaling->srcSet));
+    memcpy(*ptr, (uint64_t*)&cgen_var_64, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->srcBinding, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->srcArrayElement, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    uint64_t cgen_var_65;
+    *&cgen_var_65 = get_host_u64_VkDescriptorSet((*&forMarshaling->dstSet));
+    memcpy(*ptr, (uint64_t*)&cgen_var_65, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->dstBinding, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->dstArrayElement, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->descriptorCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkFramebufferCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkFramebufferCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkFramebufferCreateFlags*)&forMarshaling->flags, sizeof(VkFramebufferCreateFlags));
+    *ptr += sizeof(VkFramebufferCreateFlags);
+    uint64_t cgen_var_66;
+    *&cgen_var_66 = get_host_u64_VkRenderPass((*&forMarshaling->renderPass));
+    memcpy(*ptr, (uint64_t*)&cgen_var_66, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->attachmentCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    if (forMarshaling->attachmentCount)
+    {
+        uint64_t* cgen_var_67;
+        vkStream->alloc((void**)&cgen_var_67, forMarshaling->attachmentCount * 8);
+        for (uint32_t k = 0; k < forMarshaling->attachmentCount; ++k)
+        {
+            cgen_var_67[k] = get_host_u64_VkImageView(forMarshaling->pAttachments[k]);
+        }
+        memcpy(*ptr, (uint64_t*)cgen_var_67, forMarshaling->attachmentCount * 8);
+        *ptr += forMarshaling->attachmentCount * 8;
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->width, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->height, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->layers, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkAttachmentDescription(
+    VulkanStreamGuest* vkStream,
+    const VkAttachmentDescription* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkAttachmentDescriptionFlags*)&forMarshaling->flags, sizeof(VkAttachmentDescriptionFlags));
+    *ptr += sizeof(VkAttachmentDescriptionFlags);
+    memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
+    *ptr += sizeof(VkFormat);
+    memcpy(*ptr, (VkSampleCountFlagBits*)&forMarshaling->samples, sizeof(VkSampleCountFlagBits));
+    *ptr += sizeof(VkSampleCountFlagBits);
+    memcpy(*ptr, (VkAttachmentLoadOp*)&forMarshaling->loadOp, sizeof(VkAttachmentLoadOp));
+    *ptr += sizeof(VkAttachmentLoadOp);
+    memcpy(*ptr, (VkAttachmentStoreOp*)&forMarshaling->storeOp, sizeof(VkAttachmentStoreOp));
+    *ptr += sizeof(VkAttachmentStoreOp);
+    memcpy(*ptr, (VkAttachmentLoadOp*)&forMarshaling->stencilLoadOp, sizeof(VkAttachmentLoadOp));
+    *ptr += sizeof(VkAttachmentLoadOp);
+    memcpy(*ptr, (VkAttachmentStoreOp*)&forMarshaling->stencilStoreOp, sizeof(VkAttachmentStoreOp));
+    *ptr += sizeof(VkAttachmentStoreOp);
+    memcpy(*ptr, (VkImageLayout*)&forMarshaling->initialLayout, sizeof(VkImageLayout));
+    *ptr += sizeof(VkImageLayout);
+    memcpy(*ptr, (VkImageLayout*)&forMarshaling->finalLayout, sizeof(VkImageLayout));
+    *ptr += sizeof(VkImageLayout);
+}
+
+void reservedmarshal_VkAttachmentReference(
+    VulkanStreamGuest* vkStream,
+    const VkAttachmentReference* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->attachment, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkImageLayout*)&forMarshaling->layout, sizeof(VkImageLayout));
+    *ptr += sizeof(VkImageLayout);
+}
+
+void reservedmarshal_VkSubpassDescription(
+    VulkanStreamGuest* vkStream,
+    const VkSubpassDescription* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkSubpassDescriptionFlags*)&forMarshaling->flags, sizeof(VkSubpassDescriptionFlags));
+    *ptr += sizeof(VkSubpassDescriptionFlags);
+    memcpy(*ptr, (VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
+    *ptr += sizeof(VkPipelineBindPoint);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->inputAttachmentCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->inputAttachmentCount; ++i)
+    {
+        reservedmarshal_VkAttachmentReference(vkStream, (const VkAttachmentReference*)(forMarshaling->pInputAttachments + i), ptr);
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->colorAttachmentCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->colorAttachmentCount; ++i)
+    {
+        reservedmarshal_VkAttachmentReference(vkStream, (const VkAttachmentReference*)(forMarshaling->pColorAttachments + i), ptr);
+    }
+    // WARNING PTR CHECK
+    uint64_t cgen_var_68 = (uint64_t)(uintptr_t)forMarshaling->pResolveAttachments;
+    memcpy((*ptr), &cgen_var_68, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pResolveAttachments)
+    {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->colorAttachmentCount; ++i)
+        {
+            reservedmarshal_VkAttachmentReference(vkStream, (const VkAttachmentReference*)(forMarshaling->pResolveAttachments + i), ptr);
+        }
+    }
+    // WARNING PTR CHECK
+    uint64_t cgen_var_69 = (uint64_t)(uintptr_t)forMarshaling->pDepthStencilAttachment;
+    memcpy((*ptr), &cgen_var_69, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pDepthStencilAttachment)
+    {
+        reservedmarshal_VkAttachmentReference(vkStream, (const VkAttachmentReference*)(forMarshaling->pDepthStencilAttachment), ptr);
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->preserveAttachmentCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (const uint32_t*)forMarshaling->pPreserveAttachments, forMarshaling->preserveAttachmentCount * sizeof(const uint32_t));
+    *ptr += forMarshaling->preserveAttachmentCount * sizeof(const uint32_t);
+}
+
+void reservedmarshal_VkSubpassDependency(
+    VulkanStreamGuest* vkStream,
+    const VkSubpassDependency* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->srcSubpass, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->dstSubpass, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkPipelineStageFlags*)&forMarshaling->srcStageMask, sizeof(VkPipelineStageFlags));
+    *ptr += sizeof(VkPipelineStageFlags);
+    memcpy(*ptr, (VkPipelineStageFlags*)&forMarshaling->dstStageMask, sizeof(VkPipelineStageFlags));
+    *ptr += sizeof(VkPipelineStageFlags);
+    memcpy(*ptr, (VkAccessFlags*)&forMarshaling->srcAccessMask, sizeof(VkAccessFlags));
+    *ptr += sizeof(VkAccessFlags);
+    memcpy(*ptr, (VkAccessFlags*)&forMarshaling->dstAccessMask, sizeof(VkAccessFlags));
+    *ptr += sizeof(VkAccessFlags);
+    memcpy(*ptr, (VkDependencyFlags*)&forMarshaling->dependencyFlags, sizeof(VkDependencyFlags));
+    *ptr += sizeof(VkDependencyFlags);
+}
+
+void reservedmarshal_VkRenderPassCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkRenderPassCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkRenderPassCreateFlags*)&forMarshaling->flags, sizeof(VkRenderPassCreateFlags));
+    *ptr += sizeof(VkRenderPassCreateFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->attachmentCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->attachmentCount; ++i)
+    {
+        reservedmarshal_VkAttachmentDescription(vkStream, (const VkAttachmentDescription*)(forMarshaling->pAttachments + i), ptr);
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->subpassCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->subpassCount; ++i)
+    {
+        reservedmarshal_VkSubpassDescription(vkStream, (const VkSubpassDescription*)(forMarshaling->pSubpasses + i), ptr);
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->dependencyCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->dependencyCount; ++i)
+    {
+        reservedmarshal_VkSubpassDependency(vkStream, (const VkSubpassDependency*)(forMarshaling->pDependencies + i), ptr);
+    }
+}
+
+void reservedmarshal_VkCommandPoolCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkCommandPoolCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkCommandPoolCreateFlags*)&forMarshaling->flags, sizeof(VkCommandPoolCreateFlags));
+    *ptr += sizeof(VkCommandPoolCreateFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->queueFamilyIndex, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkCommandBufferAllocateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkCommandBufferAllocateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_70;
+    *&cgen_var_70 = get_host_u64_VkCommandPool((*&forMarshaling->commandPool));
+    memcpy(*ptr, (uint64_t*)&cgen_var_70, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkCommandBufferLevel*)&forMarshaling->level, sizeof(VkCommandBufferLevel));
+    *ptr += sizeof(VkCommandBufferLevel);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->commandBufferCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkCommandBufferInheritanceInfo(
+    VulkanStreamGuest* vkStream,
+    const VkCommandBufferInheritanceInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_71;
+    *&cgen_var_71 = get_host_u64_VkRenderPass((*&forMarshaling->renderPass));
+    memcpy(*ptr, (uint64_t*)&cgen_var_71, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->subpass, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    uint64_t cgen_var_72;
+    *&cgen_var_72 = get_host_u64_VkFramebuffer((*&forMarshaling->framebuffer));
+    memcpy(*ptr, (uint64_t*)&cgen_var_72, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkBool32*)&forMarshaling->occlusionQueryEnable, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkQueryControlFlags*)&forMarshaling->queryFlags, sizeof(VkQueryControlFlags));
+    *ptr += sizeof(VkQueryControlFlags);
+    memcpy(*ptr, (VkQueryPipelineStatisticFlags*)&forMarshaling->pipelineStatistics, sizeof(VkQueryPipelineStatisticFlags));
+    *ptr += sizeof(VkQueryPipelineStatisticFlags);
+}
+
+void reservedmarshal_VkCommandBufferBeginInfo(
+    VulkanStreamGuest* vkStream,
+    const VkCommandBufferBeginInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkCommandBufferUsageFlags*)&forMarshaling->flags, sizeof(VkCommandBufferUsageFlags));
+    *ptr += sizeof(VkCommandBufferUsageFlags);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_73 = (uint64_t)(uintptr_t)forMarshaling->pInheritanceInfo;
+    memcpy((*ptr), &cgen_var_73, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pInheritanceInfo)
+    {
+        reservedmarshal_VkCommandBufferInheritanceInfo(vkStream, (const VkCommandBufferInheritanceInfo*)(forMarshaling->pInheritanceInfo), ptr);
+    }
+}
+
+void reservedmarshal_VkBufferCopy(
+    VulkanStreamGuest* vkStream,
+    const VkBufferCopy* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->srcOffset, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->dstOffset, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+}
+
+void reservedmarshal_VkImageSubresourceLayers(
+    VulkanStreamGuest* vkStream,
+    const VkImageSubresourceLayers* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkImageAspectFlags*)&forMarshaling->aspectMask, sizeof(VkImageAspectFlags));
+    *ptr += sizeof(VkImageAspectFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->mipLevel, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->baseArrayLayer, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->layerCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkImageCopy(
+    VulkanStreamGuest* vkStream,
+    const VkImageCopy* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    reservedmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource), ptr);
+    reservedmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->srcOffset), ptr);
+    reservedmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource), ptr);
+    reservedmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->dstOffset), ptr);
+    reservedmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->extent), ptr);
+}
+
+void reservedmarshal_VkImageBlit(
+    VulkanStreamGuest* vkStream,
+    const VkImageBlit* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    reservedmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource), ptr);
+    for (uint32_t i = 0; i < (uint32_t)2; ++i)
+    {
+        reservedmarshal_VkOffset3D(vkStream, (VkOffset3D*)(forMarshaling->srcOffsets + i), ptr);
+    }
+    reservedmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource), ptr);
+    for (uint32_t i = 0; i < (uint32_t)2; ++i)
+    {
+        reservedmarshal_VkOffset3D(vkStream, (VkOffset3D*)(forMarshaling->dstOffsets + i), ptr);
+    }
+}
+
+void reservedmarshal_VkBufferImageCopy(
+    VulkanStreamGuest* vkStream,
+    const VkBufferImageCopy* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->bufferOffset, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->bufferRowLength, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->bufferImageHeight, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    reservedmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->imageSubresource), ptr);
+    reservedmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->imageOffset), ptr);
+    reservedmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->imageExtent), ptr);
+}
+
+void reservedmarshal_VkClearColorValue(
+    VulkanStreamGuest* vkStream,
+    const VkClearColorValue* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (float*)forMarshaling->float32, 4 * sizeof(float));
+    *ptr += 4 * sizeof(float);
+}
+
+void reservedmarshal_VkClearDepthStencilValue(
+    VulkanStreamGuest* vkStream,
+    const VkClearDepthStencilValue* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (float*)&forMarshaling->depth, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->stencil, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkClearValue(
+    VulkanStreamGuest* vkStream,
+    const VkClearValue* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    reservedmarshal_VkClearColorValue(vkStream, (VkClearColorValue*)(&forMarshaling->color), ptr);
+}
+
+void reservedmarshal_VkClearAttachment(
+    VulkanStreamGuest* vkStream,
+    const VkClearAttachment* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkImageAspectFlags*)&forMarshaling->aspectMask, sizeof(VkImageAspectFlags));
+    *ptr += sizeof(VkImageAspectFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->colorAttachment, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    reservedmarshal_VkClearValue(vkStream, (VkClearValue*)(&forMarshaling->clearValue), ptr);
+}
+
+void reservedmarshal_VkClearRect(
+    VulkanStreamGuest* vkStream,
+    const VkClearRect* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    reservedmarshal_VkRect2D(vkStream, (VkRect2D*)(&forMarshaling->rect), ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->baseArrayLayer, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->layerCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkImageResolve(
+    VulkanStreamGuest* vkStream,
+    const VkImageResolve* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    reservedmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->srcSubresource), ptr);
+    reservedmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->srcOffset), ptr);
+    reservedmarshal_VkImageSubresourceLayers(vkStream, (VkImageSubresourceLayers*)(&forMarshaling->dstSubresource), ptr);
+    reservedmarshal_VkOffset3D(vkStream, (VkOffset3D*)(&forMarshaling->dstOffset), ptr);
+    reservedmarshal_VkExtent3D(vkStream, (VkExtent3D*)(&forMarshaling->extent), ptr);
+}
+
+void reservedmarshal_VkMemoryBarrier(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryBarrier* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkAccessFlags*)&forMarshaling->srcAccessMask, sizeof(VkAccessFlags));
+    *ptr += sizeof(VkAccessFlags);
+    memcpy(*ptr, (VkAccessFlags*)&forMarshaling->dstAccessMask, sizeof(VkAccessFlags));
+    *ptr += sizeof(VkAccessFlags);
+}
+
+void reservedmarshal_VkBufferMemoryBarrier(
+    VulkanStreamGuest* vkStream,
+    const VkBufferMemoryBarrier* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkAccessFlags*)&forMarshaling->srcAccessMask, sizeof(VkAccessFlags));
+    *ptr += sizeof(VkAccessFlags);
+    memcpy(*ptr, (VkAccessFlags*)&forMarshaling->dstAccessMask, sizeof(VkAccessFlags));
+    *ptr += sizeof(VkAccessFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->srcQueueFamilyIndex, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->dstQueueFamilyIndex, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    uint64_t cgen_var_74;
+    *&cgen_var_74 = get_host_u64_VkBuffer((*&forMarshaling->buffer));
+    memcpy(*ptr, (uint64_t*)&cgen_var_74, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->offset, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+}
+
+void reservedmarshal_VkImageMemoryBarrier(
+    VulkanStreamGuest* vkStream,
+    const VkImageMemoryBarrier* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkAccessFlags*)&forMarshaling->srcAccessMask, sizeof(VkAccessFlags));
+    *ptr += sizeof(VkAccessFlags);
+    memcpy(*ptr, (VkAccessFlags*)&forMarshaling->dstAccessMask, sizeof(VkAccessFlags));
+    *ptr += sizeof(VkAccessFlags);
+    memcpy(*ptr, (VkImageLayout*)&forMarshaling->oldLayout, sizeof(VkImageLayout));
+    *ptr += sizeof(VkImageLayout);
+    memcpy(*ptr, (VkImageLayout*)&forMarshaling->newLayout, sizeof(VkImageLayout));
+    *ptr += sizeof(VkImageLayout);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->srcQueueFamilyIndex, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->dstQueueFamilyIndex, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    uint64_t cgen_var_75;
+    *&cgen_var_75 = get_host_u64_VkImage((*&forMarshaling->image));
+    memcpy(*ptr, (uint64_t*)&cgen_var_75, 1 * 8);
+    *ptr += 1 * 8;
+    reservedmarshal_VkImageSubresourceRange(vkStream, (VkImageSubresourceRange*)(&forMarshaling->subresourceRange), ptr);
+}
+
+void reservedmarshal_VkRenderPassBeginInfo(
+    VulkanStreamGuest* vkStream,
+    const VkRenderPassBeginInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_76;
+    *&cgen_var_76 = get_host_u64_VkRenderPass((*&forMarshaling->renderPass));
+    memcpy(*ptr, (uint64_t*)&cgen_var_76, 1 * 8);
+    *ptr += 1 * 8;
+    uint64_t cgen_var_77;
+    *&cgen_var_77 = get_host_u64_VkFramebuffer((*&forMarshaling->framebuffer));
+    memcpy(*ptr, (uint64_t*)&cgen_var_77, 1 * 8);
+    *ptr += 1 * 8;
+    reservedmarshal_VkRect2D(vkStream, (VkRect2D*)(&forMarshaling->renderArea), ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->clearValueCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_78 = (uint64_t)(uintptr_t)forMarshaling->pClearValues;
+    memcpy((*ptr), &cgen_var_78, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pClearValues)
+    {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->clearValueCount; ++i)
+        {
+            reservedmarshal_VkClearValue(vkStream, (const VkClearValue*)(forMarshaling->pClearValues + i), ptr);
+        }
+    }
+}
+
+void reservedmarshal_VkDispatchIndirectCommand(
+    VulkanStreamGuest* vkStream,
+    const VkDispatchIndirectCommand* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->x, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->y, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->z, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkDrawIndexedIndirectCommand(
+    VulkanStreamGuest* vkStream,
+    const VkDrawIndexedIndirectCommand* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->indexCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->instanceCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->firstIndex, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (int32_t*)&forMarshaling->vertexOffset, sizeof(int32_t));
+    *ptr += sizeof(int32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->firstInstance, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkDrawIndirectCommand(
+    VulkanStreamGuest* vkStream,
+    const VkDrawIndirectCommand* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->vertexCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->instanceCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->firstVertex, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->firstInstance, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkBaseOutStructure(
+    VulkanStreamGuest* vkStream,
+    const VkBaseOutStructure* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+}
+
+void reservedmarshal_VkBaseInStructure(
+    VulkanStreamGuest* vkStream,
+    const VkBaseInStructure* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+}
+
+#endif
+#ifdef VK_VERSION_1_1
+void reservedmarshal_VkPhysicalDeviceSubgroupProperties(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceSubgroupProperties* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->subgroupSize, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkShaderStageFlags*)&forMarshaling->supportedStages, sizeof(VkShaderStageFlags));
+    *ptr += sizeof(VkShaderStageFlags);
+    memcpy(*ptr, (VkSubgroupFeatureFlags*)&forMarshaling->supportedOperations, sizeof(VkSubgroupFeatureFlags));
+    *ptr += sizeof(VkSubgroupFeatureFlags);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->quadOperationsInAllStages, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkBindBufferMemoryInfo(
+    VulkanStreamGuest* vkStream,
+    const VkBindBufferMemoryInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_79;
+    *&cgen_var_79 = get_host_u64_VkBuffer((*&forMarshaling->buffer));
+    memcpy(*ptr, (uint64_t*)&cgen_var_79, 1 * 8);
+    *ptr += 1 * 8;
+    uint64_t cgen_var_80;
+    *&cgen_var_80 = get_host_u64_VkDeviceMemory((*&forMarshaling->memory));
+    memcpy(*ptr, (uint64_t*)&cgen_var_80, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->memoryOffset, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+}
+
+void reservedmarshal_VkBindImageMemoryInfo(
+    VulkanStreamGuest* vkStream,
+    const VkBindImageMemoryInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_81;
+    *&cgen_var_81 = get_host_u64_VkImage((*&forMarshaling->image));
+    memcpy(*ptr, (uint64_t*)&cgen_var_81, 1 * 8);
+    *ptr += 1 * 8;
+    uint64_t cgen_var_82;
+    *&cgen_var_82 = get_host_u64_VkDeviceMemory((*&forMarshaling->memory));
+    memcpy(*ptr, (uint64_t*)&cgen_var_82, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->memoryOffset, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+}
+
+void reservedmarshal_VkPhysicalDevice16BitStorageFeatures(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDevice16BitStorageFeatures* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->storageBuffer16BitAccess, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->uniformAndStorageBuffer16BitAccess, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->storagePushConstant16, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->storageInputOutput16, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkMemoryDedicatedRequirements(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryDedicatedRequirements* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->prefersDedicatedAllocation, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->requiresDedicatedAllocation, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkMemoryDedicatedAllocateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryDedicatedAllocateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_83;
+    *&cgen_var_83 = get_host_u64_VkImage((*&forMarshaling->image));
+    memcpy(*ptr, (uint64_t*)&cgen_var_83, 1 * 8);
+    *ptr += 1 * 8;
+    uint64_t cgen_var_84;
+    *&cgen_var_84 = get_host_u64_VkBuffer((*&forMarshaling->buffer));
+    memcpy(*ptr, (uint64_t*)&cgen_var_84, 1 * 8);
+    *ptr += 1 * 8;
+}
+
+void reservedmarshal_VkMemoryAllocateFlagsInfo(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryAllocateFlagsInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkMemoryAllocateFlags*)&forMarshaling->flags, sizeof(VkMemoryAllocateFlags));
+    *ptr += sizeof(VkMemoryAllocateFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->deviceMask, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkDeviceGroupRenderPassBeginInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceGroupRenderPassBeginInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->deviceMask, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->deviceRenderAreaCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->deviceRenderAreaCount; ++i)
+    {
+        reservedmarshal_VkRect2D(vkStream, (const VkRect2D*)(forMarshaling->pDeviceRenderAreas + i), ptr);
+    }
+}
+
+void reservedmarshal_VkDeviceGroupCommandBufferBeginInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceGroupCommandBufferBeginInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->deviceMask, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkDeviceGroupSubmitInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceGroupSubmitInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->waitSemaphoreCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (const uint32_t*)forMarshaling->pWaitSemaphoreDeviceIndices, forMarshaling->waitSemaphoreCount * sizeof(const uint32_t));
+    *ptr += forMarshaling->waitSemaphoreCount * sizeof(const uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->commandBufferCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (const uint32_t*)forMarshaling->pCommandBufferDeviceMasks, forMarshaling->commandBufferCount * sizeof(const uint32_t));
+    *ptr += forMarshaling->commandBufferCount * sizeof(const uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->signalSemaphoreCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (const uint32_t*)forMarshaling->pSignalSemaphoreDeviceIndices, forMarshaling->signalSemaphoreCount * sizeof(const uint32_t));
+    *ptr += forMarshaling->signalSemaphoreCount * sizeof(const uint32_t);
+}
+
+void reservedmarshal_VkDeviceGroupBindSparseInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceGroupBindSparseInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->resourceDeviceIndex, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->memoryDeviceIndex, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkBindBufferMemoryDeviceGroupInfo(
+    VulkanStreamGuest* vkStream,
+    const VkBindBufferMemoryDeviceGroupInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->deviceIndexCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (const uint32_t*)forMarshaling->pDeviceIndices, forMarshaling->deviceIndexCount * sizeof(const uint32_t));
+    *ptr += forMarshaling->deviceIndexCount * sizeof(const uint32_t);
+}
+
+void reservedmarshal_VkBindImageMemoryDeviceGroupInfo(
+    VulkanStreamGuest* vkStream,
+    const VkBindImageMemoryDeviceGroupInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->deviceIndexCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (const uint32_t*)forMarshaling->pDeviceIndices, forMarshaling->deviceIndexCount * sizeof(const uint32_t));
+    *ptr += forMarshaling->deviceIndexCount * sizeof(const uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->splitInstanceBindRegionCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->splitInstanceBindRegionCount; ++i)
+    {
+        reservedmarshal_VkRect2D(vkStream, (const VkRect2D*)(forMarshaling->pSplitInstanceBindRegions + i), ptr);
+    }
+}
+
+void reservedmarshal_VkPhysicalDeviceGroupProperties(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceGroupProperties* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->physicalDeviceCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkPhysicalDevice*)forMarshaling->physicalDevices, VK_MAX_DEVICE_GROUP_SIZE * sizeof(VkPhysicalDevice));
+    *ptr += VK_MAX_DEVICE_GROUP_SIZE * sizeof(VkPhysicalDevice);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->subsetAllocation, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkDeviceGroupDeviceCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceGroupDeviceCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->physicalDeviceCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    if (forMarshaling->physicalDeviceCount)
+    {
+        uint64_t* cgen_var_85;
+        vkStream->alloc((void**)&cgen_var_85, forMarshaling->physicalDeviceCount * 8);
+        for (uint32_t k = 0; k < forMarshaling->physicalDeviceCount; ++k)
+        {
+            cgen_var_85[k] = get_host_u64_VkPhysicalDevice(forMarshaling->pPhysicalDevices[k]);
+        }
+        memcpy(*ptr, (uint64_t*)cgen_var_85, forMarshaling->physicalDeviceCount * 8);
+        *ptr += forMarshaling->physicalDeviceCount * 8;
+    }
+}
+
+void reservedmarshal_VkBufferMemoryRequirementsInfo2(
+    VulkanStreamGuest* vkStream,
+    const VkBufferMemoryRequirementsInfo2* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_86;
+    *&cgen_var_86 = get_host_u64_VkBuffer((*&forMarshaling->buffer));
+    memcpy(*ptr, (uint64_t*)&cgen_var_86, 1 * 8);
+    *ptr += 1 * 8;
+}
+
+void reservedmarshal_VkImageMemoryRequirementsInfo2(
+    VulkanStreamGuest* vkStream,
+    const VkImageMemoryRequirementsInfo2* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_87;
+    *&cgen_var_87 = get_host_u64_VkImage((*&forMarshaling->image));
+    memcpy(*ptr, (uint64_t*)&cgen_var_87, 1 * 8);
+    *ptr += 1 * 8;
+}
+
+void reservedmarshal_VkImageSparseMemoryRequirementsInfo2(
+    VulkanStreamGuest* vkStream,
+    const VkImageSparseMemoryRequirementsInfo2* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_88;
+    *&cgen_var_88 = get_host_u64_VkImage((*&forMarshaling->image));
+    memcpy(*ptr, (uint64_t*)&cgen_var_88, 1 * 8);
+    *ptr += 1 * 8;
+}
+
+void reservedmarshal_VkMemoryRequirements2(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryRequirements2* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    reservedmarshal_VkMemoryRequirements(vkStream, (VkMemoryRequirements*)(&forMarshaling->memoryRequirements), ptr);
+}
+
+void reservedmarshal_VkSparseImageMemoryRequirements2(
+    VulkanStreamGuest* vkStream,
+    const VkSparseImageMemoryRequirements2* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    reservedmarshal_VkSparseImageMemoryRequirements(vkStream, (VkSparseImageMemoryRequirements*)(&forMarshaling->memoryRequirements), ptr);
+}
+
+void reservedmarshal_VkPhysicalDeviceFeatures2(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceFeatures2* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    reservedmarshal_VkPhysicalDeviceFeatures(vkStream, (VkPhysicalDeviceFeatures*)(&forMarshaling->features), ptr);
+}
+
+void reservedmarshal_VkPhysicalDeviceProperties2(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceProperties2* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    reservedmarshal_VkPhysicalDeviceProperties(vkStream, (VkPhysicalDeviceProperties*)(&forMarshaling->properties), ptr);
+}
+
+void reservedmarshal_VkFormatProperties2(
+    VulkanStreamGuest* vkStream,
+    const VkFormatProperties2* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    reservedmarshal_VkFormatProperties(vkStream, (VkFormatProperties*)(&forMarshaling->formatProperties), ptr);
+}
+
+void reservedmarshal_VkImageFormatProperties2(
+    VulkanStreamGuest* vkStream,
+    const VkImageFormatProperties2* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    reservedmarshal_VkImageFormatProperties(vkStream, (VkImageFormatProperties*)(&forMarshaling->imageFormatProperties), ptr);
+}
+
+void reservedmarshal_VkPhysicalDeviceImageFormatInfo2(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceImageFormatInfo2* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
+    *ptr += sizeof(VkFormat);
+    memcpy(*ptr, (VkImageType*)&forMarshaling->type, sizeof(VkImageType));
+    *ptr += sizeof(VkImageType);
+    memcpy(*ptr, (VkImageTiling*)&forMarshaling->tiling, sizeof(VkImageTiling));
+    *ptr += sizeof(VkImageTiling);
+    memcpy(*ptr, (VkImageUsageFlags*)&forMarshaling->usage, sizeof(VkImageUsageFlags));
+    *ptr += sizeof(VkImageUsageFlags);
+    memcpy(*ptr, (VkImageCreateFlags*)&forMarshaling->flags, sizeof(VkImageCreateFlags));
+    *ptr += sizeof(VkImageCreateFlags);
+}
+
+void reservedmarshal_VkQueueFamilyProperties2(
+    VulkanStreamGuest* vkStream,
+    const VkQueueFamilyProperties2* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    reservedmarshal_VkQueueFamilyProperties(vkStream, (VkQueueFamilyProperties*)(&forMarshaling->queueFamilyProperties), ptr);
+}
+
+void reservedmarshal_VkPhysicalDeviceMemoryProperties2(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceMemoryProperties2* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    reservedmarshal_VkPhysicalDeviceMemoryProperties(vkStream, (VkPhysicalDeviceMemoryProperties*)(&forMarshaling->memoryProperties), ptr);
+}
+
+void reservedmarshal_VkSparseImageFormatProperties2(
+    VulkanStreamGuest* vkStream,
+    const VkSparseImageFormatProperties2* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    reservedmarshal_VkSparseImageFormatProperties(vkStream, (VkSparseImageFormatProperties*)(&forMarshaling->properties), ptr);
+}
+
+void reservedmarshal_VkPhysicalDeviceSparseImageFormatInfo2(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceSparseImageFormatInfo2* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
+    *ptr += sizeof(VkFormat);
+    memcpy(*ptr, (VkImageType*)&forMarshaling->type, sizeof(VkImageType));
+    *ptr += sizeof(VkImageType);
+    memcpy(*ptr, (VkSampleCountFlagBits*)&forMarshaling->samples, sizeof(VkSampleCountFlagBits));
+    *ptr += sizeof(VkSampleCountFlagBits);
+    memcpy(*ptr, (VkImageUsageFlags*)&forMarshaling->usage, sizeof(VkImageUsageFlags));
+    *ptr += sizeof(VkImageUsageFlags);
+    memcpy(*ptr, (VkImageTiling*)&forMarshaling->tiling, sizeof(VkImageTiling));
+    *ptr += sizeof(VkImageTiling);
+}
+
+void reservedmarshal_VkPhysicalDevicePointClippingProperties(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDevicePointClippingProperties* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkPointClippingBehavior*)&forMarshaling->pointClippingBehavior, sizeof(VkPointClippingBehavior));
+    *ptr += sizeof(VkPointClippingBehavior);
+}
+
+void reservedmarshal_VkInputAttachmentAspectReference(
+    VulkanStreamGuest* vkStream,
+    const VkInputAttachmentAspectReference* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->subpass, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->inputAttachmentIndex, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkImageAspectFlags*)&forMarshaling->aspectMask, sizeof(VkImageAspectFlags));
+    *ptr += sizeof(VkImageAspectFlags);
+}
+
+void reservedmarshal_VkRenderPassInputAttachmentAspectCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkRenderPassInputAttachmentAspectCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->aspectReferenceCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->aspectReferenceCount; ++i)
+    {
+        reservedmarshal_VkInputAttachmentAspectReference(vkStream, (const VkInputAttachmentAspectReference*)(forMarshaling->pAspectReferences + i), ptr);
+    }
+}
+
+void reservedmarshal_VkImageViewUsageCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkImageViewUsageCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkImageUsageFlags*)&forMarshaling->usage, sizeof(VkImageUsageFlags));
+    *ptr += sizeof(VkImageUsageFlags);
+}
+
+void reservedmarshal_VkPipelineTessellationDomainOriginStateCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineTessellationDomainOriginStateCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkTessellationDomainOrigin*)&forMarshaling->domainOrigin, sizeof(VkTessellationDomainOrigin));
+    *ptr += sizeof(VkTessellationDomainOrigin);
+}
+
+void reservedmarshal_VkRenderPassMultiviewCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkRenderPassMultiviewCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->subpassCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (const uint32_t*)forMarshaling->pViewMasks, forMarshaling->subpassCount * sizeof(const uint32_t));
+    *ptr += forMarshaling->subpassCount * sizeof(const uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->dependencyCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (const int32_t*)forMarshaling->pViewOffsets, forMarshaling->dependencyCount * sizeof(const int32_t));
+    *ptr += forMarshaling->dependencyCount * sizeof(const int32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->correlationMaskCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (const uint32_t*)forMarshaling->pCorrelationMasks, forMarshaling->correlationMaskCount * sizeof(const uint32_t));
+    *ptr += forMarshaling->correlationMaskCount * sizeof(const uint32_t);
+}
+
+void reservedmarshal_VkPhysicalDeviceMultiviewFeatures(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceMultiviewFeatures* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->multiview, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->multiviewGeometryShader, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->multiviewTessellationShader, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkPhysicalDeviceMultiviewProperties(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceMultiviewProperties* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxMultiviewViewCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxMultiviewInstanceIndex, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkPhysicalDeviceVariablePointerFeatures(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceVariablePointerFeatures* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->variablePointersStorageBuffer, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->variablePointers, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkPhysicalDeviceProtectedMemoryFeatures(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceProtectedMemoryFeatures* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->protectedMemory, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkPhysicalDeviceProtectedMemoryProperties(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceProtectedMemoryProperties* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->protectedNoFault, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkDeviceQueueInfo2(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceQueueInfo2* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkDeviceQueueCreateFlags*)&forMarshaling->flags, sizeof(VkDeviceQueueCreateFlags));
+    *ptr += sizeof(VkDeviceQueueCreateFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->queueFamilyIndex, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->queueIndex, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkProtectedSubmitInfo(
+    VulkanStreamGuest* vkStream,
+    const VkProtectedSubmitInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->protectedSubmit, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkSamplerYcbcrConversionCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkSamplerYcbcrConversionCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
+    *ptr += sizeof(VkFormat);
+    memcpy(*ptr, (VkSamplerYcbcrModelConversion*)&forMarshaling->ycbcrModel, sizeof(VkSamplerYcbcrModelConversion));
+    *ptr += sizeof(VkSamplerYcbcrModelConversion);
+    memcpy(*ptr, (VkSamplerYcbcrRange*)&forMarshaling->ycbcrRange, sizeof(VkSamplerYcbcrRange));
+    *ptr += sizeof(VkSamplerYcbcrRange);
+    reservedmarshal_VkComponentMapping(vkStream, (VkComponentMapping*)(&forMarshaling->components), ptr);
+    memcpy(*ptr, (VkChromaLocation*)&forMarshaling->xChromaOffset, sizeof(VkChromaLocation));
+    *ptr += sizeof(VkChromaLocation);
+    memcpy(*ptr, (VkChromaLocation*)&forMarshaling->yChromaOffset, sizeof(VkChromaLocation));
+    *ptr += sizeof(VkChromaLocation);
+    memcpy(*ptr, (VkFilter*)&forMarshaling->chromaFilter, sizeof(VkFilter));
+    *ptr += sizeof(VkFilter);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->forceExplicitReconstruction, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkSamplerYcbcrConversionInfo(
+    VulkanStreamGuest* vkStream,
+    const VkSamplerYcbcrConversionInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_89;
+    *&cgen_var_89 = get_host_u64_VkSamplerYcbcrConversion((*&forMarshaling->conversion));
+    memcpy(*ptr, (uint64_t*)&cgen_var_89, 1 * 8);
+    *ptr += 1 * 8;
+}
+
+void reservedmarshal_VkBindImagePlaneMemoryInfo(
+    VulkanStreamGuest* vkStream,
+    const VkBindImagePlaneMemoryInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkImageAspectFlagBits*)&forMarshaling->planeAspect, sizeof(VkImageAspectFlagBits));
+    *ptr += sizeof(VkImageAspectFlagBits);
+}
+
+void reservedmarshal_VkImagePlaneMemoryRequirementsInfo(
+    VulkanStreamGuest* vkStream,
+    const VkImagePlaneMemoryRequirementsInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkImageAspectFlagBits*)&forMarshaling->planeAspect, sizeof(VkImageAspectFlagBits));
+    *ptr += sizeof(VkImageAspectFlagBits);
+}
+
+void reservedmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceSamplerYcbcrConversionFeatures* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->samplerYcbcrConversion, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkSamplerYcbcrConversionImageFormatProperties(
+    VulkanStreamGuest* vkStream,
+    const VkSamplerYcbcrConversionImageFormatProperties* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->combinedImageSamplerDescriptorCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkDescriptorUpdateTemplateEntry(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorUpdateTemplateEntry* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->dstBinding, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->dstArrayElement, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->descriptorCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkDescriptorType*)&forMarshaling->descriptorType, sizeof(VkDescriptorType));
+    *ptr += sizeof(VkDescriptorType);
+    uint64_t cgen_var_90 = (uint64_t)forMarshaling->offset;
+    memcpy((*ptr), &cgen_var_90, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    uint64_t cgen_var_91 = (uint64_t)forMarshaling->stride;
+    memcpy((*ptr), &cgen_var_91, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+}
+
+void reservedmarshal_VkDescriptorUpdateTemplateCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorUpdateTemplateCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkDescriptorUpdateTemplateCreateFlags*)&forMarshaling->flags, sizeof(VkDescriptorUpdateTemplateCreateFlags));
+    *ptr += sizeof(VkDescriptorUpdateTemplateCreateFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->descriptorUpdateEntryCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->descriptorUpdateEntryCount; ++i)
+    {
+        reservedmarshal_VkDescriptorUpdateTemplateEntry(vkStream, (const VkDescriptorUpdateTemplateEntry*)(forMarshaling->pDescriptorUpdateEntries + i), ptr);
+    }
+    memcpy(*ptr, (VkDescriptorUpdateTemplateType*)&forMarshaling->templateType, sizeof(VkDescriptorUpdateTemplateType));
+    *ptr += sizeof(VkDescriptorUpdateTemplateType);
+    uint64_t cgen_var_92;
+    *&cgen_var_92 = get_host_u64_VkDescriptorSetLayout((*&forMarshaling->descriptorSetLayout));
+    memcpy(*ptr, (uint64_t*)&cgen_var_92, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
+    *ptr += sizeof(VkPipelineBindPoint);
+    uint64_t cgen_var_93;
+    *&cgen_var_93 = get_host_u64_VkPipelineLayout((*&forMarshaling->pipelineLayout));
+    memcpy(*ptr, (uint64_t*)&cgen_var_93, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->set, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkExternalMemoryProperties(
+    VulkanStreamGuest* vkStream,
+    const VkExternalMemoryProperties* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkExternalMemoryFeatureFlags*)&forMarshaling->externalMemoryFeatures, sizeof(VkExternalMemoryFeatureFlags));
+    *ptr += sizeof(VkExternalMemoryFeatureFlags);
+    memcpy(*ptr, (VkExternalMemoryHandleTypeFlags*)&forMarshaling->exportFromImportedHandleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
+    *ptr += sizeof(VkExternalMemoryHandleTypeFlags);
+    memcpy(*ptr, (VkExternalMemoryHandleTypeFlags*)&forMarshaling->compatibleHandleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
+    *ptr += sizeof(VkExternalMemoryHandleTypeFlags);
+}
+
+void reservedmarshal_VkPhysicalDeviceExternalImageFormatInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceExternalImageFormatInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    *ptr += sizeof(VkExternalMemoryHandleTypeFlagBits);
+}
+
+void reservedmarshal_VkExternalImageFormatProperties(
+    VulkanStreamGuest* vkStream,
+    const VkExternalImageFormatProperties* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    reservedmarshal_VkExternalMemoryProperties(vkStream, (VkExternalMemoryProperties*)(&forMarshaling->externalMemoryProperties), ptr);
+}
+
+void reservedmarshal_VkPhysicalDeviceExternalBufferInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceExternalBufferInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBufferCreateFlags*)&forMarshaling->flags, sizeof(VkBufferCreateFlags));
+    *ptr += sizeof(VkBufferCreateFlags);
+    memcpy(*ptr, (VkBufferUsageFlags*)&forMarshaling->usage, sizeof(VkBufferUsageFlags));
+    *ptr += sizeof(VkBufferUsageFlags);
+    memcpy(*ptr, (VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    *ptr += sizeof(VkExternalMemoryHandleTypeFlagBits);
+}
+
+void reservedmarshal_VkExternalBufferProperties(
+    VulkanStreamGuest* vkStream,
+    const VkExternalBufferProperties* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    reservedmarshal_VkExternalMemoryProperties(vkStream, (VkExternalMemoryProperties*)(&forMarshaling->externalMemoryProperties), ptr);
+}
+
+void reservedmarshal_VkPhysicalDeviceIDProperties(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceIDProperties* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint8_t*)forMarshaling->deviceUUID, VK_UUID_SIZE * sizeof(uint8_t));
+    *ptr += VK_UUID_SIZE * sizeof(uint8_t);
+    memcpy(*ptr, (uint8_t*)forMarshaling->driverUUID, VK_UUID_SIZE * sizeof(uint8_t));
+    *ptr += VK_UUID_SIZE * sizeof(uint8_t);
+    memcpy(*ptr, (uint8_t*)forMarshaling->deviceLUID, VK_LUID_SIZE * sizeof(uint8_t));
+    *ptr += VK_LUID_SIZE * sizeof(uint8_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->deviceNodeMask, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->deviceLUIDValid, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkExternalMemoryImageCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkExternalMemoryImageCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkExternalMemoryHandleTypeFlags*)&forMarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
+    *ptr += sizeof(VkExternalMemoryHandleTypeFlags);
+}
+
+void reservedmarshal_VkExternalMemoryBufferCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkExternalMemoryBufferCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkExternalMemoryHandleTypeFlags*)&forMarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
+    *ptr += sizeof(VkExternalMemoryHandleTypeFlags);
+}
+
+void reservedmarshal_VkExportMemoryAllocateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkExportMemoryAllocateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkExternalMemoryHandleTypeFlags*)&forMarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlags));
+    *ptr += sizeof(VkExternalMemoryHandleTypeFlags);
+}
+
+void reservedmarshal_VkPhysicalDeviceExternalFenceInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceExternalFenceInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkExternalFenceHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalFenceHandleTypeFlagBits));
+    *ptr += sizeof(VkExternalFenceHandleTypeFlagBits);
+}
+
+void reservedmarshal_VkExternalFenceProperties(
+    VulkanStreamGuest* vkStream,
+    const VkExternalFenceProperties* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkExternalFenceHandleTypeFlags*)&forMarshaling->exportFromImportedHandleTypes, sizeof(VkExternalFenceHandleTypeFlags));
+    *ptr += sizeof(VkExternalFenceHandleTypeFlags);
+    memcpy(*ptr, (VkExternalFenceHandleTypeFlags*)&forMarshaling->compatibleHandleTypes, sizeof(VkExternalFenceHandleTypeFlags));
+    *ptr += sizeof(VkExternalFenceHandleTypeFlags);
+    memcpy(*ptr, (VkExternalFenceFeatureFlags*)&forMarshaling->externalFenceFeatures, sizeof(VkExternalFenceFeatureFlags));
+    *ptr += sizeof(VkExternalFenceFeatureFlags);
+}
+
+void reservedmarshal_VkExportFenceCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkExportFenceCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkExternalFenceHandleTypeFlags*)&forMarshaling->handleTypes, sizeof(VkExternalFenceHandleTypeFlags));
+    *ptr += sizeof(VkExternalFenceHandleTypeFlags);
+}
+
+void reservedmarshal_VkExportSemaphoreCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkExportSemaphoreCreateInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkExternalSemaphoreHandleTypeFlags*)&forMarshaling->handleTypes, sizeof(VkExternalSemaphoreHandleTypeFlags));
+    *ptr += sizeof(VkExternalSemaphoreHandleTypeFlags);
+}
+
+void reservedmarshal_VkPhysicalDeviceExternalSemaphoreInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceExternalSemaphoreInfo* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkExternalSemaphoreHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    *ptr += sizeof(VkExternalSemaphoreHandleTypeFlagBits);
+}
+
+void reservedmarshal_VkExternalSemaphoreProperties(
+    VulkanStreamGuest* vkStream,
+    const VkExternalSemaphoreProperties* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkExternalSemaphoreHandleTypeFlags*)&forMarshaling->exportFromImportedHandleTypes, sizeof(VkExternalSemaphoreHandleTypeFlags));
+    *ptr += sizeof(VkExternalSemaphoreHandleTypeFlags);
+    memcpy(*ptr, (VkExternalSemaphoreHandleTypeFlags*)&forMarshaling->compatibleHandleTypes, sizeof(VkExternalSemaphoreHandleTypeFlags));
+    *ptr += sizeof(VkExternalSemaphoreHandleTypeFlags);
+    memcpy(*ptr, (VkExternalSemaphoreFeatureFlags*)&forMarshaling->externalSemaphoreFeatures, sizeof(VkExternalSemaphoreFeatureFlags));
+    *ptr += sizeof(VkExternalSemaphoreFeatureFlags);
+}
+
+void reservedmarshal_VkPhysicalDeviceMaintenance3Properties(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceMaintenance3Properties* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxPerSetDescriptors, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->maxMemoryAllocationSize, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+}
+
+void reservedmarshal_VkDescriptorSetLayoutSupport(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorSetLayoutSupport* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->supported, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkPhysicalDeviceShaderDrawParameterFeatures(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceShaderDrawParameterFeatures* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderDrawParameters, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+#endif
+#ifdef VK_KHR_surface
+void reservedmarshal_VkSurfaceCapabilitiesKHR(
+    VulkanStreamGuest* vkStream,
+    const VkSurfaceCapabilitiesKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->minImageCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxImageCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->currentExtent), ptr);
+    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->minImageExtent), ptr);
+    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->maxImageExtent), ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxImageArrayLayers, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkSurfaceTransformFlagsKHR*)&forMarshaling->supportedTransforms, sizeof(VkSurfaceTransformFlagsKHR));
+    *ptr += sizeof(VkSurfaceTransformFlagsKHR);
+    memcpy(*ptr, (VkSurfaceTransformFlagBitsKHR*)&forMarshaling->currentTransform, sizeof(VkSurfaceTransformFlagBitsKHR));
+    *ptr += sizeof(VkSurfaceTransformFlagBitsKHR);
+    memcpy(*ptr, (VkCompositeAlphaFlagsKHR*)&forMarshaling->supportedCompositeAlpha, sizeof(VkCompositeAlphaFlagsKHR));
+    *ptr += sizeof(VkCompositeAlphaFlagsKHR);
+    memcpy(*ptr, (VkImageUsageFlags*)&forMarshaling->supportedUsageFlags, sizeof(VkImageUsageFlags));
+    *ptr += sizeof(VkImageUsageFlags);
+}
+
+void reservedmarshal_VkSurfaceFormatKHR(
+    VulkanStreamGuest* vkStream,
+    const VkSurfaceFormatKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
+    *ptr += sizeof(VkFormat);
+    memcpy(*ptr, (VkColorSpaceKHR*)&forMarshaling->colorSpace, sizeof(VkColorSpaceKHR));
+    *ptr += sizeof(VkColorSpaceKHR);
+}
+
+#endif
+#ifdef VK_KHR_swapchain
+void reservedmarshal_VkSwapchainCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkSwapchainCreateInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkSwapchainCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkSwapchainCreateFlagsKHR));
+    *ptr += sizeof(VkSwapchainCreateFlagsKHR);
+    uint64_t cgen_var_94;
+    *&cgen_var_94 = get_host_u64_VkSurfaceKHR((*&forMarshaling->surface));
+    memcpy(*ptr, (uint64_t*)&cgen_var_94, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->minImageCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkFormat*)&forMarshaling->imageFormat, sizeof(VkFormat));
+    *ptr += sizeof(VkFormat);
+    memcpy(*ptr, (VkColorSpaceKHR*)&forMarshaling->imageColorSpace, sizeof(VkColorSpaceKHR));
+    *ptr += sizeof(VkColorSpaceKHR);
+    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->imageExtent), ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->imageArrayLayers, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkImageUsageFlags*)&forMarshaling->imageUsage, sizeof(VkImageUsageFlags));
+    *ptr += sizeof(VkImageUsageFlags);
+    memcpy(*ptr, (VkSharingMode*)&forMarshaling->imageSharingMode, sizeof(VkSharingMode));
+    *ptr += sizeof(VkSharingMode);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->queueFamilyIndexCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_95 = (uint64_t)(uintptr_t)forMarshaling->pQueueFamilyIndices;
+    memcpy((*ptr), &cgen_var_95, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pQueueFamilyIndices)
+    {
+        memcpy(*ptr, (const uint32_t*)forMarshaling->pQueueFamilyIndices, forMarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
+        *ptr += forMarshaling->queueFamilyIndexCount * sizeof(const uint32_t);
+    }
+    memcpy(*ptr, (VkSurfaceTransformFlagBitsKHR*)&forMarshaling->preTransform, sizeof(VkSurfaceTransformFlagBitsKHR));
+    *ptr += sizeof(VkSurfaceTransformFlagBitsKHR);
+    memcpy(*ptr, (VkCompositeAlphaFlagBitsKHR*)&forMarshaling->compositeAlpha, sizeof(VkCompositeAlphaFlagBitsKHR));
+    *ptr += sizeof(VkCompositeAlphaFlagBitsKHR);
+    memcpy(*ptr, (VkPresentModeKHR*)&forMarshaling->presentMode, sizeof(VkPresentModeKHR));
+    *ptr += sizeof(VkPresentModeKHR);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->clipped, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    uint64_t cgen_var_96;
+    *&cgen_var_96 = get_host_u64_VkSwapchainKHR((*&forMarshaling->oldSwapchain));
+    memcpy(*ptr, (uint64_t*)&cgen_var_96, 1 * 8);
+    *ptr += 1 * 8;
+}
+
+void reservedmarshal_VkPresentInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkPresentInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->waitSemaphoreCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    if (forMarshaling->waitSemaphoreCount)
+    {
+        uint64_t* cgen_var_97;
+        vkStream->alloc((void**)&cgen_var_97, forMarshaling->waitSemaphoreCount * 8);
+        for (uint32_t k = 0; k < forMarshaling->waitSemaphoreCount; ++k)
+        {
+            cgen_var_97[k] = get_host_u64_VkSemaphore(forMarshaling->pWaitSemaphores[k]);
+        }
+        memcpy(*ptr, (uint64_t*)cgen_var_97, forMarshaling->waitSemaphoreCount * 8);
+        *ptr += forMarshaling->waitSemaphoreCount * 8;
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->swapchainCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    if (forMarshaling->swapchainCount)
+    {
+        uint64_t* cgen_var_98;
+        vkStream->alloc((void**)&cgen_var_98, forMarshaling->swapchainCount * 8);
+        for (uint32_t k = 0; k < forMarshaling->swapchainCount; ++k)
+        {
+            cgen_var_98[k] = get_host_u64_VkSwapchainKHR(forMarshaling->pSwapchains[k]);
+        }
+        memcpy(*ptr, (uint64_t*)cgen_var_98, forMarshaling->swapchainCount * 8);
+        *ptr += forMarshaling->swapchainCount * 8;
+    }
+    memcpy(*ptr, (const uint32_t*)forMarshaling->pImageIndices, forMarshaling->swapchainCount * sizeof(const uint32_t));
+    *ptr += forMarshaling->swapchainCount * sizeof(const uint32_t);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_99 = (uint64_t)(uintptr_t)forMarshaling->pResults;
+    memcpy((*ptr), &cgen_var_99, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pResults)
+    {
+        memcpy(*ptr, (VkResult*)forMarshaling->pResults, forMarshaling->swapchainCount * sizeof(VkResult));
+        *ptr += forMarshaling->swapchainCount * sizeof(VkResult);
+    }
+}
+
+void reservedmarshal_VkImageSwapchainCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkImageSwapchainCreateInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_100;
+    *&cgen_var_100 = get_host_u64_VkSwapchainKHR((*&forMarshaling->swapchain));
+    memcpy(*ptr, (uint64_t*)&cgen_var_100, 1 * 8);
+    *ptr += 1 * 8;
+}
+
+void reservedmarshal_VkBindImageMemorySwapchainInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkBindImageMemorySwapchainInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_101;
+    *&cgen_var_101 = get_host_u64_VkSwapchainKHR((*&forMarshaling->swapchain));
+    memcpy(*ptr, (uint64_t*)&cgen_var_101, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->imageIndex, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkAcquireNextImageInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkAcquireNextImageInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_102;
+    *&cgen_var_102 = get_host_u64_VkSwapchainKHR((*&forMarshaling->swapchain));
+    memcpy(*ptr, (uint64_t*)&cgen_var_102, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (uint64_t*)&forMarshaling->timeout, sizeof(uint64_t));
+    *ptr += sizeof(uint64_t);
+    uint64_t cgen_var_103;
+    *&cgen_var_103 = get_host_u64_VkSemaphore((*&forMarshaling->semaphore));
+    memcpy(*ptr, (uint64_t*)&cgen_var_103, 1 * 8);
+    *ptr += 1 * 8;
+    uint64_t cgen_var_104;
+    *&cgen_var_104 = get_host_u64_VkFence((*&forMarshaling->fence));
+    memcpy(*ptr, (uint64_t*)&cgen_var_104, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->deviceMask, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkDeviceGroupPresentCapabilitiesKHR(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceGroupPresentCapabilitiesKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)forMarshaling->presentMask, VK_MAX_DEVICE_GROUP_SIZE * sizeof(uint32_t));
+    *ptr += VK_MAX_DEVICE_GROUP_SIZE * sizeof(uint32_t);
+    memcpy(*ptr, (VkDeviceGroupPresentModeFlagsKHR*)&forMarshaling->modes, sizeof(VkDeviceGroupPresentModeFlagsKHR));
+    *ptr += sizeof(VkDeviceGroupPresentModeFlagsKHR);
+}
+
+void reservedmarshal_VkDeviceGroupPresentInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceGroupPresentInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->swapchainCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (const uint32_t*)forMarshaling->pDeviceMasks, forMarshaling->swapchainCount * sizeof(const uint32_t));
+    *ptr += forMarshaling->swapchainCount * sizeof(const uint32_t);
+    memcpy(*ptr, (VkDeviceGroupPresentModeFlagBitsKHR*)&forMarshaling->mode, sizeof(VkDeviceGroupPresentModeFlagBitsKHR));
+    *ptr += sizeof(VkDeviceGroupPresentModeFlagBitsKHR);
+}
+
+void reservedmarshal_VkDeviceGroupSwapchainCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceGroupSwapchainCreateInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkDeviceGroupPresentModeFlagsKHR*)&forMarshaling->modes, sizeof(VkDeviceGroupPresentModeFlagsKHR));
+    *ptr += sizeof(VkDeviceGroupPresentModeFlagsKHR);
+}
+
+#endif
+#ifdef VK_KHR_display
+void reservedmarshal_VkDisplayPropertiesKHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayPropertiesKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    uint64_t cgen_var_105;
+    *&cgen_var_105 = get_host_u64_VkDisplayKHR((*&forMarshaling->display));
+    memcpy(*ptr, (uint64_t*)&cgen_var_105, 1 * 8);
+    *ptr += 1 * 8;
+    {
+        uint32_t l = forMarshaling->displayName ? strlen(forMarshaling->displayName): 0;
+        memcpy(*ptr, (uint32_t*)&l, sizeof(uint32_t));
+        android::base::Stream::toBe32((uint8_t*)*ptr);
+        *ptr += sizeof(uint32_t);
+        memcpy(*ptr, (char*)forMarshaling->displayName, l);
+        *ptr += l;
+    }
+    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->physicalDimensions), ptr);
+    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->physicalResolution), ptr);
+    memcpy(*ptr, (VkSurfaceTransformFlagsKHR*)&forMarshaling->supportedTransforms, sizeof(VkSurfaceTransformFlagsKHR));
+    *ptr += sizeof(VkSurfaceTransformFlagsKHR);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->planeReorderPossible, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->persistentContent, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkDisplayModeParametersKHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayModeParametersKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->visibleRegion), ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->refreshRate, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkDisplayModePropertiesKHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayModePropertiesKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    uint64_t cgen_var_106;
+    *&cgen_var_106 = get_host_u64_VkDisplayModeKHR((*&forMarshaling->displayMode));
+    memcpy(*ptr, (uint64_t*)&cgen_var_106, 1 * 8);
+    *ptr += 1 * 8;
+    reservedmarshal_VkDisplayModeParametersKHR(vkStream, (VkDisplayModeParametersKHR*)(&forMarshaling->parameters), ptr);
+}
+
+void reservedmarshal_VkDisplayModeCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayModeCreateInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkDisplayModeCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkDisplayModeCreateFlagsKHR));
+    *ptr += sizeof(VkDisplayModeCreateFlagsKHR);
+    reservedmarshal_VkDisplayModeParametersKHR(vkStream, (VkDisplayModeParametersKHR*)(&forMarshaling->parameters), ptr);
+}
+
+void reservedmarshal_VkDisplayPlaneCapabilitiesKHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayPlaneCapabilitiesKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkDisplayPlaneAlphaFlagsKHR*)&forMarshaling->supportedAlpha, sizeof(VkDisplayPlaneAlphaFlagsKHR));
+    *ptr += sizeof(VkDisplayPlaneAlphaFlagsKHR);
+    reservedmarshal_VkOffset2D(vkStream, (VkOffset2D*)(&forMarshaling->minSrcPosition), ptr);
+    reservedmarshal_VkOffset2D(vkStream, (VkOffset2D*)(&forMarshaling->maxSrcPosition), ptr);
+    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->minSrcExtent), ptr);
+    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->maxSrcExtent), ptr);
+    reservedmarshal_VkOffset2D(vkStream, (VkOffset2D*)(&forMarshaling->minDstPosition), ptr);
+    reservedmarshal_VkOffset2D(vkStream, (VkOffset2D*)(&forMarshaling->maxDstPosition), ptr);
+    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->minDstExtent), ptr);
+    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->maxDstExtent), ptr);
+}
+
+void reservedmarshal_VkDisplayPlanePropertiesKHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayPlanePropertiesKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    uint64_t cgen_var_107;
+    *&cgen_var_107 = get_host_u64_VkDisplayKHR((*&forMarshaling->currentDisplay));
+    memcpy(*ptr, (uint64_t*)&cgen_var_107, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->currentStackIndex, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkDisplaySurfaceCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplaySurfaceCreateInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkDisplaySurfaceCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkDisplaySurfaceCreateFlagsKHR));
+    *ptr += sizeof(VkDisplaySurfaceCreateFlagsKHR);
+    uint64_t cgen_var_108;
+    *&cgen_var_108 = get_host_u64_VkDisplayModeKHR((*&forMarshaling->displayMode));
+    memcpy(*ptr, (uint64_t*)&cgen_var_108, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->planeIndex, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->planeStackIndex, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkSurfaceTransformFlagBitsKHR*)&forMarshaling->transform, sizeof(VkSurfaceTransformFlagBitsKHR));
+    *ptr += sizeof(VkSurfaceTransformFlagBitsKHR);
+    memcpy(*ptr, (float*)&forMarshaling->globalAlpha, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (VkDisplayPlaneAlphaFlagBitsKHR*)&forMarshaling->alphaMode, sizeof(VkDisplayPlaneAlphaFlagBitsKHR));
+    *ptr += sizeof(VkDisplayPlaneAlphaFlagBitsKHR);
+    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->imageExtent), ptr);
+}
+
+#endif
+#ifdef VK_KHR_display_swapchain
+void reservedmarshal_VkDisplayPresentInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayPresentInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    reservedmarshal_VkRect2D(vkStream, (VkRect2D*)(&forMarshaling->srcRect), ptr);
+    reservedmarshal_VkRect2D(vkStream, (VkRect2D*)(&forMarshaling->dstRect), ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->persistent, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+#endif
+#ifdef VK_KHR_xlib_surface
+void reservedmarshal_VkXlibSurfaceCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkXlibSurfaceCreateInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkXlibSurfaceCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkXlibSurfaceCreateFlagsKHR));
+    *ptr += sizeof(VkXlibSurfaceCreateFlagsKHR);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_109 = (uint64_t)(uintptr_t)forMarshaling->dpy;
+    memcpy((*ptr), &cgen_var_109, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->dpy)
+    {
+        memcpy(*ptr, (Display*)forMarshaling->dpy, sizeof(Display));
+        *ptr += sizeof(Display);
+    }
+    memcpy(*ptr, (Window*)&forMarshaling->window, sizeof(Window));
+    *ptr += sizeof(Window);
+}
+
+#endif
+#ifdef VK_KHR_xcb_surface
+void reservedmarshal_VkXcbSurfaceCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkXcbSurfaceCreateInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkXcbSurfaceCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkXcbSurfaceCreateFlagsKHR));
+    *ptr += sizeof(VkXcbSurfaceCreateFlagsKHR);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_110 = (uint64_t)(uintptr_t)forMarshaling->connection;
+    memcpy((*ptr), &cgen_var_110, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->connection)
+    {
+        memcpy(*ptr, (xcb_connection_t*)forMarshaling->connection, sizeof(xcb_connection_t));
+        *ptr += sizeof(xcb_connection_t);
+    }
+    memcpy(*ptr, (xcb_window_t*)&forMarshaling->window, sizeof(xcb_window_t));
+    *ptr += sizeof(xcb_window_t);
+}
+
+#endif
+#ifdef VK_KHR_wayland_surface
+void reservedmarshal_VkWaylandSurfaceCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkWaylandSurfaceCreateInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkWaylandSurfaceCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkWaylandSurfaceCreateFlagsKHR));
+    *ptr += sizeof(VkWaylandSurfaceCreateFlagsKHR);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_111 = (uint64_t)(uintptr_t)forMarshaling->display;
+    memcpy((*ptr), &cgen_var_111, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->display)
+    {
+        memcpy(*ptr, (wl_display*)forMarshaling->display, sizeof(wl_display));
+        *ptr += sizeof(wl_display);
+    }
+    // WARNING PTR CHECK
+    uint64_t cgen_var_112 = (uint64_t)(uintptr_t)forMarshaling->surface;
+    memcpy((*ptr), &cgen_var_112, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->surface)
+    {
+        memcpy(*ptr, (wl_surface*)forMarshaling->surface, sizeof(wl_surface));
+        *ptr += sizeof(wl_surface);
+    }
+}
+
+#endif
+#ifdef VK_KHR_mir_surface
+void reservedmarshal_VkMirSurfaceCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkMirSurfaceCreateInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkMirSurfaceCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkMirSurfaceCreateFlagsKHR));
+    *ptr += sizeof(VkMirSurfaceCreateFlagsKHR);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_113 = (uint64_t)(uintptr_t)forMarshaling->connection;
+    memcpy((*ptr), &cgen_var_113, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->connection)
+    {
+        memcpy(*ptr, (MirConnection*)forMarshaling->connection, sizeof(MirConnection));
+        *ptr += sizeof(MirConnection);
+    }
+    // WARNING PTR CHECK
+    uint64_t cgen_var_114 = (uint64_t)(uintptr_t)forMarshaling->mirSurface;
+    memcpy((*ptr), &cgen_var_114, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->mirSurface)
+    {
+        memcpy(*ptr, (MirSurface*)forMarshaling->mirSurface, sizeof(MirSurface));
+        *ptr += sizeof(MirSurface);
+    }
+}
+
+#endif
+#ifdef VK_KHR_android_surface
+void reservedmarshal_VkAndroidSurfaceCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkAndroidSurfaceCreateInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkAndroidSurfaceCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkAndroidSurfaceCreateFlagsKHR));
+    *ptr += sizeof(VkAndroidSurfaceCreateFlagsKHR);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_115 = (uint64_t)(uintptr_t)forMarshaling->window;
+    memcpy((*ptr), &cgen_var_115, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->window)
+    {
+        memcpy(*ptr, (ANativeWindow*)forMarshaling->window, sizeof(ANativeWindow));
+        *ptr += sizeof(ANativeWindow);
+    }
+}
+
+#endif
+#ifdef VK_KHR_win32_surface
+void reservedmarshal_VkWin32SurfaceCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkWin32SurfaceCreateInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkWin32SurfaceCreateFlagsKHR*)&forMarshaling->flags, sizeof(VkWin32SurfaceCreateFlagsKHR));
+    *ptr += sizeof(VkWin32SurfaceCreateFlagsKHR);
+    memcpy(*ptr, (HINSTANCE*)&forMarshaling->hinstance, sizeof(HINSTANCE));
+    *ptr += sizeof(HINSTANCE);
+    memcpy(*ptr, (HWND*)&forMarshaling->hwnd, sizeof(HWND));
+    *ptr += sizeof(HWND);
+}
+
+#endif
+#ifdef VK_KHR_sampler_mirror_clamp_to_edge
+#endif
+#ifdef VK_KHR_multiview
+#endif
+#ifdef VK_KHR_get_physical_device_properties2
+#endif
+#ifdef VK_KHR_device_group
+#endif
+#ifdef VK_KHR_shader_draw_parameters
+#endif
+#ifdef VK_KHR_maintenance1
+#endif
+#ifdef VK_KHR_device_group_creation
+#endif
+#ifdef VK_KHR_external_memory_capabilities
+#endif
+#ifdef VK_KHR_external_memory
+#endif
+#ifdef VK_KHR_external_memory_win32
+void reservedmarshal_VkImportMemoryWin32HandleInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkImportMemoryWin32HandleInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    *ptr += sizeof(VkExternalMemoryHandleTypeFlagBits);
+    memcpy(*ptr, (HANDLE*)&forMarshaling->handle, sizeof(HANDLE));
+    *ptr += sizeof(HANDLE);
+    memcpy(*ptr, (LPCWSTR*)&forMarshaling->name, sizeof(LPCWSTR));
+    *ptr += sizeof(LPCWSTR);
+}
+
+void reservedmarshal_VkExportMemoryWin32HandleInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkExportMemoryWin32HandleInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_116 = (uint64_t)(uintptr_t)forMarshaling->pAttributes;
+    memcpy((*ptr), &cgen_var_116, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pAttributes)
+    {
+        memcpy(*ptr, (const SECURITY_ATTRIBUTES*)forMarshaling->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
+        *ptr += sizeof(const SECURITY_ATTRIBUTES);
+    }
+    memcpy(*ptr, (DWORD*)&forMarshaling->dwAccess, sizeof(DWORD));
+    *ptr += sizeof(DWORD);
+    memcpy(*ptr, (LPCWSTR*)&forMarshaling->name, sizeof(LPCWSTR));
+    *ptr += sizeof(LPCWSTR);
+}
+
+void reservedmarshal_VkMemoryWin32HandlePropertiesKHR(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryWin32HandlePropertiesKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->memoryTypeBits, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkMemoryGetWin32HandleInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryGetWin32HandleInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_117;
+    *&cgen_var_117 = get_host_u64_VkDeviceMemory((*&forMarshaling->memory));
+    memcpy(*ptr, (uint64_t*)&cgen_var_117, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    *ptr += sizeof(VkExternalMemoryHandleTypeFlagBits);
+}
+
+#endif
+#ifdef VK_KHR_external_memory_fd
+void reservedmarshal_VkImportMemoryFdInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkImportMemoryFdInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    *ptr += sizeof(VkExternalMemoryHandleTypeFlagBits);
+    memcpy(*ptr, (int*)&forMarshaling->fd, sizeof(int));
+    *ptr += sizeof(int);
+}
+
+void reservedmarshal_VkMemoryFdPropertiesKHR(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryFdPropertiesKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->memoryTypeBits, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkMemoryGetFdInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryGetFdInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_118;
+    *&cgen_var_118 = get_host_u64_VkDeviceMemory((*&forMarshaling->memory));
+    memcpy(*ptr, (uint64_t*)&cgen_var_118, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    *ptr += sizeof(VkExternalMemoryHandleTypeFlagBits);
+}
+
+#endif
+#ifdef VK_KHR_win32_keyed_mutex
+void reservedmarshal_VkWin32KeyedMutexAcquireReleaseInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkWin32KeyedMutexAcquireReleaseInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->acquireCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    if (forMarshaling->acquireCount)
+    {
+        uint64_t* cgen_var_119;
+        vkStream->alloc((void**)&cgen_var_119, forMarshaling->acquireCount * 8);
+        for (uint32_t k = 0; k < forMarshaling->acquireCount; ++k)
+        {
+            cgen_var_119[k] = get_host_u64_VkDeviceMemory(forMarshaling->pAcquireSyncs[k]);
+        }
+        memcpy(*ptr, (uint64_t*)cgen_var_119, forMarshaling->acquireCount * 8);
+        *ptr += forMarshaling->acquireCount * 8;
+    }
+    memcpy(*ptr, (const uint64_t*)forMarshaling->pAcquireKeys, forMarshaling->acquireCount * sizeof(const uint64_t));
+    *ptr += forMarshaling->acquireCount * sizeof(const uint64_t);
+    memcpy(*ptr, (const uint32_t*)forMarshaling->pAcquireTimeouts, forMarshaling->acquireCount * sizeof(const uint32_t));
+    *ptr += forMarshaling->acquireCount * sizeof(const uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->releaseCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    if (forMarshaling->releaseCount)
+    {
+        uint64_t* cgen_var_120;
+        vkStream->alloc((void**)&cgen_var_120, forMarshaling->releaseCount * 8);
+        for (uint32_t k = 0; k < forMarshaling->releaseCount; ++k)
+        {
+            cgen_var_120[k] = get_host_u64_VkDeviceMemory(forMarshaling->pReleaseSyncs[k]);
+        }
+        memcpy(*ptr, (uint64_t*)cgen_var_120, forMarshaling->releaseCount * 8);
+        *ptr += forMarshaling->releaseCount * 8;
+    }
+    memcpy(*ptr, (const uint64_t*)forMarshaling->pReleaseKeys, forMarshaling->releaseCount * sizeof(const uint64_t));
+    *ptr += forMarshaling->releaseCount * sizeof(const uint64_t);
+}
+
+#endif
+#ifdef VK_KHR_external_semaphore_capabilities
+#endif
+#ifdef VK_KHR_external_semaphore
+#endif
+#ifdef VK_KHR_external_semaphore_win32
+void reservedmarshal_VkImportSemaphoreWin32HandleInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkImportSemaphoreWin32HandleInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_121;
+    *&cgen_var_121 = get_host_u64_VkSemaphore((*&forMarshaling->semaphore));
+    memcpy(*ptr, (uint64_t*)&cgen_var_121, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkSemaphoreImportFlags*)&forMarshaling->flags, sizeof(VkSemaphoreImportFlags));
+    *ptr += sizeof(VkSemaphoreImportFlags);
+    memcpy(*ptr, (VkExternalSemaphoreHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    *ptr += sizeof(VkExternalSemaphoreHandleTypeFlagBits);
+    memcpy(*ptr, (HANDLE*)&forMarshaling->handle, sizeof(HANDLE));
+    *ptr += sizeof(HANDLE);
+    memcpy(*ptr, (LPCWSTR*)&forMarshaling->name, sizeof(LPCWSTR));
+    *ptr += sizeof(LPCWSTR);
+}
+
+void reservedmarshal_VkExportSemaphoreWin32HandleInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkExportSemaphoreWin32HandleInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_122 = (uint64_t)(uintptr_t)forMarshaling->pAttributes;
+    memcpy((*ptr), &cgen_var_122, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pAttributes)
+    {
+        memcpy(*ptr, (const SECURITY_ATTRIBUTES*)forMarshaling->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
+        *ptr += sizeof(const SECURITY_ATTRIBUTES);
+    }
+    memcpy(*ptr, (DWORD*)&forMarshaling->dwAccess, sizeof(DWORD));
+    *ptr += sizeof(DWORD);
+    memcpy(*ptr, (LPCWSTR*)&forMarshaling->name, sizeof(LPCWSTR));
+    *ptr += sizeof(LPCWSTR);
+}
+
+void reservedmarshal_VkD3D12FenceSubmitInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkD3D12FenceSubmitInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->waitSemaphoreValuesCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_123 = (uint64_t)(uintptr_t)forMarshaling->pWaitSemaphoreValues;
+    memcpy((*ptr), &cgen_var_123, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pWaitSemaphoreValues)
+    {
+        memcpy(*ptr, (const uint64_t*)forMarshaling->pWaitSemaphoreValues, forMarshaling->waitSemaphoreValuesCount * sizeof(const uint64_t));
+        *ptr += forMarshaling->waitSemaphoreValuesCount * sizeof(const uint64_t);
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->signalSemaphoreValuesCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_124 = (uint64_t)(uintptr_t)forMarshaling->pSignalSemaphoreValues;
+    memcpy((*ptr), &cgen_var_124, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pSignalSemaphoreValues)
+    {
+        memcpy(*ptr, (const uint64_t*)forMarshaling->pSignalSemaphoreValues, forMarshaling->signalSemaphoreValuesCount * sizeof(const uint64_t));
+        *ptr += forMarshaling->signalSemaphoreValuesCount * sizeof(const uint64_t);
+    }
+}
+
+void reservedmarshal_VkSemaphoreGetWin32HandleInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkSemaphoreGetWin32HandleInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_125;
+    *&cgen_var_125 = get_host_u64_VkSemaphore((*&forMarshaling->semaphore));
+    memcpy(*ptr, (uint64_t*)&cgen_var_125, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkExternalSemaphoreHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    *ptr += sizeof(VkExternalSemaphoreHandleTypeFlagBits);
+}
+
+#endif
+#ifdef VK_KHR_external_semaphore_fd
+void reservedmarshal_VkImportSemaphoreFdInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkImportSemaphoreFdInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_126;
+    *&cgen_var_126 = get_host_u64_VkSemaphore((*&forMarshaling->semaphore));
+    memcpy(*ptr, (uint64_t*)&cgen_var_126, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkSemaphoreImportFlags*)&forMarshaling->flags, sizeof(VkSemaphoreImportFlags));
+    *ptr += sizeof(VkSemaphoreImportFlags);
+    memcpy(*ptr, (VkExternalSemaphoreHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    *ptr += sizeof(VkExternalSemaphoreHandleTypeFlagBits);
+    memcpy(*ptr, (int*)&forMarshaling->fd, sizeof(int));
+    *ptr += sizeof(int);
+}
+
+void reservedmarshal_VkSemaphoreGetFdInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkSemaphoreGetFdInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_127;
+    *&cgen_var_127 = get_host_u64_VkSemaphore((*&forMarshaling->semaphore));
+    memcpy(*ptr, (uint64_t*)&cgen_var_127, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkExternalSemaphoreHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalSemaphoreHandleTypeFlagBits));
+    *ptr += sizeof(VkExternalSemaphoreHandleTypeFlagBits);
+}
+
+#endif
+#ifdef VK_KHR_push_descriptor
+void reservedmarshal_VkPhysicalDevicePushDescriptorPropertiesKHR(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDevicePushDescriptorPropertiesKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxPushDescriptors, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+#endif
+#ifdef VK_KHR_16bit_storage
+#endif
+#ifdef VK_KHR_incremental_present
+void reservedmarshal_VkRectLayerKHR(
+    VulkanStreamGuest* vkStream,
+    const VkRectLayerKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    reservedmarshal_VkOffset2D(vkStream, (VkOffset2D*)(&forMarshaling->offset), ptr);
+    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->extent), ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->layer, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkPresentRegionKHR(
+    VulkanStreamGuest* vkStream,
+    const VkPresentRegionKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->rectangleCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_128 = (uint64_t)(uintptr_t)forMarshaling->pRectangles;
+    memcpy((*ptr), &cgen_var_128, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pRectangles)
+    {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->rectangleCount; ++i)
+        {
+            reservedmarshal_VkRectLayerKHR(vkStream, (const VkRectLayerKHR*)(forMarshaling->pRectangles + i), ptr);
+        }
+    }
+}
+
+void reservedmarshal_VkPresentRegionsKHR(
+    VulkanStreamGuest* vkStream,
+    const VkPresentRegionsKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->swapchainCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_129 = (uint64_t)(uintptr_t)forMarshaling->pRegions;
+    memcpy((*ptr), &cgen_var_129, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pRegions)
+    {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->swapchainCount; ++i)
+        {
+            reservedmarshal_VkPresentRegionKHR(vkStream, (const VkPresentRegionKHR*)(forMarshaling->pRegions + i), ptr);
+        }
+    }
+}
+
+#endif
+#ifdef VK_KHR_descriptor_update_template
+#endif
+#ifdef VK_KHR_create_renderpass2
+void reservedmarshal_VkAttachmentDescription2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkAttachmentDescription2KHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkAttachmentDescriptionFlags*)&forMarshaling->flags, sizeof(VkAttachmentDescriptionFlags));
+    *ptr += sizeof(VkAttachmentDescriptionFlags);
+    memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
+    *ptr += sizeof(VkFormat);
+    memcpy(*ptr, (VkSampleCountFlagBits*)&forMarshaling->samples, sizeof(VkSampleCountFlagBits));
+    *ptr += sizeof(VkSampleCountFlagBits);
+    memcpy(*ptr, (VkAttachmentLoadOp*)&forMarshaling->loadOp, sizeof(VkAttachmentLoadOp));
+    *ptr += sizeof(VkAttachmentLoadOp);
+    memcpy(*ptr, (VkAttachmentStoreOp*)&forMarshaling->storeOp, sizeof(VkAttachmentStoreOp));
+    *ptr += sizeof(VkAttachmentStoreOp);
+    memcpy(*ptr, (VkAttachmentLoadOp*)&forMarshaling->stencilLoadOp, sizeof(VkAttachmentLoadOp));
+    *ptr += sizeof(VkAttachmentLoadOp);
+    memcpy(*ptr, (VkAttachmentStoreOp*)&forMarshaling->stencilStoreOp, sizeof(VkAttachmentStoreOp));
+    *ptr += sizeof(VkAttachmentStoreOp);
+    memcpy(*ptr, (VkImageLayout*)&forMarshaling->initialLayout, sizeof(VkImageLayout));
+    *ptr += sizeof(VkImageLayout);
+    memcpy(*ptr, (VkImageLayout*)&forMarshaling->finalLayout, sizeof(VkImageLayout));
+    *ptr += sizeof(VkImageLayout);
+}
+
+void reservedmarshal_VkAttachmentReference2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkAttachmentReference2KHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->attachment, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkImageLayout*)&forMarshaling->layout, sizeof(VkImageLayout));
+    *ptr += sizeof(VkImageLayout);
+    memcpy(*ptr, (VkImageAspectFlags*)&forMarshaling->aspectMask, sizeof(VkImageAspectFlags));
+    *ptr += sizeof(VkImageAspectFlags);
+}
+
+void reservedmarshal_VkSubpassDescription2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkSubpassDescription2KHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkSubpassDescriptionFlags*)&forMarshaling->flags, sizeof(VkSubpassDescriptionFlags));
+    *ptr += sizeof(VkSubpassDescriptionFlags);
+    memcpy(*ptr, (VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
+    *ptr += sizeof(VkPipelineBindPoint);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->viewMask, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->inputAttachmentCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->inputAttachmentCount; ++i)
+    {
+        reservedmarshal_VkAttachmentReference2KHR(vkStream, (const VkAttachmentReference2KHR*)(forMarshaling->pInputAttachments + i), ptr);
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->colorAttachmentCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->colorAttachmentCount; ++i)
+    {
+        reservedmarshal_VkAttachmentReference2KHR(vkStream, (const VkAttachmentReference2KHR*)(forMarshaling->pColorAttachments + i), ptr);
+    }
+    // WARNING PTR CHECK
+    uint64_t cgen_var_130 = (uint64_t)(uintptr_t)forMarshaling->pResolveAttachments;
+    memcpy((*ptr), &cgen_var_130, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pResolveAttachments)
+    {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->colorAttachmentCount; ++i)
+        {
+            reservedmarshal_VkAttachmentReference2KHR(vkStream, (const VkAttachmentReference2KHR*)(forMarshaling->pResolveAttachments + i), ptr);
+        }
+    }
+    // WARNING PTR CHECK
+    uint64_t cgen_var_131 = (uint64_t)(uintptr_t)forMarshaling->pDepthStencilAttachment;
+    memcpy((*ptr), &cgen_var_131, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pDepthStencilAttachment)
+    {
+        reservedmarshal_VkAttachmentReference2KHR(vkStream, (const VkAttachmentReference2KHR*)(forMarshaling->pDepthStencilAttachment), ptr);
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->preserveAttachmentCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (const uint32_t*)forMarshaling->pPreserveAttachments, forMarshaling->preserveAttachmentCount * sizeof(const uint32_t));
+    *ptr += forMarshaling->preserveAttachmentCount * sizeof(const uint32_t);
+}
+
+void reservedmarshal_VkSubpassDependency2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkSubpassDependency2KHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->srcSubpass, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->dstSubpass, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkPipelineStageFlags*)&forMarshaling->srcStageMask, sizeof(VkPipelineStageFlags));
+    *ptr += sizeof(VkPipelineStageFlags);
+    memcpy(*ptr, (VkPipelineStageFlags*)&forMarshaling->dstStageMask, sizeof(VkPipelineStageFlags));
+    *ptr += sizeof(VkPipelineStageFlags);
+    memcpy(*ptr, (VkAccessFlags*)&forMarshaling->srcAccessMask, sizeof(VkAccessFlags));
+    *ptr += sizeof(VkAccessFlags);
+    memcpy(*ptr, (VkAccessFlags*)&forMarshaling->dstAccessMask, sizeof(VkAccessFlags));
+    *ptr += sizeof(VkAccessFlags);
+    memcpy(*ptr, (VkDependencyFlags*)&forMarshaling->dependencyFlags, sizeof(VkDependencyFlags));
+    *ptr += sizeof(VkDependencyFlags);
+    memcpy(*ptr, (int32_t*)&forMarshaling->viewOffset, sizeof(int32_t));
+    *ptr += sizeof(int32_t);
+}
+
+void reservedmarshal_VkRenderPassCreateInfo2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkRenderPassCreateInfo2KHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkRenderPassCreateFlags*)&forMarshaling->flags, sizeof(VkRenderPassCreateFlags));
+    *ptr += sizeof(VkRenderPassCreateFlags);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->attachmentCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->attachmentCount; ++i)
+    {
+        reservedmarshal_VkAttachmentDescription2KHR(vkStream, (const VkAttachmentDescription2KHR*)(forMarshaling->pAttachments + i), ptr);
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->subpassCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->subpassCount; ++i)
+    {
+        reservedmarshal_VkSubpassDescription2KHR(vkStream, (const VkSubpassDescription2KHR*)(forMarshaling->pSubpasses + i), ptr);
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->dependencyCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->dependencyCount; ++i)
+    {
+        reservedmarshal_VkSubpassDependency2KHR(vkStream, (const VkSubpassDependency2KHR*)(forMarshaling->pDependencies + i), ptr);
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->correlatedViewMaskCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (const uint32_t*)forMarshaling->pCorrelatedViewMasks, forMarshaling->correlatedViewMaskCount * sizeof(const uint32_t));
+    *ptr += forMarshaling->correlatedViewMaskCount * sizeof(const uint32_t);
+}
+
+void reservedmarshal_VkSubpassBeginInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkSubpassBeginInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkSubpassContents*)&forMarshaling->contents, sizeof(VkSubpassContents));
+    *ptr += sizeof(VkSubpassContents);
+}
+
+void reservedmarshal_VkSubpassEndInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkSubpassEndInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+}
+
+#endif
+#ifdef VK_KHR_shared_presentable_image
+void reservedmarshal_VkSharedPresentSurfaceCapabilitiesKHR(
+    VulkanStreamGuest* vkStream,
+    const VkSharedPresentSurfaceCapabilitiesKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkImageUsageFlags*)&forMarshaling->sharedPresentSupportedUsageFlags, sizeof(VkImageUsageFlags));
+    *ptr += sizeof(VkImageUsageFlags);
+}
+
+#endif
+#ifdef VK_KHR_external_fence_capabilities
+#endif
+#ifdef VK_KHR_external_fence
+#endif
+#ifdef VK_KHR_external_fence_win32
+void reservedmarshal_VkImportFenceWin32HandleInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkImportFenceWin32HandleInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_132;
+    *&cgen_var_132 = get_host_u64_VkFence((*&forMarshaling->fence));
+    memcpy(*ptr, (uint64_t*)&cgen_var_132, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkFenceImportFlags*)&forMarshaling->flags, sizeof(VkFenceImportFlags));
+    *ptr += sizeof(VkFenceImportFlags);
+    memcpy(*ptr, (VkExternalFenceHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalFenceHandleTypeFlagBits));
+    *ptr += sizeof(VkExternalFenceHandleTypeFlagBits);
+    memcpy(*ptr, (HANDLE*)&forMarshaling->handle, sizeof(HANDLE));
+    *ptr += sizeof(HANDLE);
+    memcpy(*ptr, (LPCWSTR*)&forMarshaling->name, sizeof(LPCWSTR));
+    *ptr += sizeof(LPCWSTR);
+}
+
+void reservedmarshal_VkExportFenceWin32HandleInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkExportFenceWin32HandleInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_133 = (uint64_t)(uintptr_t)forMarshaling->pAttributes;
+    memcpy((*ptr), &cgen_var_133, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pAttributes)
+    {
+        memcpy(*ptr, (const SECURITY_ATTRIBUTES*)forMarshaling->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
+        *ptr += sizeof(const SECURITY_ATTRIBUTES);
+    }
+    memcpy(*ptr, (DWORD*)&forMarshaling->dwAccess, sizeof(DWORD));
+    *ptr += sizeof(DWORD);
+    memcpy(*ptr, (LPCWSTR*)&forMarshaling->name, sizeof(LPCWSTR));
+    *ptr += sizeof(LPCWSTR);
+}
+
+void reservedmarshal_VkFenceGetWin32HandleInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkFenceGetWin32HandleInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_134;
+    *&cgen_var_134 = get_host_u64_VkFence((*&forMarshaling->fence));
+    memcpy(*ptr, (uint64_t*)&cgen_var_134, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkExternalFenceHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalFenceHandleTypeFlagBits));
+    *ptr += sizeof(VkExternalFenceHandleTypeFlagBits);
+}
+
+#endif
+#ifdef VK_KHR_external_fence_fd
+void reservedmarshal_VkImportFenceFdInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkImportFenceFdInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_135;
+    *&cgen_var_135 = get_host_u64_VkFence((*&forMarshaling->fence));
+    memcpy(*ptr, (uint64_t*)&cgen_var_135, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkFenceImportFlags*)&forMarshaling->flags, sizeof(VkFenceImportFlags));
+    *ptr += sizeof(VkFenceImportFlags);
+    memcpy(*ptr, (VkExternalFenceHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalFenceHandleTypeFlagBits));
+    *ptr += sizeof(VkExternalFenceHandleTypeFlagBits);
+    memcpy(*ptr, (int*)&forMarshaling->fd, sizeof(int));
+    *ptr += sizeof(int);
+}
+
+void reservedmarshal_VkFenceGetFdInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkFenceGetFdInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_136;
+    *&cgen_var_136 = get_host_u64_VkFence((*&forMarshaling->fence));
+    memcpy(*ptr, (uint64_t*)&cgen_var_136, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkExternalFenceHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalFenceHandleTypeFlagBits));
+    *ptr += sizeof(VkExternalFenceHandleTypeFlagBits);
+}
+
+#endif
+#ifdef VK_KHR_maintenance2
+#endif
+#ifdef VK_KHR_get_surface_capabilities2
+void reservedmarshal_VkPhysicalDeviceSurfaceInfo2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceSurfaceInfo2KHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_137;
+    *&cgen_var_137 = get_host_u64_VkSurfaceKHR((*&forMarshaling->surface));
+    memcpy(*ptr, (uint64_t*)&cgen_var_137, 1 * 8);
+    *ptr += 1 * 8;
+}
+
+void reservedmarshal_VkSurfaceCapabilities2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkSurfaceCapabilities2KHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    reservedmarshal_VkSurfaceCapabilitiesKHR(vkStream, (VkSurfaceCapabilitiesKHR*)(&forMarshaling->surfaceCapabilities), ptr);
+}
+
+void reservedmarshal_VkSurfaceFormat2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkSurfaceFormat2KHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    reservedmarshal_VkSurfaceFormatKHR(vkStream, (VkSurfaceFormatKHR*)(&forMarshaling->surfaceFormat), ptr);
+}
+
+#endif
+#ifdef VK_KHR_variable_pointers
+#endif
+#ifdef VK_KHR_get_display_properties2
+void reservedmarshal_VkDisplayProperties2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayProperties2KHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    reservedmarshal_VkDisplayPropertiesKHR(vkStream, (VkDisplayPropertiesKHR*)(&forMarshaling->displayProperties), ptr);
+}
+
+void reservedmarshal_VkDisplayPlaneProperties2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayPlaneProperties2KHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    reservedmarshal_VkDisplayPlanePropertiesKHR(vkStream, (VkDisplayPlanePropertiesKHR*)(&forMarshaling->displayPlaneProperties), ptr);
+}
+
+void reservedmarshal_VkDisplayModeProperties2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayModeProperties2KHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    reservedmarshal_VkDisplayModePropertiesKHR(vkStream, (VkDisplayModePropertiesKHR*)(&forMarshaling->displayModeProperties), ptr);
+}
+
+void reservedmarshal_VkDisplayPlaneInfo2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayPlaneInfo2KHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_138;
+    *&cgen_var_138 = get_host_u64_VkDisplayModeKHR((*&forMarshaling->mode));
+    memcpy(*ptr, (uint64_t*)&cgen_var_138, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->planeIndex, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkDisplayPlaneCapabilities2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayPlaneCapabilities2KHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    reservedmarshal_VkDisplayPlaneCapabilitiesKHR(vkStream, (VkDisplayPlaneCapabilitiesKHR*)(&forMarshaling->capabilities), ptr);
+}
+
+#endif
+#ifdef VK_KHR_dedicated_allocation
+#endif
+#ifdef VK_KHR_storage_buffer_storage_class
+#endif
+#ifdef VK_KHR_relaxed_block_layout
+#endif
+#ifdef VK_KHR_get_memory_requirements2
+#endif
+#ifdef VK_KHR_image_format_list
+void reservedmarshal_VkImageFormatListCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkImageFormatListCreateInfoKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->viewFormatCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (const VkFormat*)forMarshaling->pViewFormats, forMarshaling->viewFormatCount * sizeof(const VkFormat));
+    *ptr += forMarshaling->viewFormatCount * sizeof(const VkFormat);
+}
+
+#endif
+#ifdef VK_KHR_sampler_ycbcr_conversion
+#endif
+#ifdef VK_KHR_bind_memory2
+#endif
+#ifdef VK_KHR_maintenance3
+#endif
+#ifdef VK_KHR_draw_indirect_count
+#endif
+#ifdef VK_KHR_8bit_storage
+void reservedmarshal_VkPhysicalDevice8BitStorageFeaturesKHR(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDevice8BitStorageFeaturesKHR* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->storageBuffer8BitAccess, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->uniformAndStorageBuffer8BitAccess, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->storagePushConstant8, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+#endif
+#ifdef VK_KHR_shader_float16_int8
+void reservedmarshal_VkPhysicalDeviceShaderFloat16Int8Features(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceShaderFloat16Int8Features* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderFloat16, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderInt8, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+#endif
+#ifdef VK_ANDROID_native_buffer
+void reservedmarshal_VkNativeBufferANDROID(
+    VulkanStreamGuest* vkStream,
+    const VkNativeBufferANDROID* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_139 = (uint64_t)(uintptr_t)forMarshaling->handle;
+    memcpy((*ptr), &cgen_var_139, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->handle)
+    {
+        memcpy(*ptr, (const uint32_t*)forMarshaling->handle, sizeof(const uint32_t));
+        *ptr += sizeof(const uint32_t);
+    }
+    memcpy(*ptr, (int*)&forMarshaling->stride, sizeof(int));
+    *ptr += sizeof(int);
+    memcpy(*ptr, (int*)&forMarshaling->format, sizeof(int));
+    *ptr += sizeof(int);
+    memcpy(*ptr, (int*)&forMarshaling->usage, sizeof(int));
+    *ptr += sizeof(int);
+    memcpy(*ptr, (uint64_t*)&forMarshaling->consumer, sizeof(uint64_t));
+    *ptr += sizeof(uint64_t);
+    memcpy(*ptr, (uint64_t*)&forMarshaling->producer, sizeof(uint64_t));
+    *ptr += sizeof(uint64_t);
+}
+
+#endif
+#ifdef VK_EXT_debug_report
+void reservedmarshal_VkDebugReportCallbackCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDebugReportCallbackCreateInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkDebugReportFlagsEXT*)&forMarshaling->flags, sizeof(VkDebugReportFlagsEXT));
+    *ptr += sizeof(VkDebugReportFlagsEXT);
+    uint64_t cgen_var_140 = (uint64_t)forMarshaling->pfnCallback;
+    memcpy((*ptr), &cgen_var_140, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    // WARNING PTR CHECK
+    uint64_t cgen_var_141 = (uint64_t)(uintptr_t)forMarshaling->pUserData;
+    memcpy((*ptr), &cgen_var_141, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pUserData)
+    {
+        memcpy(*ptr, (void*)forMarshaling->pUserData, sizeof(uint8_t));
+        *ptr += sizeof(uint8_t);
+    }
+}
+
+#endif
+#ifdef VK_NV_glsl_shader
+#endif
+#ifdef VK_EXT_depth_range_unrestricted
+#endif
+#ifdef VK_IMG_filter_cubic
+#endif
+#ifdef VK_AMD_rasterization_order
+void reservedmarshal_VkPipelineRasterizationStateRasterizationOrderAMD(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineRasterizationStateRasterizationOrderAMD* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkRasterizationOrderAMD*)&forMarshaling->rasterizationOrder, sizeof(VkRasterizationOrderAMD));
+    *ptr += sizeof(VkRasterizationOrderAMD);
+}
+
+#endif
+#ifdef VK_AMD_shader_trinary_minmax
+#endif
+#ifdef VK_AMD_shader_explicit_vertex_parameter
+#endif
+#ifdef VK_EXT_debug_marker
+void reservedmarshal_VkDebugMarkerObjectNameInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDebugMarkerObjectNameInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkDebugReportObjectTypeEXT*)&forMarshaling->objectType, sizeof(VkDebugReportObjectTypeEXT));
+    *ptr += sizeof(VkDebugReportObjectTypeEXT);
+    memcpy(*ptr, (uint64_t*)&forMarshaling->object, sizeof(uint64_t));
+    *ptr += sizeof(uint64_t);
+    {
+        uint32_t l = forMarshaling->pObjectName ? strlen(forMarshaling->pObjectName): 0;
+        memcpy(*ptr, (uint32_t*)&l, sizeof(uint32_t));
+        android::base::Stream::toBe32((uint8_t*)*ptr);
+        *ptr += sizeof(uint32_t);
+        memcpy(*ptr, (char*)forMarshaling->pObjectName, l);
+        *ptr += l;
+    }
+}
+
+void reservedmarshal_VkDebugMarkerObjectTagInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDebugMarkerObjectTagInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkDebugReportObjectTypeEXT*)&forMarshaling->objectType, sizeof(VkDebugReportObjectTypeEXT));
+    *ptr += sizeof(VkDebugReportObjectTypeEXT);
+    memcpy(*ptr, (uint64_t*)&forMarshaling->object, sizeof(uint64_t));
+    *ptr += sizeof(uint64_t);
+    memcpy(*ptr, (uint64_t*)&forMarshaling->tagName, sizeof(uint64_t));
+    *ptr += sizeof(uint64_t);
+    uint64_t cgen_var_142 = (uint64_t)forMarshaling->tagSize;
+    memcpy((*ptr), &cgen_var_142, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    memcpy(*ptr, (const void*)forMarshaling->pTag, forMarshaling->tagSize * sizeof(const uint8_t));
+    *ptr += forMarshaling->tagSize * sizeof(const uint8_t);
+}
+
+void reservedmarshal_VkDebugMarkerMarkerInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDebugMarkerMarkerInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    {
+        uint32_t l = forMarshaling->pMarkerName ? strlen(forMarshaling->pMarkerName): 0;
+        memcpy(*ptr, (uint32_t*)&l, sizeof(uint32_t));
+        android::base::Stream::toBe32((uint8_t*)*ptr);
+        *ptr += sizeof(uint32_t);
+        memcpy(*ptr, (char*)forMarshaling->pMarkerName, l);
+        *ptr += l;
+    }
+    memcpy(*ptr, (float*)forMarshaling->color, 4 * sizeof(float));
+    *ptr += 4 * sizeof(float);
+}
+
+#endif
+#ifdef VK_AMD_gcn_shader
+#endif
+#ifdef VK_NV_dedicated_allocation
+void reservedmarshal_VkDedicatedAllocationImageCreateInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkDedicatedAllocationImageCreateInfoNV* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->dedicatedAllocation, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkDedicatedAllocationBufferCreateInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkDedicatedAllocationBufferCreateInfoNV* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->dedicatedAllocation, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkDedicatedAllocationMemoryAllocateInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkDedicatedAllocationMemoryAllocateInfoNV* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_143;
+    *&cgen_var_143 = get_host_u64_VkImage((*&forMarshaling->image));
+    memcpy(*ptr, (uint64_t*)&cgen_var_143, 1 * 8);
+    *ptr += 1 * 8;
+    uint64_t cgen_var_144;
+    *&cgen_var_144 = get_host_u64_VkBuffer((*&forMarshaling->buffer));
+    memcpy(*ptr, (uint64_t*)&cgen_var_144, 1 * 8);
+    *ptr += 1 * 8;
+}
+
+#endif
+#ifdef VK_AMD_draw_indirect_count
+#endif
+#ifdef VK_AMD_negative_viewport_height
+#endif
+#ifdef VK_AMD_gpu_shader_half_float
+#endif
+#ifdef VK_AMD_shader_ballot
+#endif
+#ifdef VK_AMD_texture_gather_bias_lod
+void reservedmarshal_VkTextureLODGatherFormatPropertiesAMD(
+    VulkanStreamGuest* vkStream,
+    const VkTextureLODGatherFormatPropertiesAMD* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->supportsTextureGatherLODBiasAMD, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+#endif
+#ifdef VK_AMD_shader_info
+void reservedmarshal_VkShaderResourceUsageAMD(
+    VulkanStreamGuest* vkStream,
+    const VkShaderResourceUsageAMD* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->numUsedVgprs, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->numUsedSgprs, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->ldsSizePerLocalWorkGroup, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    uint64_t cgen_var_145 = (uint64_t)forMarshaling->ldsUsageSizeInBytes;
+    memcpy((*ptr), &cgen_var_145, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    uint64_t cgen_var_146 = (uint64_t)forMarshaling->scratchMemUsageInBytes;
+    memcpy((*ptr), &cgen_var_146, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+}
+
+void reservedmarshal_VkShaderStatisticsInfoAMD(
+    VulkanStreamGuest* vkStream,
+    const VkShaderStatisticsInfoAMD* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkShaderStageFlags*)&forMarshaling->shaderStageMask, sizeof(VkShaderStageFlags));
+    *ptr += sizeof(VkShaderStageFlags);
+    reservedmarshal_VkShaderResourceUsageAMD(vkStream, (VkShaderResourceUsageAMD*)(&forMarshaling->resourceUsage), ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->numPhysicalVgprs, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->numPhysicalSgprs, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->numAvailableVgprs, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->numAvailableSgprs, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)forMarshaling->computeWorkGroupSize, 3 * sizeof(uint32_t));
+    *ptr += 3 * sizeof(uint32_t);
+}
+
+#endif
+#ifdef VK_AMD_shader_image_load_store_lod
+#endif
+#ifdef VK_IMG_format_pvrtc
+#endif
+#ifdef VK_NV_external_memory_capabilities
+void reservedmarshal_VkExternalImageFormatPropertiesNV(
+    VulkanStreamGuest* vkStream,
+    const VkExternalImageFormatPropertiesNV* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    reservedmarshal_VkImageFormatProperties(vkStream, (VkImageFormatProperties*)(&forMarshaling->imageFormatProperties), ptr);
+    memcpy(*ptr, (VkExternalMemoryFeatureFlagsNV*)&forMarshaling->externalMemoryFeatures, sizeof(VkExternalMemoryFeatureFlagsNV));
+    *ptr += sizeof(VkExternalMemoryFeatureFlagsNV);
+    memcpy(*ptr, (VkExternalMemoryHandleTypeFlagsNV*)&forMarshaling->exportFromImportedHandleTypes, sizeof(VkExternalMemoryHandleTypeFlagsNV));
+    *ptr += sizeof(VkExternalMemoryHandleTypeFlagsNV);
+    memcpy(*ptr, (VkExternalMemoryHandleTypeFlagsNV*)&forMarshaling->compatibleHandleTypes, sizeof(VkExternalMemoryHandleTypeFlagsNV));
+    *ptr += sizeof(VkExternalMemoryHandleTypeFlagsNV);
+}
+
+#endif
+#ifdef VK_NV_external_memory
+void reservedmarshal_VkExternalMemoryImageCreateInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkExternalMemoryImageCreateInfoNV* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkExternalMemoryHandleTypeFlagsNV*)&forMarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlagsNV));
+    *ptr += sizeof(VkExternalMemoryHandleTypeFlagsNV);
+}
+
+void reservedmarshal_VkExportMemoryAllocateInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkExportMemoryAllocateInfoNV* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkExternalMemoryHandleTypeFlagsNV*)&forMarshaling->handleTypes, sizeof(VkExternalMemoryHandleTypeFlagsNV));
+    *ptr += sizeof(VkExternalMemoryHandleTypeFlagsNV);
+}
+
+#endif
+#ifdef VK_NV_external_memory_win32
+void reservedmarshal_VkImportMemoryWin32HandleInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkImportMemoryWin32HandleInfoNV* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkExternalMemoryHandleTypeFlagsNV*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagsNV));
+    *ptr += sizeof(VkExternalMemoryHandleTypeFlagsNV);
+    memcpy(*ptr, (HANDLE*)&forMarshaling->handle, sizeof(HANDLE));
+    *ptr += sizeof(HANDLE);
+}
+
+void reservedmarshal_VkExportMemoryWin32HandleInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkExportMemoryWin32HandleInfoNV* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_147 = (uint64_t)(uintptr_t)forMarshaling->pAttributes;
+    memcpy((*ptr), &cgen_var_147, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pAttributes)
+    {
+        memcpy(*ptr, (const SECURITY_ATTRIBUTES*)forMarshaling->pAttributes, sizeof(const SECURITY_ATTRIBUTES));
+        *ptr += sizeof(const SECURITY_ATTRIBUTES);
+    }
+    memcpy(*ptr, (DWORD*)&forMarshaling->dwAccess, sizeof(DWORD));
+    *ptr += sizeof(DWORD);
+}
+
+#endif
+#ifdef VK_NV_win32_keyed_mutex
+void reservedmarshal_VkWin32KeyedMutexAcquireReleaseInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkWin32KeyedMutexAcquireReleaseInfoNV* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->acquireCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    if (forMarshaling->acquireCount)
+    {
+        uint64_t* cgen_var_148;
+        vkStream->alloc((void**)&cgen_var_148, forMarshaling->acquireCount * 8);
+        for (uint32_t k = 0; k < forMarshaling->acquireCount; ++k)
+        {
+            cgen_var_148[k] = get_host_u64_VkDeviceMemory(forMarshaling->pAcquireSyncs[k]);
+        }
+        memcpy(*ptr, (uint64_t*)cgen_var_148, forMarshaling->acquireCount * 8);
+        *ptr += forMarshaling->acquireCount * 8;
+    }
+    memcpy(*ptr, (const uint64_t*)forMarshaling->pAcquireKeys, forMarshaling->acquireCount * sizeof(const uint64_t));
+    *ptr += forMarshaling->acquireCount * sizeof(const uint64_t);
+    memcpy(*ptr, (const uint32_t*)forMarshaling->pAcquireTimeoutMilliseconds, forMarshaling->acquireCount * sizeof(const uint32_t));
+    *ptr += forMarshaling->acquireCount * sizeof(const uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->releaseCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    if (forMarshaling->releaseCount)
+    {
+        uint64_t* cgen_var_149;
+        vkStream->alloc((void**)&cgen_var_149, forMarshaling->releaseCount * 8);
+        for (uint32_t k = 0; k < forMarshaling->releaseCount; ++k)
+        {
+            cgen_var_149[k] = get_host_u64_VkDeviceMemory(forMarshaling->pReleaseSyncs[k]);
+        }
+        memcpy(*ptr, (uint64_t*)cgen_var_149, forMarshaling->releaseCount * 8);
+        *ptr += forMarshaling->releaseCount * 8;
+    }
+    memcpy(*ptr, (const uint64_t*)forMarshaling->pReleaseKeys, forMarshaling->releaseCount * sizeof(const uint64_t));
+    *ptr += forMarshaling->releaseCount * sizeof(const uint64_t);
+}
+
+#endif
+#ifdef VK_EXT_validation_flags
+void reservedmarshal_VkValidationFlagsEXT(
+    VulkanStreamGuest* vkStream,
+    const VkValidationFlagsEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->disabledValidationCheckCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (const VkValidationCheckEXT*)forMarshaling->pDisabledValidationChecks, forMarshaling->disabledValidationCheckCount * sizeof(const VkValidationCheckEXT));
+    *ptr += forMarshaling->disabledValidationCheckCount * sizeof(const VkValidationCheckEXT);
+}
+
+#endif
+#ifdef VK_NN_vi_surface
+void reservedmarshal_VkViSurfaceCreateInfoNN(
+    VulkanStreamGuest* vkStream,
+    const VkViSurfaceCreateInfoNN* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkViSurfaceCreateFlagsNN*)&forMarshaling->flags, sizeof(VkViSurfaceCreateFlagsNN));
+    *ptr += sizeof(VkViSurfaceCreateFlagsNN);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_150 = (uint64_t)(uintptr_t)forMarshaling->window;
+    memcpy((*ptr), &cgen_var_150, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->window)
+    {
+        memcpy(*ptr, (void*)forMarshaling->window, sizeof(uint8_t));
+        *ptr += sizeof(uint8_t);
+    }
+}
+
+#endif
+#ifdef VK_EXT_shader_subgroup_ballot
+#endif
+#ifdef VK_EXT_shader_subgroup_vote
+#endif
+#ifdef VK_EXT_conditional_rendering
+void reservedmarshal_VkConditionalRenderingBeginInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkConditionalRenderingBeginInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_151;
+    *&cgen_var_151 = get_host_u64_VkBuffer((*&forMarshaling->buffer));
+    memcpy(*ptr, (uint64_t*)&cgen_var_151, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->offset, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkConditionalRenderingFlagsEXT*)&forMarshaling->flags, sizeof(VkConditionalRenderingFlagsEXT));
+    *ptr += sizeof(VkConditionalRenderingFlagsEXT);
+}
+
+void reservedmarshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceConditionalRenderingFeaturesEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->conditionalRendering, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->inheritedConditionalRendering, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkCommandBufferInheritanceConditionalRenderingInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->conditionalRenderingEnable, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+#endif
+#ifdef VK_NVX_device_generated_commands
+void reservedmarshal_VkDeviceGeneratedCommandsFeaturesNVX(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceGeneratedCommandsFeaturesNVX* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->computeBindingPointSupport, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkDeviceGeneratedCommandsLimitsNVX(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceGeneratedCommandsLimitsNVX* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxIndirectCommandsLayoutTokenCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxObjectEntryCounts, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->minSequenceCountBufferOffsetAlignment, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->minSequenceIndexBufferOffsetAlignment, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->minCommandsTokenBufferOffsetAlignment, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkIndirectCommandsTokenNVX(
+    VulkanStreamGuest* vkStream,
+    const VkIndirectCommandsTokenNVX* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkIndirectCommandsTokenTypeNVX*)&forMarshaling->tokenType, sizeof(VkIndirectCommandsTokenTypeNVX));
+    *ptr += sizeof(VkIndirectCommandsTokenTypeNVX);
+    uint64_t cgen_var_152;
+    *&cgen_var_152 = get_host_u64_VkBuffer((*&forMarshaling->buffer));
+    memcpy(*ptr, (uint64_t*)&cgen_var_152, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->offset, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+}
+
+void reservedmarshal_VkIndirectCommandsLayoutTokenNVX(
+    VulkanStreamGuest* vkStream,
+    const VkIndirectCommandsLayoutTokenNVX* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkIndirectCommandsTokenTypeNVX*)&forMarshaling->tokenType, sizeof(VkIndirectCommandsTokenTypeNVX));
+    *ptr += sizeof(VkIndirectCommandsTokenTypeNVX);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->bindingUnit, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->dynamicCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->divisor, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkIndirectCommandsLayoutCreateInfoNVX(
+    VulkanStreamGuest* vkStream,
+    const VkIndirectCommandsLayoutCreateInfoNVX* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkPipelineBindPoint*)&forMarshaling->pipelineBindPoint, sizeof(VkPipelineBindPoint));
+    *ptr += sizeof(VkPipelineBindPoint);
+    memcpy(*ptr, (VkIndirectCommandsLayoutUsageFlagsNVX*)&forMarshaling->flags, sizeof(VkIndirectCommandsLayoutUsageFlagsNVX));
+    *ptr += sizeof(VkIndirectCommandsLayoutUsageFlagsNVX);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->tokenCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->tokenCount; ++i)
+    {
+        reservedmarshal_VkIndirectCommandsLayoutTokenNVX(vkStream, (const VkIndirectCommandsLayoutTokenNVX*)(forMarshaling->pTokens + i), ptr);
+    }
+}
+
+void reservedmarshal_VkCmdProcessCommandsInfoNVX(
+    VulkanStreamGuest* vkStream,
+    const VkCmdProcessCommandsInfoNVX* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_153;
+    *&cgen_var_153 = get_host_u64_VkObjectTableNVX((*&forMarshaling->objectTable));
+    memcpy(*ptr, (uint64_t*)&cgen_var_153, 1 * 8);
+    *ptr += 1 * 8;
+    uint64_t cgen_var_154;
+    *&cgen_var_154 = get_host_u64_VkIndirectCommandsLayoutNVX((*&forMarshaling->indirectCommandsLayout));
+    memcpy(*ptr, (uint64_t*)&cgen_var_154, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->indirectCommandsTokenCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->indirectCommandsTokenCount; ++i)
+    {
+        reservedmarshal_VkIndirectCommandsTokenNVX(vkStream, (const VkIndirectCommandsTokenNVX*)(forMarshaling->pIndirectCommandsTokens + i), ptr);
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxSequencesCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    uint64_t cgen_var_155;
+    *&cgen_var_155 = get_host_u64_VkCommandBuffer((*&forMarshaling->targetCommandBuffer));
+    memcpy(*ptr, (uint64_t*)&cgen_var_155, 1 * 8);
+    *ptr += 1 * 8;
+    uint64_t cgen_var_156;
+    *&cgen_var_156 = get_host_u64_VkBuffer((*&forMarshaling->sequencesCountBuffer));
+    memcpy(*ptr, (uint64_t*)&cgen_var_156, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->sequencesCountOffset, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    uint64_t cgen_var_157;
+    *&cgen_var_157 = get_host_u64_VkBuffer((*&forMarshaling->sequencesIndexBuffer));
+    memcpy(*ptr, (uint64_t*)&cgen_var_157, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->sequencesIndexOffset, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+}
+
+void reservedmarshal_VkCmdReserveSpaceForCommandsInfoNVX(
+    VulkanStreamGuest* vkStream,
+    const VkCmdReserveSpaceForCommandsInfoNVX* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_158;
+    *&cgen_var_158 = get_host_u64_VkObjectTableNVX((*&forMarshaling->objectTable));
+    memcpy(*ptr, (uint64_t*)&cgen_var_158, 1 * 8);
+    *ptr += 1 * 8;
+    uint64_t cgen_var_159;
+    *&cgen_var_159 = get_host_u64_VkIndirectCommandsLayoutNVX((*&forMarshaling->indirectCommandsLayout));
+    memcpy(*ptr, (uint64_t*)&cgen_var_159, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxSequencesCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkObjectTableCreateInfoNVX(
+    VulkanStreamGuest* vkStream,
+    const VkObjectTableCreateInfoNVX* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->objectCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (const VkObjectEntryTypeNVX*)forMarshaling->pObjectEntryTypes, forMarshaling->objectCount * sizeof(const VkObjectEntryTypeNVX));
+    *ptr += forMarshaling->objectCount * sizeof(const VkObjectEntryTypeNVX);
+    memcpy(*ptr, (const uint32_t*)forMarshaling->pObjectEntryCounts, forMarshaling->objectCount * sizeof(const uint32_t));
+    *ptr += forMarshaling->objectCount * sizeof(const uint32_t);
+    memcpy(*ptr, (const VkObjectEntryUsageFlagsNVX*)forMarshaling->pObjectEntryUsageFlags, forMarshaling->objectCount * sizeof(const VkObjectEntryUsageFlagsNVX));
+    *ptr += forMarshaling->objectCount * sizeof(const VkObjectEntryUsageFlagsNVX);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxUniformBuffersPerDescriptor, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxStorageBuffersPerDescriptor, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxStorageImagesPerDescriptor, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxSampledImagesPerDescriptor, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxPipelineLayouts, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkObjectTableEntryNVX(
+    VulkanStreamGuest* vkStream,
+    const VkObjectTableEntryNVX* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkObjectEntryTypeNVX*)&forMarshaling->type, sizeof(VkObjectEntryTypeNVX));
+    *ptr += sizeof(VkObjectEntryTypeNVX);
+    memcpy(*ptr, (VkObjectEntryUsageFlagsNVX*)&forMarshaling->flags, sizeof(VkObjectEntryUsageFlagsNVX));
+    *ptr += sizeof(VkObjectEntryUsageFlagsNVX);
+}
+
+void reservedmarshal_VkObjectTablePipelineEntryNVX(
+    VulkanStreamGuest* vkStream,
+    const VkObjectTablePipelineEntryNVX* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkObjectEntryTypeNVX*)&forMarshaling->type, sizeof(VkObjectEntryTypeNVX));
+    *ptr += sizeof(VkObjectEntryTypeNVX);
+    memcpy(*ptr, (VkObjectEntryUsageFlagsNVX*)&forMarshaling->flags, sizeof(VkObjectEntryUsageFlagsNVX));
+    *ptr += sizeof(VkObjectEntryUsageFlagsNVX);
+    uint64_t cgen_var_160;
+    *&cgen_var_160 = get_host_u64_VkPipeline((*&forMarshaling->pipeline));
+    memcpy(*ptr, (uint64_t*)&cgen_var_160, 1 * 8);
+    *ptr += 1 * 8;
+}
+
+void reservedmarshal_VkObjectTableDescriptorSetEntryNVX(
+    VulkanStreamGuest* vkStream,
+    const VkObjectTableDescriptorSetEntryNVX* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkObjectEntryTypeNVX*)&forMarshaling->type, sizeof(VkObjectEntryTypeNVX));
+    *ptr += sizeof(VkObjectEntryTypeNVX);
+    memcpy(*ptr, (VkObjectEntryUsageFlagsNVX*)&forMarshaling->flags, sizeof(VkObjectEntryUsageFlagsNVX));
+    *ptr += sizeof(VkObjectEntryUsageFlagsNVX);
+    uint64_t cgen_var_161;
+    *&cgen_var_161 = get_host_u64_VkPipelineLayout((*&forMarshaling->pipelineLayout));
+    memcpy(*ptr, (uint64_t*)&cgen_var_161, 1 * 8);
+    *ptr += 1 * 8;
+    uint64_t cgen_var_162;
+    *&cgen_var_162 = get_host_u64_VkDescriptorSet((*&forMarshaling->descriptorSet));
+    memcpy(*ptr, (uint64_t*)&cgen_var_162, 1 * 8);
+    *ptr += 1 * 8;
+}
+
+void reservedmarshal_VkObjectTableVertexBufferEntryNVX(
+    VulkanStreamGuest* vkStream,
+    const VkObjectTableVertexBufferEntryNVX* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkObjectEntryTypeNVX*)&forMarshaling->type, sizeof(VkObjectEntryTypeNVX));
+    *ptr += sizeof(VkObjectEntryTypeNVX);
+    memcpy(*ptr, (VkObjectEntryUsageFlagsNVX*)&forMarshaling->flags, sizeof(VkObjectEntryUsageFlagsNVX));
+    *ptr += sizeof(VkObjectEntryUsageFlagsNVX);
+    uint64_t cgen_var_163;
+    *&cgen_var_163 = get_host_u64_VkBuffer((*&forMarshaling->buffer));
+    memcpy(*ptr, (uint64_t*)&cgen_var_163, 1 * 8);
+    *ptr += 1 * 8;
+}
+
+void reservedmarshal_VkObjectTableIndexBufferEntryNVX(
+    VulkanStreamGuest* vkStream,
+    const VkObjectTableIndexBufferEntryNVX* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkObjectEntryTypeNVX*)&forMarshaling->type, sizeof(VkObjectEntryTypeNVX));
+    *ptr += sizeof(VkObjectEntryTypeNVX);
+    memcpy(*ptr, (VkObjectEntryUsageFlagsNVX*)&forMarshaling->flags, sizeof(VkObjectEntryUsageFlagsNVX));
+    *ptr += sizeof(VkObjectEntryUsageFlagsNVX);
+    uint64_t cgen_var_164;
+    *&cgen_var_164 = get_host_u64_VkBuffer((*&forMarshaling->buffer));
+    memcpy(*ptr, (uint64_t*)&cgen_var_164, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkIndexType*)&forMarshaling->indexType, sizeof(VkIndexType));
+    *ptr += sizeof(VkIndexType);
+}
+
+void reservedmarshal_VkObjectTablePushConstantEntryNVX(
+    VulkanStreamGuest* vkStream,
+    const VkObjectTablePushConstantEntryNVX* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkObjectEntryTypeNVX*)&forMarshaling->type, sizeof(VkObjectEntryTypeNVX));
+    *ptr += sizeof(VkObjectEntryTypeNVX);
+    memcpy(*ptr, (VkObjectEntryUsageFlagsNVX*)&forMarshaling->flags, sizeof(VkObjectEntryUsageFlagsNVX));
+    *ptr += sizeof(VkObjectEntryUsageFlagsNVX);
+    uint64_t cgen_var_165;
+    *&cgen_var_165 = get_host_u64_VkPipelineLayout((*&forMarshaling->pipelineLayout));
+    memcpy(*ptr, (uint64_t*)&cgen_var_165, 1 * 8);
+    *ptr += 1 * 8;
+    memcpy(*ptr, (VkShaderStageFlags*)&forMarshaling->stageFlags, sizeof(VkShaderStageFlags));
+    *ptr += sizeof(VkShaderStageFlags);
+}
+
+#endif
+#ifdef VK_NV_clip_space_w_scaling
+void reservedmarshal_VkViewportWScalingNV(
+    VulkanStreamGuest* vkStream,
+    const VkViewportWScalingNV* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (float*)&forMarshaling->xcoeff, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (float*)&forMarshaling->ycoeff, sizeof(float));
+    *ptr += sizeof(float);
+}
+
+void reservedmarshal_VkPipelineViewportWScalingStateCreateInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineViewportWScalingStateCreateInfoNV* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->viewportWScalingEnable, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->viewportCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_166 = (uint64_t)(uintptr_t)forMarshaling->pViewportWScalings;
+    memcpy((*ptr), &cgen_var_166, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pViewportWScalings)
+    {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->viewportCount; ++i)
+        {
+            reservedmarshal_VkViewportWScalingNV(vkStream, (const VkViewportWScalingNV*)(forMarshaling->pViewportWScalings + i), ptr);
+        }
+    }
+}
+
+#endif
+#ifdef VK_EXT_direct_mode_display
+#endif
+#ifdef VK_EXT_acquire_xlib_display
+#endif
+#ifdef VK_EXT_display_surface_counter
+void reservedmarshal_VkSurfaceCapabilities2EXT(
+    VulkanStreamGuest* vkStream,
+    const VkSurfaceCapabilities2EXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->minImageCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxImageCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->currentExtent), ptr);
+    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->minImageExtent), ptr);
+    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->maxImageExtent), ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxImageArrayLayers, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkSurfaceTransformFlagsKHR*)&forMarshaling->supportedTransforms, sizeof(VkSurfaceTransformFlagsKHR));
+    *ptr += sizeof(VkSurfaceTransformFlagsKHR);
+    memcpy(*ptr, (VkSurfaceTransformFlagBitsKHR*)&forMarshaling->currentTransform, sizeof(VkSurfaceTransformFlagBitsKHR));
+    *ptr += sizeof(VkSurfaceTransformFlagBitsKHR);
+    memcpy(*ptr, (VkCompositeAlphaFlagsKHR*)&forMarshaling->supportedCompositeAlpha, sizeof(VkCompositeAlphaFlagsKHR));
+    *ptr += sizeof(VkCompositeAlphaFlagsKHR);
+    memcpy(*ptr, (VkImageUsageFlags*)&forMarshaling->supportedUsageFlags, sizeof(VkImageUsageFlags));
+    *ptr += sizeof(VkImageUsageFlags);
+    memcpy(*ptr, (VkSurfaceCounterFlagsEXT*)&forMarshaling->supportedSurfaceCounters, sizeof(VkSurfaceCounterFlagsEXT));
+    *ptr += sizeof(VkSurfaceCounterFlagsEXT);
+}
+
+#endif
+#ifdef VK_EXT_display_control
+void reservedmarshal_VkDisplayPowerInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayPowerInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkDisplayPowerStateEXT*)&forMarshaling->powerState, sizeof(VkDisplayPowerStateEXT));
+    *ptr += sizeof(VkDisplayPowerStateEXT);
+}
+
+void reservedmarshal_VkDeviceEventInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceEventInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkDeviceEventTypeEXT*)&forMarshaling->deviceEvent, sizeof(VkDeviceEventTypeEXT));
+    *ptr += sizeof(VkDeviceEventTypeEXT);
+}
+
+void reservedmarshal_VkDisplayEventInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayEventInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkDisplayEventTypeEXT*)&forMarshaling->displayEvent, sizeof(VkDisplayEventTypeEXT));
+    *ptr += sizeof(VkDisplayEventTypeEXT);
+}
+
+void reservedmarshal_VkSwapchainCounterCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkSwapchainCounterCreateInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkSurfaceCounterFlagsEXT*)&forMarshaling->surfaceCounters, sizeof(VkSurfaceCounterFlagsEXT));
+    *ptr += sizeof(VkSurfaceCounterFlagsEXT);
+}
+
+#endif
+#ifdef VK_GOOGLE_display_timing
+void reservedmarshal_VkRefreshCycleDurationGOOGLE(
+    VulkanStreamGuest* vkStream,
+    const VkRefreshCycleDurationGOOGLE* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint64_t*)&forMarshaling->refreshDuration, sizeof(uint64_t));
+    *ptr += sizeof(uint64_t);
+}
+
+void reservedmarshal_VkPastPresentationTimingGOOGLE(
+    VulkanStreamGuest* vkStream,
+    const VkPastPresentationTimingGOOGLE* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->presentID, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint64_t*)&forMarshaling->desiredPresentTime, sizeof(uint64_t));
+    *ptr += sizeof(uint64_t);
+    memcpy(*ptr, (uint64_t*)&forMarshaling->actualPresentTime, sizeof(uint64_t));
+    *ptr += sizeof(uint64_t);
+    memcpy(*ptr, (uint64_t*)&forMarshaling->earliestPresentTime, sizeof(uint64_t));
+    *ptr += sizeof(uint64_t);
+    memcpy(*ptr, (uint64_t*)&forMarshaling->presentMargin, sizeof(uint64_t));
+    *ptr += sizeof(uint64_t);
+}
+
+void reservedmarshal_VkPresentTimeGOOGLE(
+    VulkanStreamGuest* vkStream,
+    const VkPresentTimeGOOGLE* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->presentID, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint64_t*)&forMarshaling->desiredPresentTime, sizeof(uint64_t));
+    *ptr += sizeof(uint64_t);
+}
+
+void reservedmarshal_VkPresentTimesInfoGOOGLE(
+    VulkanStreamGuest* vkStream,
+    const VkPresentTimesInfoGOOGLE* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->swapchainCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_167 = (uint64_t)(uintptr_t)forMarshaling->pTimes;
+    memcpy((*ptr), &cgen_var_167, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pTimes)
+    {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->swapchainCount; ++i)
+        {
+            reservedmarshal_VkPresentTimeGOOGLE(vkStream, (const VkPresentTimeGOOGLE*)(forMarshaling->pTimes + i), ptr);
+        }
+    }
+}
+
+#endif
+#ifdef VK_NV_sample_mask_override_coverage
+#endif
+#ifdef VK_NV_geometry_shader_passthrough
+#endif
+#ifdef VK_NV_viewport_array2
+#endif
+#ifdef VK_NVX_multiview_per_view_attributes
+void reservedmarshal_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->perViewPositionAllComponents, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+#endif
+#ifdef VK_NV_viewport_swizzle
+void reservedmarshal_VkViewportSwizzleNV(
+    VulkanStreamGuest* vkStream,
+    const VkViewportSwizzleNV* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkViewportCoordinateSwizzleNV*)&forMarshaling->x, sizeof(VkViewportCoordinateSwizzleNV));
+    *ptr += sizeof(VkViewportCoordinateSwizzleNV);
+    memcpy(*ptr, (VkViewportCoordinateSwizzleNV*)&forMarshaling->y, sizeof(VkViewportCoordinateSwizzleNV));
+    *ptr += sizeof(VkViewportCoordinateSwizzleNV);
+    memcpy(*ptr, (VkViewportCoordinateSwizzleNV*)&forMarshaling->z, sizeof(VkViewportCoordinateSwizzleNV));
+    *ptr += sizeof(VkViewportCoordinateSwizzleNV);
+    memcpy(*ptr, (VkViewportCoordinateSwizzleNV*)&forMarshaling->w, sizeof(VkViewportCoordinateSwizzleNV));
+    *ptr += sizeof(VkViewportCoordinateSwizzleNV);
+}
+
+void reservedmarshal_VkPipelineViewportSwizzleStateCreateInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineViewportSwizzleStateCreateInfoNV* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkPipelineViewportSwizzleStateCreateFlagsNV*)&forMarshaling->flags, sizeof(VkPipelineViewportSwizzleStateCreateFlagsNV));
+    *ptr += sizeof(VkPipelineViewportSwizzleStateCreateFlagsNV);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->viewportCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_168 = (uint64_t)(uintptr_t)forMarshaling->pViewportSwizzles;
+    memcpy((*ptr), &cgen_var_168, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pViewportSwizzles)
+    {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->viewportCount; ++i)
+        {
+            reservedmarshal_VkViewportSwizzleNV(vkStream, (const VkViewportSwizzleNV*)(forMarshaling->pViewportSwizzles + i), ptr);
+        }
+    }
+}
+
+#endif
+#ifdef VK_EXT_discard_rectangles
+void reservedmarshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceDiscardRectanglePropertiesEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxDiscardRectangles, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkPipelineDiscardRectangleStateCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineDiscardRectangleStateCreateInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkPipelineDiscardRectangleStateCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkPipelineDiscardRectangleStateCreateFlagsEXT));
+    *ptr += sizeof(VkPipelineDiscardRectangleStateCreateFlagsEXT);
+    memcpy(*ptr, (VkDiscardRectangleModeEXT*)&forMarshaling->discardRectangleMode, sizeof(VkDiscardRectangleModeEXT));
+    *ptr += sizeof(VkDiscardRectangleModeEXT);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->discardRectangleCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_169 = (uint64_t)(uintptr_t)forMarshaling->pDiscardRectangles;
+    memcpy((*ptr), &cgen_var_169, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pDiscardRectangles)
+    {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->discardRectangleCount; ++i)
+        {
+            reservedmarshal_VkRect2D(vkStream, (const VkRect2D*)(forMarshaling->pDiscardRectangles + i), ptr);
+        }
+    }
+}
+
+#endif
+#ifdef VK_EXT_conservative_rasterization
+void reservedmarshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceConservativeRasterizationPropertiesEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (float*)&forMarshaling->primitiveOverestimationSize, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (float*)&forMarshaling->maxExtraPrimitiveOverestimationSize, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (float*)&forMarshaling->extraPrimitiveOverestimationSizeGranularity, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->primitiveUnderestimation, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->conservativePointAndLineRasterization, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->degenerateTrianglesRasterized, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->degenerateLinesRasterized, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->fullyCoveredFragmentShaderInputVariable, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->conservativeRasterizationPostDepthCoverage, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineRasterizationConservativeStateCreateInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkPipelineRasterizationConservativeStateCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkPipelineRasterizationConservativeStateCreateFlagsEXT));
+    *ptr += sizeof(VkPipelineRasterizationConservativeStateCreateFlagsEXT);
+    memcpy(*ptr, (VkConservativeRasterizationModeEXT*)&forMarshaling->conservativeRasterizationMode, sizeof(VkConservativeRasterizationModeEXT));
+    *ptr += sizeof(VkConservativeRasterizationModeEXT);
+    memcpy(*ptr, (float*)&forMarshaling->extraPrimitiveOverestimationSize, sizeof(float));
+    *ptr += sizeof(float);
+}
+
+#endif
+#ifdef VK_EXT_swapchain_colorspace
+#endif
+#ifdef VK_EXT_hdr_metadata
+void reservedmarshal_VkXYColorEXT(
+    VulkanStreamGuest* vkStream,
+    const VkXYColorEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (float*)&forMarshaling->x, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (float*)&forMarshaling->y, sizeof(float));
+    *ptr += sizeof(float);
+}
+
+void reservedmarshal_VkHdrMetadataEXT(
+    VulkanStreamGuest* vkStream,
+    const VkHdrMetadataEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    reservedmarshal_VkXYColorEXT(vkStream, (VkXYColorEXT*)(&forMarshaling->displayPrimaryRed), ptr);
+    reservedmarshal_VkXYColorEXT(vkStream, (VkXYColorEXT*)(&forMarshaling->displayPrimaryGreen), ptr);
+    reservedmarshal_VkXYColorEXT(vkStream, (VkXYColorEXT*)(&forMarshaling->displayPrimaryBlue), ptr);
+    reservedmarshal_VkXYColorEXT(vkStream, (VkXYColorEXT*)(&forMarshaling->whitePoint), ptr);
+    memcpy(*ptr, (float*)&forMarshaling->maxLuminance, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (float*)&forMarshaling->minLuminance, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (float*)&forMarshaling->maxContentLightLevel, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (float*)&forMarshaling->maxFrameAverageLightLevel, sizeof(float));
+    *ptr += sizeof(float);
+}
+
+#endif
+#ifdef VK_MVK_ios_surface
+void reservedmarshal_VkIOSSurfaceCreateInfoMVK(
+    VulkanStreamGuest* vkStream,
+    const VkIOSSurfaceCreateInfoMVK* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkIOSSurfaceCreateFlagsMVK*)&forMarshaling->flags, sizeof(VkIOSSurfaceCreateFlagsMVK));
+    *ptr += sizeof(VkIOSSurfaceCreateFlagsMVK);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_170 = (uint64_t)(uintptr_t)forMarshaling->pView;
+    memcpy((*ptr), &cgen_var_170, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pView)
+    {
+        memcpy(*ptr, (const void*)forMarshaling->pView, sizeof(const uint8_t));
+        *ptr += sizeof(const uint8_t);
+    }
+}
+
+#endif
+#ifdef VK_MVK_macos_surface
+void reservedmarshal_VkMacOSSurfaceCreateInfoMVK(
+    VulkanStreamGuest* vkStream,
+    const VkMacOSSurfaceCreateInfoMVK* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkMacOSSurfaceCreateFlagsMVK*)&forMarshaling->flags, sizeof(VkMacOSSurfaceCreateFlagsMVK));
+    *ptr += sizeof(VkMacOSSurfaceCreateFlagsMVK);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_171 = (uint64_t)(uintptr_t)forMarshaling->pView;
+    memcpy((*ptr), &cgen_var_171, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pView)
+    {
+        memcpy(*ptr, (const void*)forMarshaling->pView, sizeof(const uint8_t));
+        *ptr += sizeof(const uint8_t);
+    }
+}
+
+#endif
+#ifdef VK_EXT_external_memory_dma_buf
+#endif
+#ifdef VK_EXT_queue_family_foreign
+#endif
+#ifdef VK_EXT_debug_utils
+void reservedmarshal_VkDebugUtilsObjectNameInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDebugUtilsObjectNameInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkObjectType*)&forMarshaling->objectType, sizeof(VkObjectType));
+    *ptr += sizeof(VkObjectType);
+    memcpy(*ptr, (uint64_t*)&forMarshaling->objectHandle, sizeof(uint64_t));
+    *ptr += sizeof(uint64_t);
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+    {
+        // WARNING PTR CHECK
+        uint64_t cgen_var_172 = (uint64_t)(uintptr_t)forMarshaling->pObjectName;
+        memcpy((*ptr), &cgen_var_172, 8);
+        android::base::Stream::toBe64((uint8_t*)(*ptr));
+        *ptr += 8;
+        if (forMarshaling->pObjectName)
+        {
+            {
+                uint32_t l = forMarshaling->pObjectName ? strlen(forMarshaling->pObjectName): 0;
+                memcpy(*ptr, (uint32_t*)&l, sizeof(uint32_t));
+                android::base::Stream::toBe32((uint8_t*)*ptr);
+                *ptr += sizeof(uint32_t);
+                memcpy(*ptr, (char*)forMarshaling->pObjectName, l);
+                *ptr += l;
+            }
+        }
+    }
+    else
+    {
+        {
+            uint32_t l = forMarshaling->pObjectName ? strlen(forMarshaling->pObjectName): 0;
+            memcpy(*ptr, (uint32_t*)&l, sizeof(uint32_t));
+            android::base::Stream::toBe32((uint8_t*)*ptr);
+            *ptr += sizeof(uint32_t);
+            memcpy(*ptr, (char*)forMarshaling->pObjectName, l);
+            *ptr += l;
+        }
+    }
+}
+
+void reservedmarshal_VkDebugUtilsObjectTagInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDebugUtilsObjectTagInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkObjectType*)&forMarshaling->objectType, sizeof(VkObjectType));
+    *ptr += sizeof(VkObjectType);
+    memcpy(*ptr, (uint64_t*)&forMarshaling->objectHandle, sizeof(uint64_t));
+    *ptr += sizeof(uint64_t);
+    memcpy(*ptr, (uint64_t*)&forMarshaling->tagName, sizeof(uint64_t));
+    *ptr += sizeof(uint64_t);
+    uint64_t cgen_var_173 = (uint64_t)forMarshaling->tagSize;
+    memcpy((*ptr), &cgen_var_173, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    memcpy(*ptr, (const void*)forMarshaling->pTag, forMarshaling->tagSize * sizeof(const uint8_t));
+    *ptr += forMarshaling->tagSize * sizeof(const uint8_t);
+}
+
+void reservedmarshal_VkDebugUtilsLabelEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDebugUtilsLabelEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    {
+        uint32_t l = forMarshaling->pLabelName ? strlen(forMarshaling->pLabelName): 0;
+        memcpy(*ptr, (uint32_t*)&l, sizeof(uint32_t));
+        android::base::Stream::toBe32((uint8_t*)*ptr);
+        *ptr += sizeof(uint32_t);
+        memcpy(*ptr, (char*)forMarshaling->pLabelName, l);
+        *ptr += l;
+    }
+    memcpy(*ptr, (float*)forMarshaling->color, 4 * sizeof(float));
+    *ptr += 4 * sizeof(float);
+}
+
+void reservedmarshal_VkDebugUtilsMessengerCallbackDataEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDebugUtilsMessengerCallbackDataEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkDebugUtilsMessengerCallbackDataFlagsEXT*)&forMarshaling->flags, sizeof(VkDebugUtilsMessengerCallbackDataFlagsEXT));
+    *ptr += sizeof(VkDebugUtilsMessengerCallbackDataFlagsEXT);
+    if (vkStream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT)
+    {
+        // WARNING PTR CHECK
+        uint64_t cgen_var_174 = (uint64_t)(uintptr_t)forMarshaling->pMessageIdName;
+        memcpy((*ptr), &cgen_var_174, 8);
+        android::base::Stream::toBe64((uint8_t*)(*ptr));
+        *ptr += 8;
+        if (forMarshaling->pMessageIdName)
+        {
+            {
+                uint32_t l = forMarshaling->pMessageIdName ? strlen(forMarshaling->pMessageIdName): 0;
+                memcpy(*ptr, (uint32_t*)&l, sizeof(uint32_t));
+                android::base::Stream::toBe32((uint8_t*)*ptr);
+                *ptr += sizeof(uint32_t);
+                memcpy(*ptr, (char*)forMarshaling->pMessageIdName, l);
+                *ptr += l;
+            }
+        }
+    }
+    else
+    {
+        {
+            uint32_t l = forMarshaling->pMessageIdName ? strlen(forMarshaling->pMessageIdName): 0;
+            memcpy(*ptr, (uint32_t*)&l, sizeof(uint32_t));
+            android::base::Stream::toBe32((uint8_t*)*ptr);
+            *ptr += sizeof(uint32_t);
+            memcpy(*ptr, (char*)forMarshaling->pMessageIdName, l);
+            *ptr += l;
+        }
+    }
+    memcpy(*ptr, (int32_t*)&forMarshaling->messageIdNumber, sizeof(int32_t));
+    *ptr += sizeof(int32_t);
+    {
+        uint32_t l = forMarshaling->pMessage ? strlen(forMarshaling->pMessage): 0;
+        memcpy(*ptr, (uint32_t*)&l, sizeof(uint32_t));
+        android::base::Stream::toBe32((uint8_t*)*ptr);
+        *ptr += sizeof(uint32_t);
+        memcpy(*ptr, (char*)forMarshaling->pMessage, l);
+        *ptr += l;
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->queueLabelCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_175 = (uint64_t)(uintptr_t)forMarshaling->pQueueLabels;
+    memcpy((*ptr), &cgen_var_175, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pQueueLabels)
+    {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->queueLabelCount; ++i)
+        {
+            reservedmarshal_VkDebugUtilsLabelEXT(vkStream, (VkDebugUtilsLabelEXT*)(forMarshaling->pQueueLabels + i), ptr);
+        }
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->cmdBufLabelCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_176 = (uint64_t)(uintptr_t)forMarshaling->pCmdBufLabels;
+    memcpy((*ptr), &cgen_var_176, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pCmdBufLabels)
+    {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->cmdBufLabelCount; ++i)
+        {
+            reservedmarshal_VkDebugUtilsLabelEXT(vkStream, (VkDebugUtilsLabelEXT*)(forMarshaling->pCmdBufLabels + i), ptr);
+        }
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->objectCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_177 = (uint64_t)(uintptr_t)forMarshaling->pObjects;
+    memcpy((*ptr), &cgen_var_177, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pObjects)
+    {
+        for (uint32_t i = 0; i < (uint32_t)forMarshaling->objectCount; ++i)
+        {
+            reservedmarshal_VkDebugUtilsObjectNameInfoEXT(vkStream, (VkDebugUtilsObjectNameInfoEXT*)(forMarshaling->pObjects + i), ptr);
+        }
+    }
+}
+
+void reservedmarshal_VkDebugUtilsMessengerCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDebugUtilsMessengerCreateInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkDebugUtilsMessengerCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkDebugUtilsMessengerCreateFlagsEXT));
+    *ptr += sizeof(VkDebugUtilsMessengerCreateFlagsEXT);
+    memcpy(*ptr, (VkDebugUtilsMessageSeverityFlagsEXT*)&forMarshaling->messageSeverity, sizeof(VkDebugUtilsMessageSeverityFlagsEXT));
+    *ptr += sizeof(VkDebugUtilsMessageSeverityFlagsEXT);
+    memcpy(*ptr, (VkDebugUtilsMessageTypeFlagsEXT*)&forMarshaling->messageType, sizeof(VkDebugUtilsMessageTypeFlagsEXT));
+    *ptr += sizeof(VkDebugUtilsMessageTypeFlagsEXT);
+    uint64_t cgen_var_178 = (uint64_t)forMarshaling->pfnUserCallback;
+    memcpy((*ptr), &cgen_var_178, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    // WARNING PTR CHECK
+    uint64_t cgen_var_179 = (uint64_t)(uintptr_t)forMarshaling->pUserData;
+    memcpy((*ptr), &cgen_var_179, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pUserData)
+    {
+        memcpy(*ptr, (void*)forMarshaling->pUserData, sizeof(uint8_t));
+        *ptr += sizeof(uint8_t);
+    }
+}
+
+#endif
+#ifdef VK_ANDROID_external_memory_android_hardware_buffer
+void reservedmarshal_VkAndroidHardwareBufferUsageANDROID(
+    VulkanStreamGuest* vkStream,
+    const VkAndroidHardwareBufferUsageANDROID* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint64_t*)&forMarshaling->androidHardwareBufferUsage, sizeof(uint64_t));
+    *ptr += sizeof(uint64_t);
+}
+
+void reservedmarshal_VkAndroidHardwareBufferPropertiesANDROID(
+    VulkanStreamGuest* vkStream,
+    const VkAndroidHardwareBufferPropertiesANDROID* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->allocationSize, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->memoryTypeBits, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkAndroidHardwareBufferFormatPropertiesANDROID(
+    VulkanStreamGuest* vkStream,
+    const VkAndroidHardwareBufferFormatPropertiesANDROID* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
+    *ptr += sizeof(VkFormat);
+    memcpy(*ptr, (uint64_t*)&forMarshaling->externalFormat, sizeof(uint64_t));
+    *ptr += sizeof(uint64_t);
+    memcpy(*ptr, (VkFormatFeatureFlags*)&forMarshaling->formatFeatures, sizeof(VkFormatFeatureFlags));
+    *ptr += sizeof(VkFormatFeatureFlags);
+    reservedmarshal_VkComponentMapping(vkStream, (VkComponentMapping*)(&forMarshaling->samplerYcbcrConversionComponents), ptr);
+    memcpy(*ptr, (VkSamplerYcbcrModelConversion*)&forMarshaling->suggestedYcbcrModel, sizeof(VkSamplerYcbcrModelConversion));
+    *ptr += sizeof(VkSamplerYcbcrModelConversion);
+    memcpy(*ptr, (VkSamplerYcbcrRange*)&forMarshaling->suggestedYcbcrRange, sizeof(VkSamplerYcbcrRange));
+    *ptr += sizeof(VkSamplerYcbcrRange);
+    memcpy(*ptr, (VkChromaLocation*)&forMarshaling->suggestedXChromaOffset, sizeof(VkChromaLocation));
+    *ptr += sizeof(VkChromaLocation);
+    memcpy(*ptr, (VkChromaLocation*)&forMarshaling->suggestedYChromaOffset, sizeof(VkChromaLocation));
+    *ptr += sizeof(VkChromaLocation);
+}
+
+void reservedmarshal_VkImportAndroidHardwareBufferInfoANDROID(
+    VulkanStreamGuest* vkStream,
+    const VkImportAndroidHardwareBufferInfoANDROID* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (AHardwareBuffer*)forMarshaling->buffer, sizeof(AHardwareBuffer));
+    *ptr += sizeof(AHardwareBuffer);
+}
+
+void reservedmarshal_VkMemoryGetAndroidHardwareBufferInfoANDROID(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryGetAndroidHardwareBufferInfoANDROID* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_180;
+    *&cgen_var_180 = get_host_u64_VkDeviceMemory((*&forMarshaling->memory));
+    memcpy(*ptr, (uint64_t*)&cgen_var_180, 1 * 8);
+    *ptr += 1 * 8;
+}
+
+void reservedmarshal_VkExternalFormatANDROID(
+    VulkanStreamGuest* vkStream,
+    const VkExternalFormatANDROID* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint64_t*)&forMarshaling->externalFormat, sizeof(uint64_t));
+    *ptr += sizeof(uint64_t);
+}
+
+#endif
+#ifdef VK_EXT_sampler_filter_minmax
+void reservedmarshal_VkSamplerReductionModeCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkSamplerReductionModeCreateInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkSamplerReductionModeEXT*)&forMarshaling->reductionMode, sizeof(VkSamplerReductionModeEXT));
+    *ptr += sizeof(VkSamplerReductionModeEXT);
+}
+
+void reservedmarshal_VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->filterMinmaxSingleComponentFormats, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->filterMinmaxImageComponentMapping, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+#endif
+#ifdef VK_AMD_gpu_shader_int16
+#endif
+#ifdef VK_AMD_mixed_attachment_samples
+#endif
+#ifdef VK_AMD_shader_fragment_mask
+#endif
+#ifdef VK_EXT_shader_stencil_export
+#endif
+#ifdef VK_EXT_sample_locations
+void reservedmarshal_VkSampleLocationEXT(
+    VulkanStreamGuest* vkStream,
+    const VkSampleLocationEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (float*)&forMarshaling->x, sizeof(float));
+    *ptr += sizeof(float);
+    memcpy(*ptr, (float*)&forMarshaling->y, sizeof(float));
+    *ptr += sizeof(float);
+}
+
+void reservedmarshal_VkSampleLocationsInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkSampleLocationsInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkSampleCountFlagBits*)&forMarshaling->sampleLocationsPerPixel, sizeof(VkSampleCountFlagBits));
+    *ptr += sizeof(VkSampleCountFlagBits);
+    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->sampleLocationGridSize), ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->sampleLocationsCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->sampleLocationsCount; ++i)
+    {
+        reservedmarshal_VkSampleLocationEXT(vkStream, (const VkSampleLocationEXT*)(forMarshaling->pSampleLocations + i), ptr);
+    }
+}
+
+void reservedmarshal_VkAttachmentSampleLocationsEXT(
+    VulkanStreamGuest* vkStream,
+    const VkAttachmentSampleLocationsEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->attachmentIndex, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    reservedmarshal_VkSampleLocationsInfoEXT(vkStream, (VkSampleLocationsInfoEXT*)(&forMarshaling->sampleLocationsInfo), ptr);
+}
+
+void reservedmarshal_VkSubpassSampleLocationsEXT(
+    VulkanStreamGuest* vkStream,
+    const VkSubpassSampleLocationsEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->subpassIndex, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    reservedmarshal_VkSampleLocationsInfoEXT(vkStream, (VkSampleLocationsInfoEXT*)(&forMarshaling->sampleLocationsInfo), ptr);
+}
+
+void reservedmarshal_VkRenderPassSampleLocationsBeginInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkRenderPassSampleLocationsBeginInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->attachmentInitialSampleLocationsCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->attachmentInitialSampleLocationsCount; ++i)
+    {
+        reservedmarshal_VkAttachmentSampleLocationsEXT(vkStream, (const VkAttachmentSampleLocationsEXT*)(forMarshaling->pAttachmentInitialSampleLocations + i), ptr);
+    }
+    memcpy(*ptr, (uint32_t*)&forMarshaling->postSubpassSampleLocationsCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->postSubpassSampleLocationsCount; ++i)
+    {
+        reservedmarshal_VkSubpassSampleLocationsEXT(vkStream, (const VkSubpassSampleLocationsEXT*)(forMarshaling->pPostSubpassSampleLocations + i), ptr);
+    }
+}
+
+void reservedmarshal_VkPipelineSampleLocationsStateCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineSampleLocationsStateCreateInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->sampleLocationsEnable, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    reservedmarshal_VkSampleLocationsInfoEXT(vkStream, (VkSampleLocationsInfoEXT*)(&forMarshaling->sampleLocationsInfo), ptr);
+}
+
+void reservedmarshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceSampleLocationsPropertiesEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkSampleCountFlags*)&forMarshaling->sampleLocationSampleCounts, sizeof(VkSampleCountFlags));
+    *ptr += sizeof(VkSampleCountFlags);
+    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->maxSampleLocationGridSize), ptr);
+    memcpy(*ptr, (float*)forMarshaling->sampleLocationCoordinateRange, 2 * sizeof(float));
+    *ptr += 2 * sizeof(float);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->sampleLocationSubPixelBits, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->variableSampleLocations, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkMultisamplePropertiesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkMultisamplePropertiesEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    reservedmarshal_VkExtent2D(vkStream, (VkExtent2D*)(&forMarshaling->maxSampleLocationGridSize), ptr);
+}
+
+#endif
+#ifdef VK_EXT_blend_operation_advanced
+void reservedmarshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->advancedBlendCoherentOperations, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->advancedBlendMaxColorAttachments, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->advancedBlendIndependentBlend, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->advancedBlendNonPremultipliedSrcColor, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->advancedBlendNonPremultipliedDstColor, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->advancedBlendCorrelatedOverlap, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->advancedBlendAllOperations, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineColorBlendAdvancedStateCreateInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->srcPremultiplied, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->dstPremultiplied, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBlendOverlapEXT*)&forMarshaling->blendOverlap, sizeof(VkBlendOverlapEXT));
+    *ptr += sizeof(VkBlendOverlapEXT);
+}
+
+#endif
+#ifdef VK_NV_fragment_coverage_to_color
+void reservedmarshal_VkPipelineCoverageToColorStateCreateInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineCoverageToColorStateCreateInfoNV* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkPipelineCoverageToColorStateCreateFlagsNV*)&forMarshaling->flags, sizeof(VkPipelineCoverageToColorStateCreateFlagsNV));
+    *ptr += sizeof(VkPipelineCoverageToColorStateCreateFlagsNV);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->coverageToColorEnable, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->coverageToColorLocation, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+#endif
+#ifdef VK_NV_framebuffer_mixed_samples
+void reservedmarshal_VkPipelineCoverageModulationStateCreateInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineCoverageModulationStateCreateInfoNV* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkPipelineCoverageModulationStateCreateFlagsNV*)&forMarshaling->flags, sizeof(VkPipelineCoverageModulationStateCreateFlagsNV));
+    *ptr += sizeof(VkPipelineCoverageModulationStateCreateFlagsNV);
+    memcpy(*ptr, (VkCoverageModulationModeNV*)&forMarshaling->coverageModulationMode, sizeof(VkCoverageModulationModeNV));
+    *ptr += sizeof(VkCoverageModulationModeNV);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->coverageModulationTableEnable, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->coverageModulationTableCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_181 = (uint64_t)(uintptr_t)forMarshaling->pCoverageModulationTable;
+    memcpy((*ptr), &cgen_var_181, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pCoverageModulationTable)
+    {
+        memcpy(*ptr, (const float*)forMarshaling->pCoverageModulationTable, forMarshaling->coverageModulationTableCount * sizeof(const float));
+        *ptr += forMarshaling->coverageModulationTableCount * sizeof(const float);
+    }
+}
+
+#endif
+#ifdef VK_NV_fill_rectangle
+#endif
+#ifdef VK_EXT_post_depth_coverage
+#endif
+#ifdef VK_EXT_validation_cache
+void reservedmarshal_VkValidationCacheCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkValidationCacheCreateInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkValidationCacheCreateFlagsEXT*)&forMarshaling->flags, sizeof(VkValidationCacheCreateFlagsEXT));
+    *ptr += sizeof(VkValidationCacheCreateFlagsEXT);
+    uint64_t cgen_var_182 = (uint64_t)forMarshaling->initialDataSize;
+    memcpy((*ptr), &cgen_var_182, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    memcpy(*ptr, (const void*)forMarshaling->pInitialData, forMarshaling->initialDataSize * sizeof(const uint8_t));
+    *ptr += forMarshaling->initialDataSize * sizeof(const uint8_t);
+}
+
+void reservedmarshal_VkShaderModuleValidationCacheCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkShaderModuleValidationCacheCreateInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    uint64_t cgen_var_183;
+    *&cgen_var_183 = get_host_u64_VkValidationCacheEXT((*&forMarshaling->validationCache));
+    memcpy(*ptr, (uint64_t*)&cgen_var_183, 1 * 8);
+    *ptr += 1 * 8;
+}
+
+#endif
+#ifdef VK_EXT_descriptor_indexing
+void reservedmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorSetLayoutBindingFlagsCreateInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->bindingCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (const VkDescriptorBindingFlagsEXT*)forMarshaling->pBindingFlags, forMarshaling->bindingCount * sizeof(const VkDescriptorBindingFlagsEXT));
+    *ptr += forMarshaling->bindingCount * sizeof(const VkDescriptorBindingFlagsEXT);
+}
+
+void reservedmarshal_VkPhysicalDeviceDescriptorIndexingFeaturesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceDescriptorIndexingFeaturesEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderInputAttachmentArrayDynamicIndexing, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderUniformTexelBufferArrayDynamicIndexing, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderStorageTexelBufferArrayDynamicIndexing, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderUniformBufferArrayNonUniformIndexing, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderSampledImageArrayNonUniformIndexing, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderStorageBufferArrayNonUniformIndexing, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderStorageImageArrayNonUniformIndexing, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderInputAttachmentArrayNonUniformIndexing, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderUniformTexelBufferArrayNonUniformIndexing, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderStorageTexelBufferArrayNonUniformIndexing, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->descriptorBindingUniformBufferUpdateAfterBind, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->descriptorBindingSampledImageUpdateAfterBind, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->descriptorBindingStorageImageUpdateAfterBind, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->descriptorBindingStorageBufferUpdateAfterBind, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->descriptorBindingUniformTexelBufferUpdateAfterBind, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->descriptorBindingStorageTexelBufferUpdateAfterBind, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->descriptorBindingUpdateUnusedWhilePending, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->descriptorBindingPartiallyBound, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->descriptorBindingVariableDescriptorCount, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->runtimeDescriptorArray, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+}
+
+void reservedmarshal_VkPhysicalDeviceDescriptorIndexingPropertiesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceDescriptorIndexingPropertiesEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxUpdateAfterBindDescriptorsInAllPools, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderUniformBufferArrayNonUniformIndexingNative, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderSampledImageArrayNonUniformIndexingNative, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderStorageBufferArrayNonUniformIndexingNative, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderStorageImageArrayNonUniformIndexingNative, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->shaderInputAttachmentArrayNonUniformIndexingNative, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->robustBufferAccessUpdateAfterBind, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (VkBool32*)&forMarshaling->quadDivergentImplicitLod, sizeof(VkBool32));
+    *ptr += sizeof(VkBool32);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindSamplers, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindUniformBuffers, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindStorageBuffers, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindSampledImages, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindStorageImages, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxPerStageDescriptorUpdateAfterBindInputAttachments, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxPerStageUpdateAfterBindResources, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindSamplers, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindUniformBuffers, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindUniformBuffersDynamic, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindStorageBuffers, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindStorageBuffersDynamic, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindSampledImages, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindStorageImages, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxDescriptorSetUpdateAfterBindInputAttachments, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorSetVariableDescriptorCountAllocateInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->descriptorSetCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (const uint32_t*)forMarshaling->pDescriptorCounts, forMarshaling->descriptorSetCount * sizeof(const uint32_t));
+    *ptr += forMarshaling->descriptorSetCount * sizeof(const uint32_t);
+}
+
+void reservedmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupportEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorSetVariableDescriptorCountLayoutSupportEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxVariableDescriptorCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+#endif
+#ifdef VK_EXT_shader_viewport_index_layer
+#endif
+#ifdef VK_EXT_global_priority
+void reservedmarshal_VkDeviceQueueGlobalPriorityCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceQueueGlobalPriorityCreateInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkQueueGlobalPriorityEXT*)&forMarshaling->globalPriority, sizeof(VkQueueGlobalPriorityEXT));
+    *ptr += sizeof(VkQueueGlobalPriorityEXT);
+}
+
+#endif
+#ifdef VK_EXT_external_memory_host
+void reservedmarshal_VkImportMemoryHostPointerInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkImportMemoryHostPointerInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkExternalMemoryHandleTypeFlagBits*)&forMarshaling->handleType, sizeof(VkExternalMemoryHandleTypeFlagBits));
+    *ptr += sizeof(VkExternalMemoryHandleTypeFlagBits);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_184 = (uint64_t)(uintptr_t)forMarshaling->pHostPointer;
+    memcpy((*ptr), &cgen_var_184, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pHostPointer)
+    {
+        memcpy(*ptr, (void*)forMarshaling->pHostPointer, sizeof(uint8_t));
+        *ptr += sizeof(uint8_t);
+    }
+}
+
+void reservedmarshal_VkMemoryHostPointerPropertiesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryHostPointerPropertiesEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->memoryTypeBits, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceExternalMemoryHostPropertiesEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->minImportedHostPointerAlignment, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+}
+
+#endif
+#ifdef VK_AMD_buffer_marker
+#endif
+#ifdef VK_AMD_shader_core_properties
+void reservedmarshal_VkPhysicalDeviceShaderCorePropertiesAMD(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceShaderCorePropertiesAMD* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->shaderEngineCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->shaderArraysPerEngineCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->computeUnitsPerShaderArray, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->simdPerComputeUnit, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->wavefrontsPerSimd, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->wavefrontSize, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->sgprsPerSimd, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->minSgprAllocation, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxSgprAllocation, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->sgprAllocationGranularity, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->vgprsPerSimd, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->minVgprAllocation, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxVgprAllocation, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->vgprAllocationGranularity, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+#endif
+#ifdef VK_EXT_vertex_attribute_divisor
+void reservedmarshal_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->maxVertexAttribDivisor, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkVertexInputBindingDivisorDescriptionEXT(
+    VulkanStreamGuest* vkStream,
+    const VkVertexInputBindingDivisorDescriptionEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (uint32_t*)&forMarshaling->binding, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->divisor, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineVertexInputDivisorStateCreateInfoEXT* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->vertexBindingDivisorCount, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+    for (uint32_t i = 0; i < (uint32_t)forMarshaling->vertexBindingDivisorCount; ++i)
+    {
+        reservedmarshal_VkVertexInputBindingDivisorDescriptionEXT(vkStream, (const VkVertexInputBindingDivisorDescriptionEXT*)(forMarshaling->pVertexBindingDivisors + i), ptr);
+    }
+}
+
+#endif
+#ifdef VK_NV_shader_subgroup_partitioned
+#endif
+#ifdef VK_NV_device_diagnostic_checkpoints
+void reservedmarshal_VkQueueFamilyCheckpointPropertiesNV(
+    VulkanStreamGuest* vkStream,
+    const VkQueueFamilyCheckpointPropertiesNV* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkPipelineStageFlags*)&forMarshaling->checkpointExecutionStageMask, sizeof(VkPipelineStageFlags));
+    *ptr += sizeof(VkPipelineStageFlags);
+}
+
+void reservedmarshal_VkCheckpointDataNV(
+    VulkanStreamGuest* vkStream,
+    const VkCheckpointDataNV* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (VkPipelineStageFlagBits*)&forMarshaling->stage, sizeof(VkPipelineStageFlagBits));
+    *ptr += sizeof(VkPipelineStageFlagBits);
+    // WARNING PTR CHECK
+    uint64_t cgen_var_185 = (uint64_t)(uintptr_t)forMarshaling->pCheckpointMarker;
+    memcpy((*ptr), &cgen_var_185, 8);
+    android::base::Stream::toBe64((uint8_t*)(*ptr));
+    *ptr += 8;
+    if (forMarshaling->pCheckpointMarker)
+    {
+        memcpy(*ptr, (void*)forMarshaling->pCheckpointMarker, sizeof(uint8_t));
+        *ptr += sizeof(uint8_t);
+    }
+}
+
+#endif
+#ifdef VK_GOOGLE_address_space
+#endif
+#ifdef VK_GOOGLE_color_buffer
+void reservedmarshal_VkImportColorBufferGOOGLE(
+    VulkanStreamGuest* vkStream,
+    const VkImportColorBufferGOOGLE* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->colorBuffer, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkImportBufferGOOGLE(
+    VulkanStreamGuest* vkStream,
+    const VkImportBufferGOOGLE* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->buffer, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+void reservedmarshal_VkImportPhysicalAddressGOOGLE(
+    VulkanStreamGuest* vkStream,
+    const VkImportPhysicalAddressGOOGLE* forMarshaling,
+    uint8_t** ptr)
+{
+    (void)vkStream;
+    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
+    *ptr += sizeof(VkStructureType);
+    reservedmarshal_extension_struct(vkStream, forMarshaling->pNext, ptr);
+    memcpy(*ptr, (uint64_t*)&forMarshaling->physicalAddress, sizeof(uint64_t));
+    *ptr += sizeof(uint64_t);
+    memcpy(*ptr, (VkDeviceSize*)&forMarshaling->size, sizeof(VkDeviceSize));
+    *ptr += sizeof(VkDeviceSize);
+    memcpy(*ptr, (VkFormat*)&forMarshaling->format, sizeof(VkFormat));
+    *ptr += sizeof(VkFormat);
+    memcpy(*ptr, (VkImageTiling*)&forMarshaling->tiling, sizeof(VkImageTiling));
+    *ptr += sizeof(VkImageTiling);
+    memcpy(*ptr, (uint32_t*)&forMarshaling->tilingParameter, sizeof(uint32_t));
+    *ptr += sizeof(uint32_t);
+}
+
+#endif
+#ifdef VK_GOOGLE_sized_descriptor_update_template
+#endif
+#ifdef VK_GOOGLE_async_command_buffers
+#endif
+#ifdef VK_GOOGLE_create_resources_with_requirements
+#endif
+#ifdef VK_GOOGLE_address_space_info
+#endif
+#ifdef VK_GOOGLE_free_memory_sync
+#endif
+#ifdef VK_GOOGLE_async_queue_submit
+#endif
+#ifdef VK_GOOGLE_linear_image_layout
+#endif
+#ifdef VK_MVK_moltenvk
+#endif
+void reservedmarshal_extension_struct(
+    VulkanStreamGuest* vkStream,
+    const void* structExtension,
+    uint8_t** ptr)
+{
+    VkInstanceCreateInfo* structAccess = (VkInstanceCreateInfo*)(structExtension);
+    uint32_t currExtSize = goldfish_vk_extension_struct_size_with_stream_features(vkStream->getFeatureBits(), structExtension);
+    if (!currExtSize && structExtension)
+    {
+        // unknown struct extension; skip and call on its pNext field
+        reservedmarshal_extension_struct(vkStream, (void*)structAccess->pNext, ptr);
+        return;
+    }
+    else
+    {
+        // known or null extension struct
+        memcpy(*ptr, &currExtSize, sizeof(uint32_t));;
+        android::base::Stream::toBe32((uint8_t*)*ptr); *ptr += sizeof(uint32_t);
+        if (!currExtSize)
+        {
+            // exit if this was a null extension struct (size == 0 in this branch)
+            return;
+        }
+    }
+    memcpy(*ptr, structExtension, sizeof(VkStructureType)); *ptr += sizeof(VkStructureType);
+    if (!structExtension)
+    {
+        return;
+    }
+    uint32_t structType = (uint32_t)goldfish_vk_struct_type(structExtension);
+    switch(structType)
+    {
+#ifdef VK_VERSION_1_1
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES:
+        {
+            reservedmarshal_VkPhysicalDeviceSubgroupProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceSubgroupProperties*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES:
+        {
+            reservedmarshal_VkPhysicalDevice16BitStorageFeatures(vkStream, reinterpret_cast<const VkPhysicalDevice16BitStorageFeatures*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS:
+        {
+            reservedmarshal_VkMemoryDedicatedRequirements(vkStream, reinterpret_cast<const VkMemoryDedicatedRequirements*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO:
+        {
+            reservedmarshal_VkMemoryDedicatedAllocateInfo(vkStream, reinterpret_cast<const VkMemoryDedicatedAllocateInfo*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO:
+        {
+            reservedmarshal_VkMemoryAllocateFlagsInfo(vkStream, reinterpret_cast<const VkMemoryAllocateFlagsInfo*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO:
+        {
+            reservedmarshal_VkDeviceGroupRenderPassBeginInfo(vkStream, reinterpret_cast<const VkDeviceGroupRenderPassBeginInfo*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO:
+        {
+            reservedmarshal_VkDeviceGroupCommandBufferBeginInfo(vkStream, reinterpret_cast<const VkDeviceGroupCommandBufferBeginInfo*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO:
+        {
+            reservedmarshal_VkDeviceGroupSubmitInfo(vkStream, reinterpret_cast<const VkDeviceGroupSubmitInfo*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO:
+        {
+            reservedmarshal_VkDeviceGroupBindSparseInfo(vkStream, reinterpret_cast<const VkDeviceGroupBindSparseInfo*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO:
+        {
+            reservedmarshal_VkBindBufferMemoryDeviceGroupInfo(vkStream, reinterpret_cast<const VkBindBufferMemoryDeviceGroupInfo*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO:
+        {
+            reservedmarshal_VkBindImageMemoryDeviceGroupInfo(vkStream, reinterpret_cast<const VkBindImageMemoryDeviceGroupInfo*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO:
+        {
+            reservedmarshal_VkDeviceGroupDeviceCreateInfo(vkStream, reinterpret_cast<const VkDeviceGroupDeviceCreateInfo*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2:
+        {
+            reservedmarshal_VkPhysicalDeviceFeatures2(vkStream, reinterpret_cast<const VkPhysicalDeviceFeatures2*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES:
+        {
+            reservedmarshal_VkPhysicalDevicePointClippingProperties(vkStream, reinterpret_cast<const VkPhysicalDevicePointClippingProperties*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO:
+        {
+            reservedmarshal_VkRenderPassInputAttachmentAspectCreateInfo(vkStream, reinterpret_cast<const VkRenderPassInputAttachmentAspectCreateInfo*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO:
+        {
+            reservedmarshal_VkImageViewUsageCreateInfo(vkStream, reinterpret_cast<const VkImageViewUsageCreateInfo*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO:
+        {
+            reservedmarshal_VkPipelineTessellationDomainOriginStateCreateInfo(vkStream, reinterpret_cast<const VkPipelineTessellationDomainOriginStateCreateInfo*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO:
+        {
+            reservedmarshal_VkRenderPassMultiviewCreateInfo(vkStream, reinterpret_cast<const VkRenderPassMultiviewCreateInfo*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES:
+        {
+            reservedmarshal_VkPhysicalDeviceMultiviewFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceMultiviewFeatures*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES:
+        {
+            reservedmarshal_VkPhysicalDeviceMultiviewProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceMultiviewProperties*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES:
+        {
+            reservedmarshal_VkPhysicalDeviceVariablePointerFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceVariablePointerFeatures*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES:
+        {
+            reservedmarshal_VkPhysicalDeviceProtectedMemoryFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceProtectedMemoryFeatures*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES:
+        {
+            reservedmarshal_VkPhysicalDeviceProtectedMemoryProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceProtectedMemoryProperties*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO:
+        {
+            reservedmarshal_VkProtectedSubmitInfo(vkStream, reinterpret_cast<const VkProtectedSubmitInfo*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO:
+        {
+            reservedmarshal_VkSamplerYcbcrConversionInfo(vkStream, reinterpret_cast<const VkSamplerYcbcrConversionInfo*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO:
+        {
+            reservedmarshal_VkBindImagePlaneMemoryInfo(vkStream, reinterpret_cast<const VkBindImagePlaneMemoryInfo*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO:
+        {
+            reservedmarshal_VkImagePlaneMemoryRequirementsInfo(vkStream, reinterpret_cast<const VkImagePlaneMemoryRequirementsInfo*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES:
+        {
+            reservedmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceSamplerYcbcrConversionFeatures*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES:
+        {
+            reservedmarshal_VkSamplerYcbcrConversionImageFormatProperties(vkStream, reinterpret_cast<const VkSamplerYcbcrConversionImageFormatProperties*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO:
+        {
+            reservedmarshal_VkPhysicalDeviceExternalImageFormatInfo(vkStream, reinterpret_cast<const VkPhysicalDeviceExternalImageFormatInfo*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES:
+        {
+            reservedmarshal_VkExternalImageFormatProperties(vkStream, reinterpret_cast<const VkExternalImageFormatProperties*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES:
+        {
+            reservedmarshal_VkPhysicalDeviceIDProperties(vkStream, reinterpret_cast<const VkPhysicalDeviceIDProperties*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO:
+        {
+            reservedmarshal_VkExternalMemoryImageCreateInfo(vkStream, reinterpret_cast<const VkExternalMemoryImageCreateInfo*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO:
+        {
+            reservedmarshal_VkExternalMemoryBufferCreateInfo(vkStream, reinterpret_cast<const VkExternalMemoryBufferCreateInfo*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO:
+        {
+            reservedmarshal_VkExportMemoryAllocateInfo(vkStream, reinterpret_cast<const VkExportMemoryAllocateInfo*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO:
+        {
+            reservedmarshal_VkExportFenceCreateInfo(vkStream, reinterpret_cast<const VkExportFenceCreateInfo*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO:
+        {
+            reservedmarshal_VkExportSemaphoreCreateInfo(vkStream, reinterpret_cast<const VkExportSemaphoreCreateInfo*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES:
+        {
+            reservedmarshal_VkPhysicalDeviceMaintenance3Properties(vkStream, reinterpret_cast<const VkPhysicalDeviceMaintenance3Properties*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES:
+        {
+            reservedmarshal_VkPhysicalDeviceShaderDrawParameterFeatures(vkStream, reinterpret_cast<const VkPhysicalDeviceShaderDrawParameterFeatures*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_KHR_swapchain
+        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR:
+        {
+            reservedmarshal_VkImageSwapchainCreateInfoKHR(vkStream, reinterpret_cast<const VkImageSwapchainCreateInfoKHR*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR:
+        {
+            reservedmarshal_VkBindImageMemorySwapchainInfoKHR(vkStream, reinterpret_cast<const VkBindImageMemorySwapchainInfoKHR*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR:
+        {
+            reservedmarshal_VkDeviceGroupPresentInfoKHR(vkStream, reinterpret_cast<const VkDeviceGroupPresentInfoKHR*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR:
+        {
+            reservedmarshal_VkDeviceGroupSwapchainCreateInfoKHR(vkStream, reinterpret_cast<const VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_KHR_display_swapchain
+        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR:
+        {
+            reservedmarshal_VkDisplayPresentInfoKHR(vkStream, reinterpret_cast<const VkDisplayPresentInfoKHR*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_KHR_external_memory_win32
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
+        {
+            reservedmarshal_VkImportMemoryWin32HandleInfoKHR(vkStream, reinterpret_cast<const VkImportMemoryWin32HandleInfoKHR*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR:
+        {
+            reservedmarshal_VkExportMemoryWin32HandleInfoKHR(vkStream, reinterpret_cast<const VkExportMemoryWin32HandleInfoKHR*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_KHR_external_memory_fd
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR:
+        {
+            reservedmarshal_VkImportMemoryFdInfoKHR(vkStream, reinterpret_cast<const VkImportMemoryFdInfoKHR*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_KHR_win32_keyed_mutex
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR:
+        {
+            reservedmarshal_VkWin32KeyedMutexAcquireReleaseInfoKHR(vkStream, reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoKHR*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_KHR_external_semaphore_win32
+        case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR:
+        {
+            reservedmarshal_VkExportSemaphoreWin32HandleInfoKHR(vkStream, reinterpret_cast<const VkExportSemaphoreWin32HandleInfoKHR*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR:
+        {
+            reservedmarshal_VkD3D12FenceSubmitInfoKHR(vkStream, reinterpret_cast<const VkD3D12FenceSubmitInfoKHR*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_KHR_push_descriptor
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR:
+        {
+            reservedmarshal_VkPhysicalDevicePushDescriptorPropertiesKHR(vkStream, reinterpret_cast<const VkPhysicalDevicePushDescriptorPropertiesKHR*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_KHR_incremental_present
+        case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR:
+        {
+            reservedmarshal_VkPresentRegionsKHR(vkStream, reinterpret_cast<const VkPresentRegionsKHR*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_KHR_shared_presentable_image
+        case VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR:
+        {
+            reservedmarshal_VkSharedPresentSurfaceCapabilitiesKHR(vkStream, reinterpret_cast<const VkSharedPresentSurfaceCapabilitiesKHR*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_KHR_external_fence_win32
+        case VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR:
+        {
+            reservedmarshal_VkExportFenceWin32HandleInfoKHR(vkStream, reinterpret_cast<const VkExportFenceWin32HandleInfoKHR*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_KHR_image_format_list
+        case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR:
+        {
+            reservedmarshal_VkImageFormatListCreateInfoKHR(vkStream, reinterpret_cast<const VkImageFormatListCreateInfoKHR*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_KHR_8bit_storage
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR:
+        {
+            reservedmarshal_VkPhysicalDevice8BitStorageFeaturesKHR(vkStream, reinterpret_cast<const VkPhysicalDevice8BitStorageFeaturesKHR*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_KHR_shader_float16_int8
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES:
+        {
+            reservedmarshal_VkPhysicalDeviceShaderFloat16Int8Features(vkStream, reinterpret_cast<const VkPhysicalDeviceShaderFloat16Int8Features*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_ANDROID_native_buffer
+        case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID:
+        {
+            reservedmarshal_VkNativeBufferANDROID(vkStream, reinterpret_cast<const VkNativeBufferANDROID*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_EXT_debug_report
+        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT:
+        {
+            reservedmarshal_VkDebugReportCallbackCreateInfoEXT(vkStream, reinterpret_cast<const VkDebugReportCallbackCreateInfoEXT*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_AMD_rasterization_order
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD:
+        {
+            reservedmarshal_VkPipelineRasterizationStateRasterizationOrderAMD(vkStream, reinterpret_cast<const VkPipelineRasterizationStateRasterizationOrderAMD*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_NV_dedicated_allocation
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV:
+        {
+            reservedmarshal_VkDedicatedAllocationImageCreateInfoNV(vkStream, reinterpret_cast<const VkDedicatedAllocationImageCreateInfoNV*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV:
+        {
+            reservedmarshal_VkDedicatedAllocationBufferCreateInfoNV(vkStream, reinterpret_cast<const VkDedicatedAllocationBufferCreateInfoNV*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV:
+        {
+            reservedmarshal_VkDedicatedAllocationMemoryAllocateInfoNV(vkStream, reinterpret_cast<const VkDedicatedAllocationMemoryAllocateInfoNV*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_AMD_texture_gather_bias_lod
+        case VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD:
+        {
+            reservedmarshal_VkTextureLODGatherFormatPropertiesAMD(vkStream, reinterpret_cast<const VkTextureLODGatherFormatPropertiesAMD*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_NV_external_memory
+        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV:
+        {
+            reservedmarshal_VkExternalMemoryImageCreateInfoNV(vkStream, reinterpret_cast<const VkExternalMemoryImageCreateInfoNV*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV:
+        {
+            reservedmarshal_VkExportMemoryAllocateInfoNV(vkStream, reinterpret_cast<const VkExportMemoryAllocateInfoNV*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_NV_external_memory_win32
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV:
+        {
+            reservedmarshal_VkImportMemoryWin32HandleInfoNV(vkStream, reinterpret_cast<const VkImportMemoryWin32HandleInfoNV*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV:
+        {
+            reservedmarshal_VkExportMemoryWin32HandleInfoNV(vkStream, reinterpret_cast<const VkExportMemoryWin32HandleInfoNV*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_NV_win32_keyed_mutex
+        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV:
+        {
+            reservedmarshal_VkWin32KeyedMutexAcquireReleaseInfoNV(vkStream, reinterpret_cast<const VkWin32KeyedMutexAcquireReleaseInfoNV*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_EXT_validation_flags
+        case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT:
+        {
+            reservedmarshal_VkValidationFlagsEXT(vkStream, reinterpret_cast<const VkValidationFlagsEXT*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_EXT_conditional_rendering
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT:
+        {
+            reservedmarshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceConditionalRenderingFeaturesEXT*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT:
+        {
+            reservedmarshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(vkStream, reinterpret_cast<const VkCommandBufferInheritanceConditionalRenderingInfoEXT*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_NV_clip_space_w_scaling
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV:
+        {
+            reservedmarshal_VkPipelineViewportWScalingStateCreateInfoNV(vkStream, reinterpret_cast<const VkPipelineViewportWScalingStateCreateInfoNV*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_EXT_display_control
+        case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT:
+        {
+            reservedmarshal_VkSwapchainCounterCreateInfoEXT(vkStream, reinterpret_cast<const VkSwapchainCounterCreateInfoEXT*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_GOOGLE_display_timing
+        case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE:
+        {
+            reservedmarshal_VkPresentTimesInfoGOOGLE(vkStream, reinterpret_cast<const VkPresentTimesInfoGOOGLE*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_NVX_multiview_per_view_attributes
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX:
+        {
+            reservedmarshal_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(vkStream, reinterpret_cast<const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_NV_viewport_swizzle
+        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV:
+        {
+            reservedmarshal_VkPipelineViewportSwizzleStateCreateInfoNV(vkStream, reinterpret_cast<const VkPipelineViewportSwizzleStateCreateInfoNV*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_EXT_discard_rectangles
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT:
+        {
+            reservedmarshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceDiscardRectanglePropertiesEXT*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT:
+        {
+            reservedmarshal_VkPipelineDiscardRectangleStateCreateInfoEXT(vkStream, reinterpret_cast<const VkPipelineDiscardRectangleStateCreateInfoEXT*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_EXT_conservative_rasterization
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT:
+        {
+            reservedmarshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceConservativeRasterizationPropertiesEXT*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT:
+        {
+            reservedmarshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(vkStream, reinterpret_cast<const VkPipelineRasterizationConservativeStateCreateInfoEXT*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_EXT_debug_utils
+        case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT:
+        {
+            reservedmarshal_VkDebugUtilsMessengerCreateInfoEXT(vkStream, reinterpret_cast<const VkDebugUtilsMessengerCreateInfoEXT*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_ANDROID_external_memory_android_hardware_buffer
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID:
+        {
+            reservedmarshal_VkAndroidHardwareBufferUsageANDROID(vkStream, reinterpret_cast<const VkAndroidHardwareBufferUsageANDROID*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID:
+        {
+            reservedmarshal_VkAndroidHardwareBufferFormatPropertiesANDROID(vkStream, reinterpret_cast<const VkAndroidHardwareBufferFormatPropertiesANDROID*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID:
+        {
+            reservedmarshal_VkImportAndroidHardwareBufferInfoANDROID(vkStream, reinterpret_cast<const VkImportAndroidHardwareBufferInfoANDROID*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID:
+        {
+            reservedmarshal_VkExternalFormatANDROID(vkStream, reinterpret_cast<const VkExternalFormatANDROID*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_EXT_sampler_filter_minmax
+        case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT:
+        {
+            reservedmarshal_VkSamplerReductionModeCreateInfoEXT(vkStream, reinterpret_cast<const VkSamplerReductionModeCreateInfoEXT*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT:
+        {
+            reservedmarshal_VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_EXT_sample_locations
+        case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT:
+        {
+            reservedmarshal_VkSampleLocationsInfoEXT(vkStream, reinterpret_cast<const VkSampleLocationsInfoEXT*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT:
+        {
+            reservedmarshal_VkRenderPassSampleLocationsBeginInfoEXT(vkStream, reinterpret_cast<const VkRenderPassSampleLocationsBeginInfoEXT*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT:
+        {
+            reservedmarshal_VkPipelineSampleLocationsStateCreateInfoEXT(vkStream, reinterpret_cast<const VkPipelineSampleLocationsStateCreateInfoEXT*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT:
+        {
+            reservedmarshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceSampleLocationsPropertiesEXT*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_EXT_blend_operation_advanced
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT:
+        {
+            reservedmarshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT:
+        {
+            reservedmarshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT:
+        {
+            reservedmarshal_VkPipelineColorBlendAdvancedStateCreateInfoEXT(vkStream, reinterpret_cast<const VkPipelineColorBlendAdvancedStateCreateInfoEXT*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_NV_fragment_coverage_to_color
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV:
+        {
+            reservedmarshal_VkPipelineCoverageToColorStateCreateInfoNV(vkStream, reinterpret_cast<const VkPipelineCoverageToColorStateCreateInfoNV*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_NV_framebuffer_mixed_samples
+        case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV:
+        {
+            reservedmarshal_VkPipelineCoverageModulationStateCreateInfoNV(vkStream, reinterpret_cast<const VkPipelineCoverageModulationStateCreateInfoNV*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_EXT_validation_cache
+        case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT:
+        {
+            reservedmarshal_VkShaderModuleValidationCacheCreateInfoEXT(vkStream, reinterpret_cast<const VkShaderModuleValidationCacheCreateInfoEXT*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_EXT_descriptor_indexing
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT:
+        {
+            reservedmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfoEXT(vkStream, reinterpret_cast<const VkDescriptorSetLayoutBindingFlagsCreateInfoEXT*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT:
+        {
+            reservedmarshal_VkPhysicalDeviceDescriptorIndexingFeaturesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingFeaturesEXT*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT:
+        {
+            reservedmarshal_VkPhysicalDeviceDescriptorIndexingPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceDescriptorIndexingPropertiesEXT*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT:
+        {
+            reservedmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfoEXT(vkStream, reinterpret_cast<const VkDescriptorSetVariableDescriptorCountAllocateInfoEXT*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT:
+        {
+            reservedmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupportEXT(vkStream, reinterpret_cast<const VkDescriptorSetVariableDescriptorCountLayoutSupportEXT*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_EXT_global_priority
+        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT:
+        {
+            reservedmarshal_VkDeviceQueueGlobalPriorityCreateInfoEXT(vkStream, reinterpret_cast<const VkDeviceQueueGlobalPriorityCreateInfoEXT*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_EXT_external_memory_host
+        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT:
+        {
+            reservedmarshal_VkImportMemoryHostPointerInfoEXT(vkStream, reinterpret_cast<const VkImportMemoryHostPointerInfoEXT*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT:
+        {
+            reservedmarshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceExternalMemoryHostPropertiesEXT*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_AMD_shader_core_properties
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD:
+        {
+            reservedmarshal_VkPhysicalDeviceShaderCorePropertiesAMD(vkStream, reinterpret_cast<const VkPhysicalDeviceShaderCorePropertiesAMD*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_EXT_vertex_attribute_divisor
+        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT:
+        {
+            reservedmarshal_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(vkStream, reinterpret_cast<const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT:
+        {
+            reservedmarshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(vkStream, reinterpret_cast<const VkPipelineVertexInputDivisorStateCreateInfoEXT*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_NV_device_diagnostic_checkpoints
+        case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV:
+        {
+            reservedmarshal_VkQueueFamilyCheckpointPropertiesNV(vkStream, reinterpret_cast<const VkQueueFamilyCheckpointPropertiesNV*>(structExtension), ptr);
+            break;
+        }
+#endif
+#ifdef VK_GOOGLE_color_buffer
+        case VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE:
+        {
+            reservedmarshal_VkImportColorBufferGOOGLE(vkStream, reinterpret_cast<const VkImportColorBufferGOOGLE*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_IMPORT_BUFFER_GOOGLE:
+        {
+            reservedmarshal_VkImportBufferGOOGLE(vkStream, reinterpret_cast<const VkImportBufferGOOGLE*>(structExtension), ptr);
+            break;
+        }
+        case VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE:
+        {
+            reservedmarshal_VkImportPhysicalAddressGOOGLE(vkStream, reinterpret_cast<const VkImportPhysicalAddressGOOGLE*>(structExtension), ptr);
+            break;
+        }
+#endif
+        default:
+        {
+            // fatal; the switch is only taken if the extension struct is known
+            abort();
+        }
+    }
+}
+
+
+} // namespace goldfish_vk
diff --git a/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.h b/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.h
new file mode 100644
index 0000000..b410310
--- /dev/null
+++ b/system/vulkan_enc/goldfish_vk_reserved_marshaling_guest.h
@@ -0,0 +1,2055 @@
+// Copyright (C) 2018 The Android Open Source Project
+// Copyright (C) 2018 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Autogenerated module goldfish_vk_reserved_marshaling_guest
+// (header) generated by android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/genvk.py -registry android/android-emugl/host/libs/libOpenglRender/vulkan-registry/xml/vk.xml cereal -o android/android-emugl/host/libs/libOpenglRender/vulkan/cereal
+// Please do not modify directly;
+// re-run android/scripts/generate-vulkan-sources.sh,
+// or directly from Python by defining:
+// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
+// CEREAL_OUTPUT_DIR: Where to put the generated sources.
+// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
+
+#pragma once
+
+#include <vulkan/vulkan.h>
+
+
+#include "vk_platform_compat.h"
+
+#include "goldfish_vk_marshaling_guest.h"
+#include "goldfish_vk_private_defs.h"
+#include "VulkanStreamGuest.h"
+
+// Stuff we are not going to use but if included,
+// will cause compile errors. These are Android Vulkan
+// required extensions, but the approach will be to
+// implement them completely on the guest side.
+#undef VK_KHR_android_surface
+#undef VK_ANDROID_external_memory_android_hardware_buffer
+
+
+namespace goldfish_vk {
+
+#ifdef VK_VERSION_1_0
+void reservedmarshal_VkApplicationInfo(
+    VulkanStreamGuest* vkStream,
+    const VkApplicationInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkInstanceCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkInstanceCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkAllocationCallbacks(
+    VulkanStreamGuest* vkStream,
+    const VkAllocationCallbacks* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceFeatures(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceFeatures* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkFormatProperties(
+    VulkanStreamGuest* vkStream,
+    const VkFormatProperties* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkExtent3D(
+    VulkanStreamGuest* vkStream,
+    const VkExtent3D* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkImageFormatProperties(
+    VulkanStreamGuest* vkStream,
+    const VkImageFormatProperties* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceLimits(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceLimits* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceSparseProperties(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceSparseProperties* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceProperties(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceProperties* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkQueueFamilyProperties(
+    VulkanStreamGuest* vkStream,
+    const VkQueueFamilyProperties* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkMemoryType(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryType* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkMemoryHeap(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryHeap* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceMemoryProperties(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceMemoryProperties* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDeviceQueueCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceQueueCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDeviceCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkExtensionProperties(
+    VulkanStreamGuest* vkStream,
+    const VkExtensionProperties* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkLayerProperties(
+    VulkanStreamGuest* vkStream,
+    const VkLayerProperties* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSubmitInfo(
+    VulkanStreamGuest* vkStream,
+    const VkSubmitInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkMemoryAllocateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryAllocateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkMappedMemoryRange(
+    VulkanStreamGuest* vkStream,
+    const VkMappedMemoryRange* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkMemoryRequirements(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryRequirements* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSparseImageFormatProperties(
+    VulkanStreamGuest* vkStream,
+    const VkSparseImageFormatProperties* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSparseImageMemoryRequirements(
+    VulkanStreamGuest* vkStream,
+    const VkSparseImageMemoryRequirements* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSparseMemoryBind(
+    VulkanStreamGuest* vkStream,
+    const VkSparseMemoryBind* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSparseBufferMemoryBindInfo(
+    VulkanStreamGuest* vkStream,
+    const VkSparseBufferMemoryBindInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSparseImageOpaqueMemoryBindInfo(
+    VulkanStreamGuest* vkStream,
+    const VkSparseImageOpaqueMemoryBindInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkImageSubresource(
+    VulkanStreamGuest* vkStream,
+    const VkImageSubresource* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkOffset3D(
+    VulkanStreamGuest* vkStream,
+    const VkOffset3D* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSparseImageMemoryBind(
+    VulkanStreamGuest* vkStream,
+    const VkSparseImageMemoryBind* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSparseImageMemoryBindInfo(
+    VulkanStreamGuest* vkStream,
+    const VkSparseImageMemoryBindInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkBindSparseInfo(
+    VulkanStreamGuest* vkStream,
+    const VkBindSparseInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkFenceCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkFenceCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSemaphoreCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkSemaphoreCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkEventCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkEventCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkQueryPoolCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkQueryPoolCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkBufferCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkBufferCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkBufferViewCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkBufferViewCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkImageCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkImageCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSubresourceLayout(
+    VulkanStreamGuest* vkStream,
+    const VkSubresourceLayout* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkComponentMapping(
+    VulkanStreamGuest* vkStream,
+    const VkComponentMapping* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkImageSubresourceRange(
+    VulkanStreamGuest* vkStream,
+    const VkImageSubresourceRange* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkImageViewCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkImageViewCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkShaderModuleCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkShaderModuleCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPipelineCacheCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineCacheCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSpecializationMapEntry(
+    VulkanStreamGuest* vkStream,
+    const VkSpecializationMapEntry* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSpecializationInfo(
+    VulkanStreamGuest* vkStream,
+    const VkSpecializationInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPipelineShaderStageCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineShaderStageCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkVertexInputBindingDescription(
+    VulkanStreamGuest* vkStream,
+    const VkVertexInputBindingDescription* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkVertexInputAttributeDescription(
+    VulkanStreamGuest* vkStream,
+    const VkVertexInputAttributeDescription* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPipelineVertexInputStateCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineVertexInputStateCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPipelineInputAssemblyStateCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineInputAssemblyStateCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPipelineTessellationStateCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineTessellationStateCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkViewport(
+    VulkanStreamGuest* vkStream,
+    const VkViewport* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkOffset2D(
+    VulkanStreamGuest* vkStream,
+    const VkOffset2D* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkExtent2D(
+    VulkanStreamGuest* vkStream,
+    const VkExtent2D* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkRect2D(
+    VulkanStreamGuest* vkStream,
+    const VkRect2D* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPipelineViewportStateCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineViewportStateCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPipelineRasterizationStateCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineRasterizationStateCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPipelineMultisampleStateCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineMultisampleStateCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkStencilOpState(
+    VulkanStreamGuest* vkStream,
+    const VkStencilOpState* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPipelineDepthStencilStateCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineDepthStencilStateCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPipelineColorBlendAttachmentState(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineColorBlendAttachmentState* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPipelineColorBlendStateCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineColorBlendStateCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPipelineDynamicStateCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineDynamicStateCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkGraphicsPipelineCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkGraphicsPipelineCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkComputePipelineCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkComputePipelineCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPushConstantRange(
+    VulkanStreamGuest* vkStream,
+    const VkPushConstantRange* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPipelineLayoutCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineLayoutCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSamplerCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkSamplerCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDescriptorSetLayoutBinding(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorSetLayoutBinding* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDescriptorSetLayoutCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorSetLayoutCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDescriptorPoolSize(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorPoolSize* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDescriptorPoolCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorPoolCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDescriptorSetAllocateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorSetAllocateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDescriptorImageInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorImageInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDescriptorBufferInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorBufferInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkWriteDescriptorSet(
+    VulkanStreamGuest* vkStream,
+    const VkWriteDescriptorSet* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkCopyDescriptorSet(
+    VulkanStreamGuest* vkStream,
+    const VkCopyDescriptorSet* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkFramebufferCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkFramebufferCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkAttachmentDescription(
+    VulkanStreamGuest* vkStream,
+    const VkAttachmentDescription* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkAttachmentReference(
+    VulkanStreamGuest* vkStream,
+    const VkAttachmentReference* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSubpassDescription(
+    VulkanStreamGuest* vkStream,
+    const VkSubpassDescription* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSubpassDependency(
+    VulkanStreamGuest* vkStream,
+    const VkSubpassDependency* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkRenderPassCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkRenderPassCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkCommandPoolCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkCommandPoolCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkCommandBufferAllocateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkCommandBufferAllocateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkCommandBufferInheritanceInfo(
+    VulkanStreamGuest* vkStream,
+    const VkCommandBufferInheritanceInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkCommandBufferBeginInfo(
+    VulkanStreamGuest* vkStream,
+    const VkCommandBufferBeginInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkBufferCopy(
+    VulkanStreamGuest* vkStream,
+    const VkBufferCopy* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkImageSubresourceLayers(
+    VulkanStreamGuest* vkStream,
+    const VkImageSubresourceLayers* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkImageCopy(
+    VulkanStreamGuest* vkStream,
+    const VkImageCopy* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkImageBlit(
+    VulkanStreamGuest* vkStream,
+    const VkImageBlit* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkBufferImageCopy(
+    VulkanStreamGuest* vkStream,
+    const VkBufferImageCopy* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkClearColorValue(
+    VulkanStreamGuest* vkStream,
+    const VkClearColorValue* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkClearDepthStencilValue(
+    VulkanStreamGuest* vkStream,
+    const VkClearDepthStencilValue* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkClearValue(
+    VulkanStreamGuest* vkStream,
+    const VkClearValue* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkClearAttachment(
+    VulkanStreamGuest* vkStream,
+    const VkClearAttachment* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkClearRect(
+    VulkanStreamGuest* vkStream,
+    const VkClearRect* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkImageResolve(
+    VulkanStreamGuest* vkStream,
+    const VkImageResolve* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkMemoryBarrier(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryBarrier* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkBufferMemoryBarrier(
+    VulkanStreamGuest* vkStream,
+    const VkBufferMemoryBarrier* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkImageMemoryBarrier(
+    VulkanStreamGuest* vkStream,
+    const VkImageMemoryBarrier* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkRenderPassBeginInfo(
+    VulkanStreamGuest* vkStream,
+    const VkRenderPassBeginInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDispatchIndirectCommand(
+    VulkanStreamGuest* vkStream,
+    const VkDispatchIndirectCommand* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDrawIndexedIndirectCommand(
+    VulkanStreamGuest* vkStream,
+    const VkDrawIndexedIndirectCommand* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDrawIndirectCommand(
+    VulkanStreamGuest* vkStream,
+    const VkDrawIndirectCommand* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkBaseOutStructure(
+    VulkanStreamGuest* vkStream,
+    const VkBaseOutStructure* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkBaseInStructure(
+    VulkanStreamGuest* vkStream,
+    const VkBaseInStructure* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_VERSION_1_1
+void reservedmarshal_VkPhysicalDeviceSubgroupProperties(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceSubgroupProperties* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkBindBufferMemoryInfo(
+    VulkanStreamGuest* vkStream,
+    const VkBindBufferMemoryInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkBindImageMemoryInfo(
+    VulkanStreamGuest* vkStream,
+    const VkBindImageMemoryInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDevice16BitStorageFeatures(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDevice16BitStorageFeatures* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkMemoryDedicatedRequirements(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryDedicatedRequirements* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkMemoryDedicatedAllocateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryDedicatedAllocateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkMemoryAllocateFlagsInfo(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryAllocateFlagsInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDeviceGroupRenderPassBeginInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceGroupRenderPassBeginInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDeviceGroupCommandBufferBeginInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceGroupCommandBufferBeginInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDeviceGroupSubmitInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceGroupSubmitInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDeviceGroupBindSparseInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceGroupBindSparseInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkBindBufferMemoryDeviceGroupInfo(
+    VulkanStreamGuest* vkStream,
+    const VkBindBufferMemoryDeviceGroupInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkBindImageMemoryDeviceGroupInfo(
+    VulkanStreamGuest* vkStream,
+    const VkBindImageMemoryDeviceGroupInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceGroupProperties(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceGroupProperties* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDeviceGroupDeviceCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceGroupDeviceCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkBufferMemoryRequirementsInfo2(
+    VulkanStreamGuest* vkStream,
+    const VkBufferMemoryRequirementsInfo2* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkImageMemoryRequirementsInfo2(
+    VulkanStreamGuest* vkStream,
+    const VkImageMemoryRequirementsInfo2* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkImageSparseMemoryRequirementsInfo2(
+    VulkanStreamGuest* vkStream,
+    const VkImageSparseMemoryRequirementsInfo2* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkMemoryRequirements2(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryRequirements2* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSparseImageMemoryRequirements2(
+    VulkanStreamGuest* vkStream,
+    const VkSparseImageMemoryRequirements2* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceFeatures2(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceFeatures2* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceProperties2(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceProperties2* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkFormatProperties2(
+    VulkanStreamGuest* vkStream,
+    const VkFormatProperties2* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkImageFormatProperties2(
+    VulkanStreamGuest* vkStream,
+    const VkImageFormatProperties2* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceImageFormatInfo2(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceImageFormatInfo2* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkQueueFamilyProperties2(
+    VulkanStreamGuest* vkStream,
+    const VkQueueFamilyProperties2* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceMemoryProperties2(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceMemoryProperties2* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSparseImageFormatProperties2(
+    VulkanStreamGuest* vkStream,
+    const VkSparseImageFormatProperties2* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceSparseImageFormatInfo2(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceSparseImageFormatInfo2* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDevicePointClippingProperties(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDevicePointClippingProperties* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkInputAttachmentAspectReference(
+    VulkanStreamGuest* vkStream,
+    const VkInputAttachmentAspectReference* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkRenderPassInputAttachmentAspectCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkRenderPassInputAttachmentAspectCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkImageViewUsageCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkImageViewUsageCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPipelineTessellationDomainOriginStateCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineTessellationDomainOriginStateCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkRenderPassMultiviewCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkRenderPassMultiviewCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceMultiviewFeatures(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceMultiviewFeatures* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceMultiviewProperties(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceMultiviewProperties* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceVariablePointerFeatures(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceVariablePointerFeatures* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceProtectedMemoryFeatures(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceProtectedMemoryFeatures* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceProtectedMemoryProperties(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceProtectedMemoryProperties* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDeviceQueueInfo2(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceQueueInfo2* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkProtectedSubmitInfo(
+    VulkanStreamGuest* vkStream,
+    const VkProtectedSubmitInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSamplerYcbcrConversionCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkSamplerYcbcrConversionCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSamplerYcbcrConversionInfo(
+    VulkanStreamGuest* vkStream,
+    const VkSamplerYcbcrConversionInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkBindImagePlaneMemoryInfo(
+    VulkanStreamGuest* vkStream,
+    const VkBindImagePlaneMemoryInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkImagePlaneMemoryRequirementsInfo(
+    VulkanStreamGuest* vkStream,
+    const VkImagePlaneMemoryRequirementsInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceSamplerYcbcrConversionFeatures(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceSamplerYcbcrConversionFeatures* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSamplerYcbcrConversionImageFormatProperties(
+    VulkanStreamGuest* vkStream,
+    const VkSamplerYcbcrConversionImageFormatProperties* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDescriptorUpdateTemplateEntry(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorUpdateTemplateEntry* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDescriptorUpdateTemplateCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorUpdateTemplateCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkExternalMemoryProperties(
+    VulkanStreamGuest* vkStream,
+    const VkExternalMemoryProperties* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceExternalImageFormatInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceExternalImageFormatInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkExternalImageFormatProperties(
+    VulkanStreamGuest* vkStream,
+    const VkExternalImageFormatProperties* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceExternalBufferInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceExternalBufferInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkExternalBufferProperties(
+    VulkanStreamGuest* vkStream,
+    const VkExternalBufferProperties* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceIDProperties(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceIDProperties* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkExternalMemoryImageCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkExternalMemoryImageCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkExternalMemoryBufferCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkExternalMemoryBufferCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkExportMemoryAllocateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkExportMemoryAllocateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceExternalFenceInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceExternalFenceInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkExternalFenceProperties(
+    VulkanStreamGuest* vkStream,
+    const VkExternalFenceProperties* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkExportFenceCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkExportFenceCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkExportSemaphoreCreateInfo(
+    VulkanStreamGuest* vkStream,
+    const VkExportSemaphoreCreateInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceExternalSemaphoreInfo(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceExternalSemaphoreInfo* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkExternalSemaphoreProperties(
+    VulkanStreamGuest* vkStream,
+    const VkExternalSemaphoreProperties* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceMaintenance3Properties(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceMaintenance3Properties* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDescriptorSetLayoutSupport(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorSetLayoutSupport* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceShaderDrawParameterFeatures(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceShaderDrawParameterFeatures* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_surface
+void reservedmarshal_VkSurfaceCapabilitiesKHR(
+    VulkanStreamGuest* vkStream,
+    const VkSurfaceCapabilitiesKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSurfaceFormatKHR(
+    VulkanStreamGuest* vkStream,
+    const VkSurfaceFormatKHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_swapchain
+void reservedmarshal_VkSwapchainCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkSwapchainCreateInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPresentInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkPresentInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkImageSwapchainCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkImageSwapchainCreateInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkBindImageMemorySwapchainInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkBindImageMemorySwapchainInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkAcquireNextImageInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkAcquireNextImageInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDeviceGroupPresentCapabilitiesKHR(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceGroupPresentCapabilitiesKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDeviceGroupPresentInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceGroupPresentInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDeviceGroupSwapchainCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceGroupSwapchainCreateInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_display
+void reservedmarshal_VkDisplayPropertiesKHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayPropertiesKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDisplayModeParametersKHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayModeParametersKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDisplayModePropertiesKHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayModePropertiesKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDisplayModeCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayModeCreateInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDisplayPlaneCapabilitiesKHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayPlaneCapabilitiesKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDisplayPlanePropertiesKHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayPlanePropertiesKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDisplaySurfaceCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplaySurfaceCreateInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_display_swapchain
+void reservedmarshal_VkDisplayPresentInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayPresentInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_xlib_surface
+void reservedmarshal_VkXlibSurfaceCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkXlibSurfaceCreateInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_xcb_surface
+void reservedmarshal_VkXcbSurfaceCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkXcbSurfaceCreateInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_wayland_surface
+void reservedmarshal_VkWaylandSurfaceCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkWaylandSurfaceCreateInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_mir_surface
+void reservedmarshal_VkMirSurfaceCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkMirSurfaceCreateInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_android_surface
+void reservedmarshal_VkAndroidSurfaceCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkAndroidSurfaceCreateInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_win32_surface
+void reservedmarshal_VkWin32SurfaceCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkWin32SurfaceCreateInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_sampler_mirror_clamp_to_edge
+#endif
+#ifdef VK_KHR_multiview
+#endif
+#ifdef VK_KHR_get_physical_device_properties2
+#endif
+#ifdef VK_KHR_device_group
+#endif
+#ifdef VK_KHR_shader_draw_parameters
+#endif
+#ifdef VK_KHR_maintenance1
+#endif
+#ifdef VK_KHR_device_group_creation
+#endif
+#ifdef VK_KHR_external_memory_capabilities
+#endif
+#ifdef VK_KHR_external_memory
+#endif
+#ifdef VK_KHR_external_memory_win32
+void reservedmarshal_VkImportMemoryWin32HandleInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkImportMemoryWin32HandleInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkExportMemoryWin32HandleInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkExportMemoryWin32HandleInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkMemoryWin32HandlePropertiesKHR(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryWin32HandlePropertiesKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkMemoryGetWin32HandleInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryGetWin32HandleInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_external_memory_fd
+void reservedmarshal_VkImportMemoryFdInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkImportMemoryFdInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkMemoryFdPropertiesKHR(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryFdPropertiesKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkMemoryGetFdInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryGetFdInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_win32_keyed_mutex
+void reservedmarshal_VkWin32KeyedMutexAcquireReleaseInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkWin32KeyedMutexAcquireReleaseInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_external_semaphore_capabilities
+#endif
+#ifdef VK_KHR_external_semaphore
+#endif
+#ifdef VK_KHR_external_semaphore_win32
+void reservedmarshal_VkImportSemaphoreWin32HandleInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkImportSemaphoreWin32HandleInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkExportSemaphoreWin32HandleInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkExportSemaphoreWin32HandleInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkD3D12FenceSubmitInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkD3D12FenceSubmitInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSemaphoreGetWin32HandleInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkSemaphoreGetWin32HandleInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_external_semaphore_fd
+void reservedmarshal_VkImportSemaphoreFdInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkImportSemaphoreFdInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSemaphoreGetFdInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkSemaphoreGetFdInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_push_descriptor
+void reservedmarshal_VkPhysicalDevicePushDescriptorPropertiesKHR(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDevicePushDescriptorPropertiesKHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_16bit_storage
+#endif
+#ifdef VK_KHR_incremental_present
+void reservedmarshal_VkRectLayerKHR(
+    VulkanStreamGuest* vkStream,
+    const VkRectLayerKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPresentRegionKHR(
+    VulkanStreamGuest* vkStream,
+    const VkPresentRegionKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPresentRegionsKHR(
+    VulkanStreamGuest* vkStream,
+    const VkPresentRegionsKHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_descriptor_update_template
+#endif
+#ifdef VK_KHR_create_renderpass2
+void reservedmarshal_VkAttachmentDescription2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkAttachmentDescription2KHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkAttachmentReference2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkAttachmentReference2KHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSubpassDescription2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkSubpassDescription2KHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSubpassDependency2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkSubpassDependency2KHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkRenderPassCreateInfo2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkRenderPassCreateInfo2KHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSubpassBeginInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkSubpassBeginInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSubpassEndInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkSubpassEndInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_shared_presentable_image
+void reservedmarshal_VkSharedPresentSurfaceCapabilitiesKHR(
+    VulkanStreamGuest* vkStream,
+    const VkSharedPresentSurfaceCapabilitiesKHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_external_fence_capabilities
+#endif
+#ifdef VK_KHR_external_fence
+#endif
+#ifdef VK_KHR_external_fence_win32
+void reservedmarshal_VkImportFenceWin32HandleInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkImportFenceWin32HandleInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkExportFenceWin32HandleInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkExportFenceWin32HandleInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkFenceGetWin32HandleInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkFenceGetWin32HandleInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_external_fence_fd
+void reservedmarshal_VkImportFenceFdInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkImportFenceFdInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkFenceGetFdInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkFenceGetFdInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_maintenance2
+#endif
+#ifdef VK_KHR_get_surface_capabilities2
+void reservedmarshal_VkPhysicalDeviceSurfaceInfo2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceSurfaceInfo2KHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSurfaceCapabilities2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkSurfaceCapabilities2KHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSurfaceFormat2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkSurfaceFormat2KHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_variable_pointers
+#endif
+#ifdef VK_KHR_get_display_properties2
+void reservedmarshal_VkDisplayProperties2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayProperties2KHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDisplayPlaneProperties2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayPlaneProperties2KHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDisplayModeProperties2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayModeProperties2KHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDisplayPlaneInfo2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayPlaneInfo2KHR* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDisplayPlaneCapabilities2KHR(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayPlaneCapabilities2KHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_dedicated_allocation
+#endif
+#ifdef VK_KHR_storage_buffer_storage_class
+#endif
+#ifdef VK_KHR_relaxed_block_layout
+#endif
+#ifdef VK_KHR_get_memory_requirements2
+#endif
+#ifdef VK_KHR_image_format_list
+void reservedmarshal_VkImageFormatListCreateInfoKHR(
+    VulkanStreamGuest* vkStream,
+    const VkImageFormatListCreateInfoKHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_sampler_ycbcr_conversion
+#endif
+#ifdef VK_KHR_bind_memory2
+#endif
+#ifdef VK_KHR_maintenance3
+#endif
+#ifdef VK_KHR_draw_indirect_count
+#endif
+#ifdef VK_KHR_8bit_storage
+void reservedmarshal_VkPhysicalDevice8BitStorageFeaturesKHR(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDevice8BitStorageFeaturesKHR* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_KHR_shader_float16_int8
+void reservedmarshal_VkPhysicalDeviceShaderFloat16Int8Features(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceShaderFloat16Int8Features* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_ANDROID_native_buffer
+void reservedmarshal_VkNativeBufferANDROID(
+    VulkanStreamGuest* vkStream,
+    const VkNativeBufferANDROID* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_EXT_debug_report
+void reservedmarshal_VkDebugReportCallbackCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDebugReportCallbackCreateInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_NV_glsl_shader
+#endif
+#ifdef VK_EXT_depth_range_unrestricted
+#endif
+#ifdef VK_IMG_filter_cubic
+#endif
+#ifdef VK_AMD_rasterization_order
+void reservedmarshal_VkPipelineRasterizationStateRasterizationOrderAMD(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineRasterizationStateRasterizationOrderAMD* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_AMD_shader_trinary_minmax
+#endif
+#ifdef VK_AMD_shader_explicit_vertex_parameter
+#endif
+#ifdef VK_EXT_debug_marker
+void reservedmarshal_VkDebugMarkerObjectNameInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDebugMarkerObjectNameInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDebugMarkerObjectTagInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDebugMarkerObjectTagInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDebugMarkerMarkerInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDebugMarkerMarkerInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_AMD_gcn_shader
+#endif
+#ifdef VK_NV_dedicated_allocation
+void reservedmarshal_VkDedicatedAllocationImageCreateInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkDedicatedAllocationImageCreateInfoNV* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDedicatedAllocationBufferCreateInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkDedicatedAllocationBufferCreateInfoNV* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDedicatedAllocationMemoryAllocateInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkDedicatedAllocationMemoryAllocateInfoNV* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_AMD_draw_indirect_count
+#endif
+#ifdef VK_AMD_negative_viewport_height
+#endif
+#ifdef VK_AMD_gpu_shader_half_float
+#endif
+#ifdef VK_AMD_shader_ballot
+#endif
+#ifdef VK_AMD_texture_gather_bias_lod
+void reservedmarshal_VkTextureLODGatherFormatPropertiesAMD(
+    VulkanStreamGuest* vkStream,
+    const VkTextureLODGatherFormatPropertiesAMD* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_AMD_shader_info
+void reservedmarshal_VkShaderResourceUsageAMD(
+    VulkanStreamGuest* vkStream,
+    const VkShaderResourceUsageAMD* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkShaderStatisticsInfoAMD(
+    VulkanStreamGuest* vkStream,
+    const VkShaderStatisticsInfoAMD* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_AMD_shader_image_load_store_lod
+#endif
+#ifdef VK_IMG_format_pvrtc
+#endif
+#ifdef VK_NV_external_memory_capabilities
+void reservedmarshal_VkExternalImageFormatPropertiesNV(
+    VulkanStreamGuest* vkStream,
+    const VkExternalImageFormatPropertiesNV* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_NV_external_memory
+void reservedmarshal_VkExternalMemoryImageCreateInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkExternalMemoryImageCreateInfoNV* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkExportMemoryAllocateInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkExportMemoryAllocateInfoNV* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_NV_external_memory_win32
+void reservedmarshal_VkImportMemoryWin32HandleInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkImportMemoryWin32HandleInfoNV* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkExportMemoryWin32HandleInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkExportMemoryWin32HandleInfoNV* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_NV_win32_keyed_mutex
+void reservedmarshal_VkWin32KeyedMutexAcquireReleaseInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkWin32KeyedMutexAcquireReleaseInfoNV* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_EXT_validation_flags
+void reservedmarshal_VkValidationFlagsEXT(
+    VulkanStreamGuest* vkStream,
+    const VkValidationFlagsEXT* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_NN_vi_surface
+void reservedmarshal_VkViSurfaceCreateInfoNN(
+    VulkanStreamGuest* vkStream,
+    const VkViSurfaceCreateInfoNN* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_EXT_shader_subgroup_ballot
+#endif
+#ifdef VK_EXT_shader_subgroup_vote
+#endif
+#ifdef VK_EXT_conditional_rendering
+void reservedmarshal_VkConditionalRenderingBeginInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkConditionalRenderingBeginInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceConditionalRenderingFeaturesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceConditionalRenderingFeaturesEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkCommandBufferInheritanceConditionalRenderingInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkCommandBufferInheritanceConditionalRenderingInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_NVX_device_generated_commands
+void reservedmarshal_VkDeviceGeneratedCommandsFeaturesNVX(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceGeneratedCommandsFeaturesNVX* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDeviceGeneratedCommandsLimitsNVX(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceGeneratedCommandsLimitsNVX* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkIndirectCommandsTokenNVX(
+    VulkanStreamGuest* vkStream,
+    const VkIndirectCommandsTokenNVX* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkIndirectCommandsLayoutTokenNVX(
+    VulkanStreamGuest* vkStream,
+    const VkIndirectCommandsLayoutTokenNVX* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkIndirectCommandsLayoutCreateInfoNVX(
+    VulkanStreamGuest* vkStream,
+    const VkIndirectCommandsLayoutCreateInfoNVX* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkCmdProcessCommandsInfoNVX(
+    VulkanStreamGuest* vkStream,
+    const VkCmdProcessCommandsInfoNVX* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkCmdReserveSpaceForCommandsInfoNVX(
+    VulkanStreamGuest* vkStream,
+    const VkCmdReserveSpaceForCommandsInfoNVX* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkObjectTableCreateInfoNVX(
+    VulkanStreamGuest* vkStream,
+    const VkObjectTableCreateInfoNVX* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkObjectTableEntryNVX(
+    VulkanStreamGuest* vkStream,
+    const VkObjectTableEntryNVX* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkObjectTablePipelineEntryNVX(
+    VulkanStreamGuest* vkStream,
+    const VkObjectTablePipelineEntryNVX* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkObjectTableDescriptorSetEntryNVX(
+    VulkanStreamGuest* vkStream,
+    const VkObjectTableDescriptorSetEntryNVX* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkObjectTableVertexBufferEntryNVX(
+    VulkanStreamGuest* vkStream,
+    const VkObjectTableVertexBufferEntryNVX* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkObjectTableIndexBufferEntryNVX(
+    VulkanStreamGuest* vkStream,
+    const VkObjectTableIndexBufferEntryNVX* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkObjectTablePushConstantEntryNVX(
+    VulkanStreamGuest* vkStream,
+    const VkObjectTablePushConstantEntryNVX* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_NV_clip_space_w_scaling
+void reservedmarshal_VkViewportWScalingNV(
+    VulkanStreamGuest* vkStream,
+    const VkViewportWScalingNV* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPipelineViewportWScalingStateCreateInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineViewportWScalingStateCreateInfoNV* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_EXT_direct_mode_display
+#endif
+#ifdef VK_EXT_acquire_xlib_display
+#endif
+#ifdef VK_EXT_display_surface_counter
+void reservedmarshal_VkSurfaceCapabilities2EXT(
+    VulkanStreamGuest* vkStream,
+    const VkSurfaceCapabilities2EXT* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_EXT_display_control
+void reservedmarshal_VkDisplayPowerInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayPowerInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDeviceEventInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceEventInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDisplayEventInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDisplayEventInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSwapchainCounterCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkSwapchainCounterCreateInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_GOOGLE_display_timing
+void reservedmarshal_VkRefreshCycleDurationGOOGLE(
+    VulkanStreamGuest* vkStream,
+    const VkRefreshCycleDurationGOOGLE* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPastPresentationTimingGOOGLE(
+    VulkanStreamGuest* vkStream,
+    const VkPastPresentationTimingGOOGLE* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPresentTimeGOOGLE(
+    VulkanStreamGuest* vkStream,
+    const VkPresentTimeGOOGLE* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPresentTimesInfoGOOGLE(
+    VulkanStreamGuest* vkStream,
+    const VkPresentTimesInfoGOOGLE* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_NV_sample_mask_override_coverage
+#endif
+#ifdef VK_NV_geometry_shader_passthrough
+#endif
+#ifdef VK_NV_viewport_array2
+#endif
+#ifdef VK_NVX_multiview_per_view_attributes
+void reservedmarshal_VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_NV_viewport_swizzle
+void reservedmarshal_VkViewportSwizzleNV(
+    VulkanStreamGuest* vkStream,
+    const VkViewportSwizzleNV* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPipelineViewportSwizzleStateCreateInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineViewportSwizzleStateCreateInfoNV* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_EXT_discard_rectangles
+void reservedmarshal_VkPhysicalDeviceDiscardRectanglePropertiesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceDiscardRectanglePropertiesEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPipelineDiscardRectangleStateCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineDiscardRectangleStateCreateInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_EXT_conservative_rasterization
+void reservedmarshal_VkPhysicalDeviceConservativeRasterizationPropertiesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceConservativeRasterizationPropertiesEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPipelineRasterizationConservativeStateCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineRasterizationConservativeStateCreateInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_EXT_swapchain_colorspace
+#endif
+#ifdef VK_EXT_hdr_metadata
+void reservedmarshal_VkXYColorEXT(
+    VulkanStreamGuest* vkStream,
+    const VkXYColorEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkHdrMetadataEXT(
+    VulkanStreamGuest* vkStream,
+    const VkHdrMetadataEXT* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_MVK_ios_surface
+void reservedmarshal_VkIOSSurfaceCreateInfoMVK(
+    VulkanStreamGuest* vkStream,
+    const VkIOSSurfaceCreateInfoMVK* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_MVK_macos_surface
+void reservedmarshal_VkMacOSSurfaceCreateInfoMVK(
+    VulkanStreamGuest* vkStream,
+    const VkMacOSSurfaceCreateInfoMVK* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_EXT_external_memory_dma_buf
+#endif
+#ifdef VK_EXT_queue_family_foreign
+#endif
+#ifdef VK_EXT_debug_utils
+void reservedmarshal_VkDebugUtilsObjectNameInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDebugUtilsObjectNameInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDebugUtilsObjectTagInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDebugUtilsObjectTagInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDebugUtilsLabelEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDebugUtilsLabelEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDebugUtilsMessengerCallbackDataEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDebugUtilsMessengerCallbackDataEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDebugUtilsMessengerCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDebugUtilsMessengerCreateInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_ANDROID_external_memory_android_hardware_buffer
+void reservedmarshal_VkAndroidHardwareBufferUsageANDROID(
+    VulkanStreamGuest* vkStream,
+    const VkAndroidHardwareBufferUsageANDROID* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkAndroidHardwareBufferPropertiesANDROID(
+    VulkanStreamGuest* vkStream,
+    const VkAndroidHardwareBufferPropertiesANDROID* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkAndroidHardwareBufferFormatPropertiesANDROID(
+    VulkanStreamGuest* vkStream,
+    const VkAndroidHardwareBufferFormatPropertiesANDROID* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkImportAndroidHardwareBufferInfoANDROID(
+    VulkanStreamGuest* vkStream,
+    const VkImportAndroidHardwareBufferInfoANDROID* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkMemoryGetAndroidHardwareBufferInfoANDROID(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryGetAndroidHardwareBufferInfoANDROID* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkExternalFormatANDROID(
+    VulkanStreamGuest* vkStream,
+    const VkExternalFormatANDROID* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_EXT_sampler_filter_minmax
+void reservedmarshal_VkSamplerReductionModeCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkSamplerReductionModeCreateInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_AMD_gpu_shader_int16
+#endif
+#ifdef VK_AMD_mixed_attachment_samples
+#endif
+#ifdef VK_AMD_shader_fragment_mask
+#endif
+#ifdef VK_EXT_shader_stencil_export
+#endif
+#ifdef VK_EXT_sample_locations
+void reservedmarshal_VkSampleLocationEXT(
+    VulkanStreamGuest* vkStream,
+    const VkSampleLocationEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSampleLocationsInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkSampleLocationsInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkAttachmentSampleLocationsEXT(
+    VulkanStreamGuest* vkStream,
+    const VkAttachmentSampleLocationsEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkSubpassSampleLocationsEXT(
+    VulkanStreamGuest* vkStream,
+    const VkSubpassSampleLocationsEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkRenderPassSampleLocationsBeginInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkRenderPassSampleLocationsBeginInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPipelineSampleLocationsStateCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineSampleLocationsStateCreateInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceSampleLocationsPropertiesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceSampleLocationsPropertiesEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkMultisamplePropertiesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkMultisamplePropertiesEXT* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_EXT_blend_operation_advanced
+void reservedmarshal_VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPipelineColorBlendAdvancedStateCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineColorBlendAdvancedStateCreateInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_NV_fragment_coverage_to_color
+void reservedmarshal_VkPipelineCoverageToColorStateCreateInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineCoverageToColorStateCreateInfoNV* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_NV_framebuffer_mixed_samples
+void reservedmarshal_VkPipelineCoverageModulationStateCreateInfoNV(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineCoverageModulationStateCreateInfoNV* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_NV_fill_rectangle
+#endif
+#ifdef VK_EXT_post_depth_coverage
+#endif
+#ifdef VK_EXT_validation_cache
+void reservedmarshal_VkValidationCacheCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkValidationCacheCreateInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkShaderModuleValidationCacheCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkShaderModuleValidationCacheCreateInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_EXT_descriptor_indexing
+void reservedmarshal_VkDescriptorSetLayoutBindingFlagsCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorSetLayoutBindingFlagsCreateInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceDescriptorIndexingFeaturesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceDescriptorIndexingFeaturesEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceDescriptorIndexingPropertiesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceDescriptorIndexingPropertiesEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDescriptorSetVariableDescriptorCountAllocateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorSetVariableDescriptorCountAllocateInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkDescriptorSetVariableDescriptorCountLayoutSupportEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDescriptorSetVariableDescriptorCountLayoutSupportEXT* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_EXT_shader_viewport_index_layer
+#endif
+#ifdef VK_EXT_global_priority
+void reservedmarshal_VkDeviceQueueGlobalPriorityCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkDeviceQueueGlobalPriorityCreateInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_EXT_external_memory_host
+void reservedmarshal_VkImportMemoryHostPointerInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkImportMemoryHostPointerInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkMemoryHostPointerPropertiesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkMemoryHostPointerPropertiesEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPhysicalDeviceExternalMemoryHostPropertiesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceExternalMemoryHostPropertiesEXT* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_AMD_buffer_marker
+#endif
+#ifdef VK_AMD_shader_core_properties
+void reservedmarshal_VkPhysicalDeviceShaderCorePropertiesAMD(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceShaderCorePropertiesAMD* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_EXT_vertex_attribute_divisor
+void reservedmarshal_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkVertexInputBindingDivisorDescriptionEXT(
+    VulkanStreamGuest* vkStream,
+    const VkVertexInputBindingDivisorDescriptionEXT* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkPipelineVertexInputDivisorStateCreateInfoEXT(
+    VulkanStreamGuest* vkStream,
+    const VkPipelineVertexInputDivisorStateCreateInfoEXT* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_NV_shader_subgroup_partitioned
+#endif
+#ifdef VK_NV_device_diagnostic_checkpoints
+void reservedmarshal_VkQueueFamilyCheckpointPropertiesNV(
+    VulkanStreamGuest* vkStream,
+    const VkQueueFamilyCheckpointPropertiesNV* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkCheckpointDataNV(
+    VulkanStreamGuest* vkStream,
+    const VkCheckpointDataNV* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_GOOGLE_address_space
+#endif
+#ifdef VK_GOOGLE_color_buffer
+void reservedmarshal_VkImportColorBufferGOOGLE(
+    VulkanStreamGuest* vkStream,
+    const VkImportColorBufferGOOGLE* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkImportBufferGOOGLE(
+    VulkanStreamGuest* vkStream,
+    const VkImportBufferGOOGLE* forMarshaling,
+    uint8_t** ptr);
+
+void reservedmarshal_VkImportPhysicalAddressGOOGLE(
+    VulkanStreamGuest* vkStream,
+    const VkImportPhysicalAddressGOOGLE* forMarshaling,
+    uint8_t** ptr);
+
+#endif
+#ifdef VK_GOOGLE_sized_descriptor_update_template
+#endif
+#ifdef VK_GOOGLE_async_command_buffers
+#endif
+#ifdef VK_GOOGLE_create_resources_with_requirements
+#endif
+#ifdef VK_GOOGLE_address_space_info
+#endif
+#ifdef VK_GOOGLE_free_memory_sync
+#endif
+#ifdef VK_GOOGLE_async_queue_submit
+#endif
+#ifdef VK_GOOGLE_linear_image_layout
+#endif
+#ifdef VK_MVK_moltenvk
+#endif
+
+} // namespace goldfish_vk