diff --git a/guest/vulkan_enc/ResourceTracker.cpp b/guest/vulkan_enc/ResourceTracker.cpp
index 4ce1e40..fd89d73 100644
--- a/guest/vulkan_enc/ResourceTracker.cpp
+++ b/guest/vulkan_enc/ResourceTracker.cpp
@@ -5696,8 +5696,7 @@
     }
 
     if (!outputBimsi || !outputBimsi->swapchain) {
-        ALOGE("FATAL: Local VkBindImageMemorySwapchainInfoKHR not properly allocated!");
-        abort();
+        return;
     }
 
     // Android based swapchains are implemented by the Android framework's
diff --git a/guest/vulkan_enc/VkEncoder.cpp b/guest/vulkan_enc/VkEncoder.cpp
index dee31e9..ba608d2 100644
--- a/guest/vulkan_enc/VkEncoder.cpp
+++ b/guest/vulkan_enc/VkEncoder.cpp
@@ -24948,1150 +24948,6 @@
 #ifdef VK_KHR_surface
 #endif
 #ifdef VK_KHR_swapchain
-VkResult VkEncoder::vkCreateSwapchainKHR(VkDevice device,
-                                         const VkSwapchainCreateInfoKHR* pCreateInfo,
-                                         const VkAllocationCallbacks* pAllocator,
-                                         VkSwapchainKHR* pSwapchain, uint32_t doLock) {
-    std::optional<uint32_t> healthMonitorAnnotation_seqno = std::nullopt;
-    std::optional<uint32_t> healthMonitorAnnotation_packetSize = std::nullopt;
-    std::vector<uint8_t> healthMonitorAnnotation_packetContents;
-
-    auto watchdog =
-        WATCHDOG_BUILDER(mHealthMonitor, "vkCreateSwapchainKHR in VkEncoder")
-            .setOnHangCallback([&]() {
-                auto annotations = std::make_unique<EventHangMetadata::HangAnnotations>();
-                if (healthMonitorAnnotation_seqno) {
-                    annotations->insert(
-                        {{"seqno", std::to_string(healthMonitorAnnotation_seqno.value())}});
-                }
-                if (healthMonitorAnnotation_packetSize) {
-                    annotations->insert(
-                        {{"packetSize",
-                          std::to_string(healthMonitorAnnotation_packetSize.value())}});
-                }
-                if (!healthMonitorAnnotation_packetContents.empty()) {
-                    annotations->insert(
-                        {{"packetContents",
-                          getPacketContents(&healthMonitorAnnotation_packetContents[0],
-                                            healthMonitorAnnotation_packetContents.size())}});
-                }
-                return std::move(annotations);
-            })
-            .build();
-
-    ENCODER_DEBUG_LOG(
-        "vkCreateSwapchainKHR(device:%p, pCreateInfo:%p, pAllocator:%p, pSwapchain:%p)", device,
-        pCreateInfo, pAllocator, pSwapchain);
-    (void)doLock;
-    bool queueSubmitWithCommandsEnabled =
-        sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
-    if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
-    auto stream = mImpl->stream();
-    auto pool = mImpl->pool();
-    VkDevice local_device;
-    VkSwapchainCreateInfoKHR* local_pCreateInfo;
-    VkAllocationCallbacks* local_pAllocator;
-    local_device = device;
-    local_pCreateInfo = nullptr;
-    if (pCreateInfo) {
-        local_pCreateInfo =
-            (VkSwapchainCreateInfoKHR*)pool->alloc(sizeof(const VkSwapchainCreateInfoKHR));
-        deepcopy_VkSwapchainCreateInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
-                                          (VkSwapchainCreateInfoKHR*)(local_pCreateInfo));
-    }
-    local_pAllocator = nullptr;
-    if (pAllocator) {
-        local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
-                                       (VkAllocationCallbacks*)(local_pAllocator));
-    }
-    local_pAllocator = nullptr;
-    if (local_pCreateInfo) {
-        transform_tohost_VkSwapchainCreateInfoKHR(sResourceTracker,
-                                                  (VkSwapchainCreateInfoKHR*)(local_pCreateInfo));
-    }
-    if (local_pAllocator) {
-        transform_tohost_VkAllocationCallbacks(sResourceTracker,
-                                               (VkAllocationCallbacks*)(local_pAllocator));
-    }
-    size_t count = 0;
-    size_t* countPtr = &count;
-    {
-        uint64_t cgen_var_0;
-        *countPtr += 1 * 8;
-        count_VkSwapchainCreateInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
-                                       (VkSwapchainCreateInfoKHR*)(local_pCreateInfo), countPtr);
-        // WARNING PTR CHECK
-        *countPtr += 8;
-        if (local_pAllocator) {
-            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
-                                        (VkAllocationCallbacks*)(local_pAllocator), countPtr);
-        }
-        uint64_t cgen_var_1;
-        *countPtr += 8;
-    }
-    uint32_t packetSize_vkCreateSwapchainKHR =
-        4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
-    healthMonitorAnnotation_packetSize = std::make_optional(packetSize_vkCreateSwapchainKHR);
-    uint8_t* streamPtr = stream->reserve(packetSize_vkCreateSwapchainKHR);
-    uint8_t* packetBeginPtr = streamPtr;
-    uint8_t** streamPtrPtr = &streamPtr;
-    uint32_t opcode_vkCreateSwapchainKHR = OP_vkCreateSwapchainKHR;
-    uint32_t seqno;
-    if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
-    healthMonitorAnnotation_seqno = std::make_optional(seqno);
-    memcpy(streamPtr, &opcode_vkCreateSwapchainKHR, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    memcpy(streamPtr, &packetSize_vkCreateSwapchainKHR, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    if (queueSubmitWithCommandsEnabled) {
-        memcpy(streamPtr, &seqno, sizeof(uint32_t));
-        streamPtr += sizeof(uint32_t);
-    }
-    uint64_t cgen_var_0;
-    *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkSwapchainCreateInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
-                                             (VkSwapchainCreateInfoKHR*)(local_pCreateInfo),
-                                             streamPtrPtr);
-    // WARNING PTR CHECK
-    uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
-    memcpy((*streamPtrPtr), &cgen_var_1, 8);
-    gfxstream::guest::Stream::toBe64((uint8_t*)(*streamPtrPtr));
-    *streamPtrPtr += 8;
-    if (local_pAllocator) {
-        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
-                                              (VkAllocationCallbacks*)(local_pAllocator),
-                                              streamPtrPtr);
-    }
-    /* is handle, possibly out */;
-    uint64_t cgen_var_2;
-    *&cgen_var_2 = (uint64_t)((*pSwapchain));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
-    *streamPtrPtr += 8;
-    /* is handle, possibly out */;
-    if (watchdog) {
-        size_t watchdogBufSize = std::min<size_t>(
-            static_cast<size_t>(packetSize_vkCreateSwapchainKHR), kWatchdogBufferMax);
-        healthMonitorAnnotation_packetContents.resize(watchdogBufSize);
-        memcpy(&healthMonitorAnnotation_packetContents[0], packetBeginPtr, watchdogBufSize);
-    }
-    stream->setHandleMapping(sResourceTracker->createMapping());
-    uint64_t cgen_var_3;
-    stream->read((uint64_t*)&cgen_var_3, 8);
-    stream->handleMapping()->mapHandles_u64_VkSwapchainKHR(&cgen_var_3, (VkSwapchainKHR*)pSwapchain,
-                                                           1);
-    stream->unsetHandleMapping();
-    VkResult vkCreateSwapchainKHR_VkResult_return = (VkResult)0;
-    stream->read(&vkCreateSwapchainKHR_VkResult_return, sizeof(VkResult));
-    ++encodeCount;
-    ;
-    if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
-        pool->freeAll();
-        stream->clearPool();
-    }
-    if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
-    return vkCreateSwapchainKHR_VkResult_return;
-}
-
-void VkEncoder::vkDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain,
-                                      const VkAllocationCallbacks* pAllocator, uint32_t doLock) {
-    std::optional<uint32_t> healthMonitorAnnotation_seqno = std::nullopt;
-    std::optional<uint32_t> healthMonitorAnnotation_packetSize = std::nullopt;
-    std::vector<uint8_t> healthMonitorAnnotation_packetContents;
-
-    auto watchdog =
-        WATCHDOG_BUILDER(mHealthMonitor, "vkDestroySwapchainKHR in VkEncoder")
-            .setOnHangCallback([&]() {
-                auto annotations = std::make_unique<EventHangMetadata::HangAnnotations>();
-                if (healthMonitorAnnotation_seqno) {
-                    annotations->insert(
-                        {{"seqno", std::to_string(healthMonitorAnnotation_seqno.value())}});
-                }
-                if (healthMonitorAnnotation_packetSize) {
-                    annotations->insert(
-                        {{"packetSize",
-                          std::to_string(healthMonitorAnnotation_packetSize.value())}});
-                }
-                if (!healthMonitorAnnotation_packetContents.empty()) {
-                    annotations->insert(
-                        {{"packetContents",
-                          getPacketContents(&healthMonitorAnnotation_packetContents[0],
-                                            healthMonitorAnnotation_packetContents.size())}});
-                }
-                return std::move(annotations);
-            })
-            .build();
-
-    ENCODER_DEBUG_LOG("vkDestroySwapchainKHR(device:%p, swapchain:%p, pAllocator:%p)", device,
-                      swapchain, pAllocator);
-    (void)doLock;
-    bool queueSubmitWithCommandsEnabled =
-        sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
-    if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
-    auto stream = mImpl->stream();
-    auto pool = mImpl->pool();
-    VkDevice local_device;
-    VkSwapchainKHR local_swapchain;
-    VkAllocationCallbacks* local_pAllocator;
-    local_device = device;
-    local_swapchain = swapchain;
-    local_pAllocator = nullptr;
-    if (pAllocator) {
-        local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
-        deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
-                                       (VkAllocationCallbacks*)(local_pAllocator));
-    }
-    local_pAllocator = nullptr;
-    if (local_pAllocator) {
-        transform_tohost_VkAllocationCallbacks(sResourceTracker,
-                                               (VkAllocationCallbacks*)(local_pAllocator));
-    }
-    size_t count = 0;
-    size_t* countPtr = &count;
-    {
-        uint64_t cgen_var_0;
-        *countPtr += 1 * 8;
-        uint64_t cgen_var_1;
-        *countPtr += 1 * 8;
-        // WARNING PTR CHECK
-        *countPtr += 8;
-        if (local_pAllocator) {
-            count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
-                                        (VkAllocationCallbacks*)(local_pAllocator), countPtr);
-        }
-    }
-    uint32_t packetSize_vkDestroySwapchainKHR =
-        4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
-    healthMonitorAnnotation_packetSize = std::make_optional(packetSize_vkDestroySwapchainKHR);
-    uint8_t* streamPtr = stream->reserve(packetSize_vkDestroySwapchainKHR);
-    uint8_t* packetBeginPtr = streamPtr;
-    uint8_t** streamPtrPtr = &streamPtr;
-    uint32_t opcode_vkDestroySwapchainKHR = OP_vkDestroySwapchainKHR;
-    uint32_t seqno;
-    if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
-    healthMonitorAnnotation_seqno = std::make_optional(seqno);
-    memcpy(streamPtr, &opcode_vkDestroySwapchainKHR, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    memcpy(streamPtr, &packetSize_vkDestroySwapchainKHR, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    if (queueSubmitWithCommandsEnabled) {
-        memcpy(streamPtr, &seqno, sizeof(uint32_t));
-        streamPtr += sizeof(uint32_t);
-    }
-    uint64_t cgen_var_0;
-    *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    uint64_t cgen_var_1;
-    *&cgen_var_1 = get_host_u64_VkSwapchainKHR((*&local_swapchain));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    // WARNING PTR CHECK
-    uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
-    memcpy((*streamPtrPtr), &cgen_var_2, 8);
-    gfxstream::guest::Stream::toBe64((uint8_t*)(*streamPtrPtr));
-    *streamPtrPtr += 8;
-    if (local_pAllocator) {
-        reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
-                                              (VkAllocationCallbacks*)(local_pAllocator),
-                                              streamPtrPtr);
-    }
-    if (watchdog) {
-        size_t watchdogBufSize = std::min<size_t>(
-            static_cast<size_t>(packetSize_vkDestroySwapchainKHR), kWatchdogBufferMax);
-        healthMonitorAnnotation_packetContents.resize(watchdogBufSize);
-        memcpy(&healthMonitorAnnotation_packetContents[0], packetBeginPtr, watchdogBufSize);
-    }
-    sResourceTracker->destroyMapping()->mapHandles_VkSwapchainKHR((VkSwapchainKHR*)&swapchain);
-    stream->flush();
-    ++encodeCount;
-    ;
-    if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
-        pool->freeAll();
-        stream->clearPool();
-    }
-    if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
-}
-
-VkResult VkEncoder::vkGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain,
-                                            uint32_t* pSwapchainImageCount,
-                                            VkImage* pSwapchainImages, uint32_t doLock) {
-    std::optional<uint32_t> healthMonitorAnnotation_seqno = std::nullopt;
-    std::optional<uint32_t> healthMonitorAnnotation_packetSize = std::nullopt;
-    std::vector<uint8_t> healthMonitorAnnotation_packetContents;
-
-    auto watchdog =
-        WATCHDOG_BUILDER(mHealthMonitor, "vkGetSwapchainImagesKHR in VkEncoder")
-            .setOnHangCallback([&]() {
-                auto annotations = std::make_unique<EventHangMetadata::HangAnnotations>();
-                if (healthMonitorAnnotation_seqno) {
-                    annotations->insert(
-                        {{"seqno", std::to_string(healthMonitorAnnotation_seqno.value())}});
-                }
-                if (healthMonitorAnnotation_packetSize) {
-                    annotations->insert(
-                        {{"packetSize",
-                          std::to_string(healthMonitorAnnotation_packetSize.value())}});
-                }
-                if (!healthMonitorAnnotation_packetContents.empty()) {
-                    annotations->insert(
-                        {{"packetContents",
-                          getPacketContents(&healthMonitorAnnotation_packetContents[0],
-                                            healthMonitorAnnotation_packetContents.size())}});
-                }
-                return std::move(annotations);
-            })
-            .build();
-
-    ENCODER_DEBUG_LOG(
-        "vkGetSwapchainImagesKHR(device:%p, swapchain:%p, pSwapchainImageCount:%p, "
-        "pSwapchainImages:%p)",
-        device, swapchain, pSwapchainImageCount, pSwapchainImages);
-    (void)doLock;
-    bool queueSubmitWithCommandsEnabled =
-        sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
-    if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
-    auto stream = mImpl->stream();
-    auto pool = mImpl->pool();
-    VkDevice local_device;
-    VkSwapchainKHR local_swapchain;
-    local_device = device;
-    local_swapchain = swapchain;
-    size_t count = 0;
-    size_t* countPtr = &count;
-    {
-        uint64_t cgen_var_0;
-        *countPtr += 1 * 8;
-        uint64_t cgen_var_1;
-        *countPtr += 1 * 8;
-        // WARNING PTR CHECK
-        *countPtr += 8;
-        if (pSwapchainImageCount) {
-            *countPtr += sizeof(uint32_t);
-        }
-        // WARNING PTR CHECK
-        *countPtr += 8;
-        if (pSwapchainImages) {
-            if ((*(pSwapchainImageCount))) {
-                *countPtr += (*(pSwapchainImageCount)) * 8;
-            }
-        }
-    }
-    uint32_t packetSize_vkGetSwapchainImagesKHR =
-        4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
-    healthMonitorAnnotation_packetSize = std::make_optional(packetSize_vkGetSwapchainImagesKHR);
-    uint8_t* streamPtr = stream->reserve(packetSize_vkGetSwapchainImagesKHR);
-    uint8_t* packetBeginPtr = streamPtr;
-    uint8_t** streamPtrPtr = &streamPtr;
-    uint32_t opcode_vkGetSwapchainImagesKHR = OP_vkGetSwapchainImagesKHR;
-    uint32_t seqno;
-    if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
-    healthMonitorAnnotation_seqno = std::make_optional(seqno);
-    memcpy(streamPtr, &opcode_vkGetSwapchainImagesKHR, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    memcpy(streamPtr, &packetSize_vkGetSwapchainImagesKHR, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    if (queueSubmitWithCommandsEnabled) {
-        memcpy(streamPtr, &seqno, sizeof(uint32_t));
-        streamPtr += sizeof(uint32_t);
-    }
-    uint64_t cgen_var_0;
-    *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    uint64_t cgen_var_1;
-    *&cgen_var_1 = get_host_u64_VkSwapchainKHR((*&local_swapchain));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    // WARNING PTR CHECK
-    uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pSwapchainImageCount;
-    memcpy((*streamPtrPtr), &cgen_var_2, 8);
-    gfxstream::guest::Stream::toBe64((uint8_t*)(*streamPtrPtr));
-    *streamPtrPtr += 8;
-    if (pSwapchainImageCount) {
-        memcpy(*streamPtrPtr, (uint32_t*)pSwapchainImageCount, sizeof(uint32_t));
-        *streamPtrPtr += sizeof(uint32_t);
-    }
-    /* is handle, possibly out */;
-    // WARNING PTR CHECK
-    uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pSwapchainImages;
-    memcpy((*streamPtrPtr), &cgen_var_3, 8);
-    gfxstream::guest::Stream::toBe64((uint8_t*)(*streamPtrPtr));
-    *streamPtrPtr += 8;
-    if (pSwapchainImages) {
-        if ((*(pSwapchainImageCount))) {
-            uint8_t* cgen_var_3_0_ptr = (uint8_t*)(*streamPtrPtr);
-            if (pSwapchainImageCount) {
-                for (uint32_t k = 0; k < (*(pSwapchainImageCount)); ++k) {
-                    uint64_t tmpval = (uint64_t)(pSwapchainImages[k]);
-                    memcpy(cgen_var_3_0_ptr + k * 8, &tmpval, sizeof(uint64_t));
-                }
-            }
-            *streamPtrPtr += 8 * (*(pSwapchainImageCount));
-        }
-    }
-    /* is handle, possibly out */;
-    if (watchdog) {
-        size_t watchdogBufSize = std::min<size_t>(
-            static_cast<size_t>(packetSize_vkGetSwapchainImagesKHR), kWatchdogBufferMax);
-        healthMonitorAnnotation_packetContents.resize(watchdogBufSize);
-        memcpy(&healthMonitorAnnotation_packetContents[0], packetBeginPtr, watchdogBufSize);
-    }
-    // WARNING PTR CHECK
-    uint32_t* check_pSwapchainImageCount;
-    check_pSwapchainImageCount = (uint32_t*)(uintptr_t)stream->getBe64();
-    if (pSwapchainImageCount) {
-        if (!(check_pSwapchainImageCount)) {
-            fprintf(stderr, "fatal: pSwapchainImageCount inconsistent between guest and host\n");
-        }
-        stream->read((uint32_t*)pSwapchainImageCount, sizeof(uint32_t));
-    }
-    // WARNING PTR CHECK
-    VkImage* check_pSwapchainImages;
-    check_pSwapchainImages = (VkImage*)(uintptr_t)stream->getBe64();
-    if (pSwapchainImages) {
-        if (!(check_pSwapchainImages)) {
-            fprintf(stderr, "fatal: pSwapchainImages inconsistent between guest and host\n");
-        }
-        if ((*(pSwapchainImageCount))) {
-            uint64_t* cgen_var_5_0;
-            stream->alloc((void**)&cgen_var_5_0, (*(pSwapchainImageCount)) * 8);
-            stream->read((uint64_t*)cgen_var_5_0, (*(pSwapchainImageCount)) * 8);
-            stream->handleMapping()->mapHandles_u64_VkImage(
-                cgen_var_5_0, (VkImage*)pSwapchainImages, (*(pSwapchainImageCount)));
-        }
-    }
-    VkResult vkGetSwapchainImagesKHR_VkResult_return = (VkResult)0;
-    stream->read(&vkGetSwapchainImagesKHR_VkResult_return, sizeof(VkResult));
-    ++encodeCount;
-    ;
-    if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
-        pool->freeAll();
-        stream->clearPool();
-    }
-    if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
-    return vkGetSwapchainImagesKHR_VkResult_return;
-}
-
-VkResult VkEncoder::vkAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain,
-                                          uint64_t timeout, VkSemaphore semaphore, VkFence fence,
-                                          uint32_t* pImageIndex, uint32_t doLock) {
-    std::optional<uint32_t> healthMonitorAnnotation_seqno = std::nullopt;
-    std::optional<uint32_t> healthMonitorAnnotation_packetSize = std::nullopt;
-    std::vector<uint8_t> healthMonitorAnnotation_packetContents;
-
-    auto watchdog =
-        WATCHDOG_BUILDER(mHealthMonitor, "vkAcquireNextImageKHR in VkEncoder")
-            .setOnHangCallback([&]() {
-                auto annotations = std::make_unique<EventHangMetadata::HangAnnotations>();
-                if (healthMonitorAnnotation_seqno) {
-                    annotations->insert(
-                        {{"seqno", std::to_string(healthMonitorAnnotation_seqno.value())}});
-                }
-                if (healthMonitorAnnotation_packetSize) {
-                    annotations->insert(
-                        {{"packetSize",
-                          std::to_string(healthMonitorAnnotation_packetSize.value())}});
-                }
-                if (!healthMonitorAnnotation_packetContents.empty()) {
-                    annotations->insert(
-                        {{"packetContents",
-                          getPacketContents(&healthMonitorAnnotation_packetContents[0],
-                                            healthMonitorAnnotation_packetContents.size())}});
-                }
-                return std::move(annotations);
-            })
-            .build();
-
-    ENCODER_DEBUG_LOG(
-        "vkAcquireNextImageKHR(device:%p, swapchain:%p, timeout:%ld, semaphore:%p, fence:%p, "
-        "pImageIndex:%p)",
-        device, swapchain, timeout, semaphore, fence, pImageIndex);
-    (void)doLock;
-    bool queueSubmitWithCommandsEnabled =
-        sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
-    if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
-    auto stream = mImpl->stream();
-    auto pool = mImpl->pool();
-    VkDevice local_device;
-    VkSwapchainKHR local_swapchain;
-    uint64_t local_timeout;
-    VkSemaphore local_semaphore;
-    VkFence local_fence;
-    local_device = device;
-    local_swapchain = swapchain;
-    local_timeout = timeout;
-    local_semaphore = semaphore;
-    local_fence = fence;
-    size_t count = 0;
-    size_t* countPtr = &count;
-    {
-        uint64_t cgen_var_0;
-        *countPtr += 1 * 8;
-        uint64_t cgen_var_1;
-        *countPtr += 1 * 8;
-        *countPtr += sizeof(uint64_t);
-        uint64_t cgen_var_2;
-        *countPtr += 1 * 8;
-        uint64_t cgen_var_3;
-        *countPtr += 1 * 8;
-        *countPtr += sizeof(uint32_t);
-    }
-    uint32_t packetSize_vkAcquireNextImageKHR =
-        4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
-    healthMonitorAnnotation_packetSize = std::make_optional(packetSize_vkAcquireNextImageKHR);
-    uint8_t* streamPtr = stream->reserve(packetSize_vkAcquireNextImageKHR);
-    uint8_t* packetBeginPtr = streamPtr;
-    uint8_t** streamPtrPtr = &streamPtr;
-    uint32_t opcode_vkAcquireNextImageKHR = OP_vkAcquireNextImageKHR;
-    uint32_t seqno;
-    if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
-    healthMonitorAnnotation_seqno = std::make_optional(seqno);
-    memcpy(streamPtr, &opcode_vkAcquireNextImageKHR, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    memcpy(streamPtr, &packetSize_vkAcquireNextImageKHR, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    if (queueSubmitWithCommandsEnabled) {
-        memcpy(streamPtr, &seqno, sizeof(uint32_t));
-        streamPtr += sizeof(uint32_t);
-    }
-    uint64_t cgen_var_0;
-    *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    uint64_t cgen_var_1;
-    *&cgen_var_1 = get_host_u64_VkSwapchainKHR((*&local_swapchain));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    memcpy(*streamPtrPtr, (uint64_t*)&local_timeout, sizeof(uint64_t));
-    *streamPtrPtr += sizeof(uint64_t);
-    uint64_t cgen_var_2;
-    *&cgen_var_2 = get_host_u64_VkSemaphore((*&local_semaphore));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    uint64_t cgen_var_3;
-    *&cgen_var_3 = get_host_u64_VkFence((*&local_fence));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_3, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    memcpy(*streamPtrPtr, (uint32_t*)pImageIndex, sizeof(uint32_t));
-    *streamPtrPtr += sizeof(uint32_t);
-    if (watchdog) {
-        size_t watchdogBufSize = std::min<size_t>(
-            static_cast<size_t>(packetSize_vkAcquireNextImageKHR), kWatchdogBufferMax);
-        healthMonitorAnnotation_packetContents.resize(watchdogBufSize);
-        memcpy(&healthMonitorAnnotation_packetContents[0], packetBeginPtr, watchdogBufSize);
-    }
-    stream->read((uint32_t*)pImageIndex, sizeof(uint32_t));
-    VkResult vkAcquireNextImageKHR_VkResult_return = (VkResult)0;
-    stream->read(&vkAcquireNextImageKHR_VkResult_return, sizeof(VkResult));
-    ++encodeCount;
-    ;
-    if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
-        pool->freeAll();
-        stream->clearPool();
-    }
-    if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
-    return vkAcquireNextImageKHR_VkResult_return;
-}
-
-VkResult VkEncoder::vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR* pPresentInfo,
-                                      uint32_t doLock) {
-    std::optional<uint32_t> healthMonitorAnnotation_seqno = std::nullopt;
-    std::optional<uint32_t> healthMonitorAnnotation_packetSize = std::nullopt;
-    std::vector<uint8_t> healthMonitorAnnotation_packetContents;
-
-    auto watchdog =
-        WATCHDOG_BUILDER(mHealthMonitor, "vkQueuePresentKHR in VkEncoder")
-            .setOnHangCallback([&]() {
-                auto annotations = std::make_unique<EventHangMetadata::HangAnnotations>();
-                if (healthMonitorAnnotation_seqno) {
-                    annotations->insert(
-                        {{"seqno", std::to_string(healthMonitorAnnotation_seqno.value())}});
-                }
-                if (healthMonitorAnnotation_packetSize) {
-                    annotations->insert(
-                        {{"packetSize",
-                          std::to_string(healthMonitorAnnotation_packetSize.value())}});
-                }
-                if (!healthMonitorAnnotation_packetContents.empty()) {
-                    annotations->insert(
-                        {{"packetContents",
-                          getPacketContents(&healthMonitorAnnotation_packetContents[0],
-                                            healthMonitorAnnotation_packetContents.size())}});
-                }
-                return std::move(annotations);
-            })
-            .build();
-
-    ENCODER_DEBUG_LOG("vkQueuePresentKHR(queue:%p, pPresentInfo:%p)", queue, pPresentInfo);
-    (void)doLock;
-    bool queueSubmitWithCommandsEnabled =
-        sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
-    if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
-    auto stream = mImpl->stream();
-    auto pool = mImpl->pool();
-    VkQueue local_queue;
-    VkPresentInfoKHR* local_pPresentInfo;
-    local_queue = queue;
-    local_pPresentInfo = nullptr;
-    if (pPresentInfo) {
-        local_pPresentInfo = (VkPresentInfoKHR*)pool->alloc(sizeof(const VkPresentInfoKHR));
-        deepcopy_VkPresentInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pPresentInfo,
-                                  (VkPresentInfoKHR*)(local_pPresentInfo));
-    }
-    if (local_pPresentInfo) {
-        transform_tohost_VkPresentInfoKHR(sResourceTracker,
-                                          (VkPresentInfoKHR*)(local_pPresentInfo));
-    }
-    size_t count = 0;
-    size_t* countPtr = &count;
-    {
-        uint64_t cgen_var_0;
-        *countPtr += 1 * 8;
-        count_VkPresentInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
-                               (VkPresentInfoKHR*)(local_pPresentInfo), countPtr);
-    }
-    uint32_t packetSize_vkQueuePresentKHR =
-        4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
-    healthMonitorAnnotation_packetSize = std::make_optional(packetSize_vkQueuePresentKHR);
-    uint8_t* streamPtr = stream->reserve(packetSize_vkQueuePresentKHR);
-    uint8_t* packetBeginPtr = streamPtr;
-    uint8_t** streamPtrPtr = &streamPtr;
-    uint32_t opcode_vkQueuePresentKHR = OP_vkQueuePresentKHR;
-    uint32_t seqno;
-    if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
-    healthMonitorAnnotation_seqno = std::make_optional(seqno);
-    memcpy(streamPtr, &opcode_vkQueuePresentKHR, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    memcpy(streamPtr, &packetSize_vkQueuePresentKHR, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    if (queueSubmitWithCommandsEnabled) {
-        memcpy(streamPtr, &seqno, sizeof(uint32_t));
-        streamPtr += sizeof(uint32_t);
-    }
-    uint64_t cgen_var_0;
-    *&cgen_var_0 = get_host_u64_VkQueue((*&local_queue));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkPresentInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
-                                     (VkPresentInfoKHR*)(local_pPresentInfo), streamPtrPtr);
-    if (watchdog) {
-        size_t watchdogBufSize =
-            std::min<size_t>(static_cast<size_t>(packetSize_vkQueuePresentKHR), kWatchdogBufferMax);
-        healthMonitorAnnotation_packetContents.resize(watchdogBufSize);
-        memcpy(&healthMonitorAnnotation_packetContents[0], packetBeginPtr, watchdogBufSize);
-    }
-    VkResult vkQueuePresentKHR_VkResult_return = (VkResult)0;
-    stream->read(&vkQueuePresentKHR_VkResult_return, sizeof(VkResult));
-    ++encodeCount;
-    ;
-    if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
-        pool->freeAll();
-        stream->clearPool();
-    }
-    if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
-    return vkQueuePresentKHR_VkResult_return;
-}
-
-VkResult VkEncoder::vkGetDeviceGroupPresentCapabilitiesKHR(
-    VkDevice device, VkDeviceGroupPresentCapabilitiesKHR* pDeviceGroupPresentCapabilities,
-    uint32_t doLock) {
-    std::optional<uint32_t> healthMonitorAnnotation_seqno = std::nullopt;
-    std::optional<uint32_t> healthMonitorAnnotation_packetSize = std::nullopt;
-    std::vector<uint8_t> healthMonitorAnnotation_packetContents;
-
-    auto watchdog =
-        WATCHDOG_BUILDER(mHealthMonitor, "vkGetDeviceGroupPresentCapabilitiesKHR in VkEncoder")
-            .setOnHangCallback([&]() {
-                auto annotations = std::make_unique<EventHangMetadata::HangAnnotations>();
-                if (healthMonitorAnnotation_seqno) {
-                    annotations->insert(
-                        {{"seqno", std::to_string(healthMonitorAnnotation_seqno.value())}});
-                }
-                if (healthMonitorAnnotation_packetSize) {
-                    annotations->insert(
-                        {{"packetSize",
-                          std::to_string(healthMonitorAnnotation_packetSize.value())}});
-                }
-                if (!healthMonitorAnnotation_packetContents.empty()) {
-                    annotations->insert(
-                        {{"packetContents",
-                          getPacketContents(&healthMonitorAnnotation_packetContents[0],
-                                            healthMonitorAnnotation_packetContents.size())}});
-                }
-                return std::move(annotations);
-            })
-            .build();
-
-    ENCODER_DEBUG_LOG(
-        "vkGetDeviceGroupPresentCapabilitiesKHR(device:%p, pDeviceGroupPresentCapabilities:%p)",
-        device, pDeviceGroupPresentCapabilities);
-    (void)doLock;
-    bool queueSubmitWithCommandsEnabled =
-        sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
-    if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
-    auto stream = mImpl->stream();
-    auto pool = mImpl->pool();
-    VkDevice local_device;
-    local_device = device;
-    size_t count = 0;
-    size_t* countPtr = &count;
-    {
-        uint64_t cgen_var_0;
-        *countPtr += 1 * 8;
-        count_VkDeviceGroupPresentCapabilitiesKHR(
-            sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
-            (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities), countPtr);
-    }
-    uint32_t packetSize_vkGetDeviceGroupPresentCapabilitiesKHR =
-        4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
-    healthMonitorAnnotation_packetSize =
-        std::make_optional(packetSize_vkGetDeviceGroupPresentCapabilitiesKHR);
-    uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceGroupPresentCapabilitiesKHR);
-    uint8_t* packetBeginPtr = streamPtr;
-    uint8_t** streamPtrPtr = &streamPtr;
-    uint32_t opcode_vkGetDeviceGroupPresentCapabilitiesKHR =
-        OP_vkGetDeviceGroupPresentCapabilitiesKHR;
-    uint32_t seqno;
-    if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
-    healthMonitorAnnotation_seqno = std::make_optional(seqno);
-    memcpy(streamPtr, &opcode_vkGetDeviceGroupPresentCapabilitiesKHR, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    memcpy(streamPtr, &packetSize_vkGetDeviceGroupPresentCapabilitiesKHR, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    if (queueSubmitWithCommandsEnabled) {
-        memcpy(streamPtr, &seqno, sizeof(uint32_t));
-        streamPtr += sizeof(uint32_t);
-    }
-    uint64_t cgen_var_0;
-    *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkDeviceGroupPresentCapabilitiesKHR(
-        stream, VK_STRUCTURE_TYPE_MAX_ENUM,
-        (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities), streamPtrPtr);
-    if (watchdog) {
-        size_t watchdogBufSize =
-            std::min<size_t>(static_cast<size_t>(packetSize_vkGetDeviceGroupPresentCapabilitiesKHR),
-                             kWatchdogBufferMax);
-        healthMonitorAnnotation_packetContents.resize(watchdogBufSize);
-        memcpy(&healthMonitorAnnotation_packetContents[0], packetBeginPtr, watchdogBufSize);
-    }
-    unmarshal_VkDeviceGroupPresentCapabilitiesKHR(
-        stream, VK_STRUCTURE_TYPE_MAX_ENUM,
-        (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities));
-    if (pDeviceGroupPresentCapabilities) {
-        transform_fromhost_VkDeviceGroupPresentCapabilitiesKHR(
-            sResourceTracker,
-            (VkDeviceGroupPresentCapabilitiesKHR*)(pDeviceGroupPresentCapabilities));
-    }
-    VkResult vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return = (VkResult)0;
-    stream->read(&vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return, sizeof(VkResult));
-    ++encodeCount;
-    ;
-    if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
-        pool->freeAll();
-        stream->clearPool();
-    }
-    if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
-    return vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return;
-}
-
-VkResult VkEncoder::vkGetDeviceGroupSurfacePresentModesKHR(VkDevice device, VkSurfaceKHR surface,
-                                                           VkDeviceGroupPresentModeFlagsKHR* pModes,
-                                                           uint32_t doLock) {
-    std::optional<uint32_t> healthMonitorAnnotation_seqno = std::nullopt;
-    std::optional<uint32_t> healthMonitorAnnotation_packetSize = std::nullopt;
-    std::vector<uint8_t> healthMonitorAnnotation_packetContents;
-
-    auto watchdog =
-        WATCHDOG_BUILDER(mHealthMonitor, "vkGetDeviceGroupSurfacePresentModesKHR in VkEncoder")
-            .setOnHangCallback([&]() {
-                auto annotations = std::make_unique<EventHangMetadata::HangAnnotations>();
-                if (healthMonitorAnnotation_seqno) {
-                    annotations->insert(
-                        {{"seqno", std::to_string(healthMonitorAnnotation_seqno.value())}});
-                }
-                if (healthMonitorAnnotation_packetSize) {
-                    annotations->insert(
-                        {{"packetSize",
-                          std::to_string(healthMonitorAnnotation_packetSize.value())}});
-                }
-                if (!healthMonitorAnnotation_packetContents.empty()) {
-                    annotations->insert(
-                        {{"packetContents",
-                          getPacketContents(&healthMonitorAnnotation_packetContents[0],
-                                            healthMonitorAnnotation_packetContents.size())}});
-                }
-                return std::move(annotations);
-            })
-            .build();
-
-    ENCODER_DEBUG_LOG("vkGetDeviceGroupSurfacePresentModesKHR(device:%p, surface:%p, pModes:%p)",
-                      device, surface, pModes);
-    (void)doLock;
-    bool queueSubmitWithCommandsEnabled =
-        sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
-    if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
-    auto stream = mImpl->stream();
-    auto pool = mImpl->pool();
-    VkDevice local_device;
-    VkSurfaceKHR local_surface;
-    local_device = device;
-    local_surface = surface;
-    size_t count = 0;
-    size_t* countPtr = &count;
-    {
-        uint64_t cgen_var_0;
-        *countPtr += 1 * 8;
-        uint64_t cgen_var_1;
-        *countPtr += 1 * 8;
-        // WARNING PTR CHECK
-        *countPtr += 8;
-        if (pModes) {
-            *countPtr += sizeof(VkDeviceGroupPresentModeFlagsKHR);
-        }
-    }
-    uint32_t packetSize_vkGetDeviceGroupSurfacePresentModesKHR =
-        4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
-    healthMonitorAnnotation_packetSize =
-        std::make_optional(packetSize_vkGetDeviceGroupSurfacePresentModesKHR);
-    uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceGroupSurfacePresentModesKHR);
-    uint8_t* packetBeginPtr = streamPtr;
-    uint8_t** streamPtrPtr = &streamPtr;
-    uint32_t opcode_vkGetDeviceGroupSurfacePresentModesKHR =
-        OP_vkGetDeviceGroupSurfacePresentModesKHR;
-    uint32_t seqno;
-    if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
-    healthMonitorAnnotation_seqno = std::make_optional(seqno);
-    memcpy(streamPtr, &opcode_vkGetDeviceGroupSurfacePresentModesKHR, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    memcpy(streamPtr, &packetSize_vkGetDeviceGroupSurfacePresentModesKHR, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    if (queueSubmitWithCommandsEnabled) {
-        memcpy(streamPtr, &seqno, sizeof(uint32_t));
-        streamPtr += sizeof(uint32_t);
-    }
-    uint64_t cgen_var_0;
-    *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    uint64_t cgen_var_1;
-    *&cgen_var_1 = get_host_u64_VkSurfaceKHR((*&local_surface));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    // WARNING PTR CHECK
-    uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pModes;
-    memcpy((*streamPtrPtr), &cgen_var_2, 8);
-    gfxstream::guest::Stream::toBe64((uint8_t*)(*streamPtrPtr));
-    *streamPtrPtr += 8;
-    if (pModes) {
-        memcpy(*streamPtrPtr, (VkDeviceGroupPresentModeFlagsKHR*)pModes,
-               sizeof(VkDeviceGroupPresentModeFlagsKHR));
-        *streamPtrPtr += sizeof(VkDeviceGroupPresentModeFlagsKHR);
-    }
-    if (watchdog) {
-        size_t watchdogBufSize =
-            std::min<size_t>(static_cast<size_t>(packetSize_vkGetDeviceGroupSurfacePresentModesKHR),
-                             kWatchdogBufferMax);
-        healthMonitorAnnotation_packetContents.resize(watchdogBufSize);
-        memcpy(&healthMonitorAnnotation_packetContents[0], packetBeginPtr, watchdogBufSize);
-    }
-    // WARNING PTR CHECK
-    VkDeviceGroupPresentModeFlagsKHR* check_pModes;
-    check_pModes = (VkDeviceGroupPresentModeFlagsKHR*)(uintptr_t)stream->getBe64();
-    if (pModes) {
-        if (!(check_pModes)) {
-            fprintf(stderr, "fatal: pModes inconsistent between guest and host\n");
-        }
-        stream->read((VkDeviceGroupPresentModeFlagsKHR*)pModes,
-                     sizeof(VkDeviceGroupPresentModeFlagsKHR));
-    }
-    VkResult vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return = (VkResult)0;
-    stream->read(&vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return, sizeof(VkResult));
-    ++encodeCount;
-    ;
-    if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
-        pool->freeAll();
-        stream->clearPool();
-    }
-    if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
-    return vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return;
-}
-
-VkResult VkEncoder::vkGetPhysicalDevicePresentRectanglesKHR(VkPhysicalDevice physicalDevice,
-                                                            VkSurfaceKHR surface,
-                                                            uint32_t* pRectCount, VkRect2D* pRects,
-                                                            uint32_t doLock) {
-    std::optional<uint32_t> healthMonitorAnnotation_seqno = std::nullopt;
-    std::optional<uint32_t> healthMonitorAnnotation_packetSize = std::nullopt;
-    std::vector<uint8_t> healthMonitorAnnotation_packetContents;
-
-    auto watchdog =
-        WATCHDOG_BUILDER(mHealthMonitor, "vkGetPhysicalDevicePresentRectanglesKHR in VkEncoder")
-            .setOnHangCallback([&]() {
-                auto annotations = std::make_unique<EventHangMetadata::HangAnnotations>();
-                if (healthMonitorAnnotation_seqno) {
-                    annotations->insert(
-                        {{"seqno", std::to_string(healthMonitorAnnotation_seqno.value())}});
-                }
-                if (healthMonitorAnnotation_packetSize) {
-                    annotations->insert(
-                        {{"packetSize",
-                          std::to_string(healthMonitorAnnotation_packetSize.value())}});
-                }
-                if (!healthMonitorAnnotation_packetContents.empty()) {
-                    annotations->insert(
-                        {{"packetContents",
-                          getPacketContents(&healthMonitorAnnotation_packetContents[0],
-                                            healthMonitorAnnotation_packetContents.size())}});
-                }
-                return std::move(annotations);
-            })
-            .build();
-
-    ENCODER_DEBUG_LOG(
-        "vkGetPhysicalDevicePresentRectanglesKHR(physicalDevice:%p, surface:%p, pRectCount:%p, "
-        "pRects:%p)",
-        physicalDevice, surface, pRectCount, pRects);
-    (void)doLock;
-    bool queueSubmitWithCommandsEnabled =
-        sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
-    if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
-    auto stream = mImpl->stream();
-    auto pool = mImpl->pool();
-    VkPhysicalDevice local_physicalDevice;
-    VkSurfaceKHR local_surface;
-    local_physicalDevice = physicalDevice;
-    local_surface = surface;
-    size_t count = 0;
-    size_t* countPtr = &count;
-    {
-        uint64_t cgen_var_0;
-        *countPtr += 1 * 8;
-        uint64_t cgen_var_1;
-        *countPtr += 1 * 8;
-        // WARNING PTR CHECK
-        *countPtr += 8;
-        if (pRectCount) {
-            *countPtr += sizeof(uint32_t);
-        }
-        // WARNING PTR CHECK
-        *countPtr += 8;
-        if (pRects) {
-            if (pRectCount) {
-                for (uint32_t i = 0; i < (uint32_t)(*(pRectCount)); ++i) {
-                    count_VkRect2D(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
-                                   (VkRect2D*)(pRects + i), countPtr);
-                }
-            }
-        }
-    }
-    uint32_t packetSize_vkGetPhysicalDevicePresentRectanglesKHR =
-        4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
-    healthMonitorAnnotation_packetSize =
-        std::make_optional(packetSize_vkGetPhysicalDevicePresentRectanglesKHR);
-    uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDevicePresentRectanglesKHR);
-    uint8_t* packetBeginPtr = streamPtr;
-    uint8_t** streamPtrPtr = &streamPtr;
-    uint32_t opcode_vkGetPhysicalDevicePresentRectanglesKHR =
-        OP_vkGetPhysicalDevicePresentRectanglesKHR;
-    uint32_t seqno;
-    if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
-    healthMonitorAnnotation_seqno = std::make_optional(seqno);
-    memcpy(streamPtr, &opcode_vkGetPhysicalDevicePresentRectanglesKHR, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    memcpy(streamPtr, &packetSize_vkGetPhysicalDevicePresentRectanglesKHR, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    if (queueSubmitWithCommandsEnabled) {
-        memcpy(streamPtr, &seqno, sizeof(uint32_t));
-        streamPtr += sizeof(uint32_t);
-    }
-    uint64_t cgen_var_0;
-    *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    uint64_t cgen_var_1;
-    *&cgen_var_1 = get_host_u64_VkSurfaceKHR((*&local_surface));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    // WARNING PTR CHECK
-    uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pRectCount;
-    memcpy((*streamPtrPtr), &cgen_var_2, 8);
-    gfxstream::guest::Stream::toBe64((uint8_t*)(*streamPtrPtr));
-    *streamPtrPtr += 8;
-    if (pRectCount) {
-        memcpy(*streamPtrPtr, (uint32_t*)pRectCount, sizeof(uint32_t));
-        *streamPtrPtr += sizeof(uint32_t);
-    }
-    // WARNING PTR CHECK
-    uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pRects;
-    memcpy((*streamPtrPtr), &cgen_var_3, 8);
-    gfxstream::guest::Stream::toBe64((uint8_t*)(*streamPtrPtr));
-    *streamPtrPtr += 8;
-    if (pRects) {
-        for (uint32_t i = 0; i < (uint32_t)(*(pRectCount)); ++i) {
-            reservedmarshal_VkRect2D(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRect2D*)(pRects + i),
-                                     streamPtrPtr);
-        }
-    }
-    if (watchdog) {
-        size_t watchdogBufSize = std::min<size_t>(
-            static_cast<size_t>(packetSize_vkGetPhysicalDevicePresentRectanglesKHR),
-            kWatchdogBufferMax);
-        healthMonitorAnnotation_packetContents.resize(watchdogBufSize);
-        memcpy(&healthMonitorAnnotation_packetContents[0], packetBeginPtr, watchdogBufSize);
-    }
-    // WARNING PTR CHECK
-    uint32_t* check_pRectCount;
-    check_pRectCount = (uint32_t*)(uintptr_t)stream->getBe64();
-    if (pRectCount) {
-        if (!(check_pRectCount)) {
-            fprintf(stderr, "fatal: pRectCount inconsistent between guest and host\n");
-        }
-        stream->read((uint32_t*)pRectCount, sizeof(uint32_t));
-    }
-    // WARNING PTR CHECK
-    VkRect2D* check_pRects;
-    check_pRects = (VkRect2D*)(uintptr_t)stream->getBe64();
-    if (pRects) {
-        if (!(check_pRects)) {
-            fprintf(stderr, "fatal: pRects inconsistent between guest and host\n");
-        }
-        if (pRectCount) {
-            for (uint32_t i = 0; i < (uint32_t)(*(pRectCount)); ++i) {
-                unmarshal_VkRect2D(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkRect2D*)(pRects + i));
-            }
-        }
-    }
-    if (pRectCount) {
-        if (pRects) {
-            for (uint32_t i = 0; i < (uint32_t)(*(pRectCount)); ++i) {
-                transform_fromhost_VkRect2D(sResourceTracker, (VkRect2D*)(pRects + i));
-            }
-        }
-    }
-    VkResult vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return = (VkResult)0;
-    stream->read(&vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return, sizeof(VkResult));
-    ++encodeCount;
-    ;
-    if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
-        pool->freeAll();
-        stream->clearPool();
-    }
-    if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
-    return vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return;
-}
-
-VkResult VkEncoder::vkAcquireNextImage2KHR(VkDevice device,
-                                           const VkAcquireNextImageInfoKHR* pAcquireInfo,
-                                           uint32_t* pImageIndex, uint32_t doLock) {
-    std::optional<uint32_t> healthMonitorAnnotation_seqno = std::nullopt;
-    std::optional<uint32_t> healthMonitorAnnotation_packetSize = std::nullopt;
-    std::vector<uint8_t> healthMonitorAnnotation_packetContents;
-
-    auto watchdog =
-        WATCHDOG_BUILDER(mHealthMonitor, "vkAcquireNextImage2KHR in VkEncoder")
-            .setOnHangCallback([&]() {
-                auto annotations = std::make_unique<EventHangMetadata::HangAnnotations>();
-                if (healthMonitorAnnotation_seqno) {
-                    annotations->insert(
-                        {{"seqno", std::to_string(healthMonitorAnnotation_seqno.value())}});
-                }
-                if (healthMonitorAnnotation_packetSize) {
-                    annotations->insert(
-                        {{"packetSize",
-                          std::to_string(healthMonitorAnnotation_packetSize.value())}});
-                }
-                if (!healthMonitorAnnotation_packetContents.empty()) {
-                    annotations->insert(
-                        {{"packetContents",
-                          getPacketContents(&healthMonitorAnnotation_packetContents[0],
-                                            healthMonitorAnnotation_packetContents.size())}});
-                }
-                return std::move(annotations);
-            })
-            .build();
-
-    ENCODER_DEBUG_LOG("vkAcquireNextImage2KHR(device:%p, pAcquireInfo:%p, pImageIndex:%p)", device,
-                      pAcquireInfo, pImageIndex);
-    (void)doLock;
-    bool queueSubmitWithCommandsEnabled =
-        sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
-    if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
-    auto stream = mImpl->stream();
-    auto pool = mImpl->pool();
-    VkDevice local_device;
-    VkAcquireNextImageInfoKHR* local_pAcquireInfo;
-    local_device = device;
-    local_pAcquireInfo = nullptr;
-    if (pAcquireInfo) {
-        local_pAcquireInfo =
-            (VkAcquireNextImageInfoKHR*)pool->alloc(sizeof(const VkAcquireNextImageInfoKHR));
-        deepcopy_VkAcquireNextImageInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAcquireInfo,
-                                           (VkAcquireNextImageInfoKHR*)(local_pAcquireInfo));
-    }
-    if (local_pAcquireInfo) {
-        transform_tohost_VkAcquireNextImageInfoKHR(
-            sResourceTracker, (VkAcquireNextImageInfoKHR*)(local_pAcquireInfo));
-    }
-    size_t count = 0;
-    size_t* countPtr = &count;
-    {
-        uint64_t cgen_var_0;
-        *countPtr += 1 * 8;
-        count_VkAcquireNextImageInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
-                                        (VkAcquireNextImageInfoKHR*)(local_pAcquireInfo), countPtr);
-        *countPtr += sizeof(uint32_t);
-    }
-    uint32_t packetSize_vkAcquireNextImage2KHR =
-        4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
-    healthMonitorAnnotation_packetSize = std::make_optional(packetSize_vkAcquireNextImage2KHR);
-    uint8_t* streamPtr = stream->reserve(packetSize_vkAcquireNextImage2KHR);
-    uint8_t* packetBeginPtr = streamPtr;
-    uint8_t** streamPtrPtr = &streamPtr;
-    uint32_t opcode_vkAcquireNextImage2KHR = OP_vkAcquireNextImage2KHR;
-    uint32_t seqno;
-    if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
-    healthMonitorAnnotation_seqno = std::make_optional(seqno);
-    memcpy(streamPtr, &opcode_vkAcquireNextImage2KHR, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    memcpy(streamPtr, &packetSize_vkAcquireNextImage2KHR, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    if (queueSubmitWithCommandsEnabled) {
-        memcpy(streamPtr, &seqno, sizeof(uint32_t));
-        streamPtr += sizeof(uint32_t);
-    }
-    uint64_t cgen_var_0;
-    *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkAcquireNextImageInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
-                                              (VkAcquireNextImageInfoKHR*)(local_pAcquireInfo),
-                                              streamPtrPtr);
-    memcpy(*streamPtrPtr, (uint32_t*)pImageIndex, sizeof(uint32_t));
-    *streamPtrPtr += sizeof(uint32_t);
-    if (watchdog) {
-        size_t watchdogBufSize = std::min<size_t>(
-            static_cast<size_t>(packetSize_vkAcquireNextImage2KHR), kWatchdogBufferMax);
-        healthMonitorAnnotation_packetContents.resize(watchdogBufSize);
-        memcpy(&healthMonitorAnnotation_packetContents[0], packetBeginPtr, watchdogBufSize);
-    }
-    stream->read((uint32_t*)pImageIndex, sizeof(uint32_t));
-    VkResult vkAcquireNextImage2KHR_VkResult_return = (VkResult)0;
-    stream->read(&vkAcquireNextImage2KHR_VkResult_return, sizeof(VkResult));
-    ++encodeCount;
-    ;
-    if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
-        pool->freeAll();
-        stream->clearPool();
-    }
-    if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
-    return vkAcquireNextImage2KHR_VkResult_return;
-}
-
 #endif
 #ifdef VK_KHR_xcb_surface
 #endif
@@ -36286,111 +35142,6 @@
 
 #endif
 #ifdef VK_EXT_swapchain_maintenance1
-VkResult VkEncoder::vkReleaseSwapchainImagesEXT(VkDevice device,
-                                                const VkReleaseSwapchainImagesInfoEXT* pReleaseInfo,
-                                                uint32_t doLock) {
-    std::optional<uint32_t> healthMonitorAnnotation_seqno = std::nullopt;
-    std::optional<uint32_t> healthMonitorAnnotation_packetSize = std::nullopt;
-    std::vector<uint8_t> healthMonitorAnnotation_packetContents;
-
-    auto watchdog =
-        WATCHDOG_BUILDER(mHealthMonitor, "vkReleaseSwapchainImagesEXT in VkEncoder")
-            .setOnHangCallback([&]() {
-                auto annotations = std::make_unique<EventHangMetadata::HangAnnotations>();
-                if (healthMonitorAnnotation_seqno) {
-                    annotations->insert(
-                        {{"seqno", std::to_string(healthMonitorAnnotation_seqno.value())}});
-                }
-                if (healthMonitorAnnotation_packetSize) {
-                    annotations->insert(
-                        {{"packetSize",
-                          std::to_string(healthMonitorAnnotation_packetSize.value())}});
-                }
-                if (!healthMonitorAnnotation_packetContents.empty()) {
-                    annotations->insert(
-                        {{"packetContents",
-                          getPacketContents(&healthMonitorAnnotation_packetContents[0],
-                                            healthMonitorAnnotation_packetContents.size())}});
-                }
-                return std::move(annotations);
-            })
-            .build();
-
-    ENCODER_DEBUG_LOG("vkReleaseSwapchainImagesEXT(device:%p, pReleaseInfo:%p)", device,
-                      pReleaseInfo);
-    (void)doLock;
-    bool queueSubmitWithCommandsEnabled =
-        sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
-    if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
-    auto stream = mImpl->stream();
-    auto pool = mImpl->pool();
-    VkDevice local_device;
-    VkReleaseSwapchainImagesInfoEXT* local_pReleaseInfo;
-    local_device = device;
-    local_pReleaseInfo = nullptr;
-    if (pReleaseInfo) {
-        local_pReleaseInfo = (VkReleaseSwapchainImagesInfoEXT*)pool->alloc(
-            sizeof(const VkReleaseSwapchainImagesInfoEXT));
-        deepcopy_VkReleaseSwapchainImagesInfoEXT(
-            pool, VK_STRUCTURE_TYPE_MAX_ENUM, pReleaseInfo,
-            (VkReleaseSwapchainImagesInfoEXT*)(local_pReleaseInfo));
-    }
-    if (local_pReleaseInfo) {
-        transform_tohost_VkReleaseSwapchainImagesInfoEXT(
-            sResourceTracker, (VkReleaseSwapchainImagesInfoEXT*)(local_pReleaseInfo));
-    }
-    size_t count = 0;
-    size_t* countPtr = &count;
-    {
-        uint64_t cgen_var_0;
-        *countPtr += 1 * 8;
-        count_VkReleaseSwapchainImagesInfoEXT(
-            sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
-            (VkReleaseSwapchainImagesInfoEXT*)(local_pReleaseInfo), countPtr);
-    }
-    uint32_t packetSize_vkReleaseSwapchainImagesEXT =
-        4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
-    healthMonitorAnnotation_packetSize = std::make_optional(packetSize_vkReleaseSwapchainImagesEXT);
-    uint8_t* streamPtr = stream->reserve(packetSize_vkReleaseSwapchainImagesEXT);
-    uint8_t* packetBeginPtr = streamPtr;
-    uint8_t** streamPtrPtr = &streamPtr;
-    uint32_t opcode_vkReleaseSwapchainImagesEXT = OP_vkReleaseSwapchainImagesEXT;
-    uint32_t seqno;
-    if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
-    healthMonitorAnnotation_seqno = std::make_optional(seqno);
-    memcpy(streamPtr, &opcode_vkReleaseSwapchainImagesEXT, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    memcpy(streamPtr, &packetSize_vkReleaseSwapchainImagesEXT, sizeof(uint32_t));
-    streamPtr += sizeof(uint32_t);
-    if (queueSubmitWithCommandsEnabled) {
-        memcpy(streamPtr, &seqno, sizeof(uint32_t));
-        streamPtr += sizeof(uint32_t);
-    }
-    uint64_t cgen_var_0;
-    *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
-    memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
-    *streamPtrPtr += 1 * 8;
-    reservedmarshal_VkReleaseSwapchainImagesInfoEXT(
-        stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkReleaseSwapchainImagesInfoEXT*)(local_pReleaseInfo),
-        streamPtrPtr);
-    if (watchdog) {
-        size_t watchdogBufSize = std::min<size_t>(
-            static_cast<size_t>(packetSize_vkReleaseSwapchainImagesEXT), kWatchdogBufferMax);
-        healthMonitorAnnotation_packetContents.resize(watchdogBufSize);
-        memcpy(&healthMonitorAnnotation_packetContents[0], packetBeginPtr, watchdogBufSize);
-    }
-    VkResult vkReleaseSwapchainImagesEXT_VkResult_return = (VkResult)0;
-    stream->read(&vkReleaseSwapchainImagesEXT_VkResult_return, sizeof(VkResult));
-    ++encodeCount;
-    ;
-    if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
-        pool->freeAll();
-        stream->clearPool();
-    }
-    if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
-    return vkReleaseSwapchainImagesEXT_VkResult_return;
-}
-
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 #endif
diff --git a/guest/vulkan_enc/VkEncoder.h b/guest/vulkan_enc/VkEncoder.h
index d44a9bc..bfc3acf 100644
--- a/guest/vulkan_enc/VkEncoder.h
+++ b/guest/vulkan_enc/VkEncoder.h
@@ -620,30 +620,6 @@
 #ifdef VK_KHR_surface
 #endif
 #ifdef VK_KHR_swapchain
-    VkResult vkCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo,
-                                  const VkAllocationCallbacks* pAllocator,
-                                  VkSwapchainKHR* pSwapchain, uint32_t doLock);
-    void vkDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain,
-                               const VkAllocationCallbacks* pAllocator, uint32_t doLock);
-    VkResult vkGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain,
-                                     uint32_t* pSwapchainImageCount, VkImage* pSwapchainImages,
-                                     uint32_t doLock);
-    VkResult vkAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout,
-                                   VkSemaphore semaphore, VkFence fence, uint32_t* pImageIndex,
-                                   uint32_t doLock);
-    VkResult vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR* pPresentInfo,
-                               uint32_t doLock);
-    VkResult vkGetDeviceGroupPresentCapabilitiesKHR(
-        VkDevice device, VkDeviceGroupPresentCapabilitiesKHR* pDeviceGroupPresentCapabilities,
-        uint32_t doLock);
-    VkResult vkGetDeviceGroupSurfacePresentModesKHR(VkDevice device, VkSurfaceKHR surface,
-                                                    VkDeviceGroupPresentModeFlagsKHR* pModes,
-                                                    uint32_t doLock);
-    VkResult vkGetPhysicalDevicePresentRectanglesKHR(VkPhysicalDevice physicalDevice,
-                                                     VkSurfaceKHR surface, uint32_t* pRectCount,
-                                                     VkRect2D* pRects, uint32_t doLock);
-    VkResult vkAcquireNextImage2KHR(VkDevice device, const VkAcquireNextImageInfoKHR* pAcquireInfo,
-                                    uint32_t* pImageIndex, uint32_t doLock);
 #endif
 #ifdef VK_KHR_xcb_surface
 #endif
@@ -1024,9 +1000,6 @@
                                          VkSubresourceLayout2KHR* pLayout, uint32_t doLock);
 #endif
 #ifdef VK_EXT_swapchain_maintenance1
-    VkResult vkReleaseSwapchainImagesEXT(VkDevice device,
-                                         const VkReleaseSwapchainImagesInfoEXT* pReleaseInfo,
-                                         uint32_t doLock);
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 #endif
diff --git a/guest/vulkan_enc/func_table.cpp b/guest/vulkan_enc/func_table.cpp
index 6512021..41b4b80 100644
--- a/guest/vulkan_enc/func_table.cpp
+++ b/guest/vulkan_enc/func_table.cpp
@@ -2167,188 +2167,6 @@
 #ifdef VK_KHR_surface
 #endif
 #ifdef VK_KHR_swapchain
-static VkResult entry_vkCreateSwapchainKHR(VkDevice device,
-                                           const VkSwapchainCreateInfoKHR* pCreateInfo,
-                                           const VkAllocationCallbacks* pAllocator,
-                                           VkSwapchainKHR* pSwapchain) {
-    AEMU_SCOPED_TRACE("vkCreateSwapchainKHR");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    VkResult vkCreateSwapchainKHR_VkResult_return = (VkResult)0;
-    vkCreateSwapchainKHR_VkResult_return = vkEnc->vkCreateSwapchainKHR(
-        device, pCreateInfo, pAllocator, pSwapchain, true /* do lock */);
-    return vkCreateSwapchainKHR_VkResult_return;
-}
-static VkResult dynCheck_entry_vkCreateSwapchainKHR(VkDevice device,
-                                                    const VkSwapchainCreateInfoKHR* pCreateInfo,
-                                                    const VkAllocationCallbacks* pAllocator,
-                                                    VkSwapchainKHR* pSwapchain) {
-    auto resources = ResourceTracker::get();
-    if (!resources->hasDeviceExtension(device, "VK_KHR_swapchain")) {
-        sOnInvalidDynamicallyCheckedCall("vkCreateSwapchainKHR", "VK_KHR_swapchain");
-    }
-    AEMU_SCOPED_TRACE("vkCreateSwapchainKHR");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    VkResult vkCreateSwapchainKHR_VkResult_return = (VkResult)0;
-    vkCreateSwapchainKHR_VkResult_return = vkEnc->vkCreateSwapchainKHR(
-        device, pCreateInfo, pAllocator, pSwapchain, true /* do lock */);
-    return vkCreateSwapchainKHR_VkResult_return;
-}
-static void entry_vkDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain,
-                                        const VkAllocationCallbacks* pAllocator) {
-    AEMU_SCOPED_TRACE("vkDestroySwapchainKHR");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    vkEnc->vkDestroySwapchainKHR(device, swapchain, pAllocator, true /* do lock */);
-}
-static void dynCheck_entry_vkDestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain,
-                                                 const VkAllocationCallbacks* pAllocator) {
-    auto resources = ResourceTracker::get();
-    if (!resources->hasDeviceExtension(device, "VK_KHR_swapchain")) {
-        sOnInvalidDynamicallyCheckedCall("vkDestroySwapchainKHR", "VK_KHR_swapchain");
-    }
-    AEMU_SCOPED_TRACE("vkDestroySwapchainKHR");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    vkEnc->vkDestroySwapchainKHR(device, swapchain, pAllocator, true /* do lock */);
-}
-static VkResult entry_vkGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain,
-                                              uint32_t* pSwapchainImageCount,
-                                              VkImage* pSwapchainImages) {
-    AEMU_SCOPED_TRACE("vkGetSwapchainImagesKHR");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    VkResult vkGetSwapchainImagesKHR_VkResult_return = (VkResult)0;
-    vkGetSwapchainImagesKHR_VkResult_return = vkEnc->vkGetSwapchainImagesKHR(
-        device, swapchain, pSwapchainImageCount, pSwapchainImages, true /* do lock */);
-    return vkGetSwapchainImagesKHR_VkResult_return;
-}
-static VkResult dynCheck_entry_vkGetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain,
-                                                       uint32_t* pSwapchainImageCount,
-                                                       VkImage* pSwapchainImages) {
-    auto resources = ResourceTracker::get();
-    if (!resources->hasDeviceExtension(device, "VK_KHR_swapchain")) {
-        sOnInvalidDynamicallyCheckedCall("vkGetSwapchainImagesKHR", "VK_KHR_swapchain");
-    }
-    AEMU_SCOPED_TRACE("vkGetSwapchainImagesKHR");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    VkResult vkGetSwapchainImagesKHR_VkResult_return = (VkResult)0;
-    vkGetSwapchainImagesKHR_VkResult_return = vkEnc->vkGetSwapchainImagesKHR(
-        device, swapchain, pSwapchainImageCount, pSwapchainImages, true /* do lock */);
-    return vkGetSwapchainImagesKHR_VkResult_return;
-}
-static VkResult entry_vkAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain,
-                                            uint64_t timeout, VkSemaphore semaphore, VkFence fence,
-                                            uint32_t* pImageIndex) {
-    AEMU_SCOPED_TRACE("vkAcquireNextImageKHR");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    VkResult vkAcquireNextImageKHR_VkResult_return = (VkResult)0;
-    vkAcquireNextImageKHR_VkResult_return = vkEnc->vkAcquireNextImageKHR(
-        device, swapchain, timeout, semaphore, fence, pImageIndex, true /* do lock */);
-    return vkAcquireNextImageKHR_VkResult_return;
-}
-static VkResult dynCheck_entry_vkAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain,
-                                                     uint64_t timeout, VkSemaphore semaphore,
-                                                     VkFence fence, uint32_t* pImageIndex) {
-    auto resources = ResourceTracker::get();
-    if (!resources->hasDeviceExtension(device, "VK_KHR_swapchain")) {
-        sOnInvalidDynamicallyCheckedCall("vkAcquireNextImageKHR", "VK_KHR_swapchain");
-    }
-    AEMU_SCOPED_TRACE("vkAcquireNextImageKHR");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    VkResult vkAcquireNextImageKHR_VkResult_return = (VkResult)0;
-    vkAcquireNextImageKHR_VkResult_return = vkEnc->vkAcquireNextImageKHR(
-        device, swapchain, timeout, semaphore, fence, pImageIndex, true /* do lock */);
-    return vkAcquireNextImageKHR_VkResult_return;
-}
-static VkResult entry_vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR* pPresentInfo) {
-    AEMU_SCOPED_TRACE("vkQueuePresentKHR");
-    auto vkEnc = ResourceTracker::getQueueEncoder(queue);
-    VkResult vkQueuePresentKHR_VkResult_return = (VkResult)0;
-    vkQueuePresentKHR_VkResult_return =
-        vkEnc->vkQueuePresentKHR(queue, pPresentInfo, true /* do lock */);
-    return vkQueuePresentKHR_VkResult_return;
-}
-static VkResult entry_vkGetDeviceGroupPresentCapabilitiesKHR(
-    VkDevice device, VkDeviceGroupPresentCapabilitiesKHR* pDeviceGroupPresentCapabilities) {
-    AEMU_SCOPED_TRACE("vkGetDeviceGroupPresentCapabilitiesKHR");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    VkResult vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return = (VkResult)0;
-    vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return =
-        vkEnc->vkGetDeviceGroupPresentCapabilitiesKHR(device, pDeviceGroupPresentCapabilities,
-                                                      true /* do lock */);
-    return vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return;
-}
-static VkResult dynCheck_entry_vkGetDeviceGroupPresentCapabilitiesKHR(
-    VkDevice device, VkDeviceGroupPresentCapabilitiesKHR* pDeviceGroupPresentCapabilities) {
-    auto resources = ResourceTracker::get();
-    if (!resources->hasDeviceExtension(device, "VK_KHR_swapchain")) {
-        sOnInvalidDynamicallyCheckedCall("vkGetDeviceGroupPresentCapabilitiesKHR",
-                                         "VK_KHR_swapchain");
-    }
-    AEMU_SCOPED_TRACE("vkGetDeviceGroupPresentCapabilitiesKHR");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    VkResult vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return = (VkResult)0;
-    vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return =
-        vkEnc->vkGetDeviceGroupPresentCapabilitiesKHR(device, pDeviceGroupPresentCapabilities,
-                                                      true /* do lock */);
-    return vkGetDeviceGroupPresentCapabilitiesKHR_VkResult_return;
-}
-static VkResult entry_vkGetDeviceGroupSurfacePresentModesKHR(
-    VkDevice device, VkSurfaceKHR surface, VkDeviceGroupPresentModeFlagsKHR* pModes) {
-    AEMU_SCOPED_TRACE("vkGetDeviceGroupSurfacePresentModesKHR");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    VkResult vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return = (VkResult)0;
-    vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return =
-        vkEnc->vkGetDeviceGroupSurfacePresentModesKHR(device, surface, pModes, true /* do lock */);
-    return vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return;
-}
-static VkResult dynCheck_entry_vkGetDeviceGroupSurfacePresentModesKHR(
-    VkDevice device, VkSurfaceKHR surface, VkDeviceGroupPresentModeFlagsKHR* pModes) {
-    auto resources = ResourceTracker::get();
-    if (!resources->hasDeviceExtension(device, "VK_KHR_swapchain")) {
-        sOnInvalidDynamicallyCheckedCall("vkGetDeviceGroupSurfacePresentModesKHR",
-                                         "VK_KHR_swapchain");
-    }
-    AEMU_SCOPED_TRACE("vkGetDeviceGroupSurfacePresentModesKHR");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    VkResult vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return = (VkResult)0;
-    vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return =
-        vkEnc->vkGetDeviceGroupSurfacePresentModesKHR(device, surface, pModes, true /* do lock */);
-    return vkGetDeviceGroupSurfacePresentModesKHR_VkResult_return;
-}
-static VkResult entry_vkGetPhysicalDevicePresentRectanglesKHR(VkPhysicalDevice physicalDevice,
-                                                              VkSurfaceKHR surface,
-                                                              uint32_t* pRectCount,
-                                                              VkRect2D* pRects) {
-    AEMU_SCOPED_TRACE("vkGetPhysicalDevicePresentRectanglesKHR");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    VkResult vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return = (VkResult)0;
-    vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return =
-        vkEnc->vkGetPhysicalDevicePresentRectanglesKHR(physicalDevice, surface, pRectCount, pRects,
-                                                       true /* do lock */);
-    return vkGetPhysicalDevicePresentRectanglesKHR_VkResult_return;
-}
-static VkResult entry_vkAcquireNextImage2KHR(VkDevice device,
-                                             const VkAcquireNextImageInfoKHR* pAcquireInfo,
-                                             uint32_t* pImageIndex) {
-    AEMU_SCOPED_TRACE("vkAcquireNextImage2KHR");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    VkResult vkAcquireNextImage2KHR_VkResult_return = (VkResult)0;
-    vkAcquireNextImage2KHR_VkResult_return =
-        vkEnc->vkAcquireNextImage2KHR(device, pAcquireInfo, pImageIndex, true /* do lock */);
-    return vkAcquireNextImage2KHR_VkResult_return;
-}
-static VkResult dynCheck_entry_vkAcquireNextImage2KHR(VkDevice device,
-                                                      const VkAcquireNextImageInfoKHR* pAcquireInfo,
-                                                      uint32_t* pImageIndex) {
-    auto resources = ResourceTracker::get();
-    if (!resources->hasDeviceExtension(device, "VK_KHR_swapchain")) {
-        sOnInvalidDynamicallyCheckedCall("vkAcquireNextImage2KHR", "VK_KHR_swapchain");
-    }
-    AEMU_SCOPED_TRACE("vkAcquireNextImage2KHR");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    VkResult vkAcquireNextImage2KHR_VkResult_return = (VkResult)0;
-    vkAcquireNextImage2KHR_VkResult_return =
-        vkEnc->vkAcquireNextImage2KHR(device, pAcquireInfo, pImageIndex, true /* do lock */);
-    return vkAcquireNextImage2KHR_VkResult_return;
-}
 #endif
 #ifdef VK_KHR_xcb_surface
 #endif
@@ -4274,29 +4092,6 @@
 }
 #endif
 #ifdef VK_EXT_swapchain_maintenance1
-static VkResult entry_vkReleaseSwapchainImagesEXT(
-    VkDevice device, const VkReleaseSwapchainImagesInfoEXT* pReleaseInfo) {
-    AEMU_SCOPED_TRACE("vkReleaseSwapchainImagesEXT");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    VkResult vkReleaseSwapchainImagesEXT_VkResult_return = (VkResult)0;
-    vkReleaseSwapchainImagesEXT_VkResult_return =
-        vkEnc->vkReleaseSwapchainImagesEXT(device, pReleaseInfo, true /* do lock */);
-    return vkReleaseSwapchainImagesEXT_VkResult_return;
-}
-static VkResult dynCheck_entry_vkReleaseSwapchainImagesEXT(
-    VkDevice device, const VkReleaseSwapchainImagesInfoEXT* pReleaseInfo) {
-    auto resources = ResourceTracker::get();
-    if (!resources->hasDeviceExtension(device, "VK_EXT_swapchain_maintenance1")) {
-        sOnInvalidDynamicallyCheckedCall("vkReleaseSwapchainImagesEXT",
-                                         "VK_EXT_swapchain_maintenance1");
-    }
-    AEMU_SCOPED_TRACE("vkReleaseSwapchainImagesEXT");
-    auto vkEnc = ResourceTracker::getThreadLocalEncoder();
-    VkResult vkReleaseSwapchainImagesEXT_VkResult_return = (VkResult)0;
-    vkReleaseSwapchainImagesEXT_VkResult_return =
-        vkEnc->vkReleaseSwapchainImagesEXT(device, pReleaseInfo, true /* do lock */);
-    return vkReleaseSwapchainImagesEXT_VkResult_return;
-}
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 #endif
@@ -5535,35 +5330,6 @@
         return nullptr;
     }
 #endif
-#ifdef VK_KHR_swapchain
-    if (!strcmp(name, "vkCreateSwapchainKHR")) {
-        return nullptr;
-    }
-    if (!strcmp(name, "vkDestroySwapchainKHR")) {
-        return nullptr;
-    }
-    if (!strcmp(name, "vkGetSwapchainImagesKHR")) {
-        return nullptr;
-    }
-    if (!strcmp(name, "vkAcquireNextImageKHR")) {
-        return nullptr;
-    }
-    if (!strcmp(name, "vkQueuePresentKHR")) {
-        return nullptr;
-    }
-    if (!strcmp(name, "vkGetDeviceGroupPresentCapabilitiesKHR")) {
-        return nullptr;
-    }
-    if (!strcmp(name, "vkGetDeviceGroupSurfacePresentModesKHR")) {
-        return nullptr;
-    }
-    if (!strcmp(name, "vkGetPhysicalDevicePresentRectanglesKHR")) {
-        return nullptr;
-    }
-    if (!strcmp(name, "vkAcquireNextImage2KHR")) {
-        return nullptr;
-    }
-#endif
 #ifdef VK_KHR_android_surface
     if (!strcmp(name, "vkCreateAndroidSurfaceKHR")) {
         return nullptr;
@@ -5893,11 +5659,6 @@
         return nullptr;
     }
 #endif
-#ifdef VK_EXT_swapchain_maintenance1
-    if (!strcmp(name, "vkReleaseSwapchainImagesEXT")) {
-        return nullptr;
-    }
-#endif
 #ifdef VK_EXT_private_data
     if (!strcmp(name, "vkCreatePrivateDataSlotEXT")) {
         return nullptr;
@@ -6665,44 +6426,6 @@
         return (void*)dynCheck_entry_vkGetDeviceImageSparseMemoryRequirements;
     }
 #endif
-#ifdef VK_KHR_swapchain
-    if (!strcmp(name, "vkCreateSwapchainKHR")) {
-        // TODO(b/236246382): Check support for device extension;
-        return (void*)dynCheck_entry_vkCreateSwapchainKHR;
-    }
-    if (!strcmp(name, "vkDestroySwapchainKHR")) {
-        // TODO(b/236246382): Check support for device extension;
-        return (void*)dynCheck_entry_vkDestroySwapchainKHR;
-    }
-    if (!strcmp(name, "vkGetSwapchainImagesKHR")) {
-        // TODO(b/236246382): Check support for device extension;
-        return (void*)dynCheck_entry_vkGetSwapchainImagesKHR;
-    }
-    if (!strcmp(name, "vkAcquireNextImageKHR")) {
-        // TODO(b/236246382): Check support for device extension;
-        return (void*)dynCheck_entry_vkAcquireNextImageKHR;
-    }
-    if (!strcmp(name, "vkQueuePresentKHR")) {
-        // TODO(b/236246382): Check support for device extension;
-        return (void*)entry_vkQueuePresentKHR;
-    }
-    if (!strcmp(name, "vkGetDeviceGroupPresentCapabilitiesKHR")) {
-        // TODO(b/236246382): Check support for device extension;
-        return (void*)dynCheck_entry_vkGetDeviceGroupPresentCapabilitiesKHR;
-    }
-    if (!strcmp(name, "vkGetDeviceGroupSurfacePresentModesKHR")) {
-        // TODO(b/236246382): Check support for device extension;
-        return (void*)dynCheck_entry_vkGetDeviceGroupSurfacePresentModesKHR;
-    }
-    if (!strcmp(name, "vkGetPhysicalDevicePresentRectanglesKHR")) {
-        // TODO(b/236246382): Check support for device extension;
-        return (void*)entry_vkGetPhysicalDevicePresentRectanglesKHR;
-    }
-    if (!strcmp(name, "vkAcquireNextImage2KHR")) {
-        // TODO(b/236246382): Check support for device extension;
-        return (void*)dynCheck_entry_vkAcquireNextImage2KHR;
-    }
-#endif
 #ifdef VK_KHR_android_surface
     if (!strcmp(name, "vkCreateAndroidSurfaceKHR")) {
         bool hasExt = resources->hasInstanceExtension(instance, "VK_KHR_android_surface");
@@ -7133,12 +6856,6 @@
         return (void*)dynCheck_entry_vkGetImageSubresourceLayout2EXT;
     }
 #endif
-#ifdef VK_EXT_swapchain_maintenance1
-    if (!strcmp(name, "vkReleaseSwapchainImagesEXT")) {
-        // TODO(b/236246382): Check support for device extension;
-        return (void*)dynCheck_entry_vkReleaseSwapchainImagesEXT;
-    }
-#endif
 #ifdef VK_EXT_private_data
     if (!strcmp(name, "vkCreatePrivateDataSlotEXT")) {
         // TODO(b/236246382): Check support for device extension;
@@ -7941,44 +7658,6 @@
         return has1_3OrHigher ? (void*)entry_vkGetDeviceImageSparseMemoryRequirements : nullptr;
     }
 #endif
-#ifdef VK_KHR_swapchain
-    if (!strcmp(name, "vkCreateSwapchainKHR")) {
-        bool hasExt = resources->hasDeviceExtension(device, "VK_KHR_swapchain");
-        return hasExt ? (void*)entry_vkCreateSwapchainKHR : nullptr;
-    }
-    if (!strcmp(name, "vkDestroySwapchainKHR")) {
-        bool hasExt = resources->hasDeviceExtension(device, "VK_KHR_swapchain");
-        return hasExt ? (void*)entry_vkDestroySwapchainKHR : nullptr;
-    }
-    if (!strcmp(name, "vkGetSwapchainImagesKHR")) {
-        bool hasExt = resources->hasDeviceExtension(device, "VK_KHR_swapchain");
-        return hasExt ? (void*)entry_vkGetSwapchainImagesKHR : nullptr;
-    }
-    if (!strcmp(name, "vkAcquireNextImageKHR")) {
-        bool hasExt = resources->hasDeviceExtension(device, "VK_KHR_swapchain");
-        return hasExt ? (void*)entry_vkAcquireNextImageKHR : nullptr;
-    }
-    if (!strcmp(name, "vkQueuePresentKHR")) {
-        bool hasExt = resources->hasDeviceExtension(device, "VK_KHR_swapchain");
-        return hasExt ? (void*)entry_vkQueuePresentKHR : nullptr;
-    }
-    if (!strcmp(name, "vkGetDeviceGroupPresentCapabilitiesKHR")) {
-        bool hasExt = resources->hasDeviceExtension(device, "VK_KHR_swapchain");
-        return hasExt ? (void*)entry_vkGetDeviceGroupPresentCapabilitiesKHR : nullptr;
-    }
-    if (!strcmp(name, "vkGetDeviceGroupSurfacePresentModesKHR")) {
-        bool hasExt = resources->hasDeviceExtension(device, "VK_KHR_swapchain");
-        return hasExt ? (void*)entry_vkGetDeviceGroupSurfacePresentModesKHR : nullptr;
-    }
-    if (!strcmp(name, "vkGetPhysicalDevicePresentRectanglesKHR")) {
-        bool hasExt = resources->hasDeviceExtension(device, "VK_KHR_swapchain");
-        return hasExt ? (void*)entry_vkGetPhysicalDevicePresentRectanglesKHR : nullptr;
-    }
-    if (!strcmp(name, "vkAcquireNextImage2KHR")) {
-        bool hasExt = resources->hasDeviceExtension(device, "VK_KHR_swapchain");
-        return hasExt ? (void*)entry_vkAcquireNextImage2KHR : nullptr;
-    }
-#endif
 #ifdef VK_KHR_android_surface
     if (!strcmp(name, "vkCreateAndroidSurfaceKHR")) {
         bool hasExt = resources->hasDeviceExtension(device, "VK_KHR_android_surface");
@@ -8412,12 +8091,6 @@
         return hasExt ? (void*)entry_vkGetImageSubresourceLayout2EXT : nullptr;
     }
 #endif
-#ifdef VK_EXT_swapchain_maintenance1
-    if (!strcmp(name, "vkReleaseSwapchainImagesEXT")) {
-        bool hasExt = resources->hasDeviceExtension(device, "VK_EXT_swapchain_maintenance1");
-        return hasExt ? (void*)entry_vkReleaseSwapchainImagesEXT : nullptr;
-    }
-#endif
 #ifdef VK_EXT_private_data
     if (!strcmp(name, "vkCreatePrivateDataSlotEXT")) {
         bool hasExt = resources->hasDeviceExtension(device, "VK_EXT_private_data");
diff --git a/guest/vulkan_enc/goldfish_vk_counting_guest.cpp b/guest/vulkan_enc/goldfish_vk_counting_guest.cpp
index af0a807..ae32081 100644
--- a/guest/vulkan_enc/goldfish_vk_counting_guest.cpp
+++ b/guest/vulkan_enc/goldfish_vk_counting_guest.cpp
@@ -5711,177 +5711,6 @@
 #ifdef VK_KHR_surface
 #endif
 #ifdef VK_KHR_swapchain
-void count_VkSwapchainCreateInfoKHR(uint32_t featureBits, VkStructureType rootType,
-                                    const VkSwapchainCreateInfoKHR* toCount, size_t* count) {
-    (void)featureBits;
-    (void)rootType;
-    (void)toCount;
-    (void)count;
-    *count += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = toCount->sType;
-    }
-    count_extension_struct(featureBits, rootType, toCount->pNext, count);
-    *count += sizeof(VkSwapchainCreateFlagsKHR);
-    uint64_t cgen_var_0;
-    *count += 1 * 8;
-    *count += sizeof(uint32_t);
-    *count += sizeof(VkFormat);
-    *count += sizeof(VkColorSpaceKHR);
-    count_VkExtent2D(featureBits, rootType, (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) {
-        if (toCount) {
-            *count += toCount->queueFamilyIndexCount * sizeof(const uint32_t);
-        }
-    }
-    *count += sizeof(VkSurfaceTransformFlagBitsKHR);
-    *count += sizeof(VkCompositeAlphaFlagBitsKHR);
-    *count += sizeof(VkPresentModeKHR);
-    *count += sizeof(VkBool32);
-    uint64_t cgen_var_1;
-    *count += 1 * 8;
-}
-
-void count_VkPresentInfoKHR(uint32_t featureBits, VkStructureType rootType,
-                            const VkPresentInfoKHR* toCount, size_t* count) {
-    (void)featureBits;
-    (void)rootType;
-    (void)toCount;
-    (void)count;
-    *count += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = toCount->sType;
-    }
-    count_extension_struct(featureBits, rootType, 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;
-    }
-    if (toCount) {
-        *count += toCount->swapchainCount * sizeof(const uint32_t);
-    }
-    // WARNING PTR CHECK
-    *count += 8;
-    if (toCount->pResults) {
-        if (toCount) {
-            *count += toCount->swapchainCount * sizeof(VkResult);
-        }
-    }
-}
-
-void count_VkImageSwapchainCreateInfoKHR(uint32_t featureBits, VkStructureType rootType,
-                                         const VkImageSwapchainCreateInfoKHR* toCount,
-                                         size_t* count) {
-    (void)featureBits;
-    (void)rootType;
-    (void)toCount;
-    (void)count;
-    *count += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = toCount->sType;
-    }
-    count_extension_struct(featureBits, rootType, toCount->pNext, count);
-    uint64_t cgen_var_0;
-    *count += 1 * 8;
-}
-
-void count_VkBindImageMemorySwapchainInfoKHR(uint32_t featureBits, VkStructureType rootType,
-                                             const VkBindImageMemorySwapchainInfoKHR* toCount,
-                                             size_t* count) {
-    (void)featureBits;
-    (void)rootType;
-    (void)toCount;
-    (void)count;
-    *count += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = toCount->sType;
-    }
-    count_extension_struct(featureBits, rootType, toCount->pNext, count);
-    uint64_t cgen_var_0;
-    *count += 1 * 8;
-    *count += sizeof(uint32_t);
-}
-
-void count_VkAcquireNextImageInfoKHR(uint32_t featureBits, VkStructureType rootType,
-                                     const VkAcquireNextImageInfoKHR* toCount, size_t* count) {
-    (void)featureBits;
-    (void)rootType;
-    (void)toCount;
-    (void)count;
-    *count += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = toCount->sType;
-    }
-    count_extension_struct(featureBits, rootType, toCount->pNext, count);
-    uint64_t cgen_var_0;
-    *count += 1 * 8;
-    *count += sizeof(uint64_t);
-    uint64_t cgen_var_1;
-    *count += 1 * 8;
-    uint64_t cgen_var_2;
-    *count += 1 * 8;
-    *count += sizeof(uint32_t);
-}
-
-void count_VkDeviceGroupPresentCapabilitiesKHR(uint32_t featureBits, VkStructureType rootType,
-                                               const VkDeviceGroupPresentCapabilitiesKHR* toCount,
-                                               size_t* count) {
-    (void)featureBits;
-    (void)rootType;
-    (void)toCount;
-    (void)count;
-    *count += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = toCount->sType;
-    }
-    count_extension_struct(featureBits, rootType, toCount->pNext, count);
-    *count += VK_MAX_DEVICE_GROUP_SIZE * sizeof(uint32_t);
-    *count += sizeof(VkDeviceGroupPresentModeFlagsKHR);
-}
-
-void count_VkDeviceGroupPresentInfoKHR(uint32_t featureBits, VkStructureType rootType,
-                                       const VkDeviceGroupPresentInfoKHR* toCount, size_t* count) {
-    (void)featureBits;
-    (void)rootType;
-    (void)toCount;
-    (void)count;
-    *count += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = toCount->sType;
-    }
-    count_extension_struct(featureBits, rootType, toCount->pNext, count);
-    *count += sizeof(uint32_t);
-    if (toCount) {
-        *count += toCount->swapchainCount * sizeof(const uint32_t);
-    }
-    *count += sizeof(VkDeviceGroupPresentModeFlagBitsKHR);
-}
-
-void count_VkDeviceGroupSwapchainCreateInfoKHR(uint32_t featureBits, VkStructureType rootType,
-                                               const VkDeviceGroupSwapchainCreateInfoKHR* toCount,
-                                               size_t* count) {
-    (void)featureBits;
-    (void)rootType;
-    (void)toCount;
-    (void)count;
-    *count += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = toCount->sType;
-    }
-    count_extension_struct(featureBits, rootType, toCount->pNext, count);
-    *count += sizeof(VkDeviceGroupPresentModeFlagsKHR);
-}
-
 #endif
 #ifdef VK_KHR_xcb_surface
 #endif
@@ -6960,112 +6789,6 @@
 
 #endif
 #ifdef VK_EXT_swapchain_maintenance1
-void count_VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT(
-    uint32_t featureBits, VkStructureType rootType,
-    const VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT* toCount, size_t* count) {
-    (void)featureBits;
-    (void)rootType;
-    (void)toCount;
-    (void)count;
-    *count += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = toCount->sType;
-    }
-    count_extension_struct(featureBits, rootType, toCount->pNext, count);
-    *count += sizeof(VkBool32);
-}
-
-void count_VkSwapchainPresentFenceInfoEXT(uint32_t featureBits, VkStructureType rootType,
-                                          const VkSwapchainPresentFenceInfoEXT* toCount,
-                                          size_t* count) {
-    (void)featureBits;
-    (void)rootType;
-    (void)toCount;
-    (void)count;
-    *count += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = toCount->sType;
-    }
-    count_extension_struct(featureBits, rootType, toCount->pNext, count);
-    *count += sizeof(uint32_t);
-    if (toCount->swapchainCount) {
-        *count += toCount->swapchainCount * 8;
-    }
-}
-
-void count_VkSwapchainPresentModesCreateInfoEXT(uint32_t featureBits, VkStructureType rootType,
-                                                const VkSwapchainPresentModesCreateInfoEXT* toCount,
-                                                size_t* count) {
-    (void)featureBits;
-    (void)rootType;
-    (void)toCount;
-    (void)count;
-    *count += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = toCount->sType;
-    }
-    count_extension_struct(featureBits, rootType, toCount->pNext, count);
-    *count += sizeof(uint32_t);
-    if (toCount) {
-        *count += toCount->presentModeCount * sizeof(const VkPresentModeKHR);
-    }
-}
-
-void count_VkSwapchainPresentModeInfoEXT(uint32_t featureBits, VkStructureType rootType,
-                                         const VkSwapchainPresentModeInfoEXT* toCount,
-                                         size_t* count) {
-    (void)featureBits;
-    (void)rootType;
-    (void)toCount;
-    (void)count;
-    *count += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = toCount->sType;
-    }
-    count_extension_struct(featureBits, rootType, toCount->pNext, count);
-    *count += sizeof(uint32_t);
-    if (toCount) {
-        *count += toCount->swapchainCount * sizeof(const VkPresentModeKHR);
-    }
-}
-
-void count_VkSwapchainPresentScalingCreateInfoEXT(
-    uint32_t featureBits, VkStructureType rootType,
-    const VkSwapchainPresentScalingCreateInfoEXT* toCount, size_t* count) {
-    (void)featureBits;
-    (void)rootType;
-    (void)toCount;
-    (void)count;
-    *count += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = toCount->sType;
-    }
-    count_extension_struct(featureBits, rootType, toCount->pNext, count);
-    *count += sizeof(VkPresentScalingFlagsEXT);
-    *count += sizeof(VkPresentGravityFlagsEXT);
-    *count += sizeof(VkPresentGravityFlagsEXT);
-}
-
-void count_VkReleaseSwapchainImagesInfoEXT(uint32_t featureBits, VkStructureType rootType,
-                                           const VkReleaseSwapchainImagesInfoEXT* toCount,
-                                           size_t* count) {
-    (void)featureBits;
-    (void)rootType;
-    (void)toCount;
-    (void)count;
-    *count += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = toCount->sType;
-    }
-    count_extension_struct(featureBits, rootType, toCount->pNext, count);
-    uint64_t cgen_var_0;
-    *count += 1 * 8;
-    *count += sizeof(uint32_t);
-    if (toCount) {
-        *count += toCount->imageIndexCount * sizeof(const uint32_t);
-    }
-}
-
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 #endif
@@ -8213,33 +7936,6 @@
             break;
         }
 #endif
-#ifdef VK_KHR_swapchain
-        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR: {
-            count_VkImageSwapchainCreateInfoKHR(
-                featureBits, rootType,
-                reinterpret_cast<const VkImageSwapchainCreateInfoKHR*>(structExtension), count);
-            break;
-        }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR: {
-            count_VkBindImageMemorySwapchainInfoKHR(
-                featureBits, rootType,
-                reinterpret_cast<const VkBindImageMemorySwapchainInfoKHR*>(structExtension), count);
-            break;
-        }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR: {
-            count_VkDeviceGroupPresentInfoKHR(
-                featureBits, rootType,
-                reinterpret_cast<const VkDeviceGroupPresentInfoKHR*>(structExtension), count);
-            break;
-        }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR: {
-            count_VkDeviceGroupSwapchainCreateInfoKHR(
-                featureBits, rootType,
-                reinterpret_cast<const VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension),
-                count);
-            break;
-        }
-#endif
 #ifdef VK_KHR_dynamic_rendering
         case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
             count_VkRenderingFragmentShadingRateAttachmentInfoKHR(
@@ -8462,42 +8158,6 @@
             break;
         }
 #endif
-#ifdef VK_EXT_swapchain_maintenance1
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT: {
-            count_VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT(
-                featureBits, rootType,
-                reinterpret_cast<const VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT*>(
-                    structExtension),
-                count);
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT: {
-            count_VkSwapchainPresentFenceInfoEXT(
-                featureBits, rootType,
-                reinterpret_cast<const VkSwapchainPresentFenceInfoEXT*>(structExtension), count);
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT: {
-            count_VkSwapchainPresentModesCreateInfoEXT(
-                featureBits, rootType,
-                reinterpret_cast<const VkSwapchainPresentModesCreateInfoEXT*>(structExtension),
-                count);
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT: {
-            count_VkSwapchainPresentModeInfoEXT(
-                featureBits, rootType,
-                reinterpret_cast<const VkSwapchainPresentModeInfoEXT*>(structExtension), count);
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT: {
-            count_VkSwapchainPresentScalingCreateInfoEXT(
-                featureBits, rootType,
-                reinterpret_cast<const VkSwapchainPresentScalingCreateInfoEXT*>(structExtension),
-                count);
-            break;
-        }
-#endif
 #ifdef VK_EXT_texel_buffer_alignment
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
             count_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
diff --git a/guest/vulkan_enc/goldfish_vk_counting_guest.h b/guest/vulkan_enc/goldfish_vk_counting_guest.h
index 7634a0e..2ca5b5c 100644
--- a/guest/vulkan_enc/goldfish_vk_counting_guest.h
+++ b/guest/vulkan_enc/goldfish_vk_counting_guest.h
@@ -1036,34 +1036,6 @@
 #ifdef VK_KHR_surface
 #endif
 #ifdef VK_KHR_swapchain
-void count_VkSwapchainCreateInfoKHR(uint32_t featureBits, VkStructureType rootType,
-                                    const VkSwapchainCreateInfoKHR* toCount, size_t* count);
-
-void count_VkPresentInfoKHR(uint32_t featureBits, VkStructureType rootType,
-                            const VkPresentInfoKHR* toCount, size_t* count);
-
-void count_VkImageSwapchainCreateInfoKHR(uint32_t featureBits, VkStructureType rootType,
-                                         const VkImageSwapchainCreateInfoKHR* toCount,
-                                         size_t* count);
-
-void count_VkBindImageMemorySwapchainInfoKHR(uint32_t featureBits, VkStructureType rootType,
-                                             const VkBindImageMemorySwapchainInfoKHR* toCount,
-                                             size_t* count);
-
-void count_VkAcquireNextImageInfoKHR(uint32_t featureBits, VkStructureType rootType,
-                                     const VkAcquireNextImageInfoKHR* toCount, size_t* count);
-
-void count_VkDeviceGroupPresentCapabilitiesKHR(uint32_t featureBits, VkStructureType rootType,
-                                               const VkDeviceGroupPresentCapabilitiesKHR* toCount,
-                                               size_t* count);
-
-void count_VkDeviceGroupPresentInfoKHR(uint32_t featureBits, VkStructureType rootType,
-                                       const VkDeviceGroupPresentInfoKHR* toCount, size_t* count);
-
-void count_VkDeviceGroupSwapchainCreateInfoKHR(uint32_t featureBits, VkStructureType rootType,
-                                               const VkDeviceGroupSwapchainCreateInfoKHR* toCount,
-                                               size_t* count);
-
 #endif
 #ifdef VK_KHR_xcb_surface
 #endif
@@ -1672,30 +1644,6 @@
 
 #endif
 #ifdef VK_EXT_swapchain_maintenance1
-void count_VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT(
-    uint32_t featureBits, VkStructureType rootType,
-    const VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT* toCount, size_t* count);
-
-void count_VkSwapchainPresentFenceInfoEXT(uint32_t featureBits, VkStructureType rootType,
-                                          const VkSwapchainPresentFenceInfoEXT* toCount,
-                                          size_t* count);
-
-void count_VkSwapchainPresentModesCreateInfoEXT(uint32_t featureBits, VkStructureType rootType,
-                                                const VkSwapchainPresentModesCreateInfoEXT* toCount,
-                                                size_t* count);
-
-void count_VkSwapchainPresentModeInfoEXT(uint32_t featureBits, VkStructureType rootType,
-                                         const VkSwapchainPresentModeInfoEXT* toCount,
-                                         size_t* count);
-
-void count_VkSwapchainPresentScalingCreateInfoEXT(
-    uint32_t featureBits, VkStructureType rootType,
-    const VkSwapchainPresentScalingCreateInfoEXT* toCount, size_t* count);
-
-void count_VkReleaseSwapchainImagesInfoEXT(uint32_t featureBits, VkStructureType rootType,
-                                           const VkReleaseSwapchainImagesInfoEXT* toCount,
-                                           size_t* count);
-
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 DEFINE_ALIAS_FUNCTION(count_VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures,
diff --git a/guest/vulkan_enc/goldfish_vk_deepcopy_guest.cpp b/guest/vulkan_enc/goldfish_vk_deepcopy_guest.cpp
index 0f3007e..2067f9c 100644
--- a/guest/vulkan_enc/goldfish_vk_deepcopy_guest.cpp
+++ b/guest/vulkan_enc/goldfish_vk_deepcopy_guest.cpp
@@ -6506,213 +6506,6 @@
 #ifdef VK_KHR_surface
 #endif
 #ifdef VK_KHR_swapchain
-void deepcopy_VkSwapchainCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
-                                       const VkSwapchainCreateInfoKHR* from,
-                                       VkSwapchainCreateInfoKHR* to) {
-    (void)alloc;
-    (void)rootType;
-    *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = from->sType;
-    }
-    const void* from_pNext = from;
-    size_t pNext_size = 0u;
-    while (!pNext_size && from_pNext) {
-        from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
-    }
-    to->pNext = nullptr;
-    if (pNext_size) {
-        to->pNext = (void*)alloc->alloc(pNext_size);
-        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
-    }
-    deepcopy_VkExtent2D(alloc, rootType, &from->imageExtent, (VkExtent2D*)(&to->imageExtent));
-    to->pQueueFamilyIndices = nullptr;
-    if (from->pQueueFamilyIndices) {
-        to->pQueueFamilyIndices = (uint32_t*)alloc->dupArray(
-            from->pQueueFamilyIndices, from->queueFamilyIndexCount * sizeof(const uint32_t));
-    }
-}
-
-void deepcopy_VkPresentInfoKHR(Allocator* alloc, VkStructureType rootType,
-                               const VkPresentInfoKHR* from, VkPresentInfoKHR* to) {
-    (void)alloc;
-    (void)rootType;
-    *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = from->sType;
-    }
-    const void* from_pNext = from;
-    size_t pNext_size = 0u;
-    while (!pNext_size && from_pNext) {
-        from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
-    }
-    to->pNext = nullptr;
-    if (pNext_size) {
-        to->pNext = (void*)alloc->alloc(pNext_size);
-        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
-    }
-    to->pWaitSemaphores = nullptr;
-    if (from->pWaitSemaphores) {
-        to->pWaitSemaphores = (VkSemaphore*)alloc->dupArray(
-            from->pWaitSemaphores, from->waitSemaphoreCount * sizeof(const VkSemaphore));
-    }
-    to->pSwapchains = nullptr;
-    if (from->pSwapchains) {
-        to->pSwapchains = (VkSwapchainKHR*)alloc->dupArray(
-            from->pSwapchains, from->swapchainCount * sizeof(const VkSwapchainKHR));
-    }
-    to->pImageIndices = nullptr;
-    if (from->pImageIndices) {
-        to->pImageIndices = (uint32_t*)alloc->dupArray(
-            from->pImageIndices, from->swapchainCount * sizeof(const uint32_t));
-    }
-    to->pResults = nullptr;
-    if (from->pResults) {
-        to->pResults =
-            (VkResult*)alloc->dupArray(from->pResults, from->swapchainCount * sizeof(VkResult));
-    }
-}
-
-void deepcopy_VkImageSwapchainCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
-                                            const VkImageSwapchainCreateInfoKHR* from,
-                                            VkImageSwapchainCreateInfoKHR* to) {
-    (void)alloc;
-    (void)rootType;
-    *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = from->sType;
-    }
-    const void* from_pNext = from;
-    size_t pNext_size = 0u;
-    while (!pNext_size && from_pNext) {
-        from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
-    }
-    to->pNext = nullptr;
-    if (pNext_size) {
-        to->pNext = (void*)alloc->alloc(pNext_size);
-        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
-    }
-}
-
-void deepcopy_VkBindImageMemorySwapchainInfoKHR(Allocator* alloc, VkStructureType rootType,
-                                                const VkBindImageMemorySwapchainInfoKHR* from,
-                                                VkBindImageMemorySwapchainInfoKHR* to) {
-    (void)alloc;
-    (void)rootType;
-    *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = from->sType;
-    }
-    const void* from_pNext = from;
-    size_t pNext_size = 0u;
-    while (!pNext_size && from_pNext) {
-        from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
-    }
-    to->pNext = nullptr;
-    if (pNext_size) {
-        to->pNext = (void*)alloc->alloc(pNext_size);
-        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
-    }
-}
-
-void deepcopy_VkAcquireNextImageInfoKHR(Allocator* alloc, VkStructureType rootType,
-                                        const VkAcquireNextImageInfoKHR* from,
-                                        VkAcquireNextImageInfoKHR* to) {
-    (void)alloc;
-    (void)rootType;
-    *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = from->sType;
-    }
-    const void* from_pNext = from;
-    size_t pNext_size = 0u;
-    while (!pNext_size && from_pNext) {
-        from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
-    }
-    to->pNext = nullptr;
-    if (pNext_size) {
-        to->pNext = (void*)alloc->alloc(pNext_size);
-        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
-    }
-}
-
-void deepcopy_VkDeviceGroupPresentCapabilitiesKHR(Allocator* alloc, VkStructureType rootType,
-                                                  const VkDeviceGroupPresentCapabilitiesKHR* from,
-                                                  VkDeviceGroupPresentCapabilitiesKHR* to) {
-    (void)alloc;
-    (void)rootType;
-    *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = from->sType;
-    }
-    const void* from_pNext = from;
-    size_t pNext_size = 0u;
-    while (!pNext_size && from_pNext) {
-        from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
-    }
-    to->pNext = nullptr;
-    if (pNext_size) {
-        to->pNext = (void*)alloc->alloc(pNext_size);
-        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
-    }
-    memcpy(to->presentMask, from->presentMask, VK_MAX_DEVICE_GROUP_SIZE * sizeof(uint32_t));
-}
-
-void deepcopy_VkDeviceGroupPresentInfoKHR(Allocator* alloc, VkStructureType rootType,
-                                          const VkDeviceGroupPresentInfoKHR* from,
-                                          VkDeviceGroupPresentInfoKHR* to) {
-    (void)alloc;
-    (void)rootType;
-    *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = from->sType;
-    }
-    const void* from_pNext = from;
-    size_t pNext_size = 0u;
-    while (!pNext_size && from_pNext) {
-        from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
-    }
-    to->pNext = nullptr;
-    if (pNext_size) {
-        to->pNext = (void*)alloc->alloc(pNext_size);
-        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
-    }
-    to->pDeviceMasks = nullptr;
-    if (from->pDeviceMasks) {
-        to->pDeviceMasks = (uint32_t*)alloc->dupArray(
-            from->pDeviceMasks, from->swapchainCount * sizeof(const uint32_t));
-    }
-}
-
-void deepcopy_VkDeviceGroupSwapchainCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
-                                                  const VkDeviceGroupSwapchainCreateInfoKHR* from,
-                                                  VkDeviceGroupSwapchainCreateInfoKHR* to) {
-    (void)alloc;
-    (void)rootType;
-    *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = from->sType;
-    }
-    const void* from_pNext = from;
-    size_t pNext_size = 0u;
-    while (!pNext_size && from_pNext) {
-        from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
-    }
-    to->pNext = nullptr;
-    if (pNext_size) {
-        to->pNext = (void*)alloc->alloc(pNext_size);
-        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
-    }
-}
-
 #endif
 #ifdef VK_KHR_xcb_surface
 #endif
@@ -8108,159 +7901,6 @@
 
 #endif
 #ifdef VK_EXT_swapchain_maintenance1
-void deepcopy_VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT(
-    Allocator* alloc, VkStructureType rootType,
-    const VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT* from,
-    VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT* to) {
-    (void)alloc;
-    (void)rootType;
-    *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = from->sType;
-    }
-    const void* from_pNext = from;
-    size_t pNext_size = 0u;
-    while (!pNext_size && from_pNext) {
-        from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
-    }
-    to->pNext = nullptr;
-    if (pNext_size) {
-        to->pNext = (void*)alloc->alloc(pNext_size);
-        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
-    }
-}
-
-void deepcopy_VkSwapchainPresentFenceInfoEXT(Allocator* alloc, VkStructureType rootType,
-                                             const VkSwapchainPresentFenceInfoEXT* from,
-                                             VkSwapchainPresentFenceInfoEXT* to) {
-    (void)alloc;
-    (void)rootType;
-    *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = from->sType;
-    }
-    const void* from_pNext = from;
-    size_t pNext_size = 0u;
-    while (!pNext_size && from_pNext) {
-        from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
-    }
-    to->pNext = nullptr;
-    if (pNext_size) {
-        to->pNext = (void*)alloc->alloc(pNext_size);
-        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
-    }
-    to->pFences = nullptr;
-    if (from->pFences) {
-        to->pFences =
-            (VkFence*)alloc->dupArray(from->pFences, from->swapchainCount * sizeof(const VkFence));
-    }
-}
-
-void deepcopy_VkSwapchainPresentModesCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
-                                                   const VkSwapchainPresentModesCreateInfoEXT* from,
-                                                   VkSwapchainPresentModesCreateInfoEXT* to) {
-    (void)alloc;
-    (void)rootType;
-    *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = from->sType;
-    }
-    const void* from_pNext = from;
-    size_t pNext_size = 0u;
-    while (!pNext_size && from_pNext) {
-        from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
-    }
-    to->pNext = nullptr;
-    if (pNext_size) {
-        to->pNext = (void*)alloc->alloc(pNext_size);
-        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
-    }
-    to->pPresentModes = nullptr;
-    if (from->pPresentModes) {
-        to->pPresentModes = (VkPresentModeKHR*)alloc->dupArray(
-            from->pPresentModes, from->presentModeCount * sizeof(const VkPresentModeKHR));
-    }
-}
-
-void deepcopy_VkSwapchainPresentModeInfoEXT(Allocator* alloc, VkStructureType rootType,
-                                            const VkSwapchainPresentModeInfoEXT* from,
-                                            VkSwapchainPresentModeInfoEXT* to) {
-    (void)alloc;
-    (void)rootType;
-    *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = from->sType;
-    }
-    const void* from_pNext = from;
-    size_t pNext_size = 0u;
-    while (!pNext_size && from_pNext) {
-        from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
-    }
-    to->pNext = nullptr;
-    if (pNext_size) {
-        to->pNext = (void*)alloc->alloc(pNext_size);
-        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
-    }
-    to->pPresentModes = nullptr;
-    if (from->pPresentModes) {
-        to->pPresentModes = (VkPresentModeKHR*)alloc->dupArray(
-            from->pPresentModes, from->swapchainCount * sizeof(const VkPresentModeKHR));
-    }
-}
-
-void deepcopy_VkSwapchainPresentScalingCreateInfoEXT(
-    Allocator* alloc, VkStructureType rootType, const VkSwapchainPresentScalingCreateInfoEXT* from,
-    VkSwapchainPresentScalingCreateInfoEXT* to) {
-    (void)alloc;
-    (void)rootType;
-    *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = from->sType;
-    }
-    const void* from_pNext = from;
-    size_t pNext_size = 0u;
-    while (!pNext_size && from_pNext) {
-        from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
-    }
-    to->pNext = nullptr;
-    if (pNext_size) {
-        to->pNext = (void*)alloc->alloc(pNext_size);
-        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
-    }
-}
-
-void deepcopy_VkReleaseSwapchainImagesInfoEXT(Allocator* alloc, VkStructureType rootType,
-                                              const VkReleaseSwapchainImagesInfoEXT* from,
-                                              VkReleaseSwapchainImagesInfoEXT* to) {
-    (void)alloc;
-    (void)rootType;
-    *to = *from;
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = from->sType;
-    }
-    const void* from_pNext = from;
-    size_t pNext_size = 0u;
-    while (!pNext_size && from_pNext) {
-        from_pNext = static_cast<const vk_struct_common*>(from_pNext)->pNext;
-        pNext_size = goldfish_vk_extension_struct_size(rootType, from_pNext);
-    }
-    to->pNext = nullptr;
-    if (pNext_size) {
-        to->pNext = (void*)alloc->alloc(pNext_size);
-        deepcopy_extension_struct(alloc, rootType, from_pNext, (void*)(to->pNext));
-    }
-    to->pImageIndices = nullptr;
-    if (from->pImageIndices) {
-        to->pImageIndices = (uint32_t*)alloc->dupArray(
-            from->pImageIndices, from->imageIndexCount * sizeof(const uint32_t));
-    }
-}
-
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 #endif
@@ -9597,36 +9237,6 @@
             break;
         }
 #endif
-#ifdef VK_KHR_swapchain
-        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR: {
-            deepcopy_VkImageSwapchainCreateInfoKHR(
-                alloc, rootType,
-                reinterpret_cast<const VkImageSwapchainCreateInfoKHR*>(structExtension),
-                reinterpret_cast<VkImageSwapchainCreateInfoKHR*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR: {
-            deepcopy_VkBindImageMemorySwapchainInfoKHR(
-                alloc, rootType,
-                reinterpret_cast<const VkBindImageMemorySwapchainInfoKHR*>(structExtension),
-                reinterpret_cast<VkBindImageMemorySwapchainInfoKHR*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR: {
-            deepcopy_VkDeviceGroupPresentInfoKHR(
-                alloc, rootType,
-                reinterpret_cast<const VkDeviceGroupPresentInfoKHR*>(structExtension),
-                reinterpret_cast<VkDeviceGroupPresentInfoKHR*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR: {
-            deepcopy_VkDeviceGroupSwapchainCreateInfoKHR(
-                alloc, rootType,
-                reinterpret_cast<const VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension),
-                reinterpret_cast<VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension_out));
-            break;
-        }
-#endif
 #ifdef VK_KHR_dynamic_rendering
         case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
             deepcopy_VkRenderingFragmentShadingRateAttachmentInfoKHR(
@@ -9864,45 +9474,6 @@
             break;
         }
 #endif
-#ifdef VK_EXT_swapchain_maintenance1
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT: {
-            deepcopy_VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT(
-                alloc, rootType,
-                reinterpret_cast<const VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT*>(
-                    structExtension),
-                reinterpret_cast<VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT*>(
-                    structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT: {
-            deepcopy_VkSwapchainPresentFenceInfoEXT(
-                alloc, rootType,
-                reinterpret_cast<const VkSwapchainPresentFenceInfoEXT*>(structExtension),
-                reinterpret_cast<VkSwapchainPresentFenceInfoEXT*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT: {
-            deepcopy_VkSwapchainPresentModesCreateInfoEXT(
-                alloc, rootType,
-                reinterpret_cast<const VkSwapchainPresentModesCreateInfoEXT*>(structExtension),
-                reinterpret_cast<VkSwapchainPresentModesCreateInfoEXT*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT: {
-            deepcopy_VkSwapchainPresentModeInfoEXT(
-                alloc, rootType,
-                reinterpret_cast<const VkSwapchainPresentModeInfoEXT*>(structExtension),
-                reinterpret_cast<VkSwapchainPresentModeInfoEXT*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT: {
-            deepcopy_VkSwapchainPresentScalingCreateInfoEXT(
-                alloc, rootType,
-                reinterpret_cast<const VkSwapchainPresentScalingCreateInfoEXT*>(structExtension),
-                reinterpret_cast<VkSwapchainPresentScalingCreateInfoEXT*>(structExtension_out));
-            break;
-        }
-#endif
 #ifdef VK_EXT_texel_buffer_alignment
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
             deepcopy_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
diff --git a/guest/vulkan_enc/goldfish_vk_deepcopy_guest.h b/guest/vulkan_enc/goldfish_vk_deepcopy_guest.h
index a596199..a0bac21 100644
--- a/guest/vulkan_enc/goldfish_vk_deepcopy_guest.h
+++ b/guest/vulkan_enc/goldfish_vk_deepcopy_guest.h
@@ -1150,37 +1150,6 @@
 #ifdef VK_KHR_surface
 #endif
 #ifdef VK_KHR_swapchain
-void deepcopy_VkSwapchainCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
-                                       const VkSwapchainCreateInfoKHR* from,
-                                       VkSwapchainCreateInfoKHR* to);
-
-void deepcopy_VkPresentInfoKHR(Allocator* alloc, VkStructureType rootType,
-                               const VkPresentInfoKHR* from, VkPresentInfoKHR* to);
-
-void deepcopy_VkImageSwapchainCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
-                                            const VkImageSwapchainCreateInfoKHR* from,
-                                            VkImageSwapchainCreateInfoKHR* to);
-
-void deepcopy_VkBindImageMemorySwapchainInfoKHR(Allocator* alloc, VkStructureType rootType,
-                                                const VkBindImageMemorySwapchainInfoKHR* from,
-                                                VkBindImageMemorySwapchainInfoKHR* to);
-
-void deepcopy_VkAcquireNextImageInfoKHR(Allocator* alloc, VkStructureType rootType,
-                                        const VkAcquireNextImageInfoKHR* from,
-                                        VkAcquireNextImageInfoKHR* to);
-
-void deepcopy_VkDeviceGroupPresentCapabilitiesKHR(Allocator* alloc, VkStructureType rootType,
-                                                  const VkDeviceGroupPresentCapabilitiesKHR* from,
-                                                  VkDeviceGroupPresentCapabilitiesKHR* to);
-
-void deepcopy_VkDeviceGroupPresentInfoKHR(Allocator* alloc, VkStructureType rootType,
-                                          const VkDeviceGroupPresentInfoKHR* from,
-                                          VkDeviceGroupPresentInfoKHR* to);
-
-void deepcopy_VkDeviceGroupSwapchainCreateInfoKHR(Allocator* alloc, VkStructureType rootType,
-                                                  const VkDeviceGroupSwapchainCreateInfoKHR* from,
-                                                  VkDeviceGroupSwapchainCreateInfoKHR* to);
-
 #endif
 #ifdef VK_KHR_xcb_surface
 #endif
@@ -1833,31 +1802,6 @@
 
 #endif
 #ifdef VK_EXT_swapchain_maintenance1
-void deepcopy_VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT(
-    Allocator* alloc, VkStructureType rootType,
-    const VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT* from,
-    VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT* to);
-
-void deepcopy_VkSwapchainPresentFenceInfoEXT(Allocator* alloc, VkStructureType rootType,
-                                             const VkSwapchainPresentFenceInfoEXT* from,
-                                             VkSwapchainPresentFenceInfoEXT* to);
-
-void deepcopy_VkSwapchainPresentModesCreateInfoEXT(Allocator* alloc, VkStructureType rootType,
-                                                   const VkSwapchainPresentModesCreateInfoEXT* from,
-                                                   VkSwapchainPresentModesCreateInfoEXT* to);
-
-void deepcopy_VkSwapchainPresentModeInfoEXT(Allocator* alloc, VkStructureType rootType,
-                                            const VkSwapchainPresentModeInfoEXT* from,
-                                            VkSwapchainPresentModeInfoEXT* to);
-
-void deepcopy_VkSwapchainPresentScalingCreateInfoEXT(
-    Allocator* alloc, VkStructureType rootType, const VkSwapchainPresentScalingCreateInfoEXT* from,
-    VkSwapchainPresentScalingCreateInfoEXT* to);
-
-void deepcopy_VkReleaseSwapchainImagesInfoEXT(Allocator* alloc, VkStructureType rootType,
-                                              const VkReleaseSwapchainImagesInfoEXT* from,
-                                              VkReleaseSwapchainImagesInfoEXT* to);
-
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 DEFINE_ALIAS_FUNCTION(deepcopy_VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures,
diff --git a/guest/vulkan_enc/goldfish_vk_extension_structs_guest.cpp b/guest/vulkan_enc/goldfish_vk_extension_structs_guest.cpp
index e95c7da..8e600e2 100644
--- a/guest/vulkan_enc/goldfish_vk_extension_structs_guest.cpp
+++ b/guest/vulkan_enc/goldfish_vk_extension_structs_guest.cpp
@@ -546,20 +546,6 @@
             return sizeof(VkPhysicalDeviceMaintenance4Properties);
         }
 #endif
-#ifdef VK_KHR_swapchain
-        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR: {
-            return sizeof(VkImageSwapchainCreateInfoKHR);
-        }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR: {
-            return sizeof(VkBindImageMemorySwapchainInfoKHR);
-        }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR: {
-            return sizeof(VkDeviceGroupPresentInfoKHR);
-        }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR: {
-            return sizeof(VkDeviceGroupSwapchainCreateInfoKHR);
-        }
-#endif
 #ifdef VK_KHR_dynamic_rendering
         case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
             return sizeof(VkRenderingFragmentShadingRateAttachmentInfoKHR);
@@ -665,23 +651,6 @@
             return sizeof(VkHostImageCopyDevicePerformanceQueryEXT);
         }
 #endif
-#ifdef VK_EXT_swapchain_maintenance1
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT: {
-            return sizeof(VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT);
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT: {
-            return sizeof(VkSwapchainPresentFenceInfoEXT);
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT: {
-            return sizeof(VkSwapchainPresentModesCreateInfoEXT);
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT: {
-            return sizeof(VkSwapchainPresentModeInfoEXT);
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT: {
-            return sizeof(VkSwapchainPresentScalingCreateInfoEXT);
-        }
-#endif
 #ifdef VK_EXT_texel_buffer_alignment
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT);
@@ -1111,20 +1080,6 @@
             return sizeof(VkPhysicalDeviceMaintenance4Properties);
         }
 #endif
-#ifdef VK_KHR_swapchain
-        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR: {
-            return sizeof(VkImageSwapchainCreateInfoKHR);
-        }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR: {
-            return sizeof(VkBindImageMemorySwapchainInfoKHR);
-        }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR: {
-            return sizeof(VkDeviceGroupPresentInfoKHR);
-        }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR: {
-            return sizeof(VkDeviceGroupSwapchainCreateInfoKHR);
-        }
-#endif
 #ifdef VK_KHR_dynamic_rendering
         case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
             return sizeof(VkRenderingFragmentShadingRateAttachmentInfoKHR);
@@ -1230,23 +1185,6 @@
             return sizeof(VkHostImageCopyDevicePerformanceQueryEXT);
         }
 #endif
-#ifdef VK_EXT_swapchain_maintenance1
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT: {
-            return sizeof(VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT);
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT: {
-            return sizeof(VkSwapchainPresentFenceInfoEXT);
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT: {
-            return sizeof(VkSwapchainPresentModesCreateInfoEXT);
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT: {
-            return sizeof(VkSwapchainPresentModeInfoEXT);
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT: {
-            return sizeof(VkSwapchainPresentScalingCreateInfoEXT);
-        }
-#endif
 #ifdef VK_EXT_texel_buffer_alignment
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
             return sizeof(VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT);
diff --git a/guest/vulkan_enc/goldfish_vk_marshaling_guest.cpp b/guest/vulkan_enc/goldfish_vk_marshaling_guest.cpp
index c9343ca..ccdd3d1 100644
--- a/guest/vulkan_enc/goldfish_vk_marshaling_guest.cpp
+++ b/guest/vulkan_enc/goldfish_vk_marshaling_guest.cpp
@@ -10810,361 +10810,6 @@
 #ifdef VK_KHR_surface
 #endif
 #ifdef VK_KHR_swapchain
-void marshal_VkSwapchainCreateInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                      const VkSwapchainCreateInfoKHR* forMarshaling) {
-    (void)rootType;
-    vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkSwapchainCreateFlagsKHR*)&forMarshaling->flags,
-                    sizeof(VkSwapchainCreateFlagsKHR));
-    uint64_t cgen_var_0;
-    vkStream->handleMapping()->mapHandles_VkSurfaceKHR_u64(&forMarshaling->surface, &cgen_var_0, 1);
-    vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->write((uint32_t*)&forMarshaling->minImageCount, sizeof(uint32_t));
-    vkStream->write((VkFormat*)&forMarshaling->imageFormat, sizeof(VkFormat));
-    vkStream->write((VkColorSpaceKHR*)&forMarshaling->imageColorSpace, sizeof(VkColorSpaceKHR));
-    marshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forMarshaling->imageExtent));
-    vkStream->write((uint32_t*)&forMarshaling->imageArrayLayers, sizeof(uint32_t));
-    vkStream->write((VkImageUsageFlags*)&forMarshaling->imageUsage, sizeof(VkImageUsageFlags));
-    vkStream->write((VkSharingMode*)&forMarshaling->imageSharingMode, sizeof(VkSharingMode));
-    vkStream->write((uint32_t*)&forMarshaling->queueFamilyIndexCount, sizeof(uint32_t));
-    // WARNING PTR CHECK
-    uint64_t cgen_var_1 = (uint64_t)(uintptr_t)forMarshaling->pQueueFamilyIndices;
-    vkStream->putBe64(cgen_var_1);
-    if (forMarshaling->pQueueFamilyIndices) {
-        vkStream->write((const uint32_t*)forMarshaling->pQueueFamilyIndices,
-                        forMarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
-    }
-    vkStream->write((VkSurfaceTransformFlagBitsKHR*)&forMarshaling->preTransform,
-                    sizeof(VkSurfaceTransformFlagBitsKHR));
-    vkStream->write((VkCompositeAlphaFlagBitsKHR*)&forMarshaling->compositeAlpha,
-                    sizeof(VkCompositeAlphaFlagBitsKHR));
-    vkStream->write((VkPresentModeKHR*)&forMarshaling->presentMode, sizeof(VkPresentModeKHR));
-    vkStream->write((VkBool32*)&forMarshaling->clipped, sizeof(VkBool32));
-    uint64_t cgen_var_2;
-    vkStream->handleMapping()->mapHandles_VkSwapchainKHR_u64(&forMarshaling->oldSwapchain,
-                                                             &cgen_var_2, 1);
-    vkStream->write((uint64_t*)&cgen_var_2, 1 * 8);
-}
-
-void unmarshal_VkSwapchainCreateInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                        VkSwapchainCreateInfoKHR* forUnmarshaling) {
-    (void)rootType;
-    vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forUnmarshaling->sType;
-    }
-    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
-    vkStream->read((VkSwapchainCreateFlagsKHR*)&forUnmarshaling->flags,
-                   sizeof(VkSwapchainCreateFlagsKHR));
-    uint64_t cgen_var_0;
-    vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkSurfaceKHR(
-        &cgen_var_0, (VkSurfaceKHR*)&forUnmarshaling->surface, 1);
-    vkStream->read((uint32_t*)&forUnmarshaling->minImageCount, sizeof(uint32_t));
-    vkStream->read((VkFormat*)&forUnmarshaling->imageFormat, sizeof(VkFormat));
-    vkStream->read((VkColorSpaceKHR*)&forUnmarshaling->imageColorSpace, sizeof(VkColorSpaceKHR));
-    unmarshal_VkExtent2D(vkStream, rootType, (VkExtent2D*)(&forUnmarshaling->imageExtent));
-    vkStream->read((uint32_t*)&forUnmarshaling->imageArrayLayers, sizeof(uint32_t));
-    vkStream->read((VkImageUsageFlags*)&forUnmarshaling->imageUsage, sizeof(VkImageUsageFlags));
-    vkStream->read((VkSharingMode*)&forUnmarshaling->imageSharingMode, sizeof(VkSharingMode));
-    vkStream->read((uint32_t*)&forUnmarshaling->queueFamilyIndexCount, sizeof(uint32_t));
-    // WARNING PTR CHECK
-    const uint32_t* check_pQueueFamilyIndices;
-    check_pQueueFamilyIndices = (const uint32_t*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pQueueFamilyIndices) {
-        if (!(check_pQueueFamilyIndices)) {
-            fprintf(stderr,
-                    "fatal: forUnmarshaling->pQueueFamilyIndices inconsistent between guest and "
-                    "host\n");
-        }
-        vkStream->read((uint32_t*)forUnmarshaling->pQueueFamilyIndices,
-                       forUnmarshaling->queueFamilyIndexCount * sizeof(const uint32_t));
-    }
-    vkStream->read((VkSurfaceTransformFlagBitsKHR*)&forUnmarshaling->preTransform,
-                   sizeof(VkSurfaceTransformFlagBitsKHR));
-    vkStream->read((VkCompositeAlphaFlagBitsKHR*)&forUnmarshaling->compositeAlpha,
-                   sizeof(VkCompositeAlphaFlagBitsKHR));
-    vkStream->read((VkPresentModeKHR*)&forUnmarshaling->presentMode, sizeof(VkPresentModeKHR));
-    vkStream->read((VkBool32*)&forUnmarshaling->clipped, sizeof(VkBool32));
-    uint64_t cgen_var_2;
-    vkStream->read((uint64_t*)&cgen_var_2, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkSwapchainKHR(
-        &cgen_var_2, (VkSwapchainKHR*)&forUnmarshaling->oldSwapchain, 1);
-}
-
-void marshal_VkPresentInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                              const VkPresentInfoKHR* forMarshaling) {
-    (void)rootType;
-    vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((uint32_t*)&forMarshaling->waitSemaphoreCount, sizeof(uint32_t));
-    if (forMarshaling->waitSemaphoreCount) {
-        uint64_t* cgen_var_0;
-        vkStream->alloc((void**)&cgen_var_0, forMarshaling->waitSemaphoreCount * 8);
-        vkStream->handleMapping()->mapHandles_VkSemaphore_u64(
-            forMarshaling->pWaitSemaphores, cgen_var_0, forMarshaling->waitSemaphoreCount);
-        vkStream->write((uint64_t*)cgen_var_0, forMarshaling->waitSemaphoreCount * 8);
-    }
-    vkStream->write((uint32_t*)&forMarshaling->swapchainCount, sizeof(uint32_t));
-    if (forMarshaling->swapchainCount) {
-        uint64_t* cgen_var_1;
-        vkStream->alloc((void**)&cgen_var_1, forMarshaling->swapchainCount * 8);
-        vkStream->handleMapping()->mapHandles_VkSwapchainKHR_u64(
-            forMarshaling->pSwapchains, cgen_var_1, forMarshaling->swapchainCount);
-        vkStream->write((uint64_t*)cgen_var_1, forMarshaling->swapchainCount * 8);
-    }
-    vkStream->write((const uint32_t*)forMarshaling->pImageIndices,
-                    forMarshaling->swapchainCount * sizeof(const uint32_t));
-    // WARNING PTR CHECK
-    uint64_t cgen_var_2 = (uint64_t)(uintptr_t)forMarshaling->pResults;
-    vkStream->putBe64(cgen_var_2);
-    if (forMarshaling->pResults) {
-        vkStream->write((VkResult*)forMarshaling->pResults,
-                        forMarshaling->swapchainCount * sizeof(VkResult));
-    }
-}
-
-void unmarshal_VkPresentInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                VkPresentInfoKHR* forUnmarshaling) {
-    (void)rootType;
-    vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forUnmarshaling->sType;
-    }
-    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
-    vkStream->read((uint32_t*)&forUnmarshaling->waitSemaphoreCount, sizeof(uint32_t));
-    if (forUnmarshaling->waitSemaphoreCount) {
-        uint64_t* cgen_var_0;
-        vkStream->alloc((void**)&cgen_var_0, forUnmarshaling->waitSemaphoreCount * 8);
-        vkStream->read((uint64_t*)cgen_var_0, forUnmarshaling->waitSemaphoreCount * 8);
-        vkStream->handleMapping()->mapHandles_u64_VkSemaphore(
-            cgen_var_0, (VkSemaphore*)forUnmarshaling->pWaitSemaphores,
-            forUnmarshaling->waitSemaphoreCount);
-    }
-    vkStream->read((uint32_t*)&forUnmarshaling->swapchainCount, sizeof(uint32_t));
-    if (forUnmarshaling->swapchainCount) {
-        uint64_t* cgen_var_1;
-        vkStream->alloc((void**)&cgen_var_1, forUnmarshaling->swapchainCount * 8);
-        vkStream->read((uint64_t*)cgen_var_1, forUnmarshaling->swapchainCount * 8);
-        vkStream->handleMapping()->mapHandles_u64_VkSwapchainKHR(
-            cgen_var_1, (VkSwapchainKHR*)forUnmarshaling->pSwapchains,
-            forUnmarshaling->swapchainCount);
-    }
-    vkStream->read((uint32_t*)forUnmarshaling->pImageIndices,
-                   forUnmarshaling->swapchainCount * sizeof(const uint32_t));
-    // WARNING PTR CHECK
-    VkResult* check_pResults;
-    check_pResults = (VkResult*)(uintptr_t)vkStream->getBe64();
-    if (forUnmarshaling->pResults) {
-        if (!(check_pResults)) {
-            fprintf(stderr,
-                    "fatal: forUnmarshaling->pResults inconsistent between guest and host\n");
-        }
-        vkStream->read((VkResult*)forUnmarshaling->pResults,
-                       forUnmarshaling->swapchainCount * sizeof(VkResult));
-    }
-}
-
-void marshal_VkImageSwapchainCreateInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                           const VkImageSwapchainCreateInfoKHR* forMarshaling) {
-    (void)rootType;
-    vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    uint64_t cgen_var_0;
-    vkStream->handleMapping()->mapHandles_VkSwapchainKHR_u64(&forMarshaling->swapchain, &cgen_var_0,
-                                                             1);
-    vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
-}
-
-void unmarshal_VkImageSwapchainCreateInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                             VkImageSwapchainCreateInfoKHR* forUnmarshaling) {
-    (void)rootType;
-    vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forUnmarshaling->sType;
-    }
-    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
-    uint64_t cgen_var_0;
-    vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkSwapchainKHR(
-        &cgen_var_0, (VkSwapchainKHR*)&forUnmarshaling->swapchain, 1);
-}
-
-void marshal_VkBindImageMemorySwapchainInfoKHR(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkBindImageMemorySwapchainInfoKHR* forMarshaling) {
-    (void)rootType;
-    vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    uint64_t cgen_var_0;
-    vkStream->handleMapping()->mapHandles_VkSwapchainKHR_u64(&forMarshaling->swapchain, &cgen_var_0,
-                                                             1);
-    vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->write((uint32_t*)&forMarshaling->imageIndex, sizeof(uint32_t));
-}
-
-void unmarshal_VkBindImageMemorySwapchainInfoKHR(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    VkBindImageMemorySwapchainInfoKHR* forUnmarshaling) {
-    (void)rootType;
-    vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forUnmarshaling->sType;
-    }
-    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
-    uint64_t cgen_var_0;
-    vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkSwapchainKHR(
-        &cgen_var_0, (VkSwapchainKHR*)&forUnmarshaling->swapchain, 1);
-    vkStream->read((uint32_t*)&forUnmarshaling->imageIndex, sizeof(uint32_t));
-}
-
-void marshal_VkAcquireNextImageInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                       const VkAcquireNextImageInfoKHR* forMarshaling) {
-    (void)rootType;
-    vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    uint64_t cgen_var_0;
-    vkStream->handleMapping()->mapHandles_VkSwapchainKHR_u64(&forMarshaling->swapchain, &cgen_var_0,
-                                                             1);
-    vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->write((uint64_t*)&forMarshaling->timeout, sizeof(uint64_t));
-    uint64_t cgen_var_1;
-    vkStream->handleMapping()->mapHandles_VkSemaphore_u64(&forMarshaling->semaphore, &cgen_var_1,
-                                                          1);
-    vkStream->write((uint64_t*)&cgen_var_1, 1 * 8);
-    uint64_t cgen_var_2;
-    vkStream->handleMapping()->mapHandles_VkFence_u64(&forMarshaling->fence, &cgen_var_2, 1);
-    vkStream->write((uint64_t*)&cgen_var_2, 1 * 8);
-    vkStream->write((uint32_t*)&forMarshaling->deviceMask, sizeof(uint32_t));
-}
-
-void unmarshal_VkAcquireNextImageInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                         VkAcquireNextImageInfoKHR* forUnmarshaling) {
-    (void)rootType;
-    vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forUnmarshaling->sType;
-    }
-    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
-    uint64_t cgen_var_0;
-    vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkSwapchainKHR(
-        &cgen_var_0, (VkSwapchainKHR*)&forUnmarshaling->swapchain, 1);
-    vkStream->read((uint64_t*)&forUnmarshaling->timeout, sizeof(uint64_t));
-    uint64_t cgen_var_1;
-    vkStream->read((uint64_t*)&cgen_var_1, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkSemaphore(
-        &cgen_var_1, (VkSemaphore*)&forUnmarshaling->semaphore, 1);
-    uint64_t cgen_var_2;
-    vkStream->read((uint64_t*)&cgen_var_2, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkFence(&cgen_var_2,
-                                                      (VkFence*)&forUnmarshaling->fence, 1);
-    vkStream->read((uint32_t*)&forUnmarshaling->deviceMask, sizeof(uint32_t));
-}
-
-void marshal_VkDeviceGroupPresentCapabilitiesKHR(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkDeviceGroupPresentCapabilitiesKHR* forMarshaling) {
-    (void)rootType;
-    vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((uint32_t*)forMarshaling->presentMask,
-                    VK_MAX_DEVICE_GROUP_SIZE * sizeof(uint32_t));
-    vkStream->write((VkDeviceGroupPresentModeFlagsKHR*)&forMarshaling->modes,
-                    sizeof(VkDeviceGroupPresentModeFlagsKHR));
-}
-
-void unmarshal_VkDeviceGroupPresentCapabilitiesKHR(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    VkDeviceGroupPresentCapabilitiesKHR* forUnmarshaling) {
-    (void)rootType;
-    vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forUnmarshaling->sType;
-    }
-    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
-    vkStream->read((uint32_t*)forUnmarshaling->presentMask,
-                   VK_MAX_DEVICE_GROUP_SIZE * sizeof(uint32_t));
-    vkStream->read((VkDeviceGroupPresentModeFlagsKHR*)&forUnmarshaling->modes,
-                   sizeof(VkDeviceGroupPresentModeFlagsKHR));
-}
-
-void marshal_VkDeviceGroupPresentInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                         const VkDeviceGroupPresentInfoKHR* forMarshaling) {
-    (void)rootType;
-    vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((uint32_t*)&forMarshaling->swapchainCount, sizeof(uint32_t));
-    vkStream->write((const uint32_t*)forMarshaling->pDeviceMasks,
-                    forMarshaling->swapchainCount * sizeof(const uint32_t));
-    vkStream->write((VkDeviceGroupPresentModeFlagBitsKHR*)&forMarshaling->mode,
-                    sizeof(VkDeviceGroupPresentModeFlagBitsKHR));
-}
-
-void unmarshal_VkDeviceGroupPresentInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                           VkDeviceGroupPresentInfoKHR* forUnmarshaling) {
-    (void)rootType;
-    vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forUnmarshaling->sType;
-    }
-    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
-    vkStream->read((uint32_t*)&forUnmarshaling->swapchainCount, sizeof(uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pDeviceMasks,
-                   forUnmarshaling->swapchainCount * sizeof(const uint32_t));
-    vkStream->read((VkDeviceGroupPresentModeFlagBitsKHR*)&forUnmarshaling->mode,
-                   sizeof(VkDeviceGroupPresentModeFlagBitsKHR));
-}
-
-void marshal_VkDeviceGroupSwapchainCreateInfoKHR(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkDeviceGroupSwapchainCreateInfoKHR* forMarshaling) {
-    (void)rootType;
-    vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkDeviceGroupPresentModeFlagsKHR*)&forMarshaling->modes,
-                    sizeof(VkDeviceGroupPresentModeFlagsKHR));
-}
-
-void unmarshal_VkDeviceGroupSwapchainCreateInfoKHR(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    VkDeviceGroupSwapchainCreateInfoKHR* forUnmarshaling) {
-    (void)rootType;
-    vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forUnmarshaling->sType;
-    }
-    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
-    vkStream->read((VkDeviceGroupPresentModeFlagsKHR*)&forUnmarshaling->modes,
-                   sizeof(VkDeviceGroupPresentModeFlagsKHR));
-}
-
 #endif
 #ifdef VK_KHR_xcb_surface
 #endif
@@ -13014,189 +12659,6 @@
 
 #endif
 #ifdef VK_EXT_swapchain_maintenance1
-void marshal_VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT* forMarshaling) {
-    (void)rootType;
-    vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkBool32*)&forMarshaling->swapchainMaintenance1, sizeof(VkBool32));
-}
-
-void unmarshal_VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT* forUnmarshaling) {
-    (void)rootType;
-    vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forUnmarshaling->sType;
-    }
-    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
-    vkStream->read((VkBool32*)&forUnmarshaling->swapchainMaintenance1, sizeof(VkBool32));
-}
-
-void marshal_VkSwapchainPresentFenceInfoEXT(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                            const VkSwapchainPresentFenceInfoEXT* forMarshaling) {
-    (void)rootType;
-    vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((uint32_t*)&forMarshaling->swapchainCount, sizeof(uint32_t));
-    if (forMarshaling->swapchainCount) {
-        uint64_t* cgen_var_0;
-        vkStream->alloc((void**)&cgen_var_0, forMarshaling->swapchainCount * 8);
-        vkStream->handleMapping()->mapHandles_VkFence_u64(forMarshaling->pFences, cgen_var_0,
-                                                          forMarshaling->swapchainCount);
-        vkStream->write((uint64_t*)cgen_var_0, forMarshaling->swapchainCount * 8);
-    }
-}
-
-void unmarshal_VkSwapchainPresentFenceInfoEXT(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                              VkSwapchainPresentFenceInfoEXT* forUnmarshaling) {
-    (void)rootType;
-    vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forUnmarshaling->sType;
-    }
-    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
-    vkStream->read((uint32_t*)&forUnmarshaling->swapchainCount, sizeof(uint32_t));
-    if (forUnmarshaling->swapchainCount) {
-        uint64_t* cgen_var_0;
-        vkStream->alloc((void**)&cgen_var_0, forUnmarshaling->swapchainCount * 8);
-        vkStream->read((uint64_t*)cgen_var_0, forUnmarshaling->swapchainCount * 8);
-        vkStream->handleMapping()->mapHandles_u64_VkFence(
-            cgen_var_0, (VkFence*)forUnmarshaling->pFences, forUnmarshaling->swapchainCount);
-    }
-}
-
-void marshal_VkSwapchainPresentModesCreateInfoEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkSwapchainPresentModesCreateInfoEXT* forMarshaling) {
-    (void)rootType;
-    vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((uint32_t*)&forMarshaling->presentModeCount, sizeof(uint32_t));
-    vkStream->write((const VkPresentModeKHR*)forMarshaling->pPresentModes,
-                    forMarshaling->presentModeCount * sizeof(const VkPresentModeKHR));
-}
-
-void unmarshal_VkSwapchainPresentModesCreateInfoEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    VkSwapchainPresentModesCreateInfoEXT* forUnmarshaling) {
-    (void)rootType;
-    vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forUnmarshaling->sType;
-    }
-    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
-    vkStream->read((uint32_t*)&forUnmarshaling->presentModeCount, sizeof(uint32_t));
-    vkStream->read((VkPresentModeKHR*)forUnmarshaling->pPresentModes,
-                   forUnmarshaling->presentModeCount * sizeof(const VkPresentModeKHR));
-}
-
-void marshal_VkSwapchainPresentModeInfoEXT(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                           const VkSwapchainPresentModeInfoEXT* forMarshaling) {
-    (void)rootType;
-    vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((uint32_t*)&forMarshaling->swapchainCount, sizeof(uint32_t));
-    vkStream->write((const VkPresentModeKHR*)forMarshaling->pPresentModes,
-                    forMarshaling->swapchainCount * sizeof(const VkPresentModeKHR));
-}
-
-void unmarshal_VkSwapchainPresentModeInfoEXT(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                             VkSwapchainPresentModeInfoEXT* forUnmarshaling) {
-    (void)rootType;
-    vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forUnmarshaling->sType;
-    }
-    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
-    vkStream->read((uint32_t*)&forUnmarshaling->swapchainCount, sizeof(uint32_t));
-    vkStream->read((VkPresentModeKHR*)forUnmarshaling->pPresentModes,
-                   forUnmarshaling->swapchainCount * sizeof(const VkPresentModeKHR));
-}
-
-void marshal_VkSwapchainPresentScalingCreateInfoEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkSwapchainPresentScalingCreateInfoEXT* forMarshaling) {
-    (void)rootType;
-    vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    vkStream->write((VkPresentScalingFlagsEXT*)&forMarshaling->scalingBehavior,
-                    sizeof(VkPresentScalingFlagsEXT));
-    vkStream->write((VkPresentGravityFlagsEXT*)&forMarshaling->presentGravityX,
-                    sizeof(VkPresentGravityFlagsEXT));
-    vkStream->write((VkPresentGravityFlagsEXT*)&forMarshaling->presentGravityY,
-                    sizeof(VkPresentGravityFlagsEXT));
-}
-
-void unmarshal_VkSwapchainPresentScalingCreateInfoEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    VkSwapchainPresentScalingCreateInfoEXT* forUnmarshaling) {
-    (void)rootType;
-    vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forUnmarshaling->sType;
-    }
-    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
-    vkStream->read((VkPresentScalingFlagsEXT*)&forUnmarshaling->scalingBehavior,
-                   sizeof(VkPresentScalingFlagsEXT));
-    vkStream->read((VkPresentGravityFlagsEXT*)&forUnmarshaling->presentGravityX,
-                   sizeof(VkPresentGravityFlagsEXT));
-    vkStream->read((VkPresentGravityFlagsEXT*)&forUnmarshaling->presentGravityY,
-                   sizeof(VkPresentGravityFlagsEXT));
-}
-
-void marshal_VkReleaseSwapchainImagesInfoEXT(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                             const VkReleaseSwapchainImagesInfoEXT* forMarshaling) {
-    (void)rootType;
-    vkStream->write((VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    marshal_extension_struct(vkStream, rootType, forMarshaling->pNext);
-    uint64_t cgen_var_0;
-    vkStream->handleMapping()->mapHandles_VkSwapchainKHR_u64(&forMarshaling->swapchain, &cgen_var_0,
-                                                             1);
-    vkStream->write((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->write((uint32_t*)&forMarshaling->imageIndexCount, sizeof(uint32_t));
-    vkStream->write((const uint32_t*)forMarshaling->pImageIndices,
-                    forMarshaling->imageIndexCount * sizeof(const uint32_t));
-}
-
-void unmarshal_VkReleaseSwapchainImagesInfoEXT(VulkanStreamGuest* vkStream,
-                                               VkStructureType rootType,
-                                               VkReleaseSwapchainImagesInfoEXT* forUnmarshaling) {
-    (void)rootType;
-    vkStream->read((VkStructureType*)&forUnmarshaling->sType, sizeof(VkStructureType));
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forUnmarshaling->sType;
-    }
-    unmarshal_extension_struct(vkStream, rootType, (void*)(forUnmarshaling->pNext));
-    uint64_t cgen_var_0;
-    vkStream->read((uint64_t*)&cgen_var_0, 1 * 8);
-    vkStream->handleMapping()->mapHandles_u64_VkSwapchainKHR(
-        &cgen_var_0, (VkSwapchainKHR*)&forUnmarshaling->swapchain, 1);
-    vkStream->read((uint32_t*)&forUnmarshaling->imageIndexCount, sizeof(uint32_t));
-    vkStream->read((uint32_t*)forUnmarshaling->pImageIndices,
-                   forUnmarshaling->imageIndexCount * sizeof(const uint32_t));
-}
-
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 #endif
@@ -14524,32 +13986,6 @@
             break;
         }
 #endif
-#ifdef VK_KHR_swapchain
-        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR: {
-            marshal_VkImageSwapchainCreateInfoKHR(
-                vkStream, rootType,
-                reinterpret_cast<const VkImageSwapchainCreateInfoKHR*>(structExtension));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR: {
-            marshal_VkBindImageMemorySwapchainInfoKHR(
-                vkStream, rootType,
-                reinterpret_cast<const VkBindImageMemorySwapchainInfoKHR*>(structExtension));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR: {
-            marshal_VkDeviceGroupPresentInfoKHR(
-                vkStream, rootType,
-                reinterpret_cast<const VkDeviceGroupPresentInfoKHR*>(structExtension));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR: {
-            marshal_VkDeviceGroupSwapchainCreateInfoKHR(
-                vkStream, rootType,
-                reinterpret_cast<const VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension));
-            break;
-        }
-#endif
 #ifdef VK_KHR_dynamic_rendering
         case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
             marshal_VkRenderingFragmentShadingRateAttachmentInfoKHR(
@@ -14751,39 +14187,6 @@
             break;
         }
 #endif
-#ifdef VK_EXT_swapchain_maintenance1
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT: {
-            marshal_VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT(
-                vkStream, rootType,
-                reinterpret_cast<const VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT*>(
-                    structExtension));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT: {
-            marshal_VkSwapchainPresentFenceInfoEXT(
-                vkStream, rootType,
-                reinterpret_cast<const VkSwapchainPresentFenceInfoEXT*>(structExtension));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT: {
-            marshal_VkSwapchainPresentModesCreateInfoEXT(
-                vkStream, rootType,
-                reinterpret_cast<const VkSwapchainPresentModesCreateInfoEXT*>(structExtension));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT: {
-            marshal_VkSwapchainPresentModeInfoEXT(
-                vkStream, rootType,
-                reinterpret_cast<const VkSwapchainPresentModeInfoEXT*>(structExtension));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT: {
-            marshal_VkSwapchainPresentScalingCreateInfoEXT(
-                vkStream, rootType,
-                reinterpret_cast<const VkSwapchainPresentScalingCreateInfoEXT*>(structExtension));
-            break;
-        }
-#endif
 #ifdef VK_EXT_texel_buffer_alignment
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
             marshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
@@ -15645,32 +15048,6 @@
             break;
         }
 #endif
-#ifdef VK_KHR_swapchain
-        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR: {
-            unmarshal_VkImageSwapchainCreateInfoKHR(
-                vkStream, rootType,
-                reinterpret_cast<VkImageSwapchainCreateInfoKHR*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR: {
-            unmarshal_VkBindImageMemorySwapchainInfoKHR(
-                vkStream, rootType,
-                reinterpret_cast<VkBindImageMemorySwapchainInfoKHR*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR: {
-            unmarshal_VkDeviceGroupPresentInfoKHR(
-                vkStream, rootType,
-                reinterpret_cast<VkDeviceGroupPresentInfoKHR*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR: {
-            unmarshal_VkDeviceGroupSwapchainCreateInfoKHR(
-                vkStream, rootType,
-                reinterpret_cast<VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension_out));
-            break;
-        }
-#endif
 #ifdef VK_KHR_dynamic_rendering
         case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
             unmarshal_VkRenderingFragmentShadingRateAttachmentInfoKHR(
@@ -15867,39 +15244,6 @@
             break;
         }
 #endif
-#ifdef VK_EXT_swapchain_maintenance1
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT: {
-            unmarshal_VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT(
-                vkStream, rootType,
-                reinterpret_cast<VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT*>(
-                    structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT: {
-            unmarshal_VkSwapchainPresentFenceInfoEXT(
-                vkStream, rootType,
-                reinterpret_cast<VkSwapchainPresentFenceInfoEXT*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT: {
-            unmarshal_VkSwapchainPresentModesCreateInfoEXT(
-                vkStream, rootType,
-                reinterpret_cast<VkSwapchainPresentModesCreateInfoEXT*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT: {
-            unmarshal_VkSwapchainPresentModeInfoEXT(
-                vkStream, rootType,
-                reinterpret_cast<VkSwapchainPresentModeInfoEXT*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT: {
-            unmarshal_VkSwapchainPresentScalingCreateInfoEXT(
-                vkStream, rootType,
-                reinterpret_cast<VkSwapchainPresentScalingCreateInfoEXT*>(structExtension_out));
-            break;
-        }
-#endif
 #ifdef VK_EXT_texel_buffer_alignment
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
             unmarshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
@@ -16559,35 +15903,6 @@
             return "OP_vkGetDescriptorSetLayoutSupport";
         }
 #endif
-#ifdef VK_KHR_swapchain
-        case OP_vkCreateSwapchainKHR: {
-            return "OP_vkCreateSwapchainKHR";
-        }
-        case OP_vkDestroySwapchainKHR: {
-            return "OP_vkDestroySwapchainKHR";
-        }
-        case OP_vkGetSwapchainImagesKHR: {
-            return "OP_vkGetSwapchainImagesKHR";
-        }
-        case OP_vkAcquireNextImageKHR: {
-            return "OP_vkAcquireNextImageKHR";
-        }
-        case OP_vkQueuePresentKHR: {
-            return "OP_vkQueuePresentKHR";
-        }
-        case OP_vkGetDeviceGroupPresentCapabilitiesKHR: {
-            return "OP_vkGetDeviceGroupPresentCapabilitiesKHR";
-        }
-        case OP_vkGetDeviceGroupSurfacePresentModesKHR: {
-            return "OP_vkGetDeviceGroupSurfacePresentModesKHR";
-        }
-        case OP_vkGetPhysicalDevicePresentRectanglesKHR: {
-            return "OP_vkGetPhysicalDevicePresentRectanglesKHR";
-        }
-        case OP_vkAcquireNextImage2KHR: {
-            return "OP_vkAcquireNextImage2KHR";
-        }
-#endif
 #ifdef VK_KHR_get_physical_device_properties2
         case OP_vkGetPhysicalDeviceFeatures2KHR: {
             return "OP_vkGetPhysicalDeviceFeatures2KHR";
@@ -16914,13 +16229,6 @@
         case OP_vkCmdSetPrimitiveRestartEnable: {
             return "OP_vkCmdSetPrimitiveRestartEnable";
         }
-#endif
-#ifdef VK_EXT_swapchain_maintenance1
-        case OP_vkReleaseSwapchainImagesEXT: {
-            return "OP_vkReleaseSwapchainImagesEXT";
-        }
-#endif
-#ifdef VK_VERSION_1_3
         case OP_vkCmdSetEvent2: {
             return "OP_vkCmdSetEvent2";
         }
diff --git a/guest/vulkan_enc/goldfish_vk_marshaling_guest.h b/guest/vulkan_enc/goldfish_vk_marshaling_guest.h
index 563fec0..fae1b9a 100644
--- a/guest/vulkan_enc/goldfish_vk_marshaling_guest.h
+++ b/guest/vulkan_enc/goldfish_vk_marshaling_guest.h
@@ -2206,69 +2206,6 @@
 #ifdef VK_KHR_surface
 #endif
 #ifdef VK_KHR_swapchain
-void marshal_VkSwapchainCreateInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                      const VkSwapchainCreateInfoKHR* forMarshaling);
-
-void unmarshal_VkSwapchainCreateInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                        VkSwapchainCreateInfoKHR* forUnmarshaling);
-
-void marshal_VkPresentInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                              const VkPresentInfoKHR* forMarshaling);
-
-void unmarshal_VkPresentInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                VkPresentInfoKHR* forUnmarshaling);
-
-#define OP_vkCreateSwapchainKHR 20170
-#define OP_vkDestroySwapchainKHR 20171
-#define OP_vkGetSwapchainImagesKHR 20172
-#define OP_vkAcquireNextImageKHR 20173
-#define OP_vkQueuePresentKHR 20174
-void marshal_VkImageSwapchainCreateInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                           const VkImageSwapchainCreateInfoKHR* forMarshaling);
-
-void unmarshal_VkImageSwapchainCreateInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                             VkImageSwapchainCreateInfoKHR* forUnmarshaling);
-
-void marshal_VkBindImageMemorySwapchainInfoKHR(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkBindImageMemorySwapchainInfoKHR* forMarshaling);
-
-void unmarshal_VkBindImageMemorySwapchainInfoKHR(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    VkBindImageMemorySwapchainInfoKHR* forUnmarshaling);
-
-void marshal_VkAcquireNextImageInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                       const VkAcquireNextImageInfoKHR* forMarshaling);
-
-void unmarshal_VkAcquireNextImageInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                         VkAcquireNextImageInfoKHR* forUnmarshaling);
-
-void marshal_VkDeviceGroupPresentCapabilitiesKHR(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkDeviceGroupPresentCapabilitiesKHR* forMarshaling);
-
-void unmarshal_VkDeviceGroupPresentCapabilitiesKHR(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    VkDeviceGroupPresentCapabilitiesKHR* forUnmarshaling);
-
-void marshal_VkDeviceGroupPresentInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                         const VkDeviceGroupPresentInfoKHR* forMarshaling);
-
-void unmarshal_VkDeviceGroupPresentInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                           VkDeviceGroupPresentInfoKHR* forUnmarshaling);
-
-void marshal_VkDeviceGroupSwapchainCreateInfoKHR(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkDeviceGroupSwapchainCreateInfoKHR* forMarshaling);
-
-void unmarshal_VkDeviceGroupSwapchainCreateInfoKHR(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    VkDeviceGroupSwapchainCreateInfoKHR* forUnmarshaling);
-
-#define OP_vkGetDeviceGroupPresentCapabilitiesKHR 20175
-#define OP_vkGetDeviceGroupSurfacePresentModesKHR 20176
-#define OP_vkGetPhysicalDevicePresentRectanglesKHR 20177
-#define OP_vkAcquireNextImage2KHR 20178
 #endif
 #ifdef VK_KHR_xcb_surface
 #endif
@@ -3461,50 +3398,6 @@
 #define OP_vkGetImageSubresourceLayout2EXT 296152177
 #endif
 #ifdef VK_EXT_swapchain_maintenance1
-void marshal_VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT* forMarshaling);
-
-void unmarshal_VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT* forUnmarshaling);
-
-void marshal_VkSwapchainPresentFenceInfoEXT(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                            const VkSwapchainPresentFenceInfoEXT* forMarshaling);
-
-void unmarshal_VkSwapchainPresentFenceInfoEXT(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                              VkSwapchainPresentFenceInfoEXT* forUnmarshaling);
-
-void marshal_VkSwapchainPresentModesCreateInfoEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkSwapchainPresentModesCreateInfoEXT* forMarshaling);
-
-void unmarshal_VkSwapchainPresentModesCreateInfoEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    VkSwapchainPresentModesCreateInfoEXT* forUnmarshaling);
-
-void marshal_VkSwapchainPresentModeInfoEXT(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                           const VkSwapchainPresentModeInfoEXT* forMarshaling);
-
-void unmarshal_VkSwapchainPresentModeInfoEXT(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                             VkSwapchainPresentModeInfoEXT* forUnmarshaling);
-
-void marshal_VkSwapchainPresentScalingCreateInfoEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkSwapchainPresentScalingCreateInfoEXT* forMarshaling);
-
-void unmarshal_VkSwapchainPresentScalingCreateInfoEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    VkSwapchainPresentScalingCreateInfoEXT* forUnmarshaling);
-
-void marshal_VkReleaseSwapchainImagesInfoEXT(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                             const VkReleaseSwapchainImagesInfoEXT* forMarshaling);
-
-void unmarshal_VkReleaseSwapchainImagesInfoEXT(VulkanStreamGuest* vkStream,
-                                               VkStructureType rootType,
-                                               VkReleaseSwapchainImagesInfoEXT* forUnmarshaling);
-
-#define OP_vkReleaseSwapchainImagesEXT 230545069
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 DEFINE_ALIAS_FUNCTION(marshal_VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures,
diff --git a/guest/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp b/guest/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp
index 2dab02c..246ed95 100644
--- a/guest/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp
+++ b/guest/vulkan_enc/goldfish_vk_reserved_marshaling_guest.cpp
@@ -7294,237 +7294,6 @@
 #ifdef VK_KHR_surface
 #endif
 #ifdef VK_KHR_swapchain
-void reservedmarshal_VkSwapchainCreateInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                              const VkSwapchainCreateInfoKHR* forMarshaling,
-                                              uint8_t** ptr) {
-    (void)vkStream;
-    (void)rootType;
-    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
-    memcpy(*ptr, (VkSwapchainCreateFlagsKHR*)&forMarshaling->flags,
-           sizeof(VkSwapchainCreateFlagsKHR));
-    *ptr += sizeof(VkSwapchainCreateFlagsKHR);
-    uint64_t cgen_var_0;
-    *&cgen_var_0 = get_host_u64_VkSurfaceKHR((*&forMarshaling->surface));
-    memcpy(*ptr, (uint64_t*)&cgen_var_0, 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, rootType, (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_1 = (uint64_t)(uintptr_t)forMarshaling->pQueueFamilyIndices;
-    memcpy((*ptr), &cgen_var_1, 8);
-    gfxstream::guest::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_2;
-    *&cgen_var_2 = get_host_u64_VkSwapchainKHR((*&forMarshaling->oldSwapchain));
-    memcpy(*ptr, (uint64_t*)&cgen_var_2, 1 * 8);
-    *ptr += 1 * 8;
-}
-
-void reservedmarshal_VkPresentInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                      const VkPresentInfoKHR* forMarshaling, uint8_t** ptr) {
-    (void)vkStream;
-    (void)rootType;
-    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
-    memcpy(*ptr, (uint32_t*)&forMarshaling->waitSemaphoreCount, sizeof(uint32_t));
-    *ptr += sizeof(uint32_t);
-    if (forMarshaling->waitSemaphoreCount) {
-        uint8_t* cgen_var_0_ptr = (uint8_t*)(*ptr);
-        if (forMarshaling) {
-            for (uint32_t k = 0; k < forMarshaling->waitSemaphoreCount; ++k) {
-                uint64_t tmpval = get_host_u64_VkSemaphore(forMarshaling->pWaitSemaphores[k]);
-                memcpy(cgen_var_0_ptr + k * 8, &tmpval, sizeof(uint64_t));
-            }
-        }
-        *ptr += 8 * forMarshaling->waitSemaphoreCount;
-    }
-    memcpy(*ptr, (uint32_t*)&forMarshaling->swapchainCount, sizeof(uint32_t));
-    *ptr += sizeof(uint32_t);
-    if (forMarshaling->swapchainCount) {
-        uint8_t* cgen_var_1_ptr = (uint8_t*)(*ptr);
-        if (forMarshaling) {
-            for (uint32_t k = 0; k < forMarshaling->swapchainCount; ++k) {
-                uint64_t tmpval = get_host_u64_VkSwapchainKHR(forMarshaling->pSwapchains[k]);
-                memcpy(cgen_var_1_ptr + k * 8, &tmpval, sizeof(uint64_t));
-            }
-        }
-        *ptr += 8 * forMarshaling->swapchainCount;
-    }
-    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_2 = (uint64_t)(uintptr_t)forMarshaling->pResults;
-    memcpy((*ptr), &cgen_var_2, 8);
-    gfxstream::guest::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, VkStructureType rootType,
-    const VkImageSwapchainCreateInfoKHR* forMarshaling, uint8_t** ptr) {
-    (void)vkStream;
-    (void)rootType;
-    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
-    uint64_t cgen_var_0;
-    *&cgen_var_0 = get_host_u64_VkSwapchainKHR((*&forMarshaling->swapchain));
-    memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
-    *ptr += 1 * 8;
-}
-
-void reservedmarshal_VkBindImageMemorySwapchainInfoKHR(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkBindImageMemorySwapchainInfoKHR* forMarshaling, uint8_t** ptr) {
-    (void)vkStream;
-    (void)rootType;
-    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
-    uint64_t cgen_var_0;
-    *&cgen_var_0 = get_host_u64_VkSwapchainKHR((*&forMarshaling->swapchain));
-    memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
-    *ptr += 1 * 8;
-    memcpy(*ptr, (uint32_t*)&forMarshaling->imageIndex, sizeof(uint32_t));
-    *ptr += sizeof(uint32_t);
-}
-
-void reservedmarshal_VkAcquireNextImageInfoKHR(VulkanStreamGuest* vkStream,
-                                               VkStructureType rootType,
-                                               const VkAcquireNextImageInfoKHR* forMarshaling,
-                                               uint8_t** ptr) {
-    (void)vkStream;
-    (void)rootType;
-    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
-    uint64_t cgen_var_0;
-    *&cgen_var_0 = get_host_u64_VkSwapchainKHR((*&forMarshaling->swapchain));
-    memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
-    *ptr += 1 * 8;
-    memcpy(*ptr, (uint64_t*)&forMarshaling->timeout, sizeof(uint64_t));
-    *ptr += sizeof(uint64_t);
-    uint64_t cgen_var_1;
-    *&cgen_var_1 = get_host_u64_VkSemaphore((*&forMarshaling->semaphore));
-    memcpy(*ptr, (uint64_t*)&cgen_var_1, 1 * 8);
-    *ptr += 1 * 8;
-    uint64_t cgen_var_2;
-    *&cgen_var_2 = get_host_u64_VkFence((*&forMarshaling->fence));
-    memcpy(*ptr, (uint64_t*)&cgen_var_2, 1 * 8);
-    *ptr += 1 * 8;
-    memcpy(*ptr, (uint32_t*)&forMarshaling->deviceMask, sizeof(uint32_t));
-    *ptr += sizeof(uint32_t);
-}
-
-void reservedmarshal_VkDeviceGroupPresentCapabilitiesKHR(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkDeviceGroupPresentCapabilitiesKHR* forMarshaling, uint8_t** ptr) {
-    (void)vkStream;
-    (void)rootType;
-    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    reservedmarshal_extension_struct(vkStream, rootType, 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,
-                                                 VkStructureType rootType,
-                                                 const VkDeviceGroupPresentInfoKHR* forMarshaling,
-                                                 uint8_t** ptr) {
-    (void)vkStream;
-    (void)rootType;
-    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    reservedmarshal_extension_struct(vkStream, rootType, 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, VkStructureType rootType,
-    const VkDeviceGroupSwapchainCreateInfoKHR* forMarshaling, uint8_t** ptr) {
-    (void)vkStream;
-    (void)rootType;
-    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
-    memcpy(*ptr, (VkDeviceGroupPresentModeFlagsKHR*)&forMarshaling->modes,
-           sizeof(VkDeviceGroupPresentModeFlagsKHR));
-    *ptr += sizeof(VkDeviceGroupPresentModeFlagsKHR);
-}
-
 #endif
 #ifdef VK_KHR_xcb_surface
 #endif
@@ -8741,126 +8510,6 @@
 
 #endif
 #ifdef VK_EXT_swapchain_maintenance1
-void reservedmarshal_VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT* forMarshaling, uint8_t** ptr) {
-    (void)vkStream;
-    (void)rootType;
-    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
-    memcpy(*ptr, (VkBool32*)&forMarshaling->swapchainMaintenance1, sizeof(VkBool32));
-    *ptr += sizeof(VkBool32);
-}
-
-void reservedmarshal_VkSwapchainPresentFenceInfoEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkSwapchainPresentFenceInfoEXT* forMarshaling, uint8_t** ptr) {
-    (void)vkStream;
-    (void)rootType;
-    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
-    memcpy(*ptr, (uint32_t*)&forMarshaling->swapchainCount, sizeof(uint32_t));
-    *ptr += sizeof(uint32_t);
-    if (forMarshaling->swapchainCount) {
-        uint8_t* cgen_var_0_ptr = (uint8_t*)(*ptr);
-        if (forMarshaling) {
-            for (uint32_t k = 0; k < forMarshaling->swapchainCount; ++k) {
-                uint64_t tmpval = get_host_u64_VkFence(forMarshaling->pFences[k]);
-                memcpy(cgen_var_0_ptr + k * 8, &tmpval, sizeof(uint64_t));
-            }
-        }
-        *ptr += 8 * forMarshaling->swapchainCount;
-    }
-}
-
-void reservedmarshal_VkSwapchainPresentModesCreateInfoEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkSwapchainPresentModesCreateInfoEXT* forMarshaling, uint8_t** ptr) {
-    (void)vkStream;
-    (void)rootType;
-    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
-    memcpy(*ptr, (uint32_t*)&forMarshaling->presentModeCount, sizeof(uint32_t));
-    *ptr += sizeof(uint32_t);
-    memcpy(*ptr, (const VkPresentModeKHR*)forMarshaling->pPresentModes,
-           forMarshaling->presentModeCount * sizeof(const VkPresentModeKHR));
-    *ptr += forMarshaling->presentModeCount * sizeof(const VkPresentModeKHR);
-}
-
-void reservedmarshal_VkSwapchainPresentModeInfoEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkSwapchainPresentModeInfoEXT* forMarshaling, uint8_t** ptr) {
-    (void)vkStream;
-    (void)rootType;
-    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
-    memcpy(*ptr, (uint32_t*)&forMarshaling->swapchainCount, sizeof(uint32_t));
-    *ptr += sizeof(uint32_t);
-    memcpy(*ptr, (const VkPresentModeKHR*)forMarshaling->pPresentModes,
-           forMarshaling->swapchainCount * sizeof(const VkPresentModeKHR));
-    *ptr += forMarshaling->swapchainCount * sizeof(const VkPresentModeKHR);
-}
-
-void reservedmarshal_VkSwapchainPresentScalingCreateInfoEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkSwapchainPresentScalingCreateInfoEXT* forMarshaling, uint8_t** ptr) {
-    (void)vkStream;
-    (void)rootType;
-    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
-    memcpy(*ptr, (VkPresentScalingFlagsEXT*)&forMarshaling->scalingBehavior,
-           sizeof(VkPresentScalingFlagsEXT));
-    *ptr += sizeof(VkPresentScalingFlagsEXT);
-    memcpy(*ptr, (VkPresentGravityFlagsEXT*)&forMarshaling->presentGravityX,
-           sizeof(VkPresentGravityFlagsEXT));
-    *ptr += sizeof(VkPresentGravityFlagsEXT);
-    memcpy(*ptr, (VkPresentGravityFlagsEXT*)&forMarshaling->presentGravityY,
-           sizeof(VkPresentGravityFlagsEXT));
-    *ptr += sizeof(VkPresentGravityFlagsEXT);
-}
-
-void reservedmarshal_VkReleaseSwapchainImagesInfoEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkReleaseSwapchainImagesInfoEXT* forMarshaling, uint8_t** ptr) {
-    (void)vkStream;
-    (void)rootType;
-    memcpy(*ptr, (VkStructureType*)&forMarshaling->sType, sizeof(VkStructureType));
-    *ptr += sizeof(VkStructureType);
-    if (rootType == VK_STRUCTURE_TYPE_MAX_ENUM) {
-        rootType = forMarshaling->sType;
-    }
-    reservedmarshal_extension_struct(vkStream, rootType, forMarshaling->pNext, ptr);
-    uint64_t cgen_var_0;
-    *&cgen_var_0 = get_host_u64_VkSwapchainKHR((*&forMarshaling->swapchain));
-    memcpy(*ptr, (uint64_t*)&cgen_var_0, 1 * 8);
-    *ptr += 1 * 8;
-    memcpy(*ptr, (uint32_t*)&forMarshaling->imageIndexCount, sizeof(uint32_t));
-    *ptr += sizeof(uint32_t);
-    memcpy(*ptr, (const uint32_t*)forMarshaling->pImageIndices,
-           forMarshaling->imageIndexCount * sizeof(const uint32_t));
-    *ptr += forMarshaling->imageIndexCount * sizeof(const uint32_t);
-}
-
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 #endif
@@ -10041,32 +9690,6 @@
             break;
         }
 #endif
-#ifdef VK_KHR_swapchain
-        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR: {
-            reservedmarshal_VkImageSwapchainCreateInfoKHR(
-                vkStream, rootType,
-                reinterpret_cast<const VkImageSwapchainCreateInfoKHR*>(structExtension), ptr);
-            break;
-        }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR: {
-            reservedmarshal_VkBindImageMemorySwapchainInfoKHR(
-                vkStream, rootType,
-                reinterpret_cast<const VkBindImageMemorySwapchainInfoKHR*>(structExtension), ptr);
-            break;
-        }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR: {
-            reservedmarshal_VkDeviceGroupPresentInfoKHR(
-                vkStream, rootType,
-                reinterpret_cast<const VkDeviceGroupPresentInfoKHR*>(structExtension), ptr);
-            break;
-        }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR: {
-            reservedmarshal_VkDeviceGroupSwapchainCreateInfoKHR(
-                vkStream, rootType,
-                reinterpret_cast<const VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension), ptr);
-            break;
-        }
-#endif
 #ifdef VK_KHR_dynamic_rendering
         case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
             reservedmarshal_VkRenderingFragmentShadingRateAttachmentInfoKHR(
@@ -10287,42 +9910,6 @@
             break;
         }
 #endif
-#ifdef VK_EXT_swapchain_maintenance1
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT: {
-            reservedmarshal_VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT(
-                vkStream, rootType,
-                reinterpret_cast<const VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT*>(
-                    structExtension),
-                ptr);
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT: {
-            reservedmarshal_VkSwapchainPresentFenceInfoEXT(
-                vkStream, rootType,
-                reinterpret_cast<const VkSwapchainPresentFenceInfoEXT*>(structExtension), ptr);
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT: {
-            reservedmarshal_VkSwapchainPresentModesCreateInfoEXT(
-                vkStream, rootType,
-                reinterpret_cast<const VkSwapchainPresentModesCreateInfoEXT*>(structExtension),
-                ptr);
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT: {
-            reservedmarshal_VkSwapchainPresentModeInfoEXT(
-                vkStream, rootType,
-                reinterpret_cast<const VkSwapchainPresentModeInfoEXT*>(structExtension), ptr);
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT: {
-            reservedmarshal_VkSwapchainPresentScalingCreateInfoEXT(
-                vkStream, rootType,
-                reinterpret_cast<const VkSwapchainPresentScalingCreateInfoEXT*>(structExtension),
-                ptr);
-            break;
-        }
-#endif
 #ifdef VK_EXT_texel_buffer_alignment
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
             reservedmarshal_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
diff --git a/guest/vulkan_enc/goldfish_vk_reserved_marshaling_guest.h b/guest/vulkan_enc/goldfish_vk_reserved_marshaling_guest.h
index 072a133..4cedd05 100644
--- a/guest/vulkan_enc/goldfish_vk_reserved_marshaling_guest.h
+++ b/guest/vulkan_enc/goldfish_vk_reserved_marshaling_guest.h
@@ -1159,39 +1159,6 @@
 #ifdef VK_KHR_surface
 #endif
 #ifdef VK_KHR_swapchain
-void reservedmarshal_VkSwapchainCreateInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                              const VkSwapchainCreateInfoKHR* forMarshaling,
-                                              uint8_t** ptr);
-
-void reservedmarshal_VkPresentInfoKHR(VulkanStreamGuest* vkStream, VkStructureType rootType,
-                                      const VkPresentInfoKHR* forMarshaling, uint8_t** ptr);
-
-void reservedmarshal_VkImageSwapchainCreateInfoKHR(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkImageSwapchainCreateInfoKHR* forMarshaling, uint8_t** ptr);
-
-void reservedmarshal_VkBindImageMemorySwapchainInfoKHR(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkBindImageMemorySwapchainInfoKHR* forMarshaling, uint8_t** ptr);
-
-void reservedmarshal_VkAcquireNextImageInfoKHR(VulkanStreamGuest* vkStream,
-                                               VkStructureType rootType,
-                                               const VkAcquireNextImageInfoKHR* forMarshaling,
-                                               uint8_t** ptr);
-
-void reservedmarshal_VkDeviceGroupPresentCapabilitiesKHR(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkDeviceGroupPresentCapabilitiesKHR* forMarshaling, uint8_t** ptr);
-
-void reservedmarshal_VkDeviceGroupPresentInfoKHR(VulkanStreamGuest* vkStream,
-                                                 VkStructureType rootType,
-                                                 const VkDeviceGroupPresentInfoKHR* forMarshaling,
-                                                 uint8_t** ptr);
-
-void reservedmarshal_VkDeviceGroupSwapchainCreateInfoKHR(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkDeviceGroupSwapchainCreateInfoKHR* forMarshaling, uint8_t** ptr);
-
 #endif
 #ifdef VK_KHR_xcb_surface
 #endif
@@ -1862,30 +1829,6 @@
 
 #endif
 #ifdef VK_EXT_swapchain_maintenance1
-void reservedmarshal_VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT* forMarshaling, uint8_t** ptr);
-
-void reservedmarshal_VkSwapchainPresentFenceInfoEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkSwapchainPresentFenceInfoEXT* forMarshaling, uint8_t** ptr);
-
-void reservedmarshal_VkSwapchainPresentModesCreateInfoEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkSwapchainPresentModesCreateInfoEXT* forMarshaling, uint8_t** ptr);
-
-void reservedmarshal_VkSwapchainPresentModeInfoEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkSwapchainPresentModeInfoEXT* forMarshaling, uint8_t** ptr);
-
-void reservedmarshal_VkSwapchainPresentScalingCreateInfoEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkSwapchainPresentScalingCreateInfoEXT* forMarshaling, uint8_t** ptr);
-
-void reservedmarshal_VkReleaseSwapchainImagesInfoEXT(
-    VulkanStreamGuest* vkStream, VkStructureType rootType,
-    const VkReleaseSwapchainImagesInfoEXT* forMarshaling, uint8_t** ptr);
-
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 DEFINE_ALIAS_FUNCTION(reservedmarshal_VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures,
diff --git a/guest/vulkan_enc/goldfish_vk_transform_guest.cpp b/guest/vulkan_enc/goldfish_vk_transform_guest.cpp
index 02f5c20..82e7351 100644
--- a/guest/vulkan_enc/goldfish_vk_transform_guest.cpp
+++ b/guest/vulkan_enc/goldfish_vk_transform_guest.cpp
@@ -6089,152 +6089,6 @@
 #ifdef VK_KHR_surface
 #endif
 #ifdef VK_KHR_swapchain
-void transform_tohost_VkSwapchainCreateInfoKHR(ResourceTracker* resourceTracker,
-                                               VkSwapchainCreateInfoKHR* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-    transform_tohost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->imageExtent));
-}
-
-void transform_fromhost_VkSwapchainCreateInfoKHR(ResourceTracker* resourceTracker,
-                                                 VkSwapchainCreateInfoKHR* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-    transform_fromhost_VkExtent2D(resourceTracker, (VkExtent2D*)(&toTransform->imageExtent));
-}
-
-void transform_tohost_VkPresentInfoKHR(ResourceTracker* resourceTracker,
-                                       VkPresentInfoKHR* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_fromhost_VkPresentInfoKHR(ResourceTracker* resourceTracker,
-                                         VkPresentInfoKHR* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_tohost_VkImageSwapchainCreateInfoKHR(ResourceTracker* resourceTracker,
-                                                    VkImageSwapchainCreateInfoKHR* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_fromhost_VkImageSwapchainCreateInfoKHR(ResourceTracker* resourceTracker,
-                                                      VkImageSwapchainCreateInfoKHR* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_tohost_VkBindImageMemorySwapchainInfoKHR(
-    ResourceTracker* resourceTracker, VkBindImageMemorySwapchainInfoKHR* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_fromhost_VkBindImageMemorySwapchainInfoKHR(
-    ResourceTracker* resourceTracker, VkBindImageMemorySwapchainInfoKHR* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_tohost_VkAcquireNextImageInfoKHR(ResourceTracker* resourceTracker,
-                                                VkAcquireNextImageInfoKHR* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_fromhost_VkAcquireNextImageInfoKHR(ResourceTracker* resourceTracker,
-                                                  VkAcquireNextImageInfoKHR* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_tohost_VkDeviceGroupPresentCapabilitiesKHR(
-    ResourceTracker* resourceTracker, VkDeviceGroupPresentCapabilitiesKHR* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_fromhost_VkDeviceGroupPresentCapabilitiesKHR(
-    ResourceTracker* resourceTracker, VkDeviceGroupPresentCapabilitiesKHR* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_tohost_VkDeviceGroupPresentInfoKHR(ResourceTracker* resourceTracker,
-                                                  VkDeviceGroupPresentInfoKHR* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_fromhost_VkDeviceGroupPresentInfoKHR(ResourceTracker* resourceTracker,
-                                                    VkDeviceGroupPresentInfoKHR* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_tohost_VkDeviceGroupSwapchainCreateInfoKHR(
-    ResourceTracker* resourceTracker, VkDeviceGroupSwapchainCreateInfoKHR* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_fromhost_VkDeviceGroupSwapchainCreateInfoKHR(
-    ResourceTracker* resourceTracker, VkDeviceGroupSwapchainCreateInfoKHR* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
 #endif
 #ifdef VK_KHR_xcb_surface
 #endif
@@ -7445,116 +7299,6 @@
 
 #endif
 #ifdef VK_EXT_swapchain_maintenance1
-void transform_tohost_VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT(
-    ResourceTracker* resourceTracker,
-    VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_fromhost_VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT(
-    ResourceTracker* resourceTracker,
-    VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_tohost_VkSwapchainPresentFenceInfoEXT(ResourceTracker* resourceTracker,
-                                                     VkSwapchainPresentFenceInfoEXT* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_fromhost_VkSwapchainPresentFenceInfoEXT(
-    ResourceTracker* resourceTracker, VkSwapchainPresentFenceInfoEXT* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_tohost_VkSwapchainPresentModesCreateInfoEXT(
-    ResourceTracker* resourceTracker, VkSwapchainPresentModesCreateInfoEXT* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_fromhost_VkSwapchainPresentModesCreateInfoEXT(
-    ResourceTracker* resourceTracker, VkSwapchainPresentModesCreateInfoEXT* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_tohost_VkSwapchainPresentModeInfoEXT(ResourceTracker* resourceTracker,
-                                                    VkSwapchainPresentModeInfoEXT* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_fromhost_VkSwapchainPresentModeInfoEXT(ResourceTracker* resourceTracker,
-                                                      VkSwapchainPresentModeInfoEXT* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_tohost_VkSwapchainPresentScalingCreateInfoEXT(
-    ResourceTracker* resourceTracker, VkSwapchainPresentScalingCreateInfoEXT* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_fromhost_VkSwapchainPresentScalingCreateInfoEXT(
-    ResourceTracker* resourceTracker, VkSwapchainPresentScalingCreateInfoEXT* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_tohost_VkReleaseSwapchainImagesInfoEXT(
-    ResourceTracker* resourceTracker, VkReleaseSwapchainImagesInfoEXT* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_tohost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
-void transform_fromhost_VkReleaseSwapchainImagesInfoEXT(
-    ResourceTracker* resourceTracker, VkReleaseSwapchainImagesInfoEXT* toTransform) {
-    (void)resourceTracker;
-    (void)toTransform;
-    if (toTransform->pNext) {
-        transform_fromhost_extension_struct(resourceTracker, (void*)(toTransform->pNext));
-    }
-}
-
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 #endif
@@ -8657,32 +8401,6 @@
             break;
         }
 #endif
-#ifdef VK_KHR_swapchain
-        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR: {
-            transform_tohost_VkImageSwapchainCreateInfoKHR(
-                resourceTracker,
-                reinterpret_cast<VkImageSwapchainCreateInfoKHR*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR: {
-            transform_tohost_VkBindImageMemorySwapchainInfoKHR(
-                resourceTracker,
-                reinterpret_cast<VkBindImageMemorySwapchainInfoKHR*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR: {
-            transform_tohost_VkDeviceGroupPresentInfoKHR(
-                resourceTracker,
-                reinterpret_cast<VkDeviceGroupPresentInfoKHR*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR: {
-            transform_tohost_VkDeviceGroupSwapchainCreateInfoKHR(
-                resourceTracker,
-                reinterpret_cast<VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension_out));
-            break;
-        }
-#endif
 #ifdef VK_KHR_dynamic_rendering
         case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
             transform_tohost_VkRenderingFragmentShadingRateAttachmentInfoKHR(
@@ -8869,39 +8587,6 @@
             break;
         }
 #endif
-#ifdef VK_EXT_swapchain_maintenance1
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT: {
-            transform_tohost_VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT(
-                resourceTracker,
-                reinterpret_cast<VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT*>(
-                    structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT: {
-            transform_tohost_VkSwapchainPresentFenceInfoEXT(
-                resourceTracker,
-                reinterpret_cast<VkSwapchainPresentFenceInfoEXT*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT: {
-            transform_tohost_VkSwapchainPresentModesCreateInfoEXT(
-                resourceTracker,
-                reinterpret_cast<VkSwapchainPresentModesCreateInfoEXT*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT: {
-            transform_tohost_VkSwapchainPresentModeInfoEXT(
-                resourceTracker,
-                reinterpret_cast<VkSwapchainPresentModeInfoEXT*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT: {
-            transform_tohost_VkSwapchainPresentScalingCreateInfoEXT(
-                resourceTracker,
-                reinterpret_cast<VkSwapchainPresentScalingCreateInfoEXT*>(structExtension_out));
-            break;
-        }
-#endif
 #ifdef VK_EXT_texel_buffer_alignment
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
             transform_tohost_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
@@ -9725,32 +9410,6 @@
             break;
         }
 #endif
-#ifdef VK_KHR_swapchain
-        case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR: {
-            transform_fromhost_VkImageSwapchainCreateInfoKHR(
-                resourceTracker,
-                reinterpret_cast<VkImageSwapchainCreateInfoKHR*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR: {
-            transform_fromhost_VkBindImageMemorySwapchainInfoKHR(
-                resourceTracker,
-                reinterpret_cast<VkBindImageMemorySwapchainInfoKHR*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR: {
-            transform_fromhost_VkDeviceGroupPresentInfoKHR(
-                resourceTracker,
-                reinterpret_cast<VkDeviceGroupPresentInfoKHR*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR: {
-            transform_fromhost_VkDeviceGroupSwapchainCreateInfoKHR(
-                resourceTracker,
-                reinterpret_cast<VkDeviceGroupSwapchainCreateInfoKHR*>(structExtension_out));
-            break;
-        }
-#endif
 #ifdef VK_KHR_dynamic_rendering
         case VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR: {
             transform_fromhost_VkRenderingFragmentShadingRateAttachmentInfoKHR(
@@ -9937,39 +9596,6 @@
             break;
         }
 #endif
-#ifdef VK_EXT_swapchain_maintenance1
-        case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT: {
-            transform_fromhost_VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT(
-                resourceTracker,
-                reinterpret_cast<VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT*>(
-                    structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT: {
-            transform_fromhost_VkSwapchainPresentFenceInfoEXT(
-                resourceTracker,
-                reinterpret_cast<VkSwapchainPresentFenceInfoEXT*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT: {
-            transform_fromhost_VkSwapchainPresentModesCreateInfoEXT(
-                resourceTracker,
-                reinterpret_cast<VkSwapchainPresentModesCreateInfoEXT*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT: {
-            transform_fromhost_VkSwapchainPresentModeInfoEXT(
-                resourceTracker,
-                reinterpret_cast<VkSwapchainPresentModeInfoEXT*>(structExtension_out));
-            break;
-        }
-        case VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT: {
-            transform_fromhost_VkSwapchainPresentScalingCreateInfoEXT(
-                resourceTracker,
-                reinterpret_cast<VkSwapchainPresentScalingCreateInfoEXT*>(structExtension_out));
-            break;
-        }
-#endif
 #ifdef VK_EXT_texel_buffer_alignment
         case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
             transform_fromhost_VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT(
diff --git a/guest/vulkan_enc/goldfish_vk_transform_guest.h b/guest/vulkan_enc/goldfish_vk_transform_guest.h
index 4af1555..e45db10 100644
--- a/guest/vulkan_enc/goldfish_vk_transform_guest.h
+++ b/guest/vulkan_enc/goldfish_vk_transform_guest.h
@@ -1762,54 +1762,6 @@
 #ifdef VK_KHR_surface
 #endif
 #ifdef VK_KHR_swapchain
-void transform_tohost_VkSwapchainCreateInfoKHR(ResourceTracker* resourceTracker,
-                                               VkSwapchainCreateInfoKHR* toTransform);
-
-void transform_fromhost_VkSwapchainCreateInfoKHR(ResourceTracker* resourceTracker,
-                                                 VkSwapchainCreateInfoKHR* toTransform);
-
-void transform_tohost_VkPresentInfoKHR(ResourceTracker* resourceTracker,
-                                       VkPresentInfoKHR* toTransform);
-
-void transform_fromhost_VkPresentInfoKHR(ResourceTracker* resourceTracker,
-                                         VkPresentInfoKHR* toTransform);
-
-void transform_tohost_VkImageSwapchainCreateInfoKHR(ResourceTracker* resourceTracker,
-                                                    VkImageSwapchainCreateInfoKHR* toTransform);
-
-void transform_fromhost_VkImageSwapchainCreateInfoKHR(ResourceTracker* resourceTracker,
-                                                      VkImageSwapchainCreateInfoKHR* toTransform);
-
-void transform_tohost_VkBindImageMemorySwapchainInfoKHR(
-    ResourceTracker* resourceTracker, VkBindImageMemorySwapchainInfoKHR* toTransform);
-
-void transform_fromhost_VkBindImageMemorySwapchainInfoKHR(
-    ResourceTracker* resourceTracker, VkBindImageMemorySwapchainInfoKHR* toTransform);
-
-void transform_tohost_VkAcquireNextImageInfoKHR(ResourceTracker* resourceTracker,
-                                                VkAcquireNextImageInfoKHR* toTransform);
-
-void transform_fromhost_VkAcquireNextImageInfoKHR(ResourceTracker* resourceTracker,
-                                                  VkAcquireNextImageInfoKHR* toTransform);
-
-void transform_tohost_VkDeviceGroupPresentCapabilitiesKHR(
-    ResourceTracker* resourceTracker, VkDeviceGroupPresentCapabilitiesKHR* toTransform);
-
-void transform_fromhost_VkDeviceGroupPresentCapabilitiesKHR(
-    ResourceTracker* resourceTracker, VkDeviceGroupPresentCapabilitiesKHR* toTransform);
-
-void transform_tohost_VkDeviceGroupPresentInfoKHR(ResourceTracker* resourceTracker,
-                                                  VkDeviceGroupPresentInfoKHR* toTransform);
-
-void transform_fromhost_VkDeviceGroupPresentInfoKHR(ResourceTracker* resourceTracker,
-                                                    VkDeviceGroupPresentInfoKHR* toTransform);
-
-void transform_tohost_VkDeviceGroupSwapchainCreateInfoKHR(
-    ResourceTracker* resourceTracker, VkDeviceGroupSwapchainCreateInfoKHR* toTransform);
-
-void transform_fromhost_VkDeviceGroupSwapchainCreateInfoKHR(
-    ResourceTracker* resourceTracker, VkDeviceGroupSwapchainCreateInfoKHR* toTransform);
-
 #endif
 #ifdef VK_KHR_xcb_surface
 #endif
@@ -2926,44 +2878,6 @@
 
 #endif
 #ifdef VK_EXT_swapchain_maintenance1
-void transform_tohost_VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT(
-    ResourceTracker* resourceTracker,
-    VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT* toTransform);
-
-void transform_fromhost_VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT(
-    ResourceTracker* resourceTracker,
-    VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT* toTransform);
-
-void transform_tohost_VkSwapchainPresentFenceInfoEXT(ResourceTracker* resourceTracker,
-                                                     VkSwapchainPresentFenceInfoEXT* toTransform);
-
-void transform_fromhost_VkSwapchainPresentFenceInfoEXT(ResourceTracker* resourceTracker,
-                                                       VkSwapchainPresentFenceInfoEXT* toTransform);
-
-void transform_tohost_VkSwapchainPresentModesCreateInfoEXT(
-    ResourceTracker* resourceTracker, VkSwapchainPresentModesCreateInfoEXT* toTransform);
-
-void transform_fromhost_VkSwapchainPresentModesCreateInfoEXT(
-    ResourceTracker* resourceTracker, VkSwapchainPresentModesCreateInfoEXT* toTransform);
-
-void transform_tohost_VkSwapchainPresentModeInfoEXT(ResourceTracker* resourceTracker,
-                                                    VkSwapchainPresentModeInfoEXT* toTransform);
-
-void transform_fromhost_VkSwapchainPresentModeInfoEXT(ResourceTracker* resourceTracker,
-                                                      VkSwapchainPresentModeInfoEXT* toTransform);
-
-void transform_tohost_VkSwapchainPresentScalingCreateInfoEXT(
-    ResourceTracker* resourceTracker, VkSwapchainPresentScalingCreateInfoEXT* toTransform);
-
-void transform_fromhost_VkSwapchainPresentScalingCreateInfoEXT(
-    ResourceTracker* resourceTracker, VkSwapchainPresentScalingCreateInfoEXT* toTransform);
-
-void transform_tohost_VkReleaseSwapchainImagesInfoEXT(ResourceTracker* resourceTracker,
-                                                      VkReleaseSwapchainImagesInfoEXT* toTransform);
-
-void transform_fromhost_VkReleaseSwapchainImagesInfoEXT(
-    ResourceTracker* resourceTracker, VkReleaseSwapchainImagesInfoEXT* toTransform);
-
 #endif
 #ifdef VK_EXT_shader_demote_to_helper_invocation
 DEFINE_ALIAS_FUNCTION(transform_tohost_VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures,
